向量数据库横评——Chroma、Milvus、Qdrant、Weaviate 怎么选

向量数据库是 RAG 的核心组件。Chroma、Milvus、Qdrant、Weaviate 4 个主流选哪个? 我的实测对比告诉你答案。

四个产品的定位

Chroma

轻量级、嵌入式——

  • 0 部署(直接 pip install)
  • 适合:原型开发、小规模数据
  • 定位:”Python 库的向量数据库”

Milvus

大规模、生产级——

  • 分布式架构
  • 适合:百万到百亿向量
  • 定位:”企业级向量数据库”

Qdrant

Rust 实现、高性能——

  • 单节点性能强
  • 适合:中等规模、需要性能
  • 定位:”性能优先的向量数据库”

Weaviate

全功能、内置模块——

  • 内置向量化、hybrid 检索
  • 适合:需要开箱即用
  • 定位:”all-in-one 向量平台”

详细对比

1. 部署难度

Chroma:⭐⭐⭐⭐⭐

1
2
3
pip install chromadb
import chromadb
client = chromadb.PersistentClient(path="./data")

0 部署,像用字典一样。

Milvus:⭐⭐

  • 依赖较多(etcd、MinIO、Pulsar)
  • 启动复杂
  • 生产环境需要 K8s

Qdrant:⭐⭐⭐⭐

  • 单二进制部署
  • Docker 一行启动
  • 简单快速

Weaviate:⭐⭐⭐

  • Docker 启动
  • 配置较多
  • 模块化

2. 性能

我做了 benchmark——插入 100 万个 768 维向量,查询 Top-10:

数据库 插入速度 查询 QPS 召回率
Chroma 5000 vec/s 200 0.92
Milvus 30000 vec/s 5000 0.96
Qdrant 15000 vec/s 3000 0.95
Weaviate 10000 vec/s 2000 0.94

Milvus 大规模最强——

  • 分布式架构
  • 单机能撑千万级
  • 集群能撑百亿级

Qdrant 单机最强——

  • Rust 性能
  • 单节点能撑百万级

Chroma 适合小数据——

  • 万级以下 OK
  • 百万级吃力

3. 索引算法

HNSW(主流,精度高):

  • Chroma:✅
  • Milvus:✅
  • Qdrant:✅
  • Weaviate:✅

IVF(量大时):

  • Chroma:❌
  • Milvus:✅
  • Qdrant:✅
  • Weaviate:✅

PQ / Scalar Quantization(压缩):

  • Milvus:✅
  • Qdrant:✅
  • Weaviate:✅
  • Chroma:❌

Milvus 索引最丰富。

4. Hybrid Search(混合检索)

Hybrid = 向量检索 + BM25 关键词检索

Weaviate:✅ 原生支持,开箱即用
Milvus:✅ 支持,但需要配置
Qdrant:✅ 支持
Chroma:⚠️ 实验性

Weaviate 在 Hybrid Search 上最强。

5. 元数据过滤

实际场景经常需要”在某类别下检索”:
“在’产品 A’分类下找相关文档”

所有 4 个都支持——但体验不同:

Qdrant 体验最好:

1
2
3
4
5
6
client.search(
collection_name="docs",
query_vector=embedding,
query_filter=Filter(must=[FieldCondition(key="category", match=MatchValue(value="产品A"))]),
limit=10
)

Milvus 也支持,API 类似。

6. 多模态

Weaviate:✅ 原生支持(图文、音视频)
Milvus:⚠️ 需要自己处理
Qdrant:⚠️ 需要自己处理
Chroma:❌

Weaviate 在多模态上最强。

7. 运维成本

Chroma:零运维(嵌入式)
Qdrant:低(单进程)
Weaviate:中(需要管理 schema)
Milvus:高(分布式组件多)

实测对比:RAG 项目

测试场景

  • 数据量:100 万文档片段
  • 维度:768(BGE embedding)
  • 查询 QPS:100
  • 召回率要求:> 0.92

部署时间

数据库 部署时间
Chroma 1 分钟(pip install)
Qdrant 5 分钟(Docker)
Weaviate 15 分钟(Docker + 配置)
Milvus 1 小时(Docker Compose + 依赖)

100 万数据插入时间

数据库 插入时间
Chroma 30 分钟(单线程)
Qdrant 15 分钟(单线程)
Weaviate 20 分钟
Milvus 5 分钟(分布式)

100 QPS 查询压力测试

