Что такое гибридный поиск и когда он нужен?

Краткий тезис

поиск|Гибридный поиск — это комбинация векторного (семантического) поиска и ключевого (лексического) поиска. поиск|Векторный поиск находит документы по смыслу, но может пропустить точные термины (ID, номера заказов, коды). поиск|Ключевой поиск находит точные слова, но не понимает синонимы и контекст. поиск|Гибридный поиск объединяет сильные стороны обоих методов, давая лучшие результаты в RAG-системах.


1. Термин: Гибридный поиск (Hybrid Search)

Что это Поисковая стратегия, которая объединяет результаты двух разных алгоритмов:

  • Векторный поиск (семантический) — ищет по смыслу через эмбеддинги
  • Ключевой поиск (лексический) — ищет по точным словам через index|инвертированный индекс (BM25, TF-IDF)

Простая аналогия

  • Векторный поиск — как друг, который понимает, что вы имеете в виду ("купить машину" → найдёт "автомобиль")
  • Ключевой поиск — как поиск Ctrl+F, ищет точное слово ("заказ №A-123" → найдёт только этот номер)

Термин «BM25» (Best Matching 25 Алгоритм ключевого поиска, который учитывает частоту слова в документе (TF), редкость слова в коллекции (IDF) и длину документа. Стандарт в Elasticsearch, Lucene, Qdrant.

Термин «TF-IDF» (Term Frequency — Inverse Document Frequency Более старый алгоритм, предшественник BM25. До сих пор используется, но BM25 обычно лучше.

Термин «Инвертированный индекс» (Inverted Index Структура данных для ключевого поиска: для каждого слова хранится список документов, где это слово встречается. Быстрый поиск по точным словам.


2. Почему одного векторного поиска недостаточно?

Проблемы векторного поиска

ПроблемаПримерПочему векторный поиск не работает
Точные термины (ID, коды, номера"Заказ №A-123-45"Эмбеддинг номера заказа не отличается от случайных чисел. Модель не понимает, что это точный идентификатор
Редкие слова (имена, бренды"Компания ООО Ромашка-Сервис"Если бренд редкий в обучающих данных, эмбеддинг будет случайным
Короткие запросы"iPhone 15"Векторный поиск может найти "смартфон Apple" (по смыслу), но нужен конкретный iPhone 15
Доменные аббревиатуры"API", "CRM", "LLM"Векторный поиск понимает аббревиатуры, но точный поиск часто надёжнее
Даты и числа"2025 год", "1000 рублей"Векторный поиск теряет точность для чисел

Термин «Редкое слово» Слово, которое редко встречается в текстах (например, специфический бренд, фамилия, термин). BM25 хорошо работает с редкими словами (они получают высокий IDF).

Термин «IDF» (Inverse Document Frequency Мера редкости слова: чем реже слово, тем выше IDF. Слово "кошка" встречается часто → низкий IDF. Слово "гиппопотомонстросесквиппедалиофобия" редко → высокий IDF.


3. Почему одного ключевого поиска (BM25) недостаточно?

Проблемы ключевого поиска

ПроблемаПримерПочему BM25 не работает
Синонимы"купить автомобиль" vs "приобрести машину"Нет общих слов, BM25 не найдёт
Перефразирование"как поменять масло" vs "инструкция по замене масла"BM25 видит только "масло"
Опечатки"машна" вместо "машина"BM25 не умеет исправлять опечатки
Смысл и контекст"быстрый" (в контексте автомобиля vs компьютера)BM25 не понимает контекст
Разные языки"car" и "машина"BM25 не связывает переводы

Термин «Лексический разрыв» (Lexical Gap Разные слова могут выражать один смысл ("автомобиль" vs "машина"). BM25 не умеет преодолевать лексический разрыв.


4. Как работает гибридный поиск

4.1 Двухэтапный процесс

Запрос пользователя
        │
        ├─────────────────┬─────────────────┐
        ▼                 ▼                 ▼
  Векторный поиск    Ключевой поиск    Другие методы
  (semantic)         (BM25/lexical)    (фильтры, релевантность)
        │                 │                 │
        ▼                 ▼                 ▼
   Результат A       Результат B       Результат C
   (векторы)         (по ключевым)      (метаданные)
        │                 │                 │
        └─────────────────┴─────────────────┘
                          ▼
                  Объединение результатов
                  (RRF или взвешенная сумма)
                          │
                          ▼
                   Финальный ранжированный
                   список документов

Термин «Объединение результатов» (Fusion Процесс комбинирования списков документов из разных источников в один.


4.2 Метод 1: Взвешенная сумма (Weighted Sum)

Формула

score_final(doc) = α × score_vector(doc) + (1-α) × score_bm25(doc)

Термин «α (альфа)» Вес векторного поиска (от 0 до 1). α=0.7 означает 70% векторный поиск, 30% BM25.

αИнтерпретация
1.0Только векторный поиск (чистый семантический)
0.7-0.9Уклон в векторный (для обычных текстов)
0.5Равный вес (баланс)
0.3-0.5Уклон в BM25 (для точных терминов)
0.0Только BM25 (чистый ключевой)

Проблема Нужно нормализовать scores, потому что vector_score (косинусное расстояние от -1 до 1) и BM25_score (не ограничен, может быть 10-100) в разных масштабах.

Решение нормализации

def normalize(scores):
    """Min-max normalization to [0, 1]"""
    min_s = min(scores)
    max_s = max(scores)
    return [(s - min_s) / (max_s - min_s) for s in scores]

Когда использовать Когда есть чёткое понимание важности векторного vs ключевого поиска. Можно настраивать α через A/B тесты.


4.3 Метод 2: RRF (Reciprocal Rank Fusion)

Что это Метод объединения результатов, основанный на рангах (позициях), а не на сырых скорах.

Формула

RRF_score(doc) = Σ 1 / (k + rank_i(doc))

где:

  • rank_i(doc) — позиция документа в i-м списке (1, 2, 3...)
  • k — константа (обычно 60), чтобы не давать слишком большой вес первым позициям

Пример:

Документ X в векторном поиске: rank = 1
Документ X в BM25: rank = 3

RRF_score = 1/(60+1) + 1/(60+3) = 1/61 + 1/63 ≈ 0.0164 + 0.0159 ≈ 0.0323

Преимущества RRF

  • Не нужна нормализация скорингов (работает только с рангами)
  • Робастный (не чувствителен к выбросам)
  • Простой и быстрый

Термин «Робастность» (Robustness Устойчивость к выбросам и аномалиям. RRF не ломается, если один из поисков вернул необычные скоры.

Когда использовать Дефолтный выбор для гибридного поиска Работает почти всегда без настройки.


5. Сравнение методов объединения

МетодСложностьНужна нормализацияЧувствительность к выбросамНастройкаКогда лучше
Weighted SumНизкаяДаВысокаяαИзвестны веса
RRFНизкаяНетНизкаяk=60Дефолтный выбор
Learning-to-RankВысокаяНетСредняяОбучениеБольшие датасеты

Термин «Learning-to-Rank» Машинное обучение для ранжирования. Обучаем модель предсказывать релевантность на основе фичей (BM25 score, vector similarity, recency, authority). Самый точный, но требует много данных.


6. Когда гибридный поиск нужен (use cases)

Use caseПочему нужен гибридный поискПример
Юридические документыНомера статей, пунктов, законов — точные термины. Клиенты спрашивают "статья 125" (точный поиск) и "ответственность за кражу" (семантический)"статья 105 УК РФ" + "какое наказание за убийство"
Техподдержка (SupportНомера заказов, тикеты, ID пользователей. Пользователи часто цитируют точные идентификаторы"Заказ #R12345 не пришёл" (точный ID) + "как отменить заказ" (смысл)
E-commerceАртикулы товаров (SKU, ISBN, ASIN). Пользователи ищут как по названию, так и по коду"iPhone 15" (название) и "MPNP3LL/A" (артикул)
МедицинаКоды диагнозов (МКБ-10), названия лекарств. Врачи ищут и по кодам, и по описаниям"J45.0" (код астмы) + "препараты от астмы"
ЛогистикаНомера накладных, трек-номера. Клиенты вводят точный номер"TRK123456789" и "где моя посылка"
Внутренние базы знанийID документов, версии, даты. Технические пользователи ищут по ID и по содержанию"DOC-2025-001" и "политика возврата"

7. Когда гибридный поиск НЕ нужен

Use caseПочему не нуженЧто использовать
Чисто семантический поискНет точных терминов, только смысл (синонимы, перефразирование)Только векторный поиск
Поиск по изображениямНет текстовых ключевых словCLIP + векторный поиск
Рекомендательные системы"Похожие товары" — чистая семантикаВекторный поиск
Поиск с синонимайзеромЕсли у вас есть свой словарь синонимов для BM25BM25 + синонимы

Термин «Синонимайзер» Система, которая расширяет запрос синонимами ("автомобиль" → "машина, авто, транспорт").


8. Реализация гибридного поиска в популярных векторных БД

Qdrant (рекомендуется из вопроса 4)

from qdrant_client import QdrantClient
from qdrant_client.http.models import HybridSearch, ScoredPoint

client = QdrantClient(host="localhost", port=6333)

results = client.search(
    collection_name="documents",
    query_vector=embedding,  # вектор запроса
    query=query_text,        # текст запроса для BM25
    search_params=HybridSearch(
        ranker=RRFRanker(),  # или WeightedRanker(vector=0.7, bm25=0.3)
        limit=10
    )
)

Плюсы Qdrant Гибридный поиск из коробки, RRF встроен, gRPC быстро.


Weaviate

import weaviate

client = weaviate.Client("http://localhost:8080")

results = client.query.get(
    "Document", ["text", "source"]
).with_hybrid(
    query=query_text,
    alpha=0.5,  # вес vector (1-alpha — вес BM25)
    limit=10
).do()

Pinecone

Ограничение Pinecone не поддерживает гибридный поиск из коробки (только векторный).

Обход Отдельный Elasticsearch для BM25 + Pinecone для векторов + объединение в приложении.


9. Полный пример реализации (Qdrant + RRF)

from qdrant_client import QdrantClient
from qdrant_client.http.models import (
    VectorParams, Distance, HybridSearch, RRFRanker
)
from sentence_transformers import SentenceTransformer

# 1. Инициализация
client = QdrantClient(host="localhost", port=6333)
encoder = SentenceTransformer("BAAI/bge-m3")

# 2. Создание коллекции с поддержкой гибридного поиска
client.create_collection(
    collection_name="hybrid_docs",
    vectors_config=VectorParams(size=1024, distance=Distance.COSINE),
    # Qdrant автоматически создаст BM25 индекс
)

# 3. Загрузка документов
documents = ["текст документа 1", "текст документа 2", ...]
for doc in documents:
    vector = encoder.encode(doc).tolist()
    client.upsert(
        collection_name="hybrid_docs",
        points=[{
            "id": i,
            "vector": vector,
            "payload": {"text": doc}
        }]
    )

# 4. Гибридный поиск
query = "заказ №12345"
query_vector = encoder.encode(query).tolist()

results = client.search(
    collection_name="hybrid_docs",
    query_vector=query_vector,
    query=query,  # текст для BM25
    search_params=HybridSearch(
        ranker=RRFRanker(k=60)  # RRF с k=60
    ),
    limit=10
)

for result in results:
    print(f"Score: {result.score}, Text: {result.payload['text']}")

10. Настройка гибридного поиска под ваш домен

ДоменРекомендуемый α (вес vector)Почему
Юриспруденция0.5-0.6Равный баланс (нужны и точные номера статей, и семантика)
Техподдержка0.4-0.5Больше важности точным ID заказов
E-commerce0.6-0.7Семантика важнее, но нужны и артикулы
Медицина0.5-0.6Коды диагнозов + описание симптомов
Общий текст0.7-0.8Семантика важнее

Термин «Тюнинг α» (Alpha Tuning Подбор оптимального веса через A/B тесты или grid search на валидационном датасете.


11. Пет-проект для закрепления

Задача Сравнить векторный поиск, BM25 и гибридный поиск на датасете из 1000 документов.

Инструменты Python, Qdrant (Docker), BGE-m3, датасет с документами и запросами

Шаги

  1. Собрать 1000 документов (можно новости, статьи, инструкции)
  2. Создать 50 запросов: 25 семантических ("как поменять масло"), 25 с точными терминами ("инструкция №12345")
  3. Вручную разметить для каждого запроса релевантные документы (gold standard)
  4. Реализовать три подхода:
    • Только векторный поиск (α=1.0)
    • Только BM25 (α=0.0)
    • Гибридный с RRF
  5. Замерить MRR@10 и Recall@10 для каждого подхода
  6. Сравнить: на каких запросах какой подход лучше

Ожидаемый результат Гибридный поиск даст лучший MRR на смешанных запросах. Векторный — на семантических. BM25 — на точных терминах.


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

ВопросТема
1RAG архитектура (этап retrieval)
4Выбор векторной БД (Qdrant поддерживает гибридный)
5Оценка retrieval (MRR, Recall — подходят для сравнения)
12Фильтрация по метаданным (можно комбинировать с гибридным)
233Hybrid search в production на 10M документов
371-380Search & ranking (глубже про LTR, LambdaMART)

6. Что такое гибридный поиск и когда он нужен|6. Что такое гибридный поиск и когда он нужен|6. Что такое гибридный поиск и когда он нужен|6 полностью разобран. Переходим к вопросу 7, когда будете готовы|Вопрос 6 полностью разобран. Переходим к вопросу 7, когда будете готовы]]


Навигация