TATECHATLAS
◎ Русский
Искусственный интеллект / Руководство

Индексация мультимодального контента: векторизация изображений и текста в Azure AI Search

Руководство по настройке мультимодального поиска в Azure AI Search с использованием векторизации текста и изображений. Описывает шаги создания индекса, выбор моделей (например, CLIP), методы генерации эмбеддингов и выполнение гибридных запросов для повышения релевантности.

В этом материале

Для реализации мультимодального поиска в Azure AI Search необходимо создать индекс с векторными полями, использовать модели, такие как OpenAI CLIP, для векторизации текста и изображений, выбрать способ генерации эмбеддингов (внутри или вне индексатора) и выполнять гибридные запросы, объединяющие полнотекстовый и векторный поиск для поиска по семантическому сходству.

Понимание мультимодального поиска в Azure AI Search

Мультимодальный поиск в Azure AI Search позволяет находить похожий контент независимо от его типа - текст или изображение - путём преобразования данных в числовые векторы (эмбеддинги), где близость векторов отражает семантическое сходство. Например, запрос «щенок» может вернуть изображения собак, даже если они не имеют текстовых меток.

Этот подход основан на векторном поиске и поддерживает не только сопоставление текст-текст, но и текст-изображение, что особенно полезно в гибридных сценариях. Векторизация позволяет улавливать концептуальное сходство, например между словами «собака» и «каннина», а также между текстом и соответствующим ему изображением.

Подготовка индекса для векторных данных

Чтобы хранить векторные представления, индекс Azure AI Search должен включать поля типа Edm.Single с атрибутом vectorSearchProfile. Эти поля содержат массивы чисел - эмбеддинги. Длина вектора зависит от используемой модели (например, 512 для CLIP).

from azure.search.documents.indexes import SearchIndexClient
from azure.core.credentials import AzureKeyCredential
from azure.search.documents.indexes.models import (
    SearchIndex,
    SearchField,
    SearchFieldDataType,
    VectorSearch,
    HnswVectorSearchAlgorithmConfiguration
)

# Create client
client = SearchIndexClient(endpoint="https://<service>.search.windows.net", credential=AzureKeyCredential("<key>"))

# Define fields
fields = [
    SearchField(name="id", type=SearchFieldDataType.String, key=True),
    SearchField(name="text", type=SearchFieldDataType.String),
    SearchField(name="image_vector", type=SearchFieldDataType.Collection(SearchFieldDataType.Single),
                vector_search_dimensions=512, vector_search_profile_name="myHnswProfile"),
    SearchField(name="text_vector", type=SearchFieldDataType.Collection(SearchFieldDataType.Single),
                vector_search_dimensions=512, vector_search_profile_name="myHnswProfile")
]

# Configure vector search
vector_search = VectorSearch(
    algorithm_configurations=[
        HnswVectorSearchAlgorithmConfiguration(name="myHnswProfile", kind="hnsw")
    ]
)

# Create index
index = SearchIndex(name="multimodal-index", fields=fields, vector_search=vector_search)
client.create_or_update_index(index)

Выбор модели для векторизации изображений

Для преобразования изображений в векторы можно использовать API Foundry Tools Image Retrieval Vectorize Image или мультимодальные модели, такие как OpenAI CLIP. Эти модели обучаются на парах текст-изображение и создают общее векторное пространство.

Например, отправка изображения собаки через API возвращает 512-мерный вектор, который сохраняется в поле image_vector, позволяя сравнивать его с текстовыми запросами на основе близости векторов.

Выбор модели для векторизации текста

Для векторизации текста подходят модели, такие как text-embedding-ada-002 от Azure OpenAI или SBERT. Они преобразуют текстовые описания (например, «щенок на лугу») в векторы той же размерности, что и векторы изображений, обеспечивая совместимость в общем векторном пространстве.

Генерацию эмбеддингов можно выполнять внешним образом (с помощью SDK OpenAI) или интегрировать в индексатор, указав конечную точку и ключ Azure OpenAI.

import openai
openai.api_type = "azure"
openai.api_key = "<key>"
openai.api_base = "https://<resource>.openai.azure.com/"
openai.api_version = "2023-05-15"

response = openai.Embedding.create(input="puppy", engine="text-embedding-ada-002")
text_embedding = response['data'][0]['embedding']

Встроенная и внешняя векторизация

Azure AI Search поддерживает два подхода: внутреннюю векторизацию через индексатор и внешнюю векторизацию с предварительно вычисленными эмбеддингами. Внутренняя векторизация требует набора навыков с встроенным векторизатором и настройки ресурса Azure OpenAI.

Внешняя векторизация даёт больше контроля и подходит для больших наборов данных. Эмбеддинги вычисляются заранее и загружаются вместе с документами. Этот метод необходим при использовании моделей, не поддерживаемых индексатором напрямую.

Создание мультимодального индекса

Мультимодальный индекс объединяет текст, изображения и их векторные представления в одной схеме. Поля, такие как text и image_vector, позволяют выполнять как полнотекстовый, так и векторный поиск, формируя основу для гибридных запросов.

Каждый документ включает идентификатор, исходный текст или описание изображения и соответствующие векторы. Все данные индексируются вместе, обеспечивая согласованность при поиске.

Выполнение мультимодального поискового запроса

Поиск выполняется с помощью гибридного запроса, содержащего параметры search (для текста) и vectorQueries (для векторов). Например, текстовый запрос «щенок» векторизуется, и полученный вектор сравнивается с полем image_vector в индексе.

Результаты полнотекстового и векторного поиска объединяются с помощью метода Reciprocal Rank Fusion (RRF), что повышает релевантность. Ответ содержит единый ранжированный список документов на основе общей степени схожести.

import requests

url = "https://<service>.search.windows.net/indexes/multimodal-index/docs/search?api-version=2023-11-01"
headers = {"Content-Type": "application/json", "api-key": "<key>"}
payload = {
    "search": "puppy",
    "vectorQueries": [
        {
            "kind": "vector", 
            "vector": text_embedding, 
            "k": 10, 
            "fields": "image_vector"
        }
    ],
    "select": "id,text",
    "top": 5
}

response = requests.post(url, json=payload, headers=headers)
print(response.json())

Оценка и улучшение результатов поиска

Качество поиска оценивается с помощью метрик, таких как точность и полнота. Тестирование проводится на размеченных парах запрос-релевантное изображение. Точность измеряет долю правильно найденных результатов среди всех возвращённых.

Для повышения релевантности используйте гибридный поиск с семантическим ранжированием (queryType=semantic). Настройте параметры, такие как k и oversampling в векторных запросах, и протестируйте стратегии фильтрации.

from sklearn.metrics import precision_score

# Example evaluation (hypothetical values)
y_true = [1, 0, 1, 1, 0]  # 1 = relevant, 0 = not
y_pred = [1, 1, 1, 0, 0]  # predicted results
precision = precision_score(y_true, y_pred, average='binary')
print(f"Precision: {precision:.2f}")

Что проверить

  • Индекс создан с векторными полями
  • Указан профиль векторного поиска (HNSW)
  • Эмбеддинги текста и изображений имеют одинаковую размерность
  • Гибридный запрос включает search и vectorQueries
  • Результаты объединены с помощью RRF

Функция векторного поиска недоступна для служб, созданных до 1 января 2019 года. Генерация эмбеддингов может быть платной при использовании Azure OpenAI или Foundry API.

Источники

  1. Microsoft Learn: vector search ↗
  2. Microsoft Learn: hybrid search ↗
  3. scikit-learn: precision_score ↗
Наверх ↑