Поделиться через


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

Если у вас есть векторный индекс в azure AI, в этой статье объясняется, как:

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

Обозреватель поиска также можно использовать в портал Azure.

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

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

Для запроса поля вектора сам запрос должен быть вектором.

Одним из способов преобразования строки текстового запроса пользователя в векторное представление является вызов библиотеки внедрения или API в коде приложения. Рекомендуется всегда использовать те же модели внедрения, используемые для создания внедрения в исходные документы. Примеры кода, показывающие , как создавать внедрения в репозиторий azure-search-vector-samples .

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

Ниже приведен пример 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, REST API или пакеты SDK Azure. Если вы переносите с 2023-07-01-Preview, есть критические изменения. Дополнительные сведения см. в статье об обновлении до последней версии REST API .

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

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

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

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-07-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",
            "weight": 0.5,
            "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 поле в индекс. Так как не существует средства для декодирования результата векторного поля, включение текстовых полей невектора полезно для их удобочитаемых значений.

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

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

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-07-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
        }
    ]
}

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

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

Следующий пример запроса ищет сходство в обоих 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 2024-07-01 , обозреватель поиска или более новые пакеты Azure SDK для этой функции.

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

Обозреватель поиска поддерживает встроенную векторизацию во время запроса. Если индекс содержит векторные поля и имеет векторизатор, можно использовать встроенное преобразование текста в вектор.

  1. Войдите в портал Azure с помощью учетной записи Azure и перейдите к служба Azure AI.

  2. В меню слева разверните индексы управления>поиском и выберите индекс. Обозреватель поиска — это первая вкладка на странице индекса.

  3. Проверьте профили векторов , чтобы подтвердить наличие векторизатора.

    Снимок экрана: параметр векторизатора в индексе поиска.

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

    Кроме того, можно выбрать >представление JSON для просмотра или изменения запроса. Если векторы присутствуют, обозреватель поиска автоматически настраивает векторный запрос. Представление JSON можно использовать для выбора полей, используемых в поиске и в ответе, добавления фильтров или создания более сложных запросов, таких как гибридные. Пример JSON представлен на вкладке REST API этого раздела.

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

Векторный запрос указывает 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).>.

Векторный вес

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

Значение по умолчанию равно 1.0, а значение должно быть положительным числом, превышающим нулю.

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

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

POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-07-01

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my_first_vector_field", 
          "k": 10, 
          "weight": 0.5 
        },
        { 
          "kind": "vector", 
          "vector": [4.0, 5.0, 6.0], 
          "fields": "my_second_vector_field", 
          "k": 10, 
          "weight": 2.0
        } 
      ], 
      "search": "hello world" 
    } 

Вес вектора применяется только к векторам. Текстовый запрос в этом примере ("hello world") имеет неявный вес 1,0 или нейтральный вес. Однако в гибридном запросе можно увеличить или уменьшить важность текстовых полей, задав maxTextRecallSize.

Задайте пороговые значения, чтобы исключить результаты низкой оценки (предварительная версия)

Так как поиск ближайшего соседа всегда возвращает запрошенные k соседи, можно получить несколько совпадений с низкой оценкой в рамках выполнения k требования количества результатов поиска. Чтобы исключить результат поиска с низкой оценкой threshold , можно добавить параметр запроса, который фильтрует результаты на основе минимальной оценки. Фильтрация возникает перед объединением результатов из разных наборов отзывов.

Этот параметр по-прежнему находится в предварительной версии. Мы рекомендуем предварительной версии REST API версии 2024-05-01-preview.

В этом примере все совпадения, которые оцениваются ниже 0,8, исключаются из результатов векторного поиска, даже если число результатов упало ниже k.

POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-05-01-preview 
    Content-Type: application/json 
    api-key: [admin key] 

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my-cosine-field", 
          "threshold": { 
            "kind": "vectorSimilarity", 
            "value": 0.8 
          } 
        }
      ]
    }

MaxTextSizeRecall для гибридного поиска (предварительная версия)

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

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

Этот параметр по-прежнему находится в предварительной версии. Мы рекомендуем предварительной версии REST API версии 2024-05-01-preview.

Дополнительные сведения см. в разделе Set maxTextRecallSize — создание гибридного запроса.

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

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