向量数据库入门:Milvus / Chroma / Pinecone 怎么选

2026 年了,RAG(检索增强生成)几乎成了 AI 应用的标配。而 RAG 的底座,就是向量数据库。但市面上 Milvus、Chroma、Pinecone 一堆选项,到底怎么选?


一、什么是向量,为什么传统数据库搞不定

1.1 传统数据库的搜索方式

SELECT * FROM articles WHERE title LIKE '%鸿蒙%';
-- 只能做关键词匹配,搜不到"HarmonyOS"的文章

你搜「怎么优化代码性能」,数据库只能匹配包含这些字的行。它不理解「代码性能」≈「运行速度」≈「执行效率」。

1.2 向量是什么

向量就是把一段文本(或图片、音频)转换成一组浮点数:

"鸿蒙应用开发"[0.023, -0.451, 0.789, ..., 0.112]  # 1024 维
"HarmonyOS 开发"[0.021, -0.448, 0.792, ..., 0.109]  # 1024 维

语义相近的文本,向量之间的距离也相近。

cosine_similarity("鸿蒙应用开发", "HarmonyOS 开发") = 0.96  ✅ 接近
cosine_similarity("鸿蒙应用开发", "今天天气不错") = 0.12    ❌ 远离

1.3 向量数据库做的是什么

用户问题 → Embedding 模型 → 向量 → 向量数据库检索 → Top-K 相似文本 → 返回结果

传统数据库做不到这个,因为 SQL 没有「找最相似的 100 维向量」这种操作。向量数据库专门为此设计,核心能力就是近似最近邻搜索(ANN)


二、三大主流向量数据库对比

概览

维度 Milvus Chroma Pinecone
类型 开源自部署 开源嵌入式 商业 SaaS
开发者 Zilliz(中国) Chroma 团队(美国) Pinecone(美国)
部署方式 Docker / K8s / Zilliz Cloud pip install 即可 纯云端
数据量级 亿级 百万级 亿级
检索算法 IVF_FLAT, HNSW, DiskANN HNSW 自研(不公开)
Python SDK pymilvus chromadb pinecone-client
中文生态 ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐
推荐场景 生产环境 / 大规模 原型验证 / 个人项目 不想管运维

三、逐个深扒

3.1 Milvus:生产级首选

from pymilvus import connections, Collection, FieldSchema, DataType, CollectionSchema

# 连接
connections.connect(host="localhost", port="19530")

# 定义 Schema
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=65535),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=1024),
]
schema = CollectionSchema(fields=fields)
collection = Collection(name="docs", schema=schema)

# 创建索引(HNSW 比 IVF_FLAT 更适合生产)
index_params = {
    "metric_type": "COSINE",
    "index_type": "HNSW",
    "params": {"M": 16, "efConstruction": 200}
}
collection.create_index(field_name="embedding", index_params=index_params)

# 插入数据
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("BAAI/bge-large-zh-v1.5")

texts = ["鸿蒙是华为开发的操作系统", "HarmonyOS 支持 ArkTS 语言"]
embeddings = model.encode(texts, normalize_embeddings=True)

collection.insert([texts, embeddings.tolist()])
collection.flush()

# 搜索
query_vec = model.encode(["鸿蒙用什么语言开发?"], normalize_embeddings=True)
collection.load()
results = collection.search(
    data=query_vec.tolist(),
    anns_field="embedding",
    param={"metric_type": "COSINE", "params": {"ef": 64}},
    limit=3,
    output_fields=["text"]
)

for hit in results[0]:
    print(f"score={hit.score:.3f}, text={hit.entity.get('text')}")

优点

  • 亿级数据能力,经历了腾讯、小米的验证
  • 多种索引算法,可针对场景调优
  • 有 Zilliz Cloud(托管版),兼顾自部署和 SaaS

缺点

  • 部署重,需要 etcd + MinIO,吃资源
  • 学习曲线比 Chroma 陡
  • get_or_create_collection 没检查存在性时会直接炸(真实踩坑经验)

💡 实战技巧:用 pymilvus.utility.has_collection() 先检查再创建。

3.2 Chroma:最丝滑的开发体验

import chromadb
from chromadb.utils import embedding_functions

# 内置 Embedding 函数,真的开箱即用
client = chromadb.PersistentClient(path="./chroma_data")
collection = client.get_or_create_collection(
    name="docs",
    embedding_function=embedding_functions.SentenceTransformerEmbeddingFunction(
        model_name="BAAI/bge-large-zh-v1.5"
    )
)

