Qdrant - Vector Database
Коллекции: создание и конфигурация
2023 год. Команда Perplexity.ai переходит с OpenAI ada-002 (1536d) на text-embedding-3-small (1536d же, но лучше качество). 100M+ запросов в месяц. Обновить embeddings для всей базы знаний - не секунда работы. Без alias-стратегии - часы даунтайма или сложнейший rollout. С aliases - атомарное переключение за миллисекунды, ноль простоя. При создании коллекции принимаются два необратимых решения: размерность и метрика. Остальное - настраивается.
- **Реиндексация 10M документов** с новой моделью без downtime - именно для этого aliases
- **A/B тест поиска** - alias 'search' переключается между двумя коллекциями для разных пользователей
- **Смена модели embeddings** - меняется size, нужна новая коллекция + alias переключение
Предварительные знания
HNSW и рождение современного векторного поиска
В 2016 году Юрий Мальков опубликовал статью «Efficient and Robust Approximate Nearest Neighbor Search Using Hierarchical Navigable Small World Graphs» (HNSW). Алгоритм решил проблему, которая тормозила векторный поиск годами: точность vs скорость. HNSW строит многослойный граф навигации - от грубого к точному. Qdrant использует HNSW как основной индекс. До HNSW вектор из 1536 чисел нужно было сравнивать с каждым из миллиона - brute force. После - навигация по графу за логарифмическое время.
Что такое коллекция и её параметры
**Коллекция** в Qdrant - это пространство имён для векторов одинаковой размерности. Аналог таблицы в SQL, но без жёсткой схемы для payload. Два ключевых решения при создании: размерность векторов и метрика расстояния - их нельзя изменить после создания. Ошибитесь - придётся перегрузить всё заново.
**`size` и `distance` нельзя изменить после создания.** Если нужна другая размерность - придётся создать новую коллекцию и перегрузить данные. Поэтому важно правильно выбрать embedding-модель до создания коллекции.
| Embedding модель | Размерность | Distance |
|---|---|---|
| OpenAI text-embedding-3-small | 1536 | Cosine |
| OpenAI text-embedding-3-large | 3072 | Cosine |
| Cohere embed-v3 | 1024 | Cosine |
| sentence-transformers/all-MiniLM-L6-v2 | 384 | Cosine |
| BAAI/bge-m3 | 1024 | Cosine |
| OpenAI ada-002 (устаревшая) | 1536 | Cosine |
Создана коллекция с size=1536, но теперь нужно использовать модель с size=384. Что нужно сделать?
VectorParams и расширенная конфигурация
**Расширенные параметры коллекции** позволяют настроить компромиссы между скоростью, памятью и качеством поиска. Большинство параметров можно изменить после создания.
**on_disk: true** для векторов - ключевой параметр для больших коллекций. Векторы хранятся в memory-mapped файлах (mmap), а не в RAM. Поиск чуть медленнее (~2x), зато можно хранить коллекции в 10x больше доступной RAM.
| Сценарий | on_disk (vectors) | hnsw_config.on_disk | Характеристика |
|---|---|---|---|
| Максимальная скорость | false | false | Всё в RAM, лучший latency |
| Баланс | false | false | Default - рекомендуется для старта |
| Большие данные | true | false | Векторы на диске, граф в RAM |
| Минимум RAM | true | true | Всё на диске, медленнее |
Коллекция из 5M векторов 1536d, 16GB RAM. Без on_disk векторы занимают 5M × 6KB = 30GB. Что выбрать?
CRUD операции с коллекциями
**Основные операции** с коллекциями - создание, получение информации, листинг и удаление. Плюс: проверка существования и пересоздание.
**Статус коллекции:** `green` - всё в порядке, `yellow` - идёт оптимизация (нормально), `grey` - коллекция не имеет данных. Если статус долго не становится `green` - проверьте логи.
Коллекция находится в статусе 'yellow'. Что это означает?
Aliases: zero-downtime переключение
**Aliases** - именованные псевдонимы для коллекций. Позволяют атомарно переключать коллекции без простоя. Незаменимы при реиндексации или смене embedding-модели. Perplexity.ai обрабатывает 100M+ запросов в месяц - без alias-стратегии каждая смена модели означала бы часы даунтайма.
**Best practice:** называйте коллекции с суффиксом версии (`docs_v1`, `docs_v2`), а в приложении всегда работайте через alias (`docs` или `search`). Это делает A/B тестирование и миграции безболезненными.
Как aliases помогают при смене embedding-модели (с 1536d на 1024d)?
Ключевые идеи
- **`size` и `distance` - необратимые параметры.** Выбирайте под используемую embedding-модель до создания
- **`on_disk: true`** для векторов - когда коллекция больше RAM. Незначительно медленнее, но без ограничений по объёму
- **Статус коллекции:** `green` - ок, `yellow` - фоновая оптимизация (нормально), `grey` - пусто
- **Aliases** - именованные указатели на коллекции. Атомарное переключение без downtime при реиндексации
- **Best practice:** приложение работает через alias, коллекции версионируются (`docs_v1`, `docs_v2`)
Что дальше
Коллекция создана. Теперь разберём главные примитивы Qdrant - points, vectors, payloads.
- Points, Vectors, Payloads — Как добавлять данные в коллекцию - upsert, batch операции, payload
- Quantization — Scalar/Binary/Product quantization - как уменьшить RAM без потери recall
Вопросы для размышления
- Если размерность нельзя изменить - как организовать rollback при ошибке в выборе модели?
- Когда стоит использовать `on_disk: true` для HNSW графа (hnsw_config.on_disk), а не только для векторов?
- Как aliases помогают в сценарии A/B тестирования двух разных embedding-моделей?
Связанные уроки
- qd-06-hnsw — HNSW параметры (m, ef_construct) подробно разобраны - механика за конфигом коллекции
- qd-10-quantization — Scalar/Binary/Product quantization - как уменьшить RAM без потери recall
- qd-04-points-vectors — Коллекция создана - следующий шаг: добавление points, vectors, payload
- qd-11-hybrid-search — Multi-vector collections требуют особой конфигурации named vectors
- db-30-vector — pgvector - реляционная альтернатива Qdrant, другие компромиссы при выборе
- la-02-dot-product