向量数据库选型指南: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 算法有三类:

理解了这些,选型时看索引类型就知道它适合什么场景。

二、三大主流方案对比

我们从部署方式、规模、性能、成本、生态五个维度对比 Pinecone、Milvus、Chroma。

维度PineconeMilvusChroma
部署方式全托管 SaaS自托管/云托管嵌入式/本地
适合规模百万~十亿级百万~十亿级万~百万级
运维成本零运维需自己运维集群几乎零运维
计费模式按用量付费开源免费/云付费开源免费
元数据过滤支持支持支持
动态数据支持支持支持
学习曲线中高极低

Pinecone:省心的全托管方案

Pinecone 是纯 SaaS 向量库,你不用管服务器、索引调优、扩容,注册即用。它对动态数据(频繁增删改)支持很好,元数据过滤能力强。缺点是数据要传到它的云上,对数据合规敏感的场景不友好;且按用量计费,规模大了成本不低。

Milvus:能扛规模的开源重器

Milvus 是国产开源向量库(Zilliz 出品),支持十亿级向量,索引类型最全(HNSW、IVF、DiskANN 等),可水平扩展。适合对数据主权有要求、规模大、有运维团队的企业。缺点是部署较重(依赖 etcd、MinIO、Pulsar 等组件),小项目用它属于杀鸡用牛刀。

Chroma:轻量的开发者首选

Chroma 是专为 AI 应用设计的轻量向量库,API 极简,pip 安装即用,默认嵌入式运行(数据存本地 SQLite+DuckDB)。适合原型开发、本地知识库、百万级以下数据。缺点是不支持分布式,规模上去后要迁移。

三、选型决策树

不要一上来就纠结哪个“最好”,先回答三个问题:

  1. 数据规模多大?万级以下用 Chroma 甚至 FAISS 内存版;百万到千万级用 Milvus 或 Pinecone;十亿级用 Milvus 集群。
  2. 有没有运维团队?没有就选 Pinecone(全托管)或 Chroma(零运维);有且要数据自主可控就选 Milvus 自托管。
  3. 数据能否出本地?金融、医疗等合规要求高的,排除 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"])

七、性能调优要点

选好向量库只是开始,调优才是性能拉开差距的地方:

  1. 索引参数:HNSW 的 M(图连接数)和 ef_construction(建图搜索宽度)越大召回越高但内存越多;查询时 ef_search 越大越准但越慢。
  2. 批量写入:单条插入极慢,务必批量(每批 100-1000 条)。
  3. 归一化向量:用余弦相似度时,写入前对向量做 L2 归一化,能用内积索引加速。
  4. 元数据过滤前置:先按元数据(如时间、类别)过滤再向量检索,比检索后过滤快得多。
  5. 分片:千万级以上数据按业务维度分片(如按租户、按时间),避免单索引过大。

八、用 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 →