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


Гибридный поиск с помощью векторов и полнотекстового текста в поиске ИИ Azure

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

  • Является единым запросом, который содержит параметры запросов search и vectors.
  • Выполняет полнотекстовый поиск и векторный поиск параллельно.
  • Объединяет результаты каждого запроса с помощью Reciprocal Rank Fusion (RRF).

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

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

Тестирование тестов на реальных и тестовых наборах данных указывает, что гибридное извлечение семантики семантического ранга обеспечивает значительные преимущества в релевантности поиска.

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

Как работает гибридный поиск?

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

Гибридный поиск объединяет результаты как полнотекстовых, так и векторных запросов, которые используют различные функции ранжирования, такие как BM25 для текста, и иерархический навигационный небольшой мир (HNSW) и исчерпывающие K Ближайшие соседи (eKNN) для векторов. Алгоритм RRF объединяет результаты. Ответ запроса предоставляет только один результирующий набор, используя RRF для ранжирования унифицированных результатов.

Структура гибридного запроса

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

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

POST https://{{searchServiceName}}.search.windows.net/indexes/hotels-vector-quickstart/docs/search?api-version=2025-09-01
content-type: application/JSON

{
    "count": true,
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelId, HotelName, Category, Description, Address/City, Address/StateProvince",
    "filter": "geo.distance(Location, geography'POINT(-77.03241 38.90166)') le 300",
    "vectorFilterMode": "postFilter",
    "facets": [ "Address/StateProvince"], 
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [ <array of embeddings> ]
            "k": 50,
            "fields": "DescriptionVector",
            "exhaustive": true,
            "oversampling": 20
        },
        {
            "kind": "vector",
            "vector": [ <array of embeddings> ]
            "k": 50,
            "fields": "Description_frVector",
            "exhaustive": false,
            "oversampling": 10
        }
    ],
    "skip": 0,
    "top": 10,
    "queryType": "semantic",
    "queryLanguage": "en-us",
    "semanticConfiguration": "my-semantic-config"
}

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

  • search задает один полнотекстовый поисковый запрос.
  • vectorQueries задает векторные запросы, которые могут быть несколькими, предназначенными для нескольких векторных полей. Если пространство внедрения включает многоязычное содержимое, векторные запросы могут найти совпадение без анализаторов языка или перевода. Если вы используете семантический рангировщик, установите k значение 50, чтобы максимально увеличить входные данные.
  • select указывает, какие поля должны возвращаться в результатах, которые должны быть текстовыми полями, доступными для чтения, если вы отображаете их пользователям или отправляете их в большую языковую модель (LLM).
  • filters может указать геопространственный поиск или другие критерии включения и исключения, например, включена ли парковка. Геопространственный запрос в этом примере находит отели в радиусе 300 километров от Вашингтона. Фильтр можно применить в начале или конце обработки запросов. Если вы используете семантический рангировщик, вам, вероятно, потребуется постфильтрация в качестве последнего шага, но стоит протестировать, чтобы понять, какой вариант лучше подходит для ваших запросов.
  • facets можно использовать для вычисления сегментов аспектов по результатам, возвращаемым из гибридных запросов.
  • queryType=semantic вызывает семантический рангировщик, применяя понимание машинного чтения для получения более релевантных результатов поиска. Семантическое ранжирование является необязательным. Если вы не используете эту функцию, удалите последние три строки гибридного запроса.

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

Обратите внимание, что в запросе нет orderby . Явные заказы сортировки переопределяют результаты ранжирования релевантности, поэтому если требуется сходство и релевантность BM25, опустите сортировку в запросе.

Ответ запроса может выглядеть следующим образом: JSON.

{
    "@odata.count": 3,
    "@search.facets": {
        "Address/StateProvince": [
            {
                "count": 1,
                "value": "NY"
            },
            {
                "count": 1,
                "value": "VA"
            }
        ]
    },
    "value": [
        {
            "@search.score": 0.03333333507180214,
            "@search.rerankerScore": 2.5229012966156006,
            "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",
                "StateProvince": "VA"
            }
        },
        {
            "@search.score": 0.032522473484277725,
            "@search.rerankerScore": 2.111117362976074,
            "HotelId": "48",
            "HotelName": "Nordick's Valley Motel",
            "Description": "Only 90 miles (about 2 hours) from the nation's capital and nearby most everything the historic valley has to offer.  Hiking? Wine Tasting? Exploring the caverns?  It's all nearby and we have specially priced packages to help make our B&B your home base for fun while visiting the valley.",
            "Category": "Boutique",
            "Address": {
                "City": "Washington D.C.",
                "StateProvince": null
            }
        }
    ]
}