Гибридный поиск — одновременное применение двух способов: поиска по смыслу через векторы и обычного поиска по словам. Результаты объединяются в один список.
Смысл в том, что эти способы ошибаются по-разному. Векторный не находит точный артикул, но понимает переформулировку. Словесный находит артикул, но бессилен, если пользователь спросил другими словами.
Что даёт словесная часть
Классический механизм — BM25, ранжирование по частоте слов запроса в документе с поправкой на их распространённость. Он точен там, где важно буквальное совпадение: номера, коды, названия моделей, фамилии, аббревиатуры, редкие термины.
Отраслевая лексика — отдельный довод: слово, которого не было в обучающих данных модели эмбеддингов, для векторного поиска почти не существует, а для словесного это обычное слово.
Параметр k1 — насыщение частоты. Определяет, как быстро повторение слова в документе перестаёт добавлять оценку. При k1, равном нулю, частота игнорируется вовсе: одно вхождение слова и десять весят одинаково. Типичные значения — 1,2–2,0: второе-третье вхождение слова добавляет уже немного, десятое — почти ничего. Это защита от накрутки текстом-простынёй с повторами.
Параметр b — нормализация длины. Насколько штрафуются длинные документы: при нуле длина не учитывается, при единице — учитывается полностью, типичное значение 0,75. Смысл: в длинном документе слова встречаются чаще просто из-за размера, и без поправки он систематически выигрывает у короткого, где искомое слово — суть. Длину игнорируют, когда чанки нарезаны одинаковыми по размеру — тогда b можно снижать.
Редкость слова весит больше. Третий компонент BM25 — поправка на распространённость слова по корпусу: слово, встречающееся в каждом документе, почти не различает их; редкий термин сдвигает оценку сильно. Именно поэтому словесная ветка сильна на артикулах и кодах ошибок — они предельно редки.
Как объединяют результаты
Reciprocal rank fusion. Учитываются не оценки, а места в списках: фрагмент получает тем больший вес, чем выше он в каждой из выдач. Не требует калибровки и потому устойчивее — обычно с него и начинают.
Механика на числах. Вес фрагмента в каждой выдаче — единица, делённая на сумму шестидесяти и его места. Первое место даёт 1/61 ≈ 0,016, десятое — 1/70 ≈ 0,014, сотое — 1/160 ≈ 0,006. Константа 60 подобрана эмпирически и сглаживает разницу между местами: лидер списка весит лишь немного больше десятого. Отсюда поведение метода: фрагмент на десятом месте в обоих списках (сумма ≈ 0,029) обгоняет фрагмент, который первый в одном и сотый в другом (≈ 0,023). RRF награждает согласие двух методов, а не одну яркую победу.
Взвешенная сумма. Оценки обоих способов приводят к сопоставимому виду и складывают с весами. Требует калибровки: шкалы у методов разные, и веса подбираются на данных.
Калибровка весов
Что именно калибруется. Взвешенная сумма опирается на нормализацию оценок — приведение к общему диапазону — и на коэффициент: доля вклада векторной ветки от нуля до единицы, остальное получает словесная. Нормализация чувствительна к выбросам: один аномально близкий вектор сжимает шкалу, и веса перестают означать то, что предполагалось.
Порядок. Старт — равные вклады, дальше перебор коэффициента по сетке с шагом 0,1 на контрольном наборе запросов с эталонами, критерий — полнота и точность выдачи. На типовых корпусах оптимум ложится в диапазон 0,3–0,7; крайние значения — сигнал, что одна из веток не работает и надо разбираться с ней, а не с весами.
Когда пересматривать. При смене состава корпуса: новые типы документов и запросов сдвигают оптимум. Сигнал к пересмотру — падение полноты на контрольном наборе при неизменных настройках, то есть обычный дрейф данных; как строить такой контроль — тема статьи про метрики RAG.
Когда гибрид обязателен
Каталоги товаров с артикулами. Техническая документация с кодами ошибок и версиями. Юридические документы с номерами статей и пунктов. Любая база, где пользователь ищет по конкретному обозначению.
Проверить нужду просто: возьмите двадцать реальных запросов и посмотрите, сколько из них содержат точное обозначение. Если больше трети — чистый векторный поиск будет разочаровывать.
Чем платим
Два индекса вместо одного: больше места, дольше индексация, сложнее эксплуатация. Плюс появляются параметры объединения, которые надо настроить и потом не забыть про них при изменении данных. Часть векторных баз содержит словесный индекс встроенным — тогда плата сводится к памяти и настройке; отдельная поисковая система рядом с базой ради гибрида нужна редко.
Как настроить и не сломать
Начинать стоит с равного вклада обоих способов и смотреть на изменение полноты по проверочному набору. Смещение в сторону словесного поиска улучшает работу с обозначениями и ухудшает понимание переформулировок; смещение в сторону векторного — наоборот.
Настраивать нужно раздельно по типам запросов, если они заметно различаются: у запросов с артикулами и у вопросов обычным языком оптимум разный. Иногда проще определять тип запроса и применять разные веса.
Типичные ошибки
Складывание оценок разных методов напрямую, без приведения к сопоставимому виду: у BM25 и косинусной близости несравнимые шкалы, и результат определяется той, у которой числа крупнее.
Настройка весов на нескольких примерах вместо проверочного набора.
Отсутствие переиндексации словесного индекса при обновлении документов — векторный обновили, а второй забыли.
Частые вопросы
Всегда ли нужен гибридный поиск?
Нет. Если пользователи формулируют вопросы обычным языком и точные обозначения в запросах редки, векторного поиска достаточно, а гибрид добавит сложности без выигрыша. Нужду проверяют на реальных запросах: доля запросов с артикулами, номерами и кодами выше трети — берите гибрид.
Как объединять результаты двух поисков?
Начинать стоит с reciprocal rank fusion: он учитывает места в списках, а не оценки, и потому не требует калибровки шкал. Взвешенная сумма даёт больше контроля, но веса приходится подбирать на данных и пересматривать при их изменении.
Заменяет ли гибридный поиск реранкинг?
Нет, они на разных этапах. Гибрид улучшает полноту — повышает шанс, что нужный фрагмент вообще окажется среди кандидатов. Реранкинг улучшает точность — поднимает нужное наверх. В зрелых системах обычно есть оба.
Какие значения k1 и b ставить в BM25?
Стандартные k1 в диапазоне 1,2–2,0 и b около 0,75 — разумный старт. Менять их стоит только по замеру на контрольном наборе: k1 снижают, когда повторы слов в документах информативны, b снижают при одинаковой нарезке чанков и повышают для неоднородных длинных документов. Влияние этих параметров меньше, чем влияние веса объединения и качества нарезки.
Нужна ли лемматизация для русского языка?
Для словесной ветки — да, иначе «договор», «договора» и «договоры» считаются разными терминами, и совпадения теряются на формах слов. Приведение к начальной форме или стемминг — стандартная часть словесного индекса для русского; без неё гибрид не реализует своё преимущество на точных формулировках.
Часто ли надо пересчитывать веса объединения?
По сигналу, а не по календарю: при появлении новых типов документов или запросов и при падении полноты на контрольном наборе. На стабильном корпусе веса держатся месяцами; регулярный пересчёт без изменений данных даёт шум настройки, а не улучшение.