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 меньше

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

  • HNSW: How the Index Works

Проблема памяти: почему нужна квантизация

**Векторные базы данных имеют проблему памяти.** Каждый вектор хранится как массив float32. На больших коллекциях это занимает гигабайты RAM - а HNSW требует чтобы весь индекс помещался в памяти для скоростного поиска.

**Три типа квантизации в Qdrant:** Scalar (int8) - сжатие в 4 раза с минимальной потерей, Product Quantization - сжатие в 8-64 раза, Binary - сжатие в 32 раза с rescoring для восстановления качества.

ТипСжатиеПотеря recallСкорость поискаКогда использовать
Scalar (int8)4x< 1%~2x быстрееБольшинство задач - хороший default
Product (PQ)8-64x2-5%~3-4x быстрееОчень большие коллекции (10M+)
Binary32x5-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 одновременно к одной коллекции? Если нет - почему?

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

  • la-15-svd
Квантизация векторов

0

1

Войти