Индексация мультимодального контента: векторизация изображений и текста в 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.