向量数据库横评:Milvus vs Pinecone vs Weaviate 选型指南
SELECT * FROM articles WHERE title LIKE '%鸿蒙%';-- 只能做关键词匹配,搜不到"HarmonyOS"的文章你搜「怎么优化代码性能」,数据库只能匹配包含这些字的行。它不理解「代码性能」≈「运行速度」≈「执行效率」。场景推荐🚀 快速原型Chroma🏭 生产环境Milvus(自部署) 或(托管)💸 花钱买省心Pinecone(海外) /(国内)我的个人
向量数据库入门: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
更多推荐



所有评论(0)