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 переключение

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

  • Installation and First Run

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-small1536Cosine
OpenAI text-embedding-3-large3072Cosine
Cohere embed-v31024Cosine
sentence-transformers/all-MiniLM-L6-v2384Cosine
BAAI/bge-m31024Cosine
OpenAI ada-002 (устаревшая)1536Cosine

Создана коллекция с size=1536, но теперь нужно использовать модель с size=384. Что нужно сделать?

VectorParams и расширенная конфигурация

**Расширенные параметры коллекции** позволяют настроить компромиссы между скоростью, памятью и качеством поиска. Большинство параметров можно изменить после создания.

**on_disk: true** для векторов - ключевой параметр для больших коллекций. Векторы хранятся в memory-mapped файлах (mmap), а не в RAM. Поиск чуть медленнее (~2x), зато можно хранить коллекции в 10x больше доступной RAM.

Сценарийon_disk (vectors)hnsw_config.on_diskХарактеристика
Максимальная скоростьfalsefalseВсё в RAM, лучший latency
БалансfalsefalseDefault - рекомендуется для старта
Большие данныеtruefalseВекторы на диске, граф в RAM
Минимум RAMtruetrueВсё на диске, медленнее

Коллекция из 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
Коллекции: создание и конфигурация

0

1

Войти