Главное отличие
Обычный векторный поиск сравнивает эмбеддинги запроса и документов. Он находит товары, близкие по смыслу: запрос «тёплая куртка для зимних прогулок» подтянет «утепленный пуховик». Но он плохо работает с точными строками: артикулы, модели, коды, редкие названия. Эмбеддинг артикула «AX-7731B» почти не отличается от эмбеддинга «AX-7731C», и модель может вернуть похожие, но не нужные товары.
Гибридный поиск объединяет два механизма:
- Лексический (полнотекстовый, BM25-подобный) находит точные совпадения токенов, в том числе артикулов.
- Векторный (семантический) находит документы по смыслу.
Для каталога это даёт следующее. Запрос «AX-7731B» попадёт в точное совпадение по лексике, даже если векторная модель его не распознала. Запрос «кроссовки для бега по асфальту, без шипов» найдёт товары по смыслу, даже если в описании нет ни одного совпадающего слова. Запрос вроде «Nike Pegasus 40 лёгкие» получит оба типа совпадений.
Как комбинируются результаты
Обычно используют один из двух подходов:
- RRF (Reciprocal Rank Fusion). Берутся ранги из каждого списка, итоговый балл считается как сумма 1/(k + rank) по спискам, обычно k ≈ 60. Метод не зависит от масштаба оценок, поэтому его часто выбирают по умолчанию.
- Взвешенная сумма нормализованных оценок. BM25 и косинусное сходство приводятся к одному диапазону (например, min-max), затем складываются с весами α и (1 − α). Здесь веса действительно нужны.
Точный механизм в YDB (какой метод слияния и какие параметры доступны в SQL/API) я не могу подтвердить по анонсу, поэтому сверьтесь с документацией.
Нужно ли настраивать веса вручную
Для большинства случаев начать можно без ручной настройки, если система использует RRF или разумные значения по умолчанию. Но для каталога стоит проверить вручную на реальных запросах:
- Для запросов с артикулами лексическая часть должна весить больше.
- Для описательных запросов («что подарить маме») больше должна весить семантика.
Практичный подход: собрать 100–200 реальных запросов с отмеченными релевантными товарами, прогнать поиск с разными весами (например, 0.3, 0.5, 0.7) и выбрать вариант с лучшими метриками (nDCG@10 или Recall@10). Часто помогает и разделение запросов по типу: если запрос похож на артикул (regex по формату кода), можно увеличивать вес лексики.
Рекомендация для вашего кейса
- Индексируйте артикул и название отдельно от описания, с меньшим весом у описания для лексики.
- Стартуйте с RRF или весов около 0.5.
- Добавьте правило: если запрос совпадает с форматом артикула, лексика получает приоритет.
- Измеряйте качество на собственной выборке, а не полагайтесь на общие примеры.
Ответить на вопрос