关联阅读:上一篇《从 0 到 1 搭建企业级 RAG 系统》
一、先回答最重要的问题
选向量数据库之前,先问自己三个问题:
-
数据规模多大?
- 百万级以下 → Chroma / FAISS 足够
- 千万到亿级 → Qdrant / Milvus
- 十亿级以上 → Milvus 分布式方案
-
要不要私有化部署?
- 客户要求数据不出网 → Qdrant / Milvus(都支持 K8s 私有化)
- Chroma 不适合生产环境私有部署 ❌
-
团队技术栈是什么?
- Python 为主 → 四个都能用,Chroma 最简单
- 需要多语言 SDK → Qdrant / Milvus(生态更全)
- 需要 Java → Milvus(原生支持)
二、四个主流向量数据库横向对比
| 维度 | Qdrant ⭐ | Milvus | FAISS | Chroma |
|---|---|---|---|---|
| 上手难度 | ⭐⭐ 低 | ⭐ 高 | ⭐⭐ 低 | ⭐ 最低 |
| 生产就绪 | ✅ 是 | ✅ 是 | ✅ 是 | ❌ 仅 POC |
| 私有部署 | ✅ 完整 | ✅ 完整 | ⚠️ 需自己包装 | ❌ 不推荐 |
| 中文效果 | ✅ 好 | ✅ 好 | ✅ 好 | ✅ 可用 |
| 性能 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐ |
| 社区生态 | ⭐⭐⭐ 成长中 | ⭐⭐⭐⭐⭐ 最大 | ⭐⭐⭐ 稳定 | ⭐⭐ 较小 |
| 多语言 SDK | ✅ 完整 | ✅ 完整 | ⚠️ Python 为主 | ✅ 有 |
| 混合检索 | ✅ 原生支持 | ✅ 支持 | ❌ 不支持 | ❌ 不支持 |
| 我的推荐 | 生产首选 | 大规模首选 | 轻量嵌入首选 | 快速验证 |
三、实测:同数据集下四个数据库的召回率与性能
测试环境:10 万条中文文本向量(每条约 500 字),Embedding 模型:BGE-large-zh(1024 维),MacBook M2 本地测试
3.1 召回率对比
| 数据库 | Top-3 召回率 | Top-5 召回率 | Top-10 召回率 |
|---|---|---|---|
| Qdrant | 94.2% | 96.8% | 98.1% |
| Milvus | 93.8% | 96.5% | 97.9% |
| FAISS | 93.1% | 95.9% | 97.4% |
| Chroma | 88.6% | 92.3% | 95.1% |
结论:召回率差距不大,Qdrant 和 Milvus 表现最好,Chroma 明显偏低。
3.2 查询速度对比
| 数据库 | 单次查询(P99) | 并发 50 QPS |
|---|---|---|
| Qdrant | 18ms | ✅ 稳定 |
| Milvus | 24ms | ✅ 稳定 |
| FAISS | 12ms | ✅ 稳定 |
| Chroma | 65ms | ⚠️ 并发下降明显 |
结论:FAISS 速度最快(毕竟是 Facebook 自家的),Qdrant 次之,Chroma 不适合高并发场景。
四、各数据库实操演示
4.1 Chroma — 5 分钟跑通(仅限快速验证)
Chroma 的最大优点:安装一行,5 分钟出结果。
pip install chromadb langchain langchain-community langchain-openai
import chromadb
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import HuggingFaceBgeEmbeddings
embedding = HuggingFaceBgeEmbeddings(model_name="BAAI/bge-large-zh")
# 存入向量
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embedding,
persist_directory="./chroma_db"
)
# 查询
results = vectorstore.similarity_search("劳动合同最长期限?", k=3)
for r in results:
print(r.page_content[:100])
优点:代码最少,上手最快 致命缺点:
- 持久化不稳定(实测在 Mac 上偶发数据丢失)
- 不支持真正的生产并发
- 数据安全要求高的项目绝对不能用
结论:只用来快速验证你的 RAG 流程是否跑通,不要上生产。
4.2 FAISS — 轻量级本地首选
FAISS 是 Facebook(Meta)开源的向量检索库,性能极强,但本质是一个库,不是完整的数据库服务。
pip install faiss-cpu # 或 faiss-gpu(需要 NVIDIA GPU)
import faiss
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import HuggingFaceBgeEmbeddings
# 存入向量
vectorstore = FAISS.from_documents(chunks, embedding)
# 保存
vectorstore.save_local("faiss_index")
# 查询
results = vectorstore.similarity_search("劳动合同最长期限?", k=3)
# 如果数据量大,用 IndexFlatIP + IVF 加速
dim = 1024
nlist = 100 # 聚类数量
quantizer = faiss.IndexFlatIP(dim)
index = faiss.IndexIVFFlat(quantizer, dim, nlist, faiss.METRIC_INNER_PRODUCT)
index.train(embeddings) # 训练
index.add(embeddings) # 添加向量
优点:速度快、支持 GPU 加速、代码轻量 缺点:
- 不支持云原生(没有 HTTP API)
- 多语言支持弱(主要 Python)
- 不支持混合检索
- 没有内置的用户权限和监控
结论:适合嵌入现有 Python 项目的轻量场景,或在没有GPU 的服务器上做本地检索。如果要做成服务,需要自己包装 API。
4.3 Qdrant — 生产环境首选 ⭐
Qdrant 是我实际交付项目用得最多的向量数据库。
核心优势:
- 原生支持混合检索(向量 + 关键词)
- 有完整的 REST API 和 gRPC 接口
- 支持在线动态更新向量
- 有 Dashboard 可视化监控
- K8s 部署方案成熟
# 方式一:Docker 一键启动
docker run -p 6333:6333 -p 6334:6334 \
-v $(pwd)/qdrant_storage:/qdrant/storage \
qdrant/qdrant
# 方式二:Python 客户端直连
pip install qdrant-client langchain-qdrant
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct
from langchain_community.embeddings import HuggingFaceBgeEmbeddings
from langchain_community.vectorstores import Qdrant
embedding = HuggingFaceBgeEmbeddings(model_name="BAAI/bge-large-zh")
# 连接本地 Qdrant
client = QdrantClient(host="localhost", port=6333)
# 创建 collection
client.create_collection(
collection_name="my_knowledge_base",
vectors_config=VectorParams(
size=1024,
distance=Distance.COSINE
)
)
# 存入向量
vectorstore = Qdrant.from_documents(
documents=chunks,
embedding=embedding,
client=client,
collection_name="my_knowledge_base"
)
# 查询
results = vectorstore.similarity_search("劳动合同最长期限?", k=3)
# 进阶:带过滤条件的查询
results = client.search(
collection_name="my_knowledge_base",
query_vector=embedding.embed_query("劳动合同最长期限?"),
query_filter={
"must": [
{"key": "category", "match": {"value": "劳动法"}}
]
},
limit=3
)
私有化部署(客户最关心的) :
# Docker Compose 部署(生产可用)
cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
qdrant:
image: qdrant/qdrant:latest
ports:
- "6333:6333"
- "6334:6334"
volumes:
- ./qdrant_data:/qdrant/storage
environment:
QDRANT__SERVICE__GRPC_PORT: 6334
EOF
docker-compose up -d
一台 2 核 4G 的服务器就能跑 Qdrant,足够支撑百万级数据。
4.4 Milvus — 亿级数据首选
Milvus 是最成熟的向量数据库,功能最全,但代价是部署和运维复杂度也最高。
适合场景:数据量超过千万级、需要多 Pod 分布式扩展、有专职 DevOps 团队。
# Docker Compose 单机版
wget https://github.com/milvus-io/milvus/releases/latest/download/docker-compose.yml
docker-compose up -d
from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType, utility
from langchain_community.vectorstores import Milvus
# 连接
connections.connect(host="localhost", port="19530")
# 创建 collection(schema 定义)
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=1024),
FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=65535),
]
schema = CollectionSchema(fields=fields, description="知识库 collection")
collection = Collection(name="knowledge_base", schema=schema)
# 建索引(必须)
index_params = {
"index_type": "IVF_FLAT",
"metric_type": "IP",
"params": {"nlist": 128}
}
collection.create_index(field_name="embedding", index_params=index_params)
# 存入向量
vectorstore = Milvus.from_documents(
documents=chunks,
embedding=embedding,
collection_name="knowledge_base",
connection_args={"host": "localhost", "port": "19530"}
)
优点:生态最完善、分布式能力最强、社区最大 缺点:
- 资源占用高(官方建议 16G+ 内存)
- 学习曲线陡
- 部署复杂度高(单机版还行,分布式需要 K8s)
五、选型决策树
数据规模 < 100万?
│
├─ 是 → 需要私有化部署?
│ ├─ 是 → Qdrant ⭐(Docker 一键部署)
│ └─ 否 → 快速验证?→ Chroma / 正式项目 → Qdrant
│
└─ 否(100万~亿级)→ Qdrant(推荐)/ Milvus
│
└─ 亿级以上 → Milvus 分布式
六、我的真实选择逻辑
做了这么多项目,我实际选型就三种情况:
| 情况 | 我的选择 | 理由 |
|---|---|---|
| 客户项目,要快速交付 | Qdrant | Docker 一键跑,API 友好,出了问题好排查 |
| 自己内部用,轻量 | FAISS | 直接嵌入 Python,没额外依赖 |
| 数据量亿级以上 | Milvus | 不得不选,功能最全 |
| 帮客户 POC 演示 | Chroma | 5 分钟跑通,客户立刻能看到效果 |
一句话:大多数项目选 Qdrant,不会错。
七、踩坑清单
| 问题 | 出在哪 | 解决方案 |
|---|---|---|
| Chroma 持久化丢数据 | 数据没 fsync | POC 用可以,正式项目换 Qdrant |
| FAISS 查询慢 | 没建索引 | 用 IVF 索引加速 |
| Qdrant 内存占用高 | collection 太多 | 定期清理或分 collection |
| Milvus 部署失败 | Docker 端口冲突 | 先查 19530 端口是否被占用 |
| 向量检索不准确 | Embedding 模型没对齐 | 同一文档用同一 Embedding 模型入库和查询 |
总结
三个核心结论:
- Chroma 只用来快速验证,不要上生产
- Qdrant 是当前最值得推荐的生产选择——上手简单、功能完整、私有化部署友好
- 选数据库之前先想清楚:数据规模、部署方式、团队技术栈,这三个问题比数据库本身更重要
下一步
选型只是第一步,下一篇我会讲《让 AI 读懂你的文档》——文本分割与 Embedding 实战的细节。
如果你正在选型阶段纠结,欢迎扫码聊一聊。 我可以帮你评估现有技术栈,给出具体选型建议,不收费。
备注"选型",送你一份《向量数据库选型评估表》,包含本文所有对比维度的详细打分 👇
📌 关联阅读
关注「林间昭语」公众号,回复以下关键词领取资料:
- 回复"知识库" → 领取《RAG 交付自检清单》
- 回复"分割" → 领取《常见文档分割策略对比表》
- 回复"选型" → 领取《向量数据库选型评估表》
- 回复"调优" → 领取《RAG 调优参数手册》
关注「林间昭语」,用技术创造可能。点击上方蓝色公众号名称 → 设为星标 🌟,第一时间收到干货。