Qdrant - Vector Database
Квантизация векторов
1 млн векторов OpenAI - 6 GB RAM. Это ~150/месяц только за память в облаке. Binary Quantization: те же 1 млн векторов - 192 MB. Recall 99%+ с rescoring. Это не потеря качества, это умная архитектура. Разберём как это работает.
- **Стартап с ограниченным бюджетом:** Scalar Quantization на 5M документов - снижение с $500 до $130/месяц в Qdrant Cloud
- **Enterprise с 100M+ векторов:** Binary + on_disk float32 - единственный практичный способ уложиться в разумный бюджет
- **Мобильное приложение:** Binary Quantization для on-device vector search - размер индекса в 32x меньше
Предварительные знания
Проблема памяти: почему нужна квантизация
**Векторные базы данных имеют проблему памяти.** Каждый вектор хранится как массив float32. На больших коллекциях это занимает гигабайты RAM - а HNSW требует чтобы весь индекс помещался в памяти для скоростного поиска.
**Три типа квантизации в Qdrant:** Scalar (int8) - сжатие в 4 раза с минимальной потерей, Product Quantization - сжатие в 8-64 раза, Binary - сжатие в 32 раза с rescoring для восстановления качества.
| Тип | Сжатие | Потеря recall | Скорость поиска | Когда использовать |
|---|---|---|---|---|
| Scalar (int8) | 4x | < 1% | ~2x быстрее | Большинство задач - хороший default |
| Product (PQ) | 8-64x | 2-5% | ~3-4x быстрее | Очень большие коллекции (10M+) |
| Binary | 32x | 5-15% без rescoring | ~40x быстрее | С rescoring: < 1% потери, fast retrieval |
Ваша коллекция: 2M векторов, 1536-dim. Текущее потребление RAM ~12 GB. Бюджет ограничен - нужно уложиться в 4 GB. Какой вариант рассмотреть первым?
Scalar Quantization: float32 → int8
**Scalar Quantization** - самый простой и безопасный тип квантизации. Каждое float32 значение заменяется на int8 (один байт): диапазон [-128, 127] вместо [-3.4×10³⁸, 3.4×10³⁸]. Сжатие 4x при минимальной потере точности.
**`quantile: 0.99`** означает: используем 1-й и 99-й перцентили как границы int8 диапазона, отрезая 1% выбросов. Это важно: редкие большие значения не должны растягивать диапазон и снижать точность для типичных значений. Дефолт 0.99 хорош для большинства случаев.
Вы включили Scalar Quantization с rescore: true, oversampling: 2.0, limit: 10. Сколько кандидатов Qdrant проверяет на первом этапе (квантизованном)?
Product Quantization: сжатие в 8-64x
**Product Quantization (PQ)** - более агрессивное сжатие. Вектор разбивается на подвекторы (subspaces), каждый сжимается отдельно. Позволяет сжать вектор в 8-64 раза за счёт большей потери точности.
**Product Quantization требует обучения кодбука** на ваших данных. Qdrant делает это автоматически при достижении `indexing_threshold` (по умолчанию 20000 точек). Поэтому на маленьких коллекциях PQ не активируется - добавьте достаточно данных или уменьшите threshold в `optimizers_config`.
Вы выбираете между Scalar (int8, 4x) и Product (x16, 16x) квантизацией для коллекции 5M векторов. Как принять решение?
Binary Quantization: 1 бит на измерение
**Binary Quantization** - экстремальное сжатие: каждое float32 заменяется одним битом (знак: 1 если > 0, 0 если ≤ 0). Сжатие 32x. При использовании с rescoring - потеря recall < 1% для нормализованных embedding-моделей.
**Когда Binary Quantization - лучший выбор:** у вас нормализованные embeddings (OpenAI, Cohere, Nomic, Sentence Transformers), коллекция 1M+ векторов, бюджет на RAM ограничен. Связка Binary (RAM) + float32 on_disk (SSD) - стандартный production паттерн для больших коллекций.
«Binary Quantization нельзя использовать в production из-за большой потери качества»
Binary + rescoring с oversampling 3-5 даёт recall 99%+ при 32x сжатии. Это стандартный production паттерн для больших коллекций с нормализованными embeddings.
Без rescoring - да, 85-95% recall. Но rescoring восстанавливает качество до float32 уровня. Суть: binary - это быстрый фильтр кандидатов, float32 - точный финальный ранкинг. Qdrant даже написал benchmark: BQ + rescore иногда быстрее scalar без rescore
Вы используете Binary Quantization с oversampling: 2.0, limit: 5. Замерили recall@5 = 87%. Коллега говорит увеличить oversampling до 5.0. Что произойдёт?
Ключевые идеи
- **Проблема:** 1M векторов 1536-dim = 6 GB RAM. Квантизация - главный способ снизить затраты
- **Scalar (int8):** float32 → int8, сжатие 4x, потеря recall < 1%. Первый выбор для большинства задач
- **Product (PQ):** разбивка на подвекторы, сжатие 8-64x, потеря 2-8%. Для 10M+ коллекций
- **Binary:** 1 бит на dim, сжатие 32x, ~40x быстрее. С rescoring: recall 99%+. Нужны нормализованные векторы
- **rescore: true** обязателен для PQ и Binary. Находит кандидатов через квантизацию, финальный ранкинг с float32
Что дальше
Квантизация сжимает dense векторы. Теперь вы знаете всё об индексации. Следующий уровень - фильтрация данных и продвинутые техники поиска.
- Payload индексы — Квантизация сжимает векторы; payload-индексы ускоряют фильтрацию - используются вместе
- Sparse Vectors — Sparse + quantized dense = максимальная эффективность Hybrid Search
- HNSW: Как работает индекс — Квантизация работает внутри HNSW - понять их взаимодействие
Вопросы для размышления
- Почему Binary Quantization работает хорошо для нормализованных векторов, но плохо для ненормализованных? Что математически происходит при бинаризации?
- У вас коллекция с Binary Quantization и rescore: true. Как oversampling влияет на latency vs recall? Найдите оптимальное значение для своей задачи.
- Можно ли применить Scalar Quantization и Binary Quantization одновременно к одной коллекции? Если нет - почему?