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

Гибридный поиск объединяет один или несколько ключевое слово запросов с одним или несколькими векторными запросами в одном запросе поиска. Запросы выполняются параллельно. Результаты объединяются и переупорядочены новыми оценками поиска с помощью взаимной оценки ранжирования Fusion (RRF) для возврата одного ранжированного результирующего набора.

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

Чтобы определить гибридный запрос, используйте REST API 2023-11-01, 2023-10-01-preview, 2024-03-01-preview, Search Обозреватель в портал Azure или более новых версиях пакетов SDK Azure.

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

Запуск гибридного запроса в Обозреватель поиска

  1. В Обозреватель поиска убедитесь, что версия API — 2023-10-01-preview или более поздней.

  2. В разделе "Представление" выберите представление JSON.

  3. Замените шаблон запроса по умолчанию гибридным запросом, таким как один запуск в строке 539 для примера векторного краткого руководства. Для краткости вектор усечен в этой статье.

    Гибридный запрос содержит текстовый запрос, указанный в search, и векторный запрос, указанный в разделе vectorQueries.vector.

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

    {
        "count": true,
        "search": "historic hotel walk to restaurants and shopping",
        "select": "HotelId, HotelName, Category, Tags, Description",
        "top": 7,
        "vectorQueries": [
            {
                "vector": [0.01944167, 0.0040178085, -0.007816401 ... <remaining values omitted> ], 
                "k": 7,
                "fields": "DescriptionVector",
                "kind": "vector",
                "exhaustive": true
            }
        ]
    }
    
  4. Нажмите Поиск.

Гибридный запрос запроса (REST API)

Гибридный запрос объединяет текстовый поиск и векторный поиск, где search параметр принимает строку запроса и vectorQueries.vector принимает векторный запрос. Поисковая система выполняет полнотекстовые и векторные запросы параллельно. Объединение всех совпадений оценивается для релевантности с помощью реляционных рангов Fusion (RRF), а один результирующий набор возвращается в ответе.

Результаты возвращаются в виде обычного текста, включая векторы в полях, помеченных как retrievable. Так как числовые векторы не полезны в результатах поиска, выберите другие поля в индексе в качестве прокси-сервера для сопоставления векторов. Например, если индекс содержит поля descriptionVector и descriptionText, запрос может совпадать с "descriptionVector", но результат поиска может отображать "descriptionText". select Используйте параметр, чтобы указать только поля, доступные для чтения человеком, в результатах.

В следующем примере показана конфигурация гибридного запроса.

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}}
{
    "vectorQueries": [{
        "vector": [
            -0.009154141,
            0.018708462,
            . . . 
            -0.02178128,
            -0.00086512347
        ],
        "fields": "DescriptionVector",
        "kind": "vector",
        "exhaustive": true,
        "k": 10
    }],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Address/City",
    "top": "10"
}

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

  • Строка векторного vectorQueries.vector запроса указывается через свойство. Запрос выполняется в поле DescriptionVector. Задайте значение kind vector, чтобы указать тип запроса. При необходимости задайте exhaustive значение true, чтобы запросить полное содержимое поля вектора.

  • Поиск ключевых слов указывается с помощью search свойства. Он выполняется параллельно с векторным запросом.

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

  • top определяет, сколько совпадений возвращаются в ответе. В этом примере ответ содержит 10 результатов, если в объединенных результатах по крайней мере 10 совпадений.

Гибридный поиск с фильтром

