Что такое TF-IDF и BM25? Почему BM25 до сих пор используется в гибридном поиске, даже при наличии эмбеддингов?
Краткий тезис
TF-IDF и BM25 — классические ранжирующие функции информационного поиска, основанные на подсчёте точного совпадения термов между запросом и документом. BM25 представляет собой эволюцию TF-IDF, добавляющую нелинейное насыщение частоты терма и нормализацию длины документа. Несмотря на повсеместное внедрение плотных эмбеддингов и нейросетевых ранжировщиков, BM25 остаётся критическим компонентом в гибридном поиске, поскольку его лексическое сходство компенсирует слабые места семантического поиска: редкие термины, точные именованные сущности и полное отсутствие контекста в коротких запросах.
2. BM25: saturation, length normalization
BM25 (Best Matching 25) — вероятностная модель Okapi BM25, устраняющая недостатки TF-IDF:
[ [text](/wiki/text){BM25}(t,d) = IDF(t) \cdot \frac{tf(t,d) \cdot (k_1 + 1)}{tf(t,d) + k_1 \cdot \left(1 - b + b \cdot \frac{|d|}{[text](/wiki/text){avgdl}}\right)} ]
где:
- (k_1) — параметр насыщения (обычно 1.2–2.0). Чем больше (k_1), тем медленнее наступает насыщение.
- (b) — параметр нормализации длины (0.0 – 1.0). При (b=0) длина игнорируется, при (b=1) — полная коррекция.
- (|d|) — длина документа в термах, ([text](/wiki/text){avgdl}) — средняя длина по коллекции.
- (IDF(t)) — аналог idf, но сглаженный:
[ IDF(t) = \log\frac{N - df(t) + 0.5}{df(t) + 0.5} + 1 ]
Ключевые улучшения BM25:
- Насыщение (saturation) — рост tf не приводит к бесконечному росту оценки, эффект от увеличения tf затухает.
- Длина документа — длинные документы штрафуются, если терм встречается редко относительно длины.
- Независимость термов — BM25 суммирует вклады термов как независимые события, что упрощает реализацию и даёт хорошие результаты за счёт простоты.
На практике BM25 часто применяется с модификациями:
- BM25F — с учётом полей (заголовок, тело, анкоры).
- BM25+ — добавление константного члена для смягчения штрафа очень коротких документов.
3. Почему BM25 жив: точное совпадение терминов
Эмбеддинги (SBERT, text-embedding-3 и др.) отлично находят семантически похожие документы, но уступают BM25 в нескольких принципиальных сценариях:
3.1. Редкие и специфические термины
Если пользователь ищет строку «Qwen2.5-7B-Instruct 4‑bit quantized», эмбеддинг запроса может размыть точные токены, тогда как BM25 найдёт документы, содержащие буквально этот набор слов. Это критично для поиска в технической документации, кодовых базах, юридических текстах.
3.2. Именованные сущности (NER)
Запрос «улица Ленина, дом 10» — эмбеддинг может сопоставить его с любым адресом, содержащим «Ленина», но BM25 отфильтрует по числовому значению и точному названию.
3.3. Короткие запросы и холодный старт
При длине запроса в 1–3 слова семантический контекст не формируется, и эмбеддинги показывают близость к случайным темам. BM25 же даёт точечное лексическое вхождение.
3.4. Прозрачность и интерпретируемость
BM25 объясним — каждое совпадение термина видно в snippet. Это важно для систем, где пользователь хочет понимать, почему найден документ.
3.5. Нулевое время инференса (на этапе поиска)
Для BM25 не нужно запускать нейросеть — дешёвый инвертированный индекс и подсчёт весов. Для миллиардов документов это экономит огромные ресурсы.
4. Гибридный поиск: весовая комбинация с эмбеддингами
Современные RAG-пайплайны объединяют лексический и семантический поиск в гибридную схему.
4.1. Два этапа
- Сбор кандидатов — BM25 и ANN-поиск (approximate nearest neighbor) работают параллельно. Каждый возвращает top‑k документов.
- Реранжирование — объединение или реранкер (например, cross-encoder) уточняет итоговый порядок.
4.2. Комбинирование весов
Популярный подход — взвешенная сумма нормализованных оценок:
[ [text](/wiki/text){score}(q,d) = [alpha](/wiki/alpha) \cdot [text](/wiki/text){BM25}(q,d) + (1-[alpha](/wiki/alpha)) \cdot [text](/wiki/text){cosine_sim}([text](/wiki/text){embed}(q), [text](/wiki/text){embed}(d)) ]
Альтернатива — реранкер на основе LambdaRank или ListNet, обученный на пользовательских кликах.
4.3. Преимущества гибридного поиска
- Взаимная компенсация: BM25 «ловит» точные вхождения, эмбеддинги — синонимы и перефразировки.
- Робастность: если эмбеддинговая модель плохо обобщает на домен (например, медицинские термины на русском), BM25 страхует лексическим совпадением.
- Поддержка OOV (out-of-vocabulary): BM25 не требует словаря — любой токен (даже слитный «нейросетьобучение») будет найден, если есть в документах.
Пример конфигурации гибридного поиска в Elasticsearch:
{
"query": {
"hybrid": {
"queries": [
{ "match": { "content": "нейронные сети" } },
{ "knn": { "vector": [0.1, …], "k": 10 } }
],
"weights": [0.3, 0.7]
}
}
}
5. Пет-проект для закрепления
Задача: Реализовать консольный поисковик по текстовым файлам (корпус — статьи на русском языке), который выводит топ-5 результатов по запросу, используя BM25, эмбеддинги (SentenceTransformer) и их гибрид.
Инструменты:
- Python 3.10+,
nltk/pymorphy2для токенизации и лемматизации. sentence-transformers(модельparaphrase-multilingual-MiniLM-L12-v2).scikit-learn(TfidfVectorizerдля сравнения).numpy,json.
Шаги:
- Подготовка корпуса — 100–200 коротких текстов (например, новости или вики-статьи).
- Токенизация и построение инвертированного индекса — реализовать
BM25Okapiиз библиотекиrank_bm25или написать свою. - Вычисление эмбеддингов — для каждого документа получить вектор и сохранить.
- Функции поиска:
- BM25:
retrieve_bm25(query, k=5) - Dense:
retrieve_dense(query, k=5) - Hybrid: комбинация с ([alpha](/wiki/alpha)=0.3) (можно подобрать вручную).
- BM25:
- Оценка качества — задать 10 тестовых запросов, сравнить точность релевантных документов (субъективно) для каждого метода.
Ожидаемый результат:
- Таблица с индексами документов и оценками для конкретного запроса.
- Вывод: гибридный метод не всегда даёт строго лучший результат, но стабильно выше в метриках precision@5 и nDCG@5.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 6 | Эмбеддинги текстов |
| 41 | ANN и его роль в векторном поиске |
Навигация
- Предыдущий: 911
- Следующий: 913
- Индекс: 00. Индекс разборов