Сравнение векторных баз данных: ChromaDB, Qdrant, Milvus, pgvector
Для RAG нужна векторная база. Выбор большой — от встраиваемой ChromaDB до кластерного Milvus. Тестировал четыре варианта на реальных задачах.

Зачем нужна векторная БД
Обычная БД ищет по точному совпадению: WHERE name = 'Иван'. Векторная ищет по похожести: «найди документы, похожие на этот запрос». Для этого используется approximate nearest neighbor (ANN) поиск.
Участники сравнения
ChromaDB
Встраиваемая Python-библиотека. Работает in-process или как сервер:
import chromadb
# Встраиваемый режим
client = chromadb.Client()
# Или сервер
client = chromadb.HttpClient(host="localhost", port=8000)
collection = client.create_collection("docs")
collection.add(
ids=["doc1", "doc2"],
embeddings=[[0.1, 0.2, ...], [0.3, 0.4, ...]],
documents=["текст первый", "текст второй"],
metadatas=[{"source": "wiki"}, {"source": "blog"}]
)
results = collection.query(
query_embeddings=[[0.15, 0.25, ...]],
n_results=5,
where={"source": "wiki"} # фильтр по метаданным
) Qdrant
Написан на Rust. Быстрый, с продвинутой фильтрацией:
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct
client = QdrantClient(host="localhost", port=6333)
client.create_collection(
collection_name="docs",
vectors_config=VectorParams(size=768, distance=Distance.COSINE)
)
client.upsert(
collection_name="docs",
points=[
PointStruct(id=1, vector=[0.1, 0.2, ...], payload={"source": "wiki"}),
PointStruct(id=2, vector=[0.3, 0.4, ...], payload={"source": "blog"}),
]
)
results = client.search(
collection_name="docs",
query_vector=[0.15, 0.25, ...],
limit=5,
query_filter={"must": [{"key": "source", "match": {"value": "wiki"}}]}
) Milvus
Распределённая БД для миллиардов векторов:
from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType
connections.connect(host="localhost", port="19530")
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=768),
FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=2000),
]
schema = CollectionSchema(fields)
collection = Collection("docs", schema) pgvector
Расширение для PostgreSQL — если уже используете Postgres:
CREATE EXTENSION vector;
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding vector(768)
);
-- Создаём индекс
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);
-- Поиск
SELECT content, 1 - (embedding <=> '[0.1, 0.2, ...]') AS similarity
FROM documents
ORDER BY embedding <=> '[0.1, 0.2, ...]'
LIMIT 5; Бенчмарк: 100K документов
Тестировал на датасете из 100K чанков технической документации, эмбеддинги 768 измерений:
| Метрика | ChromaDB | Qdrant | Milvus | pgvector |
|---|---|---|---|---|
| Вставка 100K | 45 сек | 12 сек | 8 сек | 30 сек |
| Поиск top-10 (p95) | 15 мс | 3 мс | 2 мс | 8 мс |
| Поиск + фильтр | 25 мс | 4 мс | 3 мс | 10 мс |
| RAM (idle) | 200 MB | 150 MB | 800 MB | 50 MB* |
| Docker образ | 400 MB | 100 MB | 2.5 GB | — |
*pgvector использует RAM PostgreSQL

Когда что выбирать
| Сценарий | Рекомендация |
|---|---|
| Прототип, до 10K документов | ChromaDB — минимум кода |
| Продакшен, до 1M документов | Qdrant — быстрый, лёгкий |
| Уже есть PostgreSQL | pgvector — не нужен отдельный сервис |
| Более 10M документов, кластер | Milvus — горизонтальное масштабирование |
| Open WebUI / LangChain | ChromaDB — интегрирован по умолчанию |
Мой выбор
Для домашних RAG-проектов: ChromaDB (простота) → Qdrant (когда нужна скорость).
ChromaDB идеален для начала — pip install, три строчки кода, работает. Когда упираешься в скорость фильтрации или нужен нормальный REST API — переезжаю на Qdrant.
pgvector — отличный вариант, если Postgres уже в стеке. Не нужен отдельный сервис, SQL-запросы знакомы, бэкапы через pg_dump.