Vector Databases

Векторная БД — хранилище эмбеддингов (Embeddings) с быстрым поиском ближайших соседей (ANN) для retrieval в RAG. Выбор зависит от масштаба, скорости и потребности в фильтрации: от лёгкого FAISS/Chroma для прототипа до Milvus/Qdrant для продакшена.

Суть

После чанкинга и эмбеддинга векторы надо где-то хранить и быстро искать по косинусной близости. «Зашвыриваем чанки и их эмбеддинги в базу, а на запрос она строит вектор запроса и ищет похожие». Разные БД оптимизированы под разные сценарии.

Зачем это нужно

Линейный перебор миллионов векторов нереален в реальном времени — нужны специальные ANN-индексы. И когда корпус растёт от тысяч до сотен миллионов векторов, «лёгкое» решение перестаёт держать нагрузку.

Как работает (сравнение)

БД Масштаб Сильная сторона
Milvus >100M, K8s Лучшее масштабирование, RRF из коробки
Qdrant >100M, <5 мс Лучшая фильтрация по метаданным
PostgreSQL / pgvector (Supabase) ≤~1M уверенно (до ~10M с тюнингом) «Развёрнут везде», высокая доступность; удобно когда embeddings рядом с relational data
Aerospike >1B Самая быстрая по скорости
FAISS (Meta) in-memory Библиотека для поиска в памяти, прототип
Chroma in-memory + persist Лёгкая, сохранение индекса на диск
Weaviate Ещё один популярный вариант

Уточнение по состоянию на 2026-08. Дефолт сместился в сторону pgvector: если данные уже в Postgres, отдельную векторную БД заводят, только когда упёрлись в масштаб или в тип нагрузки, а комфортный потолок сместился к ~10M векторов (в исходной редакции заметки — уверенно до ~1M). Среди выделенных БД Qdrant держит лидерство по скорости среди open-source: p99 около 12 мс на 10M векторов против ~16 мс у Weaviate и ~18 мс у Milvus, выигрыш порядка 10-25% на типовых нагрузках. Переходить на Milvus имеет смысл ближе к миллиарду векторов или когда всё и так живёт в Kubernetes, а не на сотнях миллионов.

Отдельно про облако: Pinecone и Weaviate Cloud тарифицируют частично по объёму запросов (чтения плюс записи), Qdrant Cloud — в основном по хранилищу и RAM. На нестабильном трафике это разные профили счёта при одинаковом объёме данных.

  • Для прототипа — FAISS и Chroma «два самых простых начальных решения»: работают в оперативной памяти, минимум настройки.
  • Для продакшена — специализированные лидеры; Qdrant можно поднять как облачный сервис и стучаться по сети.
  • Embedding-модель и БД должны быть согласованы (одна модель эмбеддингов для совместимости, см. Vector Store Persistence).
  • Выбор калибруют по бенчмаркам: ann-benchmarks.com, superlinked vector-db-comparison, MERA (для русского).
  • Потолок pgvector (осторожно, не универсальный закон): уверенно подходит для малых/средних корпусов, особенно когда embeddings живут рядом с relational data; комфортный ориентир — до ~1M векторов, до ~10M возможно с тюнингом и компромиссами по index build / памяти / recall. Порог 50M не использовать как дефолт без собственного бенчмарка. Для сложной фильтрации, hybrid/BM25/sparse, multivector и больших индексов чаще нужен dedicated store (Qdrant/Milvus). ⚠️ Строгие числа — из источника Qdrant (vendor-bias).
  • Когда pgvector достаточно (желательно все условия сразу): ≤~1M векторов; нет селективной фильтрации по метаданным (tenant/category); не нужен hybrid/BM25; векторы — атрибут relational-строки. Иначе → dedicated. Qdrant: filterable HNSW (pre-filter по метаданным), нативный BM25 через sparse-векторы, multivector. Ловушка ColBERT: эмбеддинг на каждый токен → 100k документов = 10M+ векторов (за пределами pgvector).

Пример

На этапе прототипа БД взаимозаменяемы: один embedding-модель и единый API from_documents / similarity_search поверх Chroma, Qdrant и FAISS in-memory.

vs_chroma = Chroma.from_documents(chunks, embedding=embeddings, collection_name="demo")
vs_qdrant = QdrantVectorStore.from_documents(chunks, embedding=embeddings,
                                             location=":memory:", collection_name="demo")
vs_faiss  = FAISS.from_documents(chunks, embedding=embeddings)

def retrieve(vs, query, k=2):           # БД меняется, retrieval-код — нет
    return vs.similarity_search(query, k=k)

Qdrant или Milvus под свой корпус

Язык корпуса на выбор базы не влияет: база хранит векторы, а языковую специфику несёт embedding-модель (RU Embedding Model Selection). Единственное косвенное следствие — размерность и вес выбранной модели, они влияют на объём индекса, а не на выбор движка.

Решают два других признака. Фильтрация по метаданным — сильная сторона Qdrant: pre-filter внутри HNSW означает, что фильтр применяется во время обхода графа, а не после него, поэтому селективные запросы («только документы этого клиента за этот квартал») не деградируют. Масштаб — порог перехода на Milvus лежит ближе к миллиарду векторов или там, где инфраструктура и так на Kubernetes. Между этими двумя ориентирами Qdrant обычно и остаётся выбором по умолчанию для продакшен-RAG.

Связано с

  • Embedding Attacks — бэкап векторной базы равносилен утечке исходных документов

  • Multi Tenancy AI — три модели изоляции арендаторов в векторной базе

  • LLM Sizing — расчёт памяти под индекс и граф HNSW

  • RAG — векторная БД = хранилище retrieval-слоя

  • Embeddings — что именно хранится в базе

  • Vector Store Persistence — как сохранять и переносить индексы между машинами

  • Agent Memory — long-term память агента реализуется на vector DB