Создание гибридного запроса в Поиск с использованием ИИ Azure

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

В этой статье вы узнаете, как:

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

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

Предварительные условия

Выберите API, инструмент и пригодный шаблон

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

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

  • Стабильные ИНТЕРФЕЙСы REST API или последняя предварительная версия API, если вы используете функции предварительной версии, такие как maxTextRecallSize и countAndFacetMode(preview).

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

Рабочие гибридные шаблоны

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

  • Сбалансированный гибридный (по умолчанию): используйте это первое значение для большинства рабочих нагрузок. Начните с k диапазона от 30 до 50, top в диапазоне от 10 до 20, и включите семантический рейтинг только при повышении измеренной релевантности.

  • Гибрид с приоритетом на отзыв: используйте данную опцию для сложных запросов, где цель - охват. Постепенно увеличивайте maxTextRecallSize и держите настройки вектора умеренными. Ожидается более высокая стоимость слияния.

  • Гибридная система с приоритетом на точность: используйте её для достижения низкой задержки в условиях масштабирования. Держите k и top скромными, применяйте выборочные фильтры и избегайте семантических функций, которые не добавляют пользы.

Почему перегруженные запросы дросселируются

Гибридные запросы выполняют получение текста и вектора параллельно, а затем объединяют результаты с RRF. При увеличении лексического вклада (например, путем изменения гибридного весового веса в пользу BM25) вы увеличиваете число текстовых кандидатов, которые должны быть объединены с векторными кандидатами. При сочетании этого с дорогостоящими параметрами вектора и семантическим повторным ранжированием, нагрузка на ЦП и память быстро увеличиваются.

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

  • Более высокая задержка и пиковые пики p95/p99
  • 429 ответов регулирования
  • Клиент наблюдает за сбоями или превышением времени ожидания запросов, когда не настроено поведение повторных попыток.

Порядок настройки перед масштабированием

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

  1. Сначала уменьшите затратные параметры поиска векторов. Например, если efSearch и maxConnections настроены агрессивно, снизите их перед масштабированием (например, сократите efSearch от около 800 до 128 до 192 и уменьшите от maxConnections 64 до 32).
  2. Ограничьте область применения семантического пересортировки до случаев, которые от этого выигрывают.
  3. Повторное тестирование задержки и частоты ошибок 429 при типичной нагрузке.
  4. Масштабирование реплик только в том случае, если регулирование сохраняется после настройки.

Используйте эту последовательность для повышения стабильности сначала и управления затратами перед масштабированием.

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

В этом разделе объясняется базовая структура гибридного запроса и настройка одного из них в обозревателе поиска или выполнении в клиенте REST.

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

  1. Перейдите в службу поиска в портал Azure.

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

  3. В разделе "Представление" переключитесь на представление JSON, чтобы можно было вставить векторный запрос.

  4. Замените шаблон запроса по умолчанию гибридным запросом. Базовый гибридный запрос содержит текстовый запрос, указанный в search, и векторный запрос, указанный в разделе vectorQueries.vector. Текстовый запрос и векторный запрос могут быть эквивалентными или дивергентными, но они часто используют одно и то же намерение.

    Этот пример взят из справочника vector quickstart, который содержит векторное и невекторное содержимое, а также несколько примеров запросов. Для краткости вектор усечен в этой статье.

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

    Совет

    Результаты поиска проще читать, если скрыть векторы. В параметрах запроса включите скрытие векторных значений в результатах поиска.

  6. Ниже приведена другая версия запроса. Этот элемент добавляет count, показывающее число найденных совпадений, параметр select для выбора определенных полей и параметр top, возвращающий первые семь результатов.

     {
         "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
             }
         ]
     }
    

Настройка maxTextRecallSize и countAndFacetMode

Примечание.

Эта функция сейчас доступна в виде общедоступной предварительной версии. Этот предварительный просмотр предоставляется без соглашения об уровне обслуживания и не предназначается для производственных рабочих нагрузок. Некоторые функции могут не поддерживаться или их возможности могут быть ограничены. Дополнительные сведения см. в разделе Supplemental Terms of Use for Microsoft Azure Previews.

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

