Гибридный поиск
- title
- Гибридный поиск
- type
- concept
- summary
- Объединение поиска по ключевым словам BM25 и сходства эмбеддингов для более точной выборки
- tags
- search, information-retrieval, ai-agents
- created
- 2026-04-07
- updated
- 2026-04-07
- lang
- ru
- translation_of
- hybrid-search
- source_updated
- 2026-04-07
- translated
- 2026-09-01
- translator
- lllm/antigravity/gemini-3.7-flash-medium
Объединение поиска по ключевым словам (BM25) с семантическим поиском на базе векторов и эмбеддингов с последующим смешиванием их оценок для ранжирования. По отдельности ни один из подходов не покрывает все типы запросов достаточно хорошо. Вместе же они справляются как с точными совпадениями терминов, так и со смысловым сходством.
Зачем нужны оба подхода
BM25 (поиск по ключевым словам) оценивает документы по частоте терминов и обратной частоте документа (TF-IDF). Он работает быстро, не требует ML-моделей и отлично справляется с точными совпадениями - поиск по запросу "ECONNREFUSED" найдёт документы, содержащие ровно эту строку. При этом он спотыкается на синонимах и перефразированиях: запрос "connection refused" может упустить документы, где написано лишь "socket error".
Поиск по эмбеддингам (семантический или векторный поиск) кодирует запросы и документы в виде векторов, а затем находит ближайшие совпадения по косинусному расстоянию. Он отлично работает с синонимами и парафразами - "connection refused" и "socket error" оказываются рядом в векторном пространстве. Но он уступает на точных идентификаторах: запрос "ECONNREFUSED" может вернуть документы о сетях в целом, а не о конкретном коде ошибки.
Гибридный поиск объединяет оба метода: параллельно запускаются BM25 и поиск по эмбеддингам, их оценки нормализуются и смешиваются с настраиваемым весом (часто 0.5/0.5 или 0.7 для BM25 / 0.3 для эмбеддингов).
Практическая реализация
Простейший подход, используемый в hippo-memory и qmd:
- Запустить BM25 по всем документам, получить топ-N результатов с оценками
- Посчитать косинусное сходство по эмбеддингам, получить топ-N результатов с оценками
- Нормализовать каждый набор оценок к диапазону [0, 1]
- Объединить:
final_score = α × bm25_score + (1 - α) × embedding_score - Переранжировать по итоговому баллу и обрезать по лимиту токенов
Ключевое архитектурное решение здесь - плавная деградация (graceful degradation). Если эмбеддинги недоступны (модель не установлена, холодный старт, нехватка ресурсов), система откатывается только на BM25. Результаты должны возвращаться всегда: поиск по эмбеддингам - это улучшение, а не строгое требование.
Reciprocal Rank Fusion (RRF)
Альтернатива смешиванию оценок: вместо нормализации исходных баллов результаты каждой системы ранжируются, после чего объединяются уже сами ранги. Оценка RRF = Σ(1 / (k + rank_i)) по всем источникам выборки. Это решает проблему нормализации оценок (у BM25 и косинусного сходства сильно различаются распределения) и отлично работает при объединении результатов более чем из двух источников.
Где это применяется
- RAG-пайплайны - большинство промышленных систем генерации с дополнением выборкой (RAG) используют гибридный поиск для нахождения подходящих фрагментов контекста. Чистый поиск по эмбеддингам упускает точные ссылки в коде, а чистый BM25 не видит семантических связей.
- Память агентов - hippo-memory использует BM25 по умолчанию как всегда доступный вариант и добавляет сходство эмбеддингов, когда установлен @xenova/transformers.
- Инструменты локального поиска - qmd объединяет BM25, векторы и LLM-переранжирование для поиска по markdown-файлам.
- Поиск по документам - Elasticsearch, Meilisearch и Typesense поддерживают режимы гибридного поиска, объединяя полнотекстовые и векторные индексы.
- Поиск на стороне клиента - full-text-search-indexeddb строит более простой поиск только по ключевым словам с помощью
multiEntryinverted-index в indexeddb. Без ранжирования, но этого достаточно для поиска по истории чата, где нужны просто "сообщения, содержащие эти слова".
Применимость к этой базе знаний
Если эта база знаний разрастётся настолько, что просмотра каталогов станет недостаточно, гибридный поиск станет основным подходом к извлечению информации. BM25 возьмёт на себя поиск конкретных терминов (например, на какой странице упоминается "FLP impossibility"), а эмбеддинги - концептуальные запросы ("что нам известно о сбоях координации AI-агентов"). qmd уже умеет делать это для markdown-файлов и предоставляет MCP-сервер для интеграции с Claude Code.