Что такое гибридный поиск и когда он нужен?
Краткий тезис
поиск|Гибридный поиск — это комбинация векторного (семантического) поиска и ключевого (лексического) поиска. поиск|Векторный поиск находит документы по смыслу, но может пропустить точные термины (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 + векторный поиск |
| Рекомендательные системы | "Похожие товары" — чистая семантика | Векторный поиск |
| Поиск с синонимайзером | Если у вас есть свой словарь синонимов для BM25 | BM25 + синонимы |
Термин «Синонимайзер» Система, которая расширяет запрос синонимами ("автомобиль" → "машина, авто, транспорт").
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-commerce | 0.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, датасет с документами и запросами
Шаги
- Собрать 1000 документов (можно новости, статьи, инструкции)
- Создать 50 запросов: 25 семантических ("как поменять масло"), 25 с точными терминами ("инструкция №12345")
- Вручную разметить для каждого запроса релевантные документы (gold standard)
- Реализовать три подхода:
- Только векторный поиск (α=1.0)
- Только BM25 (α=0.0)
- Гибридный с RRF
- Замерить MRR@10 и Recall@10 для каждого подхода
- Сравнить: на каких запросах какой подход лучше
Ожидаемый результат Гибридный поиск даст лучший MRR на смешанных запросах. Векторный — на семантических. BM25 — на точных терминах.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 1 | RAG архитектура (этап retrieval) |
| 4 | Выбор векторной БД (Qdrant поддерживает гибридный) |
| 5 | Оценка retrieval (MRR, Recall — подходят для сравнения) |
| 12 | Фильтрация по метаданным (можно комбинировать с гибридным) |
| 233 | Hybrid search в production на 10M документов |
| 371-380 | Search & ranking (глубже про LTR, LambdaMART) |
6. Что такое гибридный поиск и когда он нужен|6. Что такое гибридный поиск и когда он нужен|6. Что такое гибридный поиск и когда он нужен|6 полностью разобран. Переходим к вопросу 7, когда будете готовы|Вопрос 6 полностью разобран. Переходим к вопросу 7, когда будете готовы]]
Навигация
- Предыдущий: 5
- Следующий: 7
- Индекс: 00. Индекс разборов