Qdrant - Vector Database
Matryoshka Embeddings (MRL)
1 миллион документов в Qdrant: прямой поиск по 1536-dim = 180ms, 6GB RAM. Two-stage с MRL (256→1536-dim): 35ms, recall 98%. Вы получаете почти ту же точность при 5x ускорении. GPT-4 занял бы больше времени на ответ чем вы потратили на поиск.
- **Enterprise knowledge base:** 10M документов, SLA < 100ms. Two-stage MRL: 256-dim за 15ms (кандидаты) + 1536-dim rerank за 20ms = 35ms total при recall 98%
- **Mobile/edge search:** 256-dim MRL вектора занимают 1KB вместо 6KB — критично для хранения на устройстве
- **Cost optimization:** OpenAI billing по токенам embedding. Хранить 256-dim вместо 1536-dim = 6x меньше векторного хранилища, 6x меньше RAM для HNSW индекса
Предварительные знания
Matryoshka Representation Learning: идея и модели
**Matryoshka Representation Learning (MRL)** - техника обучения embedding моделей при которой меньшие срезы вектора (prefixes) сохраняют семантическую информацию. Как русская матрёшка: внутри большого вектора вложены меньшие, каждый из которых осмысленный сам по себе. Обычная модель: вектор 1536-dim - первые 256 чисел не несут смысла без остальных. MRL модель: первые 256 чисел уже несут смысл (хуже чем 1536, но работают), первые 512 - лучше, все 1536 - максимальное качество. Модели поддерживающие MRL: - `text-embedding-3-small` и `text-embedding-3-large` от OpenAI (параметр `dimensions`) - `nomic-embed-text-v1.5` от Nomic AI - `mxbai-embed-large-v1` от Mixedbread - `jina-embeddings-v3` от Jina AI
**Почему работает MRL:** при обучении MRL модели используется специальная loss функция которая заставляет модель кодировать наиболее важную семантическую информацию в первых измерениях вектора. Стандартные модели (ada-002, all-MiniLM) так не обучались - усечение их векторов значительно ухудшает качество. Перед использованием MRL - проверь что модель явно поддерживает эту технику.
Вы используете text-embedding-ada-002. Можно ли усечь его 1536-dim вектор до 256-dim для экономии памяти, используя ту же технику что и для text-embedding-3-small?
MRL в Qdrant: named vectors и коллекции
Qdrant не имеет встроенной поддержки MRL как отдельного типа индекса. MRL реализуется через существующие механизмы: **Подход 1: Named vectors** - хранить несколько усечённых векторов разной размерности в одной точке. Поиск по нужной размерности = поиск по соответствующему named vector. **Подход 2: Отдельные коллекции** - `docs-256`, `docs-512`, `docs-1536`. Каждая коллекция хранит векторы одной размерности. Поиск сначала по `docs-256`, потом re-rank по `docs-1536`. Каждый подход имеет свои trade-offs.
| Параметр | Named vectors | Отдельные коллекции |
|---|---|---|
| Хранение | 256+1536 = 1792 числа/точку | 256 в одной + 1536 в другой |
| Синхронность | Автоматически — один upsert | Ручная — два upsert |
| Поиск по размерности | vector: { name: 'small', ... } | client.search('docs-256', ...) |
| Quantization | Разная для каждого named vector | Разная для каждой коллекции |
| Рекомендация | Простота + меньше кода | Гибкость + разные конфиги |
Вы используете named vectors ('small' 256-dim и 'full' 1536-dim). Нужно применить scalar quantization к 'full' вектору но НЕ к 'small'. Как это сделать?
Two-stage retrieval: кандидаты + reranking
**Two-stage retrieval** с MRL - ключевой паттерн для production систем: 1. **Stage 1 (Candidate Retrieval):** быстрый поиск по малой размерности (256-dim). Находим топ-N кандидатов. Скорость: ~6x быстрее чем поиск по 1536-dim. 2. **Stage 2 (Reranking):** уточняем рейтинг топ-N кандидатов используя полную размерность (1536-dim). Высокая точность, но только для небольшого набора. Результат: скорость близкая к 256-dim, точность близкая к 1536-dim. **~6x ускорение при recall ~98%** по сравнению с прямым поиском по 1536-dim.
**Экономия памяти + скорость:** для Stage 1 (256-dim) применить scalar quantization int8 → дополнительные 4x экономии памяти на кандидатном индексе. Для Stage 2 (1536-dim): scalar quantization с always_ram: false → самый точный reranking при минимальном потреблении RAM. Комбинация MRL two-stage + quantization = оптимальное решение для production систем с ограниченными ресурсами.
«MRL - это просто обрезать вектор, любая модель подойдёт»
MRL требует специально обученную модель (matryoshka training). Обрезка обычного вектора (ada-002, all-MiniLM) даёт значительную потерю качества. Только модели с явной поддержкой MRL (text-embedding-3-*, nomic-embed-v1.5) корректно работают с усечёнными векторами.
При стандартном обучении embedding модели: измерения вектора распределяют семантическую информацию равномерно - каждое измерение важно, порядок не значим. При MRL обучении: специальная loss функция заставляет модель кодировать наиболее важную информацию в первых N измерениях. Это фундаментальное отличие в процессе обучения, а не постобработка.
Two-stage search: Stage 1 возвращает 50 кандидатов, Stage 2 reranks топ-10. Recall@10 = 98%. Это означает что...
Итоги
- **MRL (Matryoshka Representation Learning):** модель обучена так что первые N измерений вектора осмысленны. Поддерживают: text-embedding-3-small/large (параметр dimensions), nomic-embed-v1.5, mxbai-embed-large-v1.
- **256-dim:** 93.4% качества при 6x меньшем размере. 512-dim: 96.7%. Баланс скорость/качество зависит от задачи.
- **Named vectors в Qdrant:** один point с 'small' (256-dim) и 'full' (1536-dim) векторами. Одна коллекция, два вектора на точку.
- **Two-stage retrieval:** Stage 1 — быстрый поиск top-N × 5 кандидатов по 256-dim; Stage 2 — rerank по 1536-dim с filter: has_id. Результат: ~5x ускорение, recall ~98%.
- **candidateMultiplier trade-off:** 3 = быстрее, 5 = оптимально, 10 = точнее. Выбирай под свой SLA latency vs recall.
Что дальше
Вы прошли весь advanced курс по Qdrant. MRL + two-stage retrieval - вершина оптимизации векторного поиска. Следующий шаг: применить всё изученное в комплексном production проекте.
- Multi-vector Search — Named vectors - это механизм которым MRL реализуется в Qdrant. Понимание multi-vector углубит использование MRL
- Квантизация — MRL + квантизация для Stage 1 кандидатов = максимальная скорость при минимальном RAM
- Production RAG Pipeline — Встроить MRL two-stage retrieval в RAG pipeline для оптимального баланса качества и скорости
Вопросы для размышления
- Как измерить recall вашего two-stage поиска на реальных данных? Как построить ground truth для сравнения с direct 1536-dim поиском?
- candidateMultiplier = 5 означает 5x больше Stage 2 вычислений по сравнению с direct search. При каком значении two-stage становится медленнее чем прямой 1536-dim поиск?
- MRL с отдельными коллекциями (docs-256 и docs-1536) vs named vectors — как реализовать zero-downtime индексацию новых документов в оба хранилища атомарно?