Если вы используете maxTextRecallSize, вам также может потребоваться задать CountAndFacetMode. Этот параметр определяет, следует ли countfacets включать все документы, соответствующие поисковому запросу, или только те документы, полученные в maxTextRecallSize окне. Значением по умолчанию является countAllResults.

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

Совет

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

  1. Используйте поиск — POST (предварительная версия) или ПОИСК — GET (предварительная версия) для указания параметров предварительного просмотра .

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

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

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

  3. Установить maxTextRecallSize:

    • Уменьшите maxTextRecallSize, если поиск сходства векторов обычно превышает производительность текстовой части гибридного запроса.

    • Увеличьте 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=2025-11-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 до 5 000. Он также использует верхние, пропускать и рядом с извлечением результатов из больших результирующих наборов. В этом случае запрос извлекает результаты в BM25, начиная с позиции 1500 до 2000 в качестве вклада текстового запроса в составной набор RRF.

POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2025-11-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" 
      } 
    } 

Справочник: hybridSearch | maxTextRecallSize | countAndFacetMode

Примеры гибридных запросов

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

Пример: гибридный поиск с фильтром

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

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2025-09-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": "preFilter",
    "filter": "ParkingIncluded",
    "top": "10"
}

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

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

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

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

Справочник: filter | vectorFilterMode

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

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

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

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

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

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

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

Вот пример гибридного запроса, который изменяет настройку фильтра. Глобальный фильтр "Оценка больше чем 3" заменяется во время выполнения с помощью filterOverride.

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

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

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

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

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

Справка:queryType | semanticConfiguration | captions | ответы

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

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

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2025-09-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": "ParkingIncluded",
    "vectorFilterMode": "preFilter",
    "top": "50"
}

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

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

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

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

  • strictPostFilter (предварительная версия) применяется к нефильтрованнымk верхним результатам после выполнения запроса. Он всегда возвращает меньше или равно документам k . Если нефильтрованный k=50 возвращает 50 нефильтрованных результатов, а фильтр соответствует 30 документам, в результирующем наборе возвращаются только 30 документов, даже если индекс содержит более 30 документов, соответствующих фильтру. Так как этот режим имеет наибольшее сокращение вспоминаемости, мы не рекомендуем использовать его с семантическим ранжировщиком.

Настроить ответ на запрос

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

Поля ответа

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

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

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

Примечание.

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

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

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

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

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

Примечание.

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

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

Примечание.

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

Если вы используете семантический рейтер в 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"
    }
}

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

Используйте следующую таблицу для диагностики распространенных проблем с гибридными запросами.

Проблема Возможная причина Резолюция
Пустые результаты Несоответствие имени поля вектора или отсутствие данных индекса Проверьте, что fields в vectorQueries совпадает с векторным полем в вашей схеме индекса. Убедитесь, что документы содержат векторные данные.
Низкие оценки RRF Обычное поведение RRF Оценки RRF по сути ниже, чем оценки сходства. Оценка 0,03 по-прежнему может указывать на сильный матч.
Векторные результаты доминируют Низкая производительность текстового запроса Увеличьте число maxTextRecallSize результатов BM25 или настройте взвешивание векторов.
Результаты текста доминируют Слишком низкая сходство векторов Проверьте качество внедрения. Убедитесь, что вектор запросов использует ту же модель, что и векторы документов.
Семантический рангер возвращает меньше результатов Недостаточно входных документов Установите k значение не менее 50 при использовании семантического ранжирования. Убедитесь, что фильтры не слишком строги.
Фильтр не применяется к векторам Использование только глобального фильтра Для фильтрации по вектору используйте filterOverride в векторном запросе (просмотр).
Непредвиденное поле в результатах select отсутствующий параметр Добавьте select , чтобы указать, какие поля следует возвращать. Исключите поля векторов для удобства чтения.