В этом примере добавляется фильтр, который применяется к filterable полям невектора индекса поиска.

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}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "k": 10
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "vectorFilterMode": "postFilter",
    "filter": "ParkingIncluded",
    "top": "10"
}

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

  • Фильтры применяются к содержимому фильтруемых полей. В этом примере поле ParkingIncluded является логическим, и оно помечается как filterable в схеме индекса.

  • В гибридных запросах фильтры можно применять перед выполнением запроса, чтобы уменьшить область запроса или после выполнения запроса, чтобы обрезать результаты. Значение по умолчанию — "preFilter". Чтобы использовать postFilter, задайте режим обработки фильтра, как показано в этом примере.

  • При выполнении запроса послефильтрации количество результатов может быть меньше, чем top-n.

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

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}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "k": 50
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Tags",
    "queryType": "semantic",
    "semanticConfiguration": "my-semantic-config",
    "captions": "extractive",
    "answers": "extractive",
    "top": "50"
}

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

  • Семантический ранжирование принимает до 50 результатов из объединенного ответа. Задайте для параметра "k" и "top" значение 50 для равного представления обоих запросов.

  • Требуются "queryType" и "semanticConfiguration".

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

Семантический гибридный поиск с фильтром

Ниже приведен последний запрос в коллекции. Это тот же семантический гибридный запрос, что и предыдущий пример, но с фильтром.

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}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "k": 50
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Tags",
    "queryType": "semantic",
    "semanticConfiguration": "my-semantic-config",
    "captions": "extractive",
    "answers": "extractive",
    "filter": "ParkingIsIncluded'",
    "vectorFilterMode": "postFilter",
    "top": "50"
}

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

  • Режим фильтра может повлиять на количество результатов, доступных для семантического реанктера. Рекомендуется предоставить семантике рангер максимальное количество документов (50). Если префильтры или postfilters слишком выборочные, вы можете быть недостаточно семантического ранджера, предоставив ему менее 50 документов для работы.

  • Префильтровка применяется перед выполнением запроса. Если префильтратор сокращает область поиска до 100 документов, векторный запрос выполняется по полю DescriptionVector для этих 100 документов, возвращая лучшие совпадения k=50. Эти 50 соответствующих документов затем передаются в RRF для объединенных результатов, а затем в семантический рангер.

  • Postfilter применяется после выполнения запроса. Если k=50 возвращает 50 совпадений на стороне векторного запроса, то после фильтрации применяется к 50 совпадениям, уменьшая результаты, которые соответствуют критериям фильтра, оставляя вас менее чем 50 документов для передачи в семантический рангер

Настройка ответа запроса

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

Поля в ответе

Результаты поиска состоят из retrievable полей из индекса поиска. Результатом является либо:

  • Все retrievable поля (REST API по умолчанию).
  • Поля, явно перечисленные в параметре select в запросе.

В примерах в этой статье используется инструкция select для указания полей текста (невектора) в ответе.

Примечание.

Векторы не спроектированы в читаемый человеком текст, поэтому не возвращают их в ответе. Вместо этого выберите невекторные поля, которые являются репрезентативными для документа поиска. Например, если запрос предназначен для поля DescriptionVector, возвращает эквивалентное текстовое поле, если в ответе есть одно ("Описание").

Количество результатов

Запрос может совпадать с любым количеством документов, так как и все из них, если критерии поиска слабы (например, search=*" для пустого запроса). Так как для возврата несвязанных результатов редко требуется, следует указать максимальное значение для ответа:

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

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

Если вы используете семантический рейтинг, рекомендуется задать как k, так и "top" по крайней мере 50. Семантический рангировщик может занять до 50 результатов. Указав 50 для каждого запроса, вы получаете равное представление из обеих подсистем поиска.

Рейтинг

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

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

Поиск одного вектора: @search.score для результатов, упорядоченных по подобию косинуса (по умолчанию функция расстояния сходства векторов).

{
    "@search.score": 0.8399121,
    "HotelId": "49",
    "HotelName": "Old Carrabelle Hotel",
    "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
    "Category": "Luxury",
    "Address": {
    "City": "Arlington"
    }
}

Гибридный поиск: @search.score для гибридных результатов, ранжированных с помощью Взаимного ранжирования Fusion.

{
    "@search.score": 0.032786883413791656,
    "HotelId": "49",
    "HotelName": "Old Carrabelle Hotel",
    "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
    "Category": "Luxury",
    "Address": {
    "City": "Arlington"
    }
}

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

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