TATECHATLAS
◎ Русский
Искусственный интеллект / Руководство

Стратегия фильтрованного векторного поиска: применение фильтров к векторным запросам в Azure AI Search

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

В этом материале

Фильтрованный векторный поиск в Azure AI Search позволяет прикрепить выражение фильтра к векторному запросу. Фильтр нацелен на невекторные поля метаданных, а не на само векторное поле. Движок может применить фильтр до или после оценки векторного сходства. Предварительная фильтрация сужает набор кандидатов перед поиском ближайших соседей, что может незаметно отбросить релевантные документы, не удовлетворяющие условию метаданных, но может снизить задержку для избирательных фильтров. Постфильтрация вычисляет сходство по всему индексу, а затем удаляет несоответствующие результаты, потенциально возвращая меньше документов, чем запрошенное k. Выбор является стратегическим решением: постфильтрация часто рекомендуется при использовании семантического ранжировщика, поскольку ему нужен больший пул кандидатов, но документация советует тестировать оба режима для ваших данных. Чтобы реализовать это, необходимо спроектировать фильтруемые текстовые или числовые поля наряду с векторными полями и задать параметр vectorFilterMode в запросе.

Что означает фильтрованный векторный поиск в Azure AI Search

Фильтрованный векторный поиск в Azure AI Search означает прикрепление выражения фильтра к запросу, который также содержит векторный запрос. Фильтр работает с текстовыми или числовыми полями в схеме индекса, но никогда с самим векторным полем. Это позволяет включать или исключать документы на основе критериев метаданных, одновременно выполняя поиск ближайших соседей по эмбеддингам. Движок может обработать фильтр до или после выполнения векторного запроса, что меняет то, какие документы попадают в конвейер оценки сходства.

Предварительная фильтрация сокращает набор кандидатов до оценки kNN, что может снизить задержку, когда фильтр очень избирателен. Однако, поскольку она может незаметно отбросить концептуально релевантные документы, документация советует проводить бенчмаркинг обоих режимов - preFilter и postFilter - с репрезентативными запросами, чтобы подтвердить компромисс для вашего конкретного распределения данных.

Предварительная фильтрация против постфильтрации: центральное решение

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

Проектирование фильтруемых полей метаданных

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

Параметр vectorFilterMode и конкретный запрос

Документация по гибридному поиску предоставляет конкретный запрос, демонстрирующий фильтрованный векторный поиск на практике. Запрос включает выражение фильтра с использованием geo.distance для поиска отелей в радиусе 300 километров от точки и устанавливает vectorFilterMode в postFilter. Запрос также содержит полнотекстовый поиск, два векторных запроса, нацеленных на разные векторные поля, фасеты и семантическое ранжирование. Фильтр: geo.distance(Location, geography'POINT(-77.03241 38.90166)') le 300, а vectorFilterMode - postFilter. Это означает, что движок сначала находит 50 ближайших соседей по сходству эмбеддингов среди всех отелей, затем удаляет те, что находятся за пределами радиуса. Результирующий набор может содержать менее 50 документов. Векторные запросы указывают k=50 и oversampling для улучшения полноты. Пример показывает, как фильтр, векторные запросы и другие функции сосуществуют в одном запросе.

POST https://{{searchServiceName}}.search.windows.net/indexes/hotels-vector-quickstart/docs/search?api-version=2026-04-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"
}

Взаимодействие с семантическим ранжировщиком

При использовании семантического ранжировщика документация предлагает постфильтрацию в качестве отправной точки. Причина в том, что семантическому ранжировщику нужен больший пул кандидатов для чтения и переупорядочивания. Предварительная фильтрация может слишком сильно сократить пул, ограничивая эффективность ранжировщика. Однако это не строгое правило; источник явно рекомендует тестирование, чтобы подтвердить, какое поведение лучше для ваших запросов. Семантический ранжировщик работает с объединёнными результатами полнотекстового и векторного поиска, и фильтр может быть применён до или после этого объединения, влияя на входные данные для ранжировщика. Если вы установите k равным 50 для векторных запросов при использовании семантического ранжировщика, вы максимизируете входные данные, доступные для повторного ранжирования.

Компромиссы: потеря полноты при предварительной фильтрации

Предварительная фильтрация сужает набор кандидатов до вычисления векторного сходства. Это может незаметно отбросить концептуально релевантные документы, которые не удовлетворяют условию метаданных, даже если они очень похожи на вектор запроса. Например, отель, который является идеальным семантическим совпадением, но находится чуть за пределами географического радиуса, будет исключён до оценки. Постфильтрация вычисляет сходство по всему индексу, а затем удаляет несоответствующие результаты, что может вернуть меньше элементов, чем k, но гарантирует, что ранжирование по сходству учитывало все документы. Следствие: выбор между предварительной и постфильтрацией - это компромисс между полнотой, количеством результатов и задержкой. Предварительная фильтрация сохраняет k и может снизить задержку для избирательных фильтров, но рискует пропустить релевантные документы; постфильтрация сохраняет полноту, но может вернуть меньше результатов и потребовать больше вычислений.

Сочетание фильтров с фасетами и профилями оценки

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

Границы применимости и когда пересмотреть подход

Основные ограничения: сами векторные поля не фильтруемы, поэтому каждый критерий фильтра должен находиться в отдельном поле. Постфильтрация может дать меньше результатов, чем запрошенное k, что может потребовать обработки в вашем приложении. Предварительная фильтрация может снизить полноту, но улучшить задержку для очень избирательных фильтров. Документация рекомендует тестирование для подтверждения наилучшего режима, а не предположение о единственно правильном ответе. Если ваши критерии фильтра очень избирательны и вам нужно ровно k результатов, возможно, потребуется настроить oversampling или пересмотреть дизайн фильтра. Тестирование должно включать измерение полноты, точности и задержки при реалистичных нагрузках. Если ни одна комбинация режима фильтра и oversampling не даёт приемлемых результатов, рассмотрите возможность сделать фильтр менее ограничительным или перенести некоторые ограничения в сам векторный эмбеддинг с помощью стратегий эмбеддинга, учитывающих метаданные.

Что проверить

  • Убедитесь, что каждый критерий фильтра в запросе соответствует невекторному полю, помеченному как filterable в схеме индекса.
  • Подтвердите, что параметр vectorFilterMode установлен в preFilter или postFilter в гибридном запросе.
  • Проведите бенчмаркинг обоих режимов - preFilter и postFilter - с репрезентативными запросами, чтобы определить оптимальный баланс полноты, задержки и количества результатов для вашего конкретного набора данных.
  • Проверьте, что результаты постфильтрации могут содержать меньше документов, чем запрошенное k; обработайте это в логике вашего приложения.
  • Убедитесь, что фасеты и профили оценки применяются к гибридному результирующему набору и не мешают векторному ранжированию.

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

Источники

  1. Microsoft Learn: vector search ↗
  2. Microsoft Learn: hybrid search ↗
  3. scikit-learn: precision_score ↗
Наверх ↑