Qdrant - Vector Database
Sparse Vectors: BM42 и SPLADE
Dense embeddings не находят 'PostgreSQL 15.2 JSONB GIN index'. Слишком специфично для семантики. Sparse vectors решают это - они кодируют конкретные слова с весами. Dense + Sparse = Hybrid Search. Это стандарт для серьёзных поисковых систем.
- **E-commerce:** поиск по артикулу 'SKU-ABC-12345' - только sparse точно найдёт этот товар
- **Юридический поиск:** статья 'ГК РФ 854' - конкретная ссылка, не семантика
- **Техническая документация:** 'kubectl apply --dry-run' - команды должны находиться точно
Предварительные знания
Sparse vs Dense: два мира поиска
**Dense vectors** (как OpenAI embeddings) - плотные векторы, где большинство измерений ненулевые. Кодируют *семантику*: 'кот' и 'кошка' дают похожие векторы. **Sparse vectors** - разреженные, большинство измерений равны нулю. Кодируют *лексику*: важные слова из текста с их весами.
**Проблема dense-only поиска:** семантические модели иногда промахиваются по конкретным терминам. Запрос 'PostgreSQL JSONB index performance' может вернуть статьи про MongoDB или MySQL - они семантически похожи. Sparse vector точно найдёт документы где упоминается именно 'PostgreSQL JSONB'.
| Критерий | Dense (semantic) | Sparse (lexical) |
|---|---|---|
| Синонимы | Отлично - 'автомобиль'='машина' | Плохо - разные слова, разные индексы |
| Точные термины | Плохо - теряет специфику | Отлично - точное совпадение слов |
| Новые слова (OOV) | Плохо - неизвестны модели | Хорошо - любое слово = индекс |
| Понимание контекста | Отлично | Нет |
| Скорость индексации | Нужна модель embeddings | Быстро (статистика слов) |
| Размер индекса | Фиксированный (N × dim) | Растёт с размером словаря |
Пользователь ищет 'iPhone 15 Pro 256GB silver'. Dense поиск возвращает iPhone 14, Samsung Galaxy и MacBook - семантически похожие. Как улучшить?
BM42: нейронный IDF от Qdrant
**BM42** - алгоритм от Qdrant, улучшение классического BM25. Разница: BM25 использует статистический IDF (частота слов в корпусе), BM42 использует **нейронный IDF** - transformer-модель определяет важность токена с учётом контекста.
**BM42 vs BM25 в Qdrant:** Qdrant официально рекомендует BM42 (через fastembed) как лучшую sparse-модель для большинства задач. BM25 тоже поддерживается но как встроенная функция (built-in sparse). BM42 даёт лучший recall за счёт нейронного IDF.
Документ содержит: 'The bank processed the transaction'. BM25 и BM42 дают слову 'bank' разные веса. В чём разница?
SPLADE: learned sparse representations
**SPLADE (SParse Lexical AnD Expansion)** - нейронная модель, обученная создавать разреженные векторы с **расширением запроса**. Если в документе написано 'автомобиль', SPLADE также активирует токены 'машина', 'транспорт', 'движение' - семантически связанные. Это делает sparse поиск значительно умнее BM25/BM42.
| Алгоритм | Расширение | Качество | Скорость генерации | Когда использовать |
|---|---|---|---|---|
| BM25 | Нет | Базовое | Очень быстро (статистика) | Простой keyword поиск, legacy |
| BM42 | Нет (контекст через attention) | Хорошее | Быстро (маленький трансформер) | General purpose, рекомендован Qdrant |
| SPLADE | Да (семантическое расширение) | Отличное | Медленнее (полный BERT-based) | Высокое качество recall, Hybrid Search |
Запрос 'electric vehicle charging'. SPLADE документ содержит 'EV charging station для Tesla'. BM25 не находит (разные слова), SPLADE находит. Почему?
Настройка коллекции и поиск по sparse vectors
**Полный пример** коллекции с dense + sparse vectors, добавления данных и поиска. Sparse поиск можно использовать отдельно или комбинировать с dense для Hybrid Search.
**Практический совет:** для большинства production RAG-систем - используйте Hybrid Search (dense + sparse через RRF). Dense даёт семантику, sparse даёт точность на терминах. Recall hybrid поиска обычно на 5-15% выше чем dense-only, особенно на специализированных доменах (медицина, право, технический поиск).
«Sparse поиск - устаревшая технология, dense embeddings решают всё»
Sparse и dense - complementary, не конкуренты. Hybrid Search стабильно даёт лучший recall чем любой из них по отдельности
Dense теряет точность на конкретных терминах, артикулах, именах. Sparse теряет синонимы и смысловые связи. BEIR benchmark показывает: лучшие системы поиска всегда используют hybrid подход. Qdrant Query API с prefetch + RRF делает это в одном запросе
Вы настраиваете поиск по медицинским документам. Запросы типа 'MI treatment protocol' (MI = myocardial infarction). Пользователи часто используют аббревиатуры. Какое решение лучшее?
Ключевые идеи
- **Sparse vectors** кодируют лексику: конкретные слова с IDF-весами. Большинство измерений = 0
- **BM42** (рекомендован Qdrant) - нейронный IDF через attention-веса трансформера. Быстро, хорошее качество
- **SPLADE** - учит расширение запросов. 'EV' → 'electric vehicle'. Лучшее качество, медленнее
- **Sparse vectors требуют Dot Product** - веса не нормализованы, масштаб важен
- **Hybrid Search** (dense + sparse + RRF fusion) - стабильно даёт recall на 5-15% выше чем dense-only
Что дальше
Sparse vectors увеличивают recall. Но коллекция с dense + sparse занимает значительно больше памяти. Квантизация решает эту проблему.
- Квантизация векторов — Сжатие dense векторов в 4-32x - важно когда есть ещё и sparse
- Payload индексы — Фильтрация работает и с sparse поиском
- HNSW: Как работает индекс — Dense часть hybrid search использует HNSW
Вопросы для размышления
- Почему SPLADE использует Dot Product, а не Cosine? Что произойдёт если создать sparse коллекцию с Cosine?
- На каких задачах sparse-only поиск лучше hybrid? Есть ли такие случаи?
- BM42 и SPLADE генерируются разными моделями. Если вы переходите с BM42 на SPLADE - нужно ли переиндексировать данные? Почему?