Как устроен гибридный поиск
Гибридный поиск — следующий шаг после чисто семантического: запрос параллельно уходит в два индекса. Лексическая ветка ищет слова запроса в инвертированном индексе и ранжирует по BM25 — формула учитывает, как часто слово встречается в товаре, насколько оно редкое в каталоге и длину текста. Векторная ветка переводит запрос в эмбеддинг и ищет ближайшие векторы товаров в векторной базе методом приближённого поиска соседей. Затем два списка сливают, а верх итогового списка часто уточняет переранжирование.
Какой метод справляется с каким запросом
В поиск по сайту приходят запросы обоих типов, и гибрид закрывает слабые места каждого метода:
| Запрос | Лексический (BM25) | Векторный |
|---|---|---|
| «RTX 4070 Ti» | находит точно | может подмешать 4060 и 4080 |
| артикул «AB-10234» | находит точно | почти бесполезен |
| «платье на свадьбу летом» | ищет слова «свадьба» и «лето» | находит лёгкие нарядные платья |
| «что подарить папе-рыбаку» | почти бесполезен | находит товары для рыбалки |
| «зимняя обувь» | только товары со словом «зимняя» | находит и «утеплённые ботинки» |
Как сливают выдачи
- Reciprocal Rank Fusion. RRF(d) = Σ 1/(k + r(d)), где r(d) — позиция товара в каждом списке. Метод описали Гордон Кормак, Чарльз Кларк и Штефан Бюттхер на конференции SIGIR 2009, значение k = 60 авторы зафиксировали в пилотном эксперименте. В Elasticsearch это ретривер rrf, где k (rank_constant) по умолчанию тоже 60.
- Взвешенная сумма оценок. Оценки обеих веток приводят к одной шкале и складывают с весом. В Weaviate вес задаёт alpha: 0 — чистый BM25, 1 — чистый векторный поиск; с версии 1.24 по умолчанию используется слияние по относительным оценкам (Relative Score Fusion), альтернатива — Ranked Fusion по позициям. В OpenSearch для этого есть запрос hybrid и процессор нормализации оценок.
- Переранжирование. Несколько десятков лучших кандидатов из обеих веток переупорядочивает модель, которая видит запрос и товар вместе и учитывает бизнес-сигналы.
Пример RRF: товар A — первый в BM25 и отсутствует в векторном списке, у него 1/61 ≈ 0,0164. Товар B — пятый в обоих списках, у него 2/65 ≈ 0,0308. Выше встанет B: присутствие в обоих списках весит больше, чем первое место в одном.
Практика: как внедрять
- Начните с RRF — в нём нет весов, которые нужно подбирать.
- Соберите размеченный набор из 200–300 реальных запросов трёх классов — артикулы и модели, бренды, описательные — и мерьте качество по каждому классу отдельно.
- Если запрос похож на артикул (цифры, дефисы), усиливайте лексическую ветку.
- Фильтры по наличию, категории и цене применяйте в обеих ветках до слияния, иначе после фильтрации от одной из них может почти ничего не остаться.
- Итог сравнивайте с текущим поиском A/B-тестом на реальном трафике.