Hybrid Search
hybrid search — комбинация семантического и keyword-поиска
Hybrid Search — комбинация semantic search (по векторам смысла) и keyword search (BM25, по точным словам). Каждый ловит то, что упускает другой: semantic понимает синонимы, keyword находит точные термины (артикулы, имена, технические коды). Результаты сливаются через RRF (Reciprocal Rank Fusion) или weighted combination. К 2026-му стандарт для RAG-приложений в production.
Коротко
Коротко. Hybrid Search — это объединение двух поисков: semantic (по embedding-векторам, ловит смысл) и keyword (BM25, ловит точные слова). Каждый делает свой запрос параллельно, потом результаты сливаются через RRF (Reciprocal Rank Fusion) или weighted scoring. Главный плюс: semantic понимает синонимы, keyword не теряет уникальные термины (артикулы, имена). К 2026-му это default-стандарт для RAG.
Что это такое
Команда строит RAG-ассистента для интернет-магазина электроники. Тестирует два подхода:
Чистый Semantic Search:
- «Как настроить Wi-Fi на Sony WH-1000XM5» → находит общие статьи про настройку наушников. Артикул потерялся в семантике.
- «Возврат не работает» → находит «refund procedure», «как сделать возврат» — отлично.
Чистый Keyword Search (BM25):
- «Sony WH-1000XM5 настройка» → точно находит документ про эту модель.
- «Возврат не работает» → находит документы со словом «не работает», но про другое (наушники не работают, оплата не работает).
Оба плохи в чистом виде. Hybrid Search: запускает оба параллельно, объединяет результаты:
- Для «Sony WH-1000XM5» — keyword находит точный документ, ставит на 1 место.
- Для «возврат не работает» — semantic находит «refund procedure», ставит на 1 место.
Каждый запрос автоматически идёт в «свой» сильный поисковик. Качество — лучше любого из них в отдельности на 10–30%.
К 2026-му Hybrid Search — индустриальный стандарт для production RAG. Поддерживается всеми крупными vector DB (Qdrant, Weaviate, Pinecone, Vespa, Postgres+pgvector).
Как это работает
Двухпоточный pipeline:
Query
│
├──→ [Embedding] ──→ [Vector DB] ──→ Top-10 semantic results
│
└──→ [Tokenize] ──→ [BM25 index] ──→ Top-10 keyword results
│
[Fusion: RRF or weighted]
│
Top-5 final
Главные методы fusion:
Reciprocal Rank Fusion (RRF)
Самый популярный, простой:
def rrf_score(rank, k=60):
return 1 / (k + rank)
# для каждого документа из любого источника
final_score[doc_id] = rrf_score(semantic_rank) + rrf_score(keyword_rank)
Документы, которые попали в оба топа, получают двойной счёт и поднимаются вверх. Параметр k=60 — стандарт.
Weighted Score Combination
final_score = α × semantic_score + (1-α) × keyword_score
Где α — балансовый параметр (обычно 0.5–0.7 в пользу semantic). Требует нормализации scores.
Пример на практике
Команда строит RAG для документации Cisco (сетевое оборудование). 50 000 страниц технических manual'ов с тысячами артикулов и кодов.
Без Hybrid:
- Semantic only: пользователь ищет «WS-C2960X-48LPS-L spec» — находит общие статьи про коммутаторы. Артикул потерял.
- Keyword only: ищет «как настроить vlan» — находит много документов с «vlan», но не понимает, что нужны Cisco-vlans, не другие.
С Hybrid Search через Qdrant:
from qdrant_client import QdrantClient
from qdrant_client.http import models
# Hybrid query — Qdrant поддерживает нативно с 2024
results = qdrant.query_points(
collection_name="cisco_docs",
query=models.NearestQuery(nearest=query_vector), # semantic
using="dense",
prefetch=models.Prefetch(
query=models.SparseVector(...), # BM25-like sparse vector
using="sparse",
limit=20
),
limit=5
)
Результаты:
- «WS-C2960X-48LPS-L spec» → keyword даёт 1-й результат точное совпадение, semantic поддерживает «коммутатор», RRF поднимает на топ-1.
- «как настроить vlan» → semantic даёт «VLAN configuration overview», keyword даёт детальные команды CLI, RRF миксует — пользователь видит оба.
Метрики на тесте: recall@5 поднялся с 67% (semantic-only) до 89% (hybrid).
В ComfyUI с RAG-нодами hybrid пока редок (часть нод поддерживает только semantic), но стандартные RAG-фреймворки (LangChain, LlamaIndex) дают hybrid из коробки.
С чем часто путают
- Hybrid Search и Semantic Search — Semantic это только векторный поиск. Hybrid = semantic + keyword.
- Hybrid Search и Multi-modal Search — Multi-modal комбинирует разные типы данных (текст + изображение). Hybrid — разные алгоритмы поиска по одному типу.
- RRF и Weighted Fusion — два разных метода объединения. RRF не требует нормализации.
- Hybrid Search и Reranking — Hybrid это первый retrieval. Reranking — повторная сортировка результатов после.
- Sparse Vector и Dense Vector — Dense это semantic embedding (1500+ dim). Sparse — BM25-эквивалент в виде вектора (тысячи dim, в основном нули).
Частые ошибки и заблуждения
- «Hybrid Search всегда лучше любого отдельного». Почти всегда, но не на 100%. На очень простых запросах разница незаметна. На очень специфичных доменах (только код, только имена) keyword может быть сам по себе лучше.
- «Нужны два разных backend'а». В современных vector DB (Qdrant, Weaviate, Vespa) hybrid поддерживается нативно в одном index'е через sparse + dense vectors.
- «RRF k=60 — магическое число». Это эмпирически подобранный параметр (Cormack et al. 2009). Работает почти всегда, но можно тюнить ±20%.
- «Hybrid Search в 2 раза медленнее». Нет — параллельные запросы. Latency ~равна semantic-only с минимальным overhead на fusion.
- «Не нужен, если есть reranking». Reranking улучшает результаты, но не может вернуть документ, который не попал в первичный retrieval. Hybrid увеличивает recall на этом этапе.
Связанные термины
- Semantic Search — одна из двух частей Hybrid.
- BM25 — главный keyword-алгоритм (вторая часть).
- RRF (Reciprocal Rank Fusion) — главный метод fusion.
- Reranking — следующий шаг после Hybrid Search.
- RAG — главный сценарий применения.
- Sparse Vector / Dense Vector — два типа векторов в hybrid.
- Vector Database — где обычно реализуется.
Частые вопросы
Какой вес у semantic vs keyword? В RRF — оба равные (по умолчанию). В weighted — обычно 0.5–0.7 в пользу semantic. Для технических доменов с уникальными терминами — поднять keyword до 0.5.
Как реализовать hybrid в Postgres?
pgvector для semantic + tsvector (PostgreSQL full-text) для keyword. SQL-запрос с UNION ALL и manual RRF/weighted scoring.
В каких vector DB hybrid native? Qdrant (с 2024), Weaviate, Vespa, Pinecone (c sparse-dense), Elastic с vector + BM25, Postgres+pgvector через расширения.
Hybrid увеличивает стоимость? Минимально. Embedding для запроса считается один раз, BM25 — почти бесплатный. Storage — sparse vectors добавляют ~20% к dense.
Когда hybrid точно нужен? Когда в данных есть уникальные термины: артикулы, имена, технические коды, версии (v1.2.3), идентификаторы. Если только обычный текст — semantic-only тоже подойдёт.
RRF можно расширить на 3+ источника?
Да. Если у вас semantic + keyword + knowledge graph + reranker — RRF легко суммирует все ранки. Просто складываются 1/(k+rank) от каждого.
Главное
Hybrid Search — комбинация semantic search (по смыслу) и keyword search (по точным словам, BM25). Каждый ловит то, что упускает другой: semantic понимает синонимы и перефразировки, keyword не теряет уникальные термины (артикулы, имена, коды). Объединение через RRF (Reciprocal Rank Fusion) — стандарт. К 2026-му это default для production-RAG: качество выше любого из источников отдельно на 10–30% по recall@5. Поддерживается нативно в Qdrant, Weaviate, Vespa, Pinecone. Главный совет — не начинайте с pure semantic, сразу делайте hybrid: добавляет 20% сложности кода, даёт огромный буст качества.