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

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

Какой метод справляется с каким запросом

В поиск по сайту приходят запросы обоих типов, и гибрид закрывает слабые места каждого метода:

Запрос Лексический (BM25) Векторный
«RTX 4070 Ti» находит точно может подмешать 4060 и 4080
артикул «AB-10234» находит точно почти бесполезен
«платье на свадьбу летом» ищет слова «свадьба» и «лето» находит лёгкие нарядные платья
«что подарить папе-рыбаку» почти бесполезен находит товары для рыбалки
«зимняя обувь» только товары со словом «зимняя» находит и «утеплённые ботинки»

Как сливают выдачи

  1. Reciprocal Rank Fusion. RRF(d) = Σ 1/(k + r(d)), где r(d) — позиция товара в каждом списке. Метод описали Гордон Кормак, Чарльз Кларк и Штефан Бюттхер на конференции SIGIR 2009, значение k = 60 авторы зафиксировали в пилотном эксперименте. В Elasticsearch это ретривер rrf, где k (rank_constant) по умолчанию тоже 60.
  2. Взвешенная сумма оценок. Оценки обеих веток приводят к одной шкале и складывают с весом. В Weaviate вес задаёт alpha: 0 — чистый BM25, 1 — чистый векторный поиск; с версии 1.24 по умолчанию используется слияние по относительным оценкам (Relative Score Fusion), альтернатива — Ranked Fusion по позициям. В OpenSearch для этого есть запрос hybrid и процессор нормализации оценок.
  3. Переранжирование. Несколько десятков лучших кандидатов из обеих веток переупорядочивает модель, которая видит запрос и товар вместе и учитывает бизнес-сигналы.

Пример RRF: товар A — первый в BM25 и отсутствует в векторном списке, у него 1/61 ≈ 0,0164. Товар B — пятый в обоих списках, у него 2/65 ≈ 0,0308. Выше встанет B: присутствие в обоих списках весит больше, чем первое место в одном.

Практика: как внедрять

  • Начните с RRF — в нём нет весов, которые нужно подбирать.
  • Соберите размеченный набор из 200–300 реальных запросов трёх классов — артикулы и модели, бренды, описательные — и мерьте качество по каждому классу отдельно.
  • Если запрос похож на артикул (цифры, дефисы), усиливайте лексическую ветку.
  • Фильтры по наличию, категории и цене применяйте в обеих ветках до слияния, иначе после фильтрации от одной из них может почти ничего не остаться.
  • Итог сравнивайте с текущим поиском A/B-тестом на реальном трафике.