「向量数据库怎么选」Milvus / Qdrant / FAISS / Chroma 实操对比

0 阅读7分钟

关联阅读:上一篇《从 0 到 1 搭建企业级 RAG 系统》


一、先回答最重要的问题

选向量数据库之前,先问自己三个问题:

  1. 数据规模多大?

    • 百万级以下 → Chroma / FAISS 足够
    • 千万到亿级 → Qdrant / Milvus
    • 十亿级以上 → Milvus 分布式方案
  2. 要不要私有化部署?

    • 客户要求数据不出网 → Qdrant / Milvus(都支持 K8s 私有化)
    • Chroma 不适合生产环境私有部署 ❌
  3. 团队技术栈是什么?

    • Python 为主 → 四个都能用,Chroma 最简单
    • 需要多语言 SDK → Qdrant / Milvus(生态更全)
    • 需要 Java → Milvus(原生支持)

二、四个主流向量数据库横向对比

维度QdrantMilvusFAISSChroma
上手难度⭐⭐ 低⭐ 高⭐⭐ 低⭐ 最低
生产就绪✅ 是✅ 是✅ 是❌ 仅 POC
私有部署✅ 完整✅ 完整⚠️ 需自己包装❌ 不推荐
中文效果✅ 好✅ 好✅ 好✅ 可用
性能⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
社区生态⭐⭐⭐ 成长中⭐⭐⭐⭐⭐ 最大⭐⭐⭐ 稳定⭐⭐ 较小
多语言 SDK✅ 完整✅ 完整⚠️ Python 为主✅ 有
混合检索✅ 原生支持✅ 支持❌ 不支持❌ 不支持
我的推荐生产首选大规模首选轻量嵌入首选快速验证

三、实测:同数据集下四个数据库的召回率与性能

测试环境:10 万条中文文本向量(每条约 500 字),Embedding 模型:BGE-large-zh(1024 维),MacBook M2 本地测试

3.1 召回率对比

数据库Top-3 召回率Top-5 召回率Top-10 召回率
Qdrant94.2%96.8%98.1%
Milvus93.8%96.5%97.9%
FAISS93.1%95.9%97.4%
Chroma88.6%92.3%95.1%

结论:召回率差距不大,Qdrant 和 Milvus 表现最好,Chroma 明显偏低。

3.2 查询速度对比

数据库单次查询(P99)并发 50 QPS
Qdrant18ms✅ 稳定
Milvus24ms✅ 稳定
FAISS12ms✅ 稳定
Chroma65ms⚠️ 并发下降明显

结论: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 分布式

六、我的真实选择逻辑

做了这么多项目,我实际选型就三种情况:

情况我的选择理由
客户项目,要快速交付QdrantDocker 一键跑,API 友好,出了问题好排查
自己内部用,轻量FAISS直接嵌入 Python,没额外依赖
数据量亿级以上Milvus不得不选,功能最全
帮客户 POC 演示Chroma5 分钟跑通,客户立刻能看到效果

一句话:大多数项目选 Qdrant,不会错。


七、踩坑清单

问题出在哪解决方案
Chroma 持久化丢数据数据没 fsyncPOC 用可以,正式项目换 Qdrant
FAISS 查询慢没建索引用 IVF 索引加速
Qdrant 内存占用高collection 太多定期清理或分 collection
Milvus 部署失败Docker 端口冲突先查 19530 端口是否被占用
向量检索不准确Embedding 模型没对齐同一文档用同一 Embedding 模型入库和查询

总结

三个核心结论:

  1. Chroma 只用来快速验证,不要上生产
  2. Qdrant 是当前最值得推荐的生产选择——上手简单、功能完整、私有化部署友好
  3. 选数据库之前先想清楚:数据规模、部署方式、团队技术栈,这三个问题比数据库本身更重要

下一步

选型只是第一步,下一篇我会讲《让 AI 读懂你的文档》——文本分割与 Embedding 实战的细节。

如果你正在选型阶段纠结,欢迎扫码聊一聊。 我可以帮你评估现有技术栈,给出具体选型建议,不收费。

备注"选型",送你一份《向量数据库选型评估表》,包含本文所有对比维度的详细打分 👇


📌 关联阅读

关注「林间昭语」公众号,回复以下关键词领取资料:

  • 回复"知识库" → 领取《RAG 交付自检清单》
  • 回复"分割" → 领取《常见文档分割策略对比表》
  • 回复"选型" → 领取《向量数据库选型评估表》
  • 回复"调优" → 领取《RAG 调优参数手册》

关注「林间昭语」,用技术创造可能。点击上方蓝色公众号名称 → 设为星标 🌟,第一时间收到干货。