Перейти к содержанию

Гибридный поиск: векторы + ключевые слова + метаданные

Проектирование устойчивого гибридного поиска: сочетание векторных, лексических, метаданных и временных сигналов для RAG веб-сайтов.

retrieval • hybrid • search • rag

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

Мотивация

Сценарии сбоев:

  • Имена собственные / коды SKU, упускаемые плотной моделью.
  • Запросы об изменении цен, вытягивающие устаревший снимок из-за отсутствия временного усиления.
  • Длинные вопросы на естественном языке, переоценённые по стоп-словам в системе только с разреженным поиском.
  • Векторные ложные срабатывания на семантически широких страницах (маркетинговая «вода») из-за отсутствия лексической привязки.

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

Слои компонентов

Рекомендуемый поток:

  1. Эмбеддинг запроса → поиск ANN (k_vec)
  2. Лексический поиск (BM25 / SPLADE / Elasticsearch) (k_lex)
  3. Объединение → нормализация оценок (масштабирование по источнику)
  4. Проход фильтрации по метаданным (locale, access_tier, page_type)
  5. Корректировки разнообразия и свежести
  6. Опциональный кросс/моно ре-ранкер
  7. Финальное усечение (топ K)

Сохраняйте исходные оценки до слияния для аудита.

Нормализация запроса

Шаги:

  • Нормализация Unicode NFKC
  • Приведение к нижнему регистру (при необходимости сохраните снимок регистра для форматирования ответа)
  • Токенизация с сохранением стоп-слов (семантические эмбеддинги могут использовать контекст)
  • Расширение синонимов / псевдонимов: добавьте альтернативные токены для сопоставления внутренних кодовых имён продукта (не вставляются в промпт модели; используются только для разреженного поиска).
  • Извлечение чисел и версий: захватывайте шаблоны X.Y.Z для целевого лексического скоринга.

Фильтры метаданных и атрибутов

Фильтры, применяемые после первичного объединения кандидатов, минимизируют потери полноты. Распространённые поля: locale, access_tier, page_type, product_area, updated_bucket. Применяйте фильтры безопасности (tenant / tier) ДО слияния оценок, чтобы утечки не влияли на ре-ранкинг. Предоставьте режим отладки, возвращающий набор filtered_out для проверки.

Стратегия ре-ранкинга

Используйте лёгкий кросс-энкодер (дистиллированную модель) на топ-N (10–20). Если задержка > бюджета, понижайте качество: пропускайте ре-ранкинг ИЛИ сокращайте число кандидатов, увеличивая лексический вес. Отслеживайте re_rank_delta = MRR_post - MRR_pre, чтобы обосновать стоимость. Кэшируйте результаты ре-ранкинга для идентичных наборов объединения в пределах короткого TTL.

Свежесть и временные сигналы

Вычислите freshness_weight = exp(-lambda * age_days), где lambda настраивается по типу контента (выше для цен, ниже для стабильного API). Объедините: final_score = w_sem * sem_score + w_lex * lex_score + w_fresh * freshness_weight + w_meta * meta_priors. Сначала нормализуйте каждый компонент (z-оценка или min-max), чтобы избежать доминирования.

Режимы сбоев

СбойПричинаСмягчение
Смещение по популярностиПереоценка лексического tf-idfОграничить вклад частоты терминов
Устаревшие результатыНеверная настройка веса свежестиПерекалибровать lambda с помощью набора для оценки
Утечка LocaleПозднее применение фильтраПеренести фильтры безопасности раньше
Семантический дрейфОбновление модели эмбеддинговДвойная индексация и A/B-сравнение перед выкаткой
Шум от чрезмерного слиянияНеограниченный размер объединенияОграничить объединение, отсечение по разнообразию

Фреймворк оценивания

Эксперименты:

  • Абляция: (только векторы, только лексика, гибрид без ре-ранкинга, полный) измеряет Recall@k, MRR.
  • Настройка весов слияния: поиск по сетке весов с использованием валидационного эталонного набора.
  • Бюджет задержки: отслеживайте среднюю + P95 задержку поиска по конфигурации.
  • Дрейф: отслеживайте еженедельное относительное изменение полноты для частотных и хвостовых запросов.

Ведите манифест оценивания с хэшами конфигураций.

Цикл оптимизации

Цикл:

  1. Логируйте трассировки поиска (query, candidates, scores, source_tag).
  2. Выявляйте промахи (низкая достоверность ниже по конвейеру или малое число цитирований) → классифицируйте первопричину (отсутствующий лексический кандидат, семантическое ложное срабатывание, устаревший контент).
  3. Корректируйте веса / пороги; запускайте офлайн-набор.
  4. Выкатывайте новые веса слияния в режиме canary за feature flag.
  5. Продвигайте при статистически значимом улучшении.

Ключевые выводы

  • Гибридный поиск — это система настраиваемых регуляторов; измеряйте неустанно.
  • Применяйте фильтры безопасности и доступа рано; избегайте утечек в скоринг.
  • Ре-ранкинг должен оправдывать задержку измеримым приростом MRR / Recall.
  • Временное затухание не даёт устаревшим, но авторитетным страницам доминировать.
  • Относитесь к изменениям слияния как к коду: версионируйте, оценивайте, выкатывайте вперёд или назад.