Aivaro
  • Оглавление
  • Вопросы
  • Практика
  • Вики
  • Материалы сообщества
  • Тесты
  • Поиск
✈Telegram @ai_varo
RUEN中文
…
Оглавление/Вопросы/#912

Что такое 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:

  1. Насыщение (saturation) — рост tf не приводит к бесконечному росту оценки, эффект от увеличения tf затухает.
  2. Длина документа — длинные документы штрафуются, если терм встречается редко относительно длины.
  3. Независимость термов — 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. Два этапа

  1. Сбор кандидатов — BM25 и ANN-поиск (approximate nearest neighbor) работают параллельно. Каждый возвращает top‑k документов.
  2. Реранжирование — объединение или реранкер (например, 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.

Шаги:

  1. Подготовка корпуса — 100–200 коротких текстов (например, новости или вики-статьи).
  2. Токенизация и построение инвертированного индекса — реализовать BM25Okapi из библиотеки rank_bm25 или написать свою.
  3. Вычисление эмбеддингов — для каждого документа получить вектор и сохранить.
  4. Функции поиска:
    • BM25: retrieve_bm25(query, k=5)
    • Dense: retrieve_dense(query, k=5)
    • Hybrid: комбинация с ([alpha](/wiki/alpha)=0.3) (можно подобрать вручную).
  5. Оценка качества — задать 10 тестовых запросов, сравнить точность релевантных документов (субъективно) для каждого метода.

Ожидаемый результат:

  • Таблица с индексами документов и оценками для конкретного запроса.
  • Вывод: гибридный метод не всегда даёт строго лучший результат, но стабильно выше в метриках precision@5 и nDCG@5.

Связь с другими вопросами

ВопросТема
6Эмбеддинги текстов
41ANN и его роль в векторном поиске

Навигация

  • Предыдущий: 911
  • Следующий: 913
  • Индекс: 00. Индекс разборов