Первый пост - что такое RAG
Второй пост - чанки для RAG
Третий пост - Router-LLM
💡Один вектор — хорошо, а два + reranker — точнее и быстрее
Hybrid search — объединение плотных (dense) эмбеддингов и разрежённых (BM25/SPLADE) счётчиков — даёт заметный прирост recall/precision для RAG-систем: лично мои бенчмарки показывают +8-25 % recall и –40 % галлюцинаций по сравнению с чистым векторным поиском. Ключ к успеху — правильно объединить два ранжирования и добавить лёгкий cross-encoder reranker (например BGE-Reranker-m3-v2 или Cohere v3) для последней сортировки топ-кандидатов
💬 - На первом скрине нарисован pipeline как делаем запросы с помощью гибрида.
💬 - А на втором то как я делаю с гибридной норрмализацией и fusion
Почему одного метода мало
- BM25/SPARSE отлично ловят точные идентификаторы и редкие термины (“TS-12345”, NullPointerException) а в случае с SPARSE и семантические синонимы— dense-вектор их часто игнорирует.
- Dense эмбеддинги спасают, когда формулировки различаются (“график продаж” vs “trend of revenue”).
- Reranker (cross-encoder) умеет видеть полный токен-в-токен контекст и поднимает действительно релевантные чанки вверх.
Базовый pipeline
- Query → получаем sparse-вектор (BM25 или SPLADE) и dense-вектор (BGE-M3).
- Hybrid retrieve: объединяем топ-k (например k=50) из обеих выборок. Milvus и Qdrant умеют делать это за один hybridSearch вызов.
- Rerank (k≈80 → 15 шт.) Reciprocal Rank Fusion или BGE-Reranker-v2-m3.
- LLM получает уже «вычищенный» контекст.
Практические советы
- Нормализуйте веса: score = 0.7*dense + 0.3*sparse, либо используйте встроенный RRF — не зависите от абсолютных шкал.
- Перед rerank’ом фильтруйте дубликаты по ID чанка, иначе cross-encoder впустую тратит время.
- Для кода полезно поднять вес BM25: точный токен (.env, rm -rf) важнее общей семантики и можно заморочиться с SPARSE, но это нужно уметь
- Multi-vector (Chroma, Milvus и тп) — храните рядом эмбеддинг summary и сырых чанкoв, повышает отзыв на диалогах.
Еще раз чтобы лучше запомнить:
Зачем скрещивать методы?
- BM25 ловит точные ID и редкие термины (`TS-12345`, `NPE`).
- Dense понимает смысл, даже если слова другие.
- Reranker (cross-encoder) ставит на верх то, что отвечает правде.
Как это работает
- Из запроса делаем *два* вектора: sparse и dense.
- Гибридный retriever берёт top-50 из каждого → объединяет.
- RRF или bge-reranker пересортировывает топ-15.
- LLM получает чистый контекст — меньше токенов, выше точность.
Настройка на практике
- Вес по умолчанию: 0.7*dense + 0.3*sparse.
- Если запрос содержит точный номер или код → 0.4/0.6.
- k для rerank: 80 (хватает, чтобы не упустить редкий факт).
- Удаляйте дубликаты по chunk\_uid до rerank’а.
Что почитать
- Milvus HybridSearch + RRF Ranker
- Weaviate «Hybrid search explained»
- BGE-Reranker v2-m3 (HF)
- Qdrant tutorial по rerank’у
💬 Следующй пост: Graph RAG — когда простого поиска недостаточно.
Люблю репосты и лайки 🥰

