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

> Гибридный поиск и реранкинг: BM25 + векторы, fusion и cross-encoder — прод-рецепт RAG и вопросы на интервью.

Раздел: [RAG: поиск + генерация](https://ml-book.com/s/rag/) · Страница темы: https://ml-book.com/t/hybrid-rerank/ · Обновлено: 2026-09-16 · Источник: ml-book.com, учебник делается сообществом

## Интуиция

Пользователь пишет: «ошибка E404B при оплате». Векторный поиск (см. [векторный поиск](https://ml-book.com/t/vector-search/)) превратит запрос в точку смысла — и артикул «E404B» в ней размажется: для модели эмбеддингов это просто редкая последовательность символов без выученного значения. Найдутся документы «про ошибки оплаты вообще», а не про конкретный код. То же самое с артикулами товаров, именами людей, аббревиатурами и номерами статей закона.

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

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

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

`RRF(d) = Σ_{списки} 1 / (k + rank_i(d)), k ≈ 60`

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

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

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

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

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

> 🎛 Интерактивная визуализация — на странице темы: https://ml-book.com/t/hybrid-rerank/

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

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

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

> **⚠️ Подводный камень**
>
> Реранкер пересортировывает только то, что дал ретривер. Если релевантный документ не попал в топ-50 первой стадии, никакой cross-encoder его не вернёт: recall ретривера — жёсткий потолок качества всей системы. Сначала добивайся высокого recall на первом этапе, потом полируй порядок реранкером.

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

## Связанные темы

- [Векторный поиск и ANN-индексы](https://ml-book.com/t/vector-search/)
- [Чанкинг и подготовка данных](https://ml-book.com/t/chunking/)
- [MMR и разнообразие выдачи](https://ml-book.com/t/mmr-diversity/)
- [Оценка качества RAG](https://ml-book.com/t/rag-eval/)

---

Интерактив, тест из 12 вопросов и карточки терминов — на странице темы: https://ml-book.com/t/hybrid-rerank/
Весь учебник в markdown: https://ml-book.com/llms-full.txt · Оглавление для агентов: https://ml-book.com/llms.txt
