更新于

2026 向量数据库对比:Chroma/Qdrant/Milvus/pgvector


向量数据库这两年百花齐放。但 RAG 项目里,绝大多数选错了——要么用了太重的(Milvus 跑几千文档),要么用了太轻的(Chroma 跑几千万)。本文按场景给清晰选型。

一、6 个主流选项

DB类型适合规模部署复杂度
Chroma嵌入式 / 服务< 1M极低
Qdrant服务1M – 100M
Milvus服务10M – 10B
pgvectorPostgres 扩展< 10M低(如已有 PG)
Weaviate服务1M – 100M
PineconeSaaS1M – 1B极低(托管)

二、性能(10M 向量,1024 维,top-10 检索)

DB召回率QPSp95 延迟内存
Chroma20050ms
Qdrant极高25008ms
Milvus极高3000+10ms
pgvector (HNSW)150012ms
Weaviate180015ms
Pinecone受限于套餐20ms托管

结论

  • 性能极致:Qdrant / Milvus
  • 工程简单:pgvector(如已有 Postgres)
  • 入门:Chroma

三、Chroma:入门首选

import chromadb

client = chromadb.PersistentClient(path="./chroma_db")
coll = client.get_or_create_collection("docs")
coll.add(
    ids=["1", "2"],
    documents=["text A", "text B"],
    embeddings=[emb_a, emb_b],
    metadatas=[{"src": "doc1"}, {"src": "doc2"}],
)

results = coll.query(query_embeddings=[query_emb], n_results=5)

优势:

  • 零运维
  • API 极简
  • 嵌入 + 服务两种模式
  • 自动批量

劣势:

  • 超 1M 向量明显变慢
  • 没有真正高级查询(filter 简单)
  • 没有真正水平扩展

适合:50 万以内文档 / Demo / 个人项目。

四、Qdrant:性能 / 易用平衡

from qdrant_client import QdrantClient
from qdrant_client.models import VectorParams, Distance, PointStruct

client = QdrantClient("http://localhost:6333")
client.create_collection(
    "docs",
    vectors_config=VectorParams(size=1024, distance=Distance.COSINE),
)

client.upsert(
    collection_name="docs",
    points=[PointStruct(id=1, vector=emb, payload={"src": "doc1"})],
)

hits = client.search(collection_name="docs", query_vector=query_emb, limit=5)

优势:

  • 性能极强
  • HNSW + 量化
  • 富 filter(嵌套字段、范围查询)
  • Docker 部署简单
  • HTTP / gRPC

劣势:

  • 单机最多到 1 亿规模
  • 分布式集群配置复杂

适合:百万 - 亿级 / 生产 RAG / 数据敏感(自部署)。

五、Milvus:大规模生产

from pymilvus import MilvusClient

client = MilvusClient(uri="http://localhost:19530")
client.create_collection("docs", dimension=1024)
client.insert("docs", data=[{"id": 1, "vector": emb, "src": "doc1"}])
hits = client.search("docs", data=[query_emb], limit=5)

优势:

  • 真正水平扩展
  • 多副本 / 强一致
  • 丰富索引(IVF / HNSW / DiskANN)
  • 集群管理工具完善

劣势:

  • 部署复杂(K8s)
  • 1M 以下规模性价比低
  • 学习曲线陡

适合:千万 - 数十亿规模 / 团队有 SRE / 数据是核心资产。

六、pgvector:已有 Postgres 的最佳选择

CREATE EXTENSION vector;

CREATE TABLE docs (
  id SERIAL PRIMARY KEY,
  content TEXT,
  src TEXT,
  embedding vector(1024)
);

CREATE INDEX ON docs USING hnsw (embedding vector_cosine_ops);

-- 检索
SELECT id, content, src, embedding <=> '[...]' AS distance
FROM docs
WHERE src = 'doc1'
ORDER BY distance
LIMIT 5;

优势:

  • 一个 DB 搞定向量 + 关系数据
  • 事务支持
  • 完整 SQL(JOIN、聚合)
  • 备份 / HA 复用现有 PG 设施

劣势:

  • HNSW 性能不如专用
  • 不擅长百万级以上
  • 索引建得慢

适合:项目已有 Postgres / 数据量 < 10M / 不想多维护一个组件。

七、Weaviate:GraphQL + Multi-tenancy

import weaviate

client = weaviate.Client("http://localhost:8080")
client.schema.create_class({
    "class": "Doc",
    "vectorizer": "none",
})
client.data_object.create({"content": "...", "src": "doc1"}, "Doc", vector=emb)

result = client.query.get("Doc", ["content", "src"]) \
    .with_near_vector({"vector": query_emb}) \
    .with_limit(5) \
    .do()

优势:

  • GraphQL 查询
  • 内置 multi-tenancy
  • 模块化(可接 OpenAI 自动 embed)

劣势:

  • 复杂度比 Qdrant 高
  • 中文社区资料少

适合:多租户 SaaS / 重度依赖 GraphQL 的团队。

八、Pinecone:完全托管

from pinecone import Pinecone

pc = Pinecone(api_key="...")
index = pc.Index("docs")
index.upsert(vectors=[{"id": "1", "values": emb, "metadata": {"src": "doc1"}}])
results = index.query(vector=query_emb, top_k=5)

优势:

  • 零运维
  • 全球部署
  • 高可用

劣势:

  • 国内访问看网络
  • 数据出境
  • 按存储 + QPS 计费,量大很贵

适合:海外项目 / 不想自己运维 / 预算充足。

九、混合检索(BM25 + Vector)

中文 RAG 强烈推荐混合检索

DB混合检索内置支持
Qdrant✓(hybrid search)
Milvus
Weaviate
Chroma✗(自己拼)
pgvector部分(用 tsvector 自拼)

详见 中文 RAG 工程实战

十、决策表

你的情况
Demo / < 100k 文档Chroma
< 1M 文档 + 已有 PGpgvector
< 1M 文档 + 重检索性能Qdrant
1M – 10M 文档Qdrant
10M+ 文档 + 团队有 SREMilvus
海外 + 不想运维Pinecone
多租户 SaaSWeaviate / Qdrant
实时增量更新频繁Qdrant / pgvector
数据敏感不能出局Qdrant 自部署 / pgvector

十一、迁移成本

各家 API 不通用。从一个迁到另一个需要:

  1. 重新导出所有 embedding(或重新算)
  2. 重写 ingest 代码
  3. 重写 query 代码
  4. 调 chunk / index 参数
  5. 跑回归测试

第一次选错代价大。建议:从 Chroma / pgvector 起步,量大再迁。

十二、相关阅读

向量库选好后,embedding 接 YoTradeApi 中转,一把 Key 跑 text-embedding-3-large / voyage / 国产 embedding。