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 индекса

Предварительные знания

  • Named Vectors: Multiple Embeddings
  • Vector Quantization

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 индексацию новых документов в оба хранилища атомарно?

Связанные уроки

  • la-15-svd
Matryoshka Embeddings (MRL)

0

1

Войти