Создание векторного запроса в службе "Поиск ИИ Azure"

В службе "Поиск ИИ Azure", если в индексе поиска есть векторные поля , в этой статье объясняется, как:

В этой статье используется REST для иллюстрации. Примеры кода на других языках см . в репозитории GitHub azure-search-vector-samples для комплексных решений, включающих векторные запросы.

Необходимые компоненты

Совет

Чтобы быстро определить, имеет ли индекс векторы, найдите поля типа Collection(Edm.Single)с атрибутом dimensions и назначением vectorSearchProfile .

Преобразование входных данных строки запроса в вектор

Для запроса поля вектора сам запрос должен быть вектором. Одним из способов преобразования строки текстового запроса пользователя в векторное представление является вызов библиотеки внедрения или API в коде приложения. Рекомендуется всегда использовать те же модели внедрения, используемые для создания внедрения в исходные документы.

Примеры кода, показывающие , как создавать внедрения в репозиторий azure-search-vector-samples .

Ниже приведен пример REST API строки запроса, отправленной в развертывание модели внедрения Azure OpenAI:

POST https://{{openai-service-name}}.openai.azure.com/openai/deployments/{{openai-deployment-name}}/embeddings?api-version={{openai-api-version}}
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "input": "what azure services support generative AI'"
}

Ожидаемый ответ — 202 для успешного вызова развернутой модели. Поле "внедрение" в тексте ответа является векторным представлением строки запроса "input". В целях тестирования вы скопируйте значение массива "внедрение" в vectorQueries.vector в запросе запроса с помощью синтаксиса, показанного в следующих нескольких разделах.

Фактический ответ на этот вызов POST к развернутой модели включает в себя 1536 внедрения, обрезанный здесь только до первых нескольких векторов для удобства чтения.

{
    "object": "list",
    "data": [
        {
            "object": "embedding",
            "index": 0,
            "embedding": [
                -0.009171937,
                0.018715322,
                ...
                -0.0016804502
            ]
        }
    ],
    "model": "ada",
    "usage": {
        "prompt_tokens": 7,
        "total_tokens": 7
    }
}

В этом подходе код приложения отвечает за подключение к модели, создание внедрения и обработку ответа.

Совет

Попробуйте выполнить запрос с встроенной векторизацией( в настоящее время в общедоступной предварительной версии), чтобы служба поиска Azure AI обрабатывала входные и выходные данные векторизации запросов.

Запрос векторного запроса

В этом разделе показана базовая структура векторного запроса. Для создания векторного запроса можно использовать портал Azure, REST API или пакеты SDK Azure. Если вы переносите с 2023-07-01-Preview, есть критические изменения. Дополнительные сведения см. в статье об обновлении до последней версии REST API .

2023-11-01 — стабильная версия REST API для search POST. Эта версия поддерживает следующее:

  • vectorQueries — это конструкция для векторного поиска.
  • kindvector для указания того, что запрос является массивом векторов.
  • vector — запрос (векторное представление текста или изображения).
  • exhaustive (необязательно) вызывает исчерпывающий KNN во время запроса, даже если поле индексируется для HNSW.

В следующем примере вектор представляет эту строку: "то, что службы Azure поддерживают полнотекстовый поиск". Запрос предназначен для contentVector поля. Запрос возвращает k результаты. Фактический вектор имеет 1536 внедрения, поэтому он обрезан в этом примере для удобства чтения.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector",
            "k": 5
        }
    ]
}

Ответ векторного запроса

В службе "Поиск ИИ Azure" ответы запросов состоят из всех retrievable полей по умолчанию. Однако обычно результаты поиска ограничиваются подмножеством retrievable полей, перечисляя их в инструкции select .

В векторном запросе тщательно рассмотрите необходимость векторных полей в ответе. Поля векторов не доступны для чтения, поэтому если вы отправляете ответ на веб-страницу, следует выбрать невекторные поля, которые являются репрезентативными результатами. Например, если запрос выполняется против contentVector, вы можете вернуться content .

Если вы хотите векторные поля в результате, вот пример структуры отклика. contentVector представляет собой массив строк внедрения, обрезанный здесь для краткости. Оценка поиска указывает релевантность. Другие невекторные поля включаются в контекст.

{
    "@odata.count": 3,
    "value": [
        {
            "@search.score": 0.80025613,
            "title": "Azure Search",
            "category": "AI + Machine Learning",
            "contentVector": [
                -0.0018343845,
                0.017952163,
                0.0025753193,
                ...
            ]
        },
        {
            "@search.score": 0.78856903,
            "title": "Azure Application Insights",
            "category": "Management + Governance",
            "contentVector": [
                -0.016821077,
                0.0037742127,
                0.016136652,
                ...
            ]
        },
        {
            "@search.score": 0.78650564,
            "title": "Azure Media Services",
            "category": "Media",
            "contentVector": [
                -0.025449317,
                0.0038463024,
                -0.02488436,
                ...
            ]
        }
    ]
}

