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


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

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

В этой статье используется REST для иллюстрации. После понимания базового рабочего процесса перейдите к примерам кода пакета SDK Azure в репозитории 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 для успешного вызова развернутой модели.

Поле embedding в тексте ответа — векторное представление строки inputзапроса. В целях тестирования необходимо скопировать значение массива embeddingvectorQueries.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.kind установите значение vector для массива векторов, или text, если входные данные — строка, и у вас есть векторизатор.
  • vectorQueries.vector — это запрос (векторное представление текста или изображения).
  • vectorQueries.exhaustive (необязательно) вызывает исчерпывающий KNN во время запроса, даже если поле индексируется для HNSW.
  • vectorQueries.fields (необязательно) задает конкретные поля для выполнения запросов (до 10 на запрос).
  • vectorQueries.weight (необязательно) указывает относительный вес каждого векторного запроса, включенного в операции поиска. Дополнительные сведения см. в разделе "Векторный вес".
  • vectorQueries.k — это количество совпадений, которые нужно вернуть.

В следующем примере вектор представляет эту строку: "what Azure services support full text search" Запрос предназначен для 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 . Можно указать до 10 полей.

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

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 и найдите службу поиска.

  2. В меню слева выберите управление поиском>Индексы, и затем выберите ваш индекс.

  3. Перейдите на вкладку "Векторные профили" , чтобы убедиться, что у вас есть векторизатор.

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

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

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

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

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

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

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

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

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

k и top являются необязательными. Если не указано, число результатов по умолчанию равно 50. Вы можете задать top, skip, чтобы листать больше результатов или изменить значение по умолчанию.

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

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

  • Метрика сходства.
  • RRF, если есть несколько наборов результатов поиска.

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

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

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

RRF

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

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

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

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

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

Весовые значения используются при вычислении показателей RRF каждого документа. Вычисление представляет собой умножение значения 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.