Диагностика Mock-интервью
Главная · RAG: поиск + генерация

Гибридный поиск и реранкинг

Чистый векторный поиск проваливается на точных терминах, а классический полнотекстовый — на перефразировках. Продакшн-рецепт: гнать оба параллельно, сливать результаты и добивать точность реранкером.

Интуиция

Пользователь пишет: «ошибка E404B при оплате». Векторный поиск (см. векторный поиск) превратит запрос в точку смысла — и артикул «E404B» в ней размажется: для модели эмбеддингов это просто редкая последовательность символов без выученного значения. Найдутся документы «про ошибки оплаты вообще», а не про конкретный код. То же самое с артикулами товаров, именами людей, аббревиатурами и номерами статей закона.

Лексический поиск BM25 (взвешенное совпадение слов, наследник TF-IDF) — наоборот: точный термин «E404B» найдёт мгновенно, но спасует перед синонимами. Запрос «платёж не проходит» не найдёт документ «оплата отклоняется на шаге подтверждения» — ни одного общего слова. Слабости двух методов не пересекаются, поэтому их объединение почти всегда выигрывает у каждого по отдельности.

Как это работает: слияние и RRF

Гибридный поиск (hybrid search) выполняет два поиска параллельно и сливает списки. Проблема: скоры BM25 (условные 0–20) и косинусная близость (0–1) живут в разных шкалах — складывать их напрямую нельзя. Решение — Reciprocal Rank Fusion (RRF), которое смотрит только на позиции документов:

RRF(d) = Σсписки 1 / (k + ranki(d)),   k ≈ 60

Документ получает тем больше очков, чем выше он стоит в каждом списке; константа k сглаживает вклад первых позиций, чтобы одно первое место не перевешивало всё. Главный плюс RRF — не нужна калибровка скоров: ранги сравнимы всегда. Альтернатива — взвешенная сумма нормализованных скоров, где весом задают баланс «лексика ↔ семантика».

Второй этап: реранкер

Ретривер первого этапа — bi-encoder: запрос и документ кодируются отдельно, векторы документов предвычислены заранее, поэтому поиск по миллионам документов занимает миллисекунды. Но раздельное кодирование — это потеря точности: модель не видит запрос и документ вместе.

Реранкер (reranker) — cross-encoder: он читает пару «запрос + документ» целиком одним проходом и выдаёт точный скор релевантности. Это на порядки дороже, поэтому его применяют только к топу выдачи: дешёвый ретривер отдаёт топ-50 кандидатов, cross-encoder аккуратно пересортировывает их. Цена — латентность: десятки инференсов трансформера на каждый запрос.

💡 Ключевая мысль Двухэтапная схема разделяет ответственность: ретривер отвечает за recall (не потерять нужное среди миллионов), реранкер — за precision (поставить нужное на самый верх).

Поставь вес на 0 или 1 — recall@3 гибрида падает до уровня одиночного метода: BM25 тащит наверх справочник кодов и changelog (точный термин есть, пользы нет), вектор — «возвраты платежей» (похоже по смыслу, не то по сути). На средних весах гибрид собирает все три релевантных документа. А реранкер спасает даже плохую первую стадию: включи его при крайнем весе — релевантные документы всплывают из топ-4 наверх, но латентность вырастает в разы.

Что выбрать на практике

Дефолт продакшна в 2025+ году: гибрид (BM25 + вектор, слияние через RRF) + cross-encoder-реранкер поверх топ-50. Отключать компоненты стоит только по замерам: если корпус — сплошные артикулы и логи, вектор может почти ничего не добавлять; если латентность критична (автодополнение), реранкер выкидывают первым. Любое решение проверяется метриками ретривера на своём золотом сете — об этом в теме оценка качества RAG.

⚠️ Подводный камень Реранкер пересортировывает только то, что дал ретривер. Если релевантный документ не попал в топ-50 первой стадии, никакой cross-encoder его не вернёт: recall ретривера — жёсткий потолок качества всей системы. Сначала добивайся высокого recall на первом этапе, потом полируй порядок реранкером.
🎤 На собеседовании
  • «Чем bi-encoder отличается от cross-encoder?» — раздельное кодирование (векторы предвычислены, поиск быстрый, точность ниже) против совместного чтения пары (точность выше, но O(N) инференсов — только для реранкинга топа).
  • «Почему RRF, а не сумма скоров?» — скоры BM25 и косинус живут в несравнимых шкалах; RRF работает с рангами и не требует калибровки.
  • «Когда чистого векторного поиска мало?» — точные термины: артикулы, коды ошибок, имена, аббревиатуры, номера статей.
  • «Какую цену платим за реранкер?» — латентность и стоимость инференса; поэтому он применяется к топ-N, а не ко всей базе.