向量数据库选型指南:Pinecone vs Milvus vs Chroma对比
做 RAG、语义搜索、推荐系统,迟早要面对一个问题:向量存哪儿?把几百万条文本的 Embedding 向量塞进 MySQL 显然不现实,传统数据库没有“找最相似的 Top-K”这种能力。于是向量数据库应运而生——它专门为高维向量的近似最近邻搜索(ANN)而生。
但市面上的向量库让人眼花缭乱:Pinecone、Milvus、Chroma、Weaviate、Qdrant、FAISS……到底该选哪个?本文先讲清楚向量库的底层原理,再横向对比三个最有代表性的方案,最后给出选型决策建议和 Python 接入代码。
一、向量数据库到底在解决什么问题
假设你有 100 万条文档,每条都转成了 1536 维向量。用户提问时,也要把问题转成 1536 维向量,然后在 100 万个向量里找出与问题向量最相似的 K 个。相似度通常用余弦相似度或欧氏距离衡量。
暴力做法是逐个计算距离再排序,复杂度 O(N×D),100 万条要算 15 亿次乘法,毫秒级响应根本不可能。向量数据库的核心价值就是用近似最近邻(ANN)算法把查询复杂度降到亚线性级别,在“精度损失可接受”的前提下实现毫秒级检索。
主流 ANN 算法有三类:
- HNSW(分层可导航小世界图):把向量组织成多层图,从顶层粗筛到底层精排。查询快、召回高,是当前最主流的索引。
- IVF(倒排文件):先用 K-means 把向量聚成 N 个簇,查询时只搜最近的几个簇。适合超大规模数据。
- PQ(乘积量化):把向量压缩存储,牺牲精度换内存。常和 IVF 组合成 IVF_PQ。
理解了这些,选型时看索引类型就知道它适合什么场景。
二、三大主流方案对比
我们从部署方式、规模、性能、成本、生态五个维度对比 Pinecone、Milvus、Chroma。
| 维度 | Pinecone | Milvus | Chroma |
|---|---|---|---|
| 部署方式 | 全托管 SaaS | 自托管/云托管 | 嵌入式/本地 |
| 适合规模 | 百万~十亿级 | 百万~十亿级 | 万~百万级 |
| 运维成本 | 零运维 | 需自己运维集群 | 几乎零运维 |
| 计费模式 | 按用量付费 | 开源免费/云付费 | 开源免费 |
| 元数据过滤 | 支持 | 支持 | 支持 |
| 动态数据 | 支持 | 支持 | 支持 |
| 学习曲线 | 低 | 中高 | 极低 |
Pinecone:省心的全托管方案
Pinecone 是纯 SaaS 向量库,你不用管服务器、索引调优、扩容,注册即用。它对动态数据(频繁增删改)支持很好,元数据过滤能力强。缺点是数据要传到它的云上,对数据合规敏感的场景不友好;且按用量计费,规模大了成本不低。
Milvus:能扛规模的开源重器
Milvus 是国产开源向量库(Zilliz 出品),支持十亿级向量,索引类型最全(HNSW、IVF、DiskANN 等),可水平扩展。适合对数据主权有要求、规模大、有运维团队的企业。缺点是部署较重(依赖 etcd、MinIO、Pulsar 等组件),小项目用它属于杀鸡用牛刀。
Chroma:轻量的开发者首选
Chroma 是专为 AI 应用设计的轻量向量库,API 极简,pip 安装即用,默认嵌入式运行(数据存本地 SQLite+DuckDB)。适合原型开发、本地知识库、百万级以下数据。缺点是不支持分布式,规模上去后要迁移。
三、选型决策树
不要一上来就纠结哪个“最好”,先回答三个问题:
- 数据规模多大?万级以下用 Chroma 甚至 FAISS 内存版;百万到千万级用 Milvus 或 Pinecone;十亿级用 Milvus 集群。
- 有没有运维团队?没有就选 Pinecone(全托管)或 Chroma(零运维);有且要数据自主可控就选 Milvus 自托管。
- 数据能否出本地?金融、医疗等合规要求高的,排除 Pinecone,选 Milvus 或 Chroma 自托管。
一个实用的渐进路线:原型阶段用 Chroma 快速验证 → 数据上百万后迁到 Milvus → 不想运维就换 Pinecone。三者都支持标准化的向量接口,迁移成本主要在数据导入导出,代码改动不大。
四、Chroma 快速接入示例
Chroma 最适合入门,几行代码就能跑通。这里演示如何把文档向量化存入 Chroma 并检索。
# pip install chromadb openai
import chromadb
from openai import OpenAI
# 通过 EnlyAI 统一接入获取 Embedding
client = OpenAI(api_key="sk-your-enlyai-key", base_url="https://enlyai.com/v1")
def embed(texts):
r = client.embeddings.create(model="text-embedding-3-small", input=texts)
return [d.embedding for d in r.data]
# 创建本地向量库
db = chromadb.PersistentClient(path="./vectordb")
collection = db.get_or_create_collection(name="docs")
docs = ["EnlyAI 支持 GPT-5.5 模型", "Claude Opus 4.8 擅长长文本", "Gemini 3.5 Pro 多模态能力强"]
vectors = embed(docs)
collection.add(
documents=docs,
embeddings=vectors,
ids=["d1", "d2", "d3"]
)
# 检索
q_vec = embed(["哪个模型多模态好"])
results = collection.query(query_embeddings=q_vec, n_results=2)
print(results["documents"])
五、Milvus 接入示例
Milvus 用官方 SDK 连接,需要先启动 Milvus 服务(Docker 或 Milvus Lite)。
# pip install pymilvus
from pymilvus import MilvusClient
# Milvus Lite 单机版,无需独立部署
client = MilvusClient("./milvus_demo.db")
if client.has_collection("docs"):
client.drop_collection("docs")
client.create_collection(
collection_name="docs",
dimension=1536, # 与 Embedding 维度一致
metric_type="COSINE"
)
# 插入数据
data = [{"id": i, "vector": v, "text": t}
for i, (v, t) in enumerate(zip(vectors, docs))]
client.insert(collection_name="docs", data=data)
# 检索 Top-2
res = client.search(
collection_name="docs",
data=q_vec,
limit=2,
output_fields=["text"]
)
for hits in res:
for hit in hits:
print(hit["entity"]["text"], hit["distance"])
六、Pinecone 接入示例
# pip install pinecone
from pinecone import Pinecone
pc = Pinecone(api_key="your-pinecone-key")
index = pc.Index("docs")
# upsert 写入
index.upsert(vectors=[
{"id": "d1", "values": vectors[0], "metadata": {"text": docs[0]}},
{"id": "d2", "values": vectors[1], "metadata": {"text": docs[1]}},
])
# 查询,可带元数据过滤
res = index.query(vector=q_vec[0], top_k=2, include_metadata=True)
for m in res["matches"]:
print(m["metadata"]["text"], m["score"])
七、性能调优要点
选好向量库只是开始,调优才是性能拉开差距的地方:
- 索引参数:HNSW 的
M(图连接数)和ef_construction(建图搜索宽度)越大召回越高但内存越多;查询时ef_search越大越准但越慢。 - 批量写入:单条插入极慢,务必批量(每批 100-1000 条)。
- 归一化向量:用余弦相似度时,写入前对向量做 L2 归一化,能用内积索引加速。
- 元数据过滤前置:先按元数据(如时间、类别)过滤再向量检索,比检索后过滤快得多。
- 分片:千万级以上数据按业务维度分片(如按租户、按时间),避免单索引过大。
八、用 EnlyAI 统一获取 Embedding
无论选哪个向量库,都需要先有 Embedding。通过 EnlyAI 统一接入,一个 key 调用所有 Embedding 模型,不用在 OpenAI、Cohere、Voyage 各开账号:
from openai import OpenAI
client = OpenAI(api_key="sk-your-enlyai-key", base_url="https://enlyai.com/v1")
# 同一套代码,切换不同 Embedding 模型对比效果
for model in ["text-embedding-3-small", "text-embedding-3-large"]:
r = client.embeddings.create(model=model, input=["测试语义检索"])
print(model, len(r.data[0].embedding))
统一接入的好处是:换 Embedding 模型只改一个字符串,向量库不用动;所有模型调用汇总在一个账单,方便成本分析。
总结
向量数据库没有银弹。Chroma 胜在轻快,适合原型和中小规模;Milvus 胜在能扛规模和数据自主,适合企业级;Pinecone 胜在零运维,适合不想碰基础设施的团队。先想清楚规模、运维能力和合规要求,再按决策树选型,比盲目追“最强”靠谱得多。
而 Embedding 这一层,交给 EnlyAI 统一接入,能让你在向量库选型和迁移时保持模型层稳定,把精力集中在检索效果本身。
想为 RAG 系统选对向量库与 Embedding?
EnlyAI 提供 OpenAI 兼容的统一接口,一个 key 调用各类 Embedding 模型与 GPT-5.5、Claude Opus 4.8 等大模型,注册即送免费额度,配合任意向量库即可搭建 RAG。
立即注册 EnlyAI →