Hybrid Search

hybrid search — комбинация семантического и keyword-поиска

Раздел
Языковые модели
Обновлено
19.06.26

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% сложности кода, даёт огромный буст качества.