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


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

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

В этой статье раскрываются следующие темы:

  • Настройка базового запроса
  • Сформулировать гибридные запросы с дополнительными параметрами и фильтрами
  • Повышение релевантности с помощью семантического ранжирования или векторных весов
  • Оптимизация поведения запросов путем управления текстовыми и векторными входными данными

Примечание.

Новая версия 2024-09-01-preview — это возможность целевых фильтров только вложенным запросом вектора в гибридном запросе. Это обеспечивает большую точность применения фильтров. Дополнительные сведения см. в разделе "Целевые фильтры для векторных запросов" в этой статье.

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

Выбор API или инструмента

  • Обозреватель поиска в портал Azure (поддерживает стабильный и предварительный синтаксис поиска API) содержит представление JSON, которое позволяет вставить гибридный запрос.

  • 2024-07-01 стабильная версия или последняя предварительная версия API, если вы используете предварительные версии функций, таких как maxTextRecallSize и countAndFacetMode(preview).

    Для удобства чтения мы используем примеры REST, чтобы объяснить, как работают API. Для создания гибридных запросов можно использовать клиент REST, например Visual Studio Code с расширением REST. Дополнительные сведения см . в кратком руководстве по поиску векторов с помощью REST API.

  • Более новые стабильные или бета-версии пакетов SDK Azure (см. журналы изменений для поддержки функций пакета SDK).

Настройка гибридного запроса в обозревателе поиска

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

  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=2024-07-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
        },
        {
            "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=2024-07-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.

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

С помощью предварительной версии 2024-09-01-preview можно переопределить глобальный фильтр в запросе поиска, применяя дополнительный фильтр, предназначенный только для вложенных запросов вектора в гибридном запросе.

Эта функция обеспечивает точное управление, гарантируя, что фильтры влияют только на результаты векторного поиска, оставляя результаты поиска на основе ключевых слов не затронуты.

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

Чтобы применить целевые фильтры векторов, выполните указанные действия.

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

  • Измените запрос, добавив новый vectorQueries.filterOverride параметр в выражение фильтра OData.

Ниже приведен пример гибридного запроса, который добавляет переопределение фильтра. Глобальный фильтр "Rating gt 3" заменяется во время выполнения фильтромOvrride.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-09-01=preview

{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "exhaustive": true,
            "filterOverride": "Address/City eq 'Seattle'",
            "k": 10
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Address/City, Rating",
    "filter": "Rating gt 3"
    "debug": "vector",
    "top": 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}}
{
    "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 результатов из объединенного ответа.

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

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

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

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

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}}
{
    "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 документов для передачи в семантический рангировщик.

Установка maxTextRecallSize и countAndFacetMode (предварительная версия)

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

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

Совет

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

  1. Используйте search — POST или Search — GET в 2024-05-01-preview, чтобы указать эти параметры.

  2. hybridSearch Добавьте объект параметра запроса, чтобы задать максимальное количество документов, отозванных с помощью результатов гибридного запроса BM25. Он имеет два свойства:

    • maxTextRecallSize указывает количество результатов BM25 для предоставления ранжировщику обратного ранжирования (RRF), используемого в гибридных запросах. Значение по умолчанию — 1000. Максимальное значение — 10 000.

    • countAndFacetMode сообщает счетчики результатов BM25 (и для аспектов, если вы используете их). Значение по умолчанию — это все документы, соответствующие запросу. При необходимости можно задать область "count" для maxTextRecallSizeпараметра .

  3. Уменьшите, maxTextRecallSize если поиск сходства векторов, как правило, опережает текстовую сторону гибридного запроса.

  4. Создайте maxTextRecallSize , если у вас есть большой индекс, и значение по умолчанию не записывает достаточное количество результатов. С более крупным результирующий набор BM25 можно также задать topskipи next получить части этих результатов.

В следующих примерах REST показаны два варианта использования для настройки maxTextRecallSize.

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

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

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my_vector_field", 
          "k": 10 
        } 
      ], 
      "search": "hello world", 
      "hybridSearch": { 
        "maxTextRecallSize": 100, 
        "countAndFacetMode": "countRetrievableResults" 
      } 
    } 

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

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

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my_vector_field", 
          "k": 10 
        } 
      ], 
      "search": "hello world",
      "top": 500,
      "skip": 1500,
      "next": 500,
      "hybridSearch": { 
        "maxTextRecallSize": 5000, 
        "countAndFacetMode": "countRetrievableResults" 
      } 
    } 

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

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

Поля в ответе

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

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

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

Примечание.

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

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

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

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

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

Примечание.

Если вы используете гибридный поиск в API 2024-05-01-preview, вы можете контролировать количество результатов из запроса ключевых слов с помощью maxTextRecallSize. Объедините это с параметром "k" для управления представлением из каждой подсистемы поиска (ключевого слова и вектора).

Результаты семантического ранжирования

Примечание.

Семантический рангировщик может занять до 50 результатов.

Если вы используете семантический рангер в API 2024-05-01-preview, рекомендуется задать "k" и "maxTextRecallSize", чтобы суммировать по крайней мере 50 итогов. Затем можно ограничить результаты, возвращенные пользователю с помощью параметра top.

Если вы используете семантику ранжирования в предыдущих API, сделайте следующее:

  • При выполнении поиска только по ключевым словам (без вектора) задайте "top" значение 50
  • При выполнении гибридного поиска значение "k" равным 50, чтобы обеспечить получение по крайней мере 50 результатов семантического ранджера.

Рейтинг

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

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

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

{
    "@search.score": 0.8399121,
    "HotelId": "49",
    "HotelName": "Swirling Currents 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": "Swirling Currents 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.