EnglishРусский Map

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

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:

  1. Запустить BM25 по всем документам, получить топ-N результатов с оценками
  2. Посчитать косинусное сходство по эмбеддингам, получить топ-N результатов с оценками
  3. Нормализовать каждый набор оценок к диапазону [0, 1]
  4. Объединить: final_score = α × bm25_score + (1 - α) × embedding_score
  5. Переранжировать по итоговому баллу и обрезать по лимиту токенов

Ключевое архитектурное решение здесь - плавная деградация (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 строит более простой поиск только по ключевым словам с помощью multiEntry inverted-index в indexeddb. Без ранжирования, но этого достаточно для поиска по истории чата, где нужны просто "сообщения, содержащие эти слова".

Применимость к этой базе знаний

Если эта база знаний разрастётся настолько, что просмотра каталогов станет недостаточно, гибридный поиск станет основным подходом к извлечению информации. BM25 возьмёт на себя поиск конкретных терминов (например, на какой странице упоминается "FLP impossibility"), а эмбеддинги - концептуальные запросы ("что нам известно о сбоях координации AI-агентов"). qmd уже умеет делать это для markdown-файлов и предоставляет MCP-сервер для интеграции с Claude Code.

Sub-pages