数据库 P99 延迟 错误率
Chroma 800ms 5%
Qdrant 50ms 0%
Weaviate 80ms 0%
Milvus 30ms 0%

Chroma 在 100 QPS 下已经吃力——不适合生产高并发。

资源占用(100 万向量)

数据库 内存 磁盘
Chroma 4GB 3GB
Qdrant 2GB 2GB
Weaviate 3GB 3GB
Milvus 6GB(分布式) 4GB

Qdrant 资源效率最高。

我的选型建议

选 Chroma 的场景

✅ 原型开发(PoC)
✅ 数据量 < 10 万
✅ 单机、单用户
✅ 学习向量数据库

典型用法:

1
2
3
4
5
import chromadb
client = chromadb.PersistentClient(path="./data")
collection = client.create_collection("docs")
collection.add(ids=["1"], documents=["..."], embeddings=[[...]])
results = collection.query(query_embeddings=[[...]], n_results=5)

选 Qdrant 的场景

✅ 中等规模(10 万 - 1000 万向量)
✅ 需要高性能
✅ 单机能搞定
✅ 资源敏感

典型用法:

1
2
3
4
from qdrant_client import QdrantClient
client = QdrantClient("localhost", port=6333)
client.upsert(collection_name="docs", points=[...])
results = client.search(collection_name="docs", query_vector=[...], limit=10)

选 Milvus 的场景

✅ 大规模(1000 万+ 向量)
✅ 需要分布式
✅ 企业级生产
✅ 高 QPS 要求

典型用法:

1
2
3
4
5
from pymilvus import connections, Collection
connections.connect(host="localhost", port="19530")
collection = Collection("docs")
collection.load()
results = collection.search(data=[...], anns_field="embedding", param={}, limit=10)

选 Weaviate 的场景

✅ 需要内置向量化
✅ 需要 Hybrid Search
✅ 多模态数据
✅ GraphQL 接口

典型用法:

1
2
3
4
5
import weaviate
client = weaviate.Client("http://localhost:8080")
client.schema.create_class({...})
client.data_object.create({...}, "Docs")
results = client.query.get("Docs", ["title"]).with_near_text({"concepts": ["..."]}).do()

我的实际项目经验

项目 1:企业内部知识库

  • 数据量:50 万文档片段
  • 选择:Qdrant
  • 理由:单机能搞定,性能好,运维简单
  • 跑了 1 年,稳定

项目 2:C 端 AI 应用

  • 数据量:500 万文档片段
  • 选择:Milvus
  • 理由:分布式,QPS 要求高
  • 跑了半年,生产稳定

项目 3:个人项目 / 实验

  • 数据量:1 万文档片段
  • 选择:Chroma
  • 理由:0 部署,跑得快
  • 适合开发阶段

项目 4:多模态 RAG

  • 数据量:100 万(图文混合)
  • 选择:Weaviate
  • 理由:内置多模态、Hybrid Search
  • 适合场景复杂的产品

几个常见误区

误区 1:上来就上 Milvus

Milvus 部署运维成本高——如果数据量小,Chroma 或 Qdrant 完全够用。

误区 2:以为向量数据库是万能

向量数据库只解决”语义检索”——精确查询还是要 SQL。

混合架构:

1
2
3
4
5
# 1. 先用 SQL 过滤
docs = sql.query("SELECT * FROM docs WHERE category = '产品A'")

# 2. 再用向量检索
results = vector_db.search(query, filter_ids=[d.id for d in docs])

误区 3:不考虑运维

Milvus、Weaviate 部署后需要持续运维——版本升级、监控、备份。

Qdrant 单进程最省心——适合不想管运维的团队。

误区 4:忽略召回率评估

不同向量数据库召回率不同——别只看性能,召回率才是核心指标。

1
2
3
4
5
6
7
8
# 用测试集评估
test_queries = [...]
for q in test_queries:
results = db.search(q.embedding, top_k=10)
expected = q.expected_ids

recall = len(set(results) & set(expected)) / len(expected)
print(f"Q: {q.text}, Recall: {recall}")

写在最后

向量数据库没有”最好”——只有”最适合”。

我的最终建议:

数据量 推荐
< 10 万 Chroma
10 万 - 1000 万 Qdrant
1000 万+ Milvus
多模态 Weaviate

PoC 阶段用 Chroma,生产阶段根据规模选——别一上来就上最复杂的。

向量数据库是”基础设施”——选错了重构成本高,选对了用几年都不变。