# 插入
collection.add(
    documents=["鸿蒙是华为开发的操作系统", "HarmonyOS 支持 ArkTS 语言"],
    ids=["doc1", "doc2"]
)

# 搜索 —— 中文也能直接搜
results = collection.query(
    query_texts=["鸿蒙用什么语言开发?"],
    n_results=2
)
print(results["documents"])  # ['HarmonyOS 支持 ArkTS 语言', '鸿蒙是华为开发的操作系统']

优点

  • pip install chromadb 就完事了,零配置
  • 内置 Embedding 函数,不用额外集模型
  • API 设计极简,5 行代码跑通 RAG

缺点

  • 百万级数据后性能下降明显
  • 不支持分布式部署
  • 生产环境的可靠性还没经过大规模验证

适用场景:个人项目、Hackathon、MVP 验证。

3.3 Pinecone:懒人福音

from pinecone import Pinecone

pc = Pinecone(api_key="your-api-key")
index = pc.Index("docs")

# 插入
index.upsert(vectors=[
    {"id": "doc1", "values": [0.1] * 1024, "metadata": {"text": "..."}},
])

# 搜索
results = index.query(
    vector=[0.1] * 1024,
    top_k=3,
    include_metadata=True
)

优点

  • 零运维,申请即用
  • 自动扩缩容
  • Serverless 按量计费

缺点

  • 💰 贵。100 万条 1024 维向量约 $70/月起步
  • 数据在别人服务器上,合规敏感场景不宜
  • 国内访问需要梯子

四、选型决策树

你的场景是什么?
│
├─ 个人项目 / MVP / Hackathon
│   └─ → Chroma(pip install 即用)
│
├─ 公司生产环境,数据量百万级以上
│   ├─ 有运维团队 → Milvus 自部署
│   └─ 无运维团队 → Zilliz Cloud(Milvus 托管)
│
├─ 海外项目,不想管服务器
│   └─ → Pinecone(贵但省心)
│
└─ 数据合规要求高(金融/政务)
    └─ → Milvus 私有化部署

五、性能实测(10 万条 1024 维向量)

测试环境:MacBook Pro M3, 16GB RAM

操作 Milvus Chroma Pinecone
批量插入 10 万条 12s 45s 8s (云端)
Top-10 检索延迟 (P99) 8ms 15ms 12ms
内存占用 800MB 350MB 0 (云端)
Docker 镜像大小 2.1GB 0 (pip) 0 (云端)
稳定性 (连续查询 1h) 稳定 偶有卡顿 稳定

结论:小规模 Chroma 够用,上生产必须 Milvus/Pinecone


六、实战建议

6.1 不要直接裸用向量数据库

好的 RAG 系统架构:

API 层(FastAPI)
    ↓
Query 改写 / 多轮上下文
    ↓
Embedding(BGE / text2vec)
    ↓
混合检索 = 向量检索 + BM25 关键词检索  ← 这才是关键
    ↓
Re-rank(重排序)
    ↓
LLM 生成答案

纯粹的向量检索准确率约 70-75%,加上 BM25 混合检索可到 85%+,再加重排序可到 90%+。

6.2 Embedding 模型的选择

模型 维度 中文效果 部署
BGE-Large-ZH v1.5 1024 ⭐⭐⭐⭐⭐ 本地 1.3GB
text2vec-large-chinese 1024 ⭐⭐⭐⭐ 本地
M3E-large 1024 ⭐⭐⭐⭐ 本地
OpenAI text-embedding-3 1536 ⭐⭐⭐ API 计费

国产场景建议 BGE-Large-ZH,免费且中文效果最好。

6.3 Chunk 大小怎么定

Chunk 大小 优点 缺点
256 token 检索精准 上下文碎片化
512 token 平衡
1024 token 上下文完整 检索精度下降

建议:512 token 为主,代码示例保留完整不切割


七、总结

场景 推荐
🚀 快速原型 Chroma
🏭 生产环境 Milvus (自部署) 或 Zilliz Cloud (托管)
💸 花钱买省心 Pinecone (海外) / Zilliz Cloud (国内)

我的个人选择:开发阶段 Chroma,上线切 Milvus。中间切换成本很低,因为都是标准的向量存取接口。


下一篇预告:《鸿蒙端侧数据库:HarmonyOS 的 relationalStore 实战》—— ArkTS 全代码,从建表到 CRUD 到事务处理,鸿蒙开发者必看。

参考:Milvus 2.5 文档、ChromaDB 0.5、Pinecone Python SDK 5.0

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