Основные моменты:

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

  • Определяется @search.score алгоритмом векторного поиска.

  • Поля в результатах поиска — это либо все retrievable поля, либо поля в предложении select . Во время выполнения векторного запроса совпадение выполняется только для векторных данных. Однако ответ может включать любое retrievable поле в индекс. Так как не существует средства для декодирования результата векторного поля, включение текстовых полей невектора полезно для их удобочитаемых значений.

Векторный запрос с фильтром

Запрос может включать векторный запрос и выражение фильтра. Фильтры применяются к filterable текстовым и числовым полям и полезны для включения или исключения документов поиска на основе критериев фильтрации. Хотя поле вектора не фильтруется само по себе, запрос может указывать фильтры для других полей в том же индексе.

В более новых версиях API можно задать режим фильтра для применения фильтров до или после выполнения векторного запроса. Сравнение каждого режима и ожидаемой производительности на основе размера индекса см. в статьях "Фильтры" в векторных запросах.

Совет

Если у вас нет исходных полей с текстовыми или числовыми значениями, проверка для метаданных документа, таких как свойства LastModified или CreatedBy, которые могут оказаться полезными в фильтре метаданных.

2023-11-01 — стабильная версия для этого API. Он имеет:

В следующем примере вектор представляет эту строку запроса: "то, что службы Azure поддерживают полнотекстовый поиск". Запрос предназначен для contentVector поля. Фактический вектор имеет 1536 внедрения, поэтому он обрезан в этом примере для удобства чтения.

Критерии фильтра применяются к фильтруемому текстовому полю (category в этом примере), прежде чем поисковая система выполнит векторный запрос.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "count": true,
    "select": "title, content, category",
    "filter": "category eq 'Databases'",
    "vectorFilterMode": "preFilter",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector",
            "k": 5
        }
    ]
}

Несколько векторных полей

Свойство VectorQueries.fields можно задать для нескольких векторных полей. Векторный запрос выполняется для каждого поля вектора, указанного в списке fields . При запросе нескольких векторных полей убедитесь, что каждый из них содержит внедрения из одной модели внедрения, и что запрос также создается из той же модели внедрения.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector, titleVector",
            "k": 5
        }
    ]
}

Несколько векторных запросов

Поиск вектора с несколькими запросами отправляет несколько запросов в нескольких полях векторов в индексе поиска. Типичным примером этого запроса является использование таких моделей, как C пакет интерфейса пользователя для многомодального поиска векторов, где одна и та же модель может векторизировать изображение и текстовое содержимое.

Следующий пример запроса ищет сходство в обоих myImageVector и myTextVector, но отправляет два разных внедрения запросов соответственно, каждый из которых выполняется параллельно. Этот запрос создает результат, который оценивается с помощью RRF.

  • vectorQueries предоставляет массив векторных запросов.
  • vector содержит векторы изображения и текстовые векторы в индексе поиска. Каждый экземпляр является отдельным запросом.
  • fields указывает, какое поле вектора для целевого объекта.
  • k — это число ближайших совпадений соседей, включаемых в результаты.
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "myimagevector",
            "k": 5
        },
        {
            "kind": "vector"
            "vector": [
                -0.002222222,
                0.018708462,
                -0.013770515,
            . . .
            ],
            "fields": "mytextvector",
            "k": 5
        }
    ]
}

Результаты поиска включают сочетание текста и изображений, если индекс поиска включает поле для файла изображения (индекс поиска не сохраняет изображения).

Запрос с интегрированной векторизацией (предварительная версия)

В этом разделе показан векторный запрос, вызывающий новую встроенную функцию предварительной версии векторизации , которая преобразует текстовый запрос в вектор. Используйте REST API 2023-10-01-Preview или обновленный бета-пакет Пакета SDK Azure.

Предварительные требования — это индекс поиска с настроенным векторизатором и назначенным векторным полем. Векторизатор предоставляет сведения о подключении к модели внедрения, используемой во время запроса.

Запросы предоставляют текстовые строки вместо векторов:

  • kind должно быть задано значение text .
  • text должен иметь текстовую строку. Он передается в векторизатор, назначенный полю вектора.
  • fields — это поле вектора для поиска.

Ниже приведен простой пример векторного запроса во время запроса. Текстовая строка векторизирована, а затем используется для запроса поля descriptionVector.

POST https://{{search-service}}.search.windows.net/indexes/{{index}}/docs/search?api-version=2023-10-01-preview
{
    "select": "title, genre, description",
    "vectorQueries": [
        {
            "kind": "text",
            "text": "mystery novel set in London",
            "fields": "descriptionVector",
            "k": 5
        }
    ]
}

Ниже приведен гибридный запрос с помощью встроенной векторизации текстовых запросов. Этот запрос включает несколько полей вектора запроса, несколько невекторных полей, фильтр и семантический ранжирование. Опять же, различия — это kind векторный запрос и text строка вместо вектора vector.

В этом примере поисковая система выполняет три вызова векторизации к векторизаторам, назначенным descriptionVector, synopsisVectorи authorBioVector в индексе. Результирующий вектор используется для получения документов в соответствующих полях. Поисковая система также выполняет ключевое слово поиск по search запросу , "тайный роман набор в Лондоне".

POST https://{{search-service}}.search.windows.net/indexes/{{index}}/docs/search?api-version=2023-10-01-preview
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "search":"mystery novel set in London", 
    "searchFields":"description, synopsis", 
    "semanticConfiguration":"my-semantic-config", 
    "queryType":"semantic",
    "select": "title, author, synopsis",
    "filter": "genre eq 'mystery'",
    "vectorFilterMode": "postFilter",
    "vectorQueries": [
        {
            "kind": "text",
            "text": "mystery novel set in London",
            "fields": "descriptionVector, synopsisVector",
            "k": 5
        },
        {
            "kind": "text"
            "text": "living english author",
            "fields": "authorBioVector",
            "k": 5
        }
    ]
}

Оценка результатов всех четырех запросов слита с использованием ранжирования RRF. Вторичный семантический ранжирование вызывается по сплавленным результатам поиска, но только searchFields повышение результатов, наиболее семантических семантических "search":"mystery novel set in London".

Примечание.

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

Количество ранжированных результатов в ответе на векторный запрос

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

Если вы знакомы с полным текстовым поиском, вы знаете, что вы ожидаете нуля результатов, если индекс не содержит термин или фразу. Однако в векторном поиске операция поиска определяет ближайших соседей, и она всегда возвращает k результаты, даже если ближайшие соседи не так похожи. Таким образом, можно получить результаты для нечувствичных или вне темы запросов, особенно если вы не используете запросы на установка границ. Менее релевантные результаты имеют худший показатель сходства, но они по-прежнему "ближайшие" векторы, если нет ничего ближе. Таким образом, ответ без значимых результатов по-прежнему может возвращать k результаты, но оценка сходства каждого результата будет низкой.

Гибридный подход , включающий полнотекстовый поиск, может устранить эту проблему. Другое решение заключается в том, чтобы задать минимальное пороговое значение для оценки поиска, но только если запрос является чистым одним векторным запросом. Гибридные запросы не способствуют минимальным пороговым значениям, так как диапазоны RRF гораздо меньше и изменчивы.

Параметры запроса, влияющие на число результатов, включают:

  • "k": n результаты запросов только для векторов
  • "top": n результаты гибридных запросов, включающих параметр search

Оба "k" и "top" являются необязательными. Не указано, число результатов по умолчанию — 50. Вы можете задать "top" и "пропустить" на страницу с дополнительными результатами или изменить значение по умолчанию.

Алгоритмы ранжирования, используемые в векторном запросе

Ранжирование результатов вычисляется по следующим значениям:

  • Метрика сходства
  • Если имеется несколько наборов результатов поиска, взаимное слияние ранга (RRF).

Метрика сходства

Метрика сходства, указанная в разделе индекса vectorSearch для запроса только для вектора. Допустимые значения: cosine, euclidean и dotProduct.

Модели внедрения Azure OpenAI используют совместное сходство, поэтому если вы используете модели внедрения Azure OpenAI, cosine рекомендуется метрика. Другие поддерживаемые метрики ранжирования включают euclidean и dotProduct.

Использование RRF

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

Во время выполнения запроса векторный запрос может использовать только один внутренний векторный индекс. Поэтому для нескольких векторных полей и нескольких векторных запросов поисковая система создает несколько запросов, предназначенных для соответствующих индексов векторов каждого поля. Выходные данные — это набор ранжированных результатов для каждого запроса, который использует RRF. Дополнительные сведения см. в разделе "Оценка релевантности" с помощью реляционного ранга Fusion (RRF).>.

Следующие шаги

На следующем шаге просмотрите примеры кода векторного запроса в Python, C# или JavaScript.