Сравнение векторных баз данных: ChromaDB, Qdrant, Milvus, pgvector

vector-dbragaidatabases

Для 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 измерений:

МетрикаChromaDBQdrantMilvuspgvector
Вставка 100K45 сек12 сек8 сек30 сек
Поиск top-10 (p95)15 мс3 мс2 мс8 мс
Поиск + фильтр25 мс4 мс3 мс10 мс
RAM (idle)200 MB150 MB800 MB50 MB*
Docker образ400 MB100 MB2.5 GB

*pgvector использует RAM PostgreSQL

Серверная

Когда что выбирать

СценарийРекомендация
Прототип, до 10K документовChromaDB — минимум кода
Продакшен, до 1M документовQdrant — быстрый, лёгкий
Уже есть PostgreSQLpgvector — не нужен отдельный сервис
Более 10M документов, кластерMilvus — горизонтальное масштабирование
Open WebUI / LangChainChromaDB — интегрирован по умолчанию

Мой выбор

Для домашних RAG-проектов: ChromaDB (простота) → Qdrant (когда нужна скорость).

ChromaDB идеален для начала — pip install, три строчки кода, работает. Когда упираешься в скорость фильтрации или нужен нормальный REST API — переезжаю на Qdrant.

pgvector — отличный вариант, если Postgres уже в стеке. Не нужен отдельный сервис, SQL-запросы знакомы, бэкапы через pg_dump.

© 2026 Terminal Notes. Built with SvelteKit.