跳到主要内容

AI 应用向量数据库选型:Milvus、Pinecone、Qdrant、Chroma 等对比

· 阅读需 9 分钟

RAG 火了一年多,向量数据库的选型问题被问了无数次。本文基于实际使用经验,系统对比 8 款主流向量数据库,帮你做技术决策。

先理清概念:向量数据库到底存什么​

向量数据库不是魔法。本质上它做两件事:

  1. 存向量 — 把 Embedding 模型输出的高维浮点向量(如 1536 维)存下来
  2. 搜近似 — 给定一个查询向量,快速找到 Top-K 个最相似的向量(ANN 近似最近邻搜索)

核心指标就两个:召回率(搜得准不准)和 QPS(搜得快不快)。

数据流:
文本 → Embedding 模型 → [0.12, -0.34, 0.78, ...] → 向量数据库
↓
查询 → Embedding 模型 → [0.15, -0.31, 0.72, ...] → ANN 检索 → Top-K 结果

8 款数据库速览​

数据库类型开源托管服务核心引擎
Milvus专用向量库✅ Apache 2.0Zilliz CloudKnowhere (FAISS/HNSW/DiskANN)
Pinecone专用向量库❌ 闭源✅ SaaS 唯一自研
Qdrant专用向量库✅ Apache 2.0✅ Qdrant Cloud自研 Rust 引擎
Weaviate向量 + 全文✅ BSD-3✅ Weaviate Cloud自研 + HNSW
Chroma轻量向量库✅ Apache 2.0❌HNSW (hnswlib)
FAISS向量索引库✅ MIT❌CPU/GPU 多索引
pgvectorPG 扩展✅ PostgreSQL✅ 各云 PG 服务IVFFlat / HNSW
Elasticsearch全文 + 向量✅ Elastic License✅ Elastic CloudLucene HNSW

逐一拆解​

Milvus — 国产顶流,功能最全​

定位:企业级分布式向量数据库,面向 10 亿+ 向量规模。

from pymilvus import MilvusClient

client = MilvusClient("milvus_demo.db")

# 建集合
client.create_collection(
collection_name="docs",
dimension=1536,
metric_type="COSINE"
)

# 插入
client.insert("docs", [
{"id": 1, "vector": [0.1, 0.2, ...], "text": "..."},
])

# 搜索
results = client.search(
collection_name="docs",
data=[[0.15, 0.25, ...]],
limit=10,
output_fields=["text"]
)

优点:

  • 索引类型最全:IVF_FLAT、IVF_SQ8、HNSW、DiskANN、GPU 索引
  • 分布式架构:读写分离、水平扩展、多副本
  • 标量过滤强:支持复杂布尔表达式 + 向量搜索混用
  • 生态好:LangChain、LlamaIndex、Dify 都原生支持

缺点:

  • 部署重:依赖 etcd、MinIO、Pulsar/Kafka,最小也要 3 个容器
  • 学习曲线陡:Collection、Partition、Index 概念多
  • Milvus Lite(嵌入式)功能阉割严重

适用:生产环境,向量量级 > 1000 万,需要标量过滤 + 高可用。

Pinecone — 最省心,最贵​

定位:全托管 Serverless 向量数据库,零运维。

from pinecone import Pinecone

pc = Pinecone(api_key="...")
index = pc.Index("my-index")

# 写入
index.upsert(vectors=[
{"id": "1", "values": [0.1, 0.2, ...], "metadata": {"text": "..."}},
])

# 查询
results = index.query(
vector=[0.15, 0.25, ...],
top_k=10,
filter={"category": "tech"},
include_metadata=True
)

优点:

  • 零运维:没有服务器、没有配置、按量付费
  • Serverless 弹性:空闲时 scale to zero
  • Pod 架构:数据隔离天然支持多租户
  • 全球多区域部署

缺点:

  • 贵:$0.33/GB/月 + 写入费用,100 万条向量月费 $70+
  • 闭源:数据在别人手里,审计和合规麻烦
  • 索引类型有限:只有自研引擎,没有 HNSW/IVF 等传统选择
  • 国内访问慢:服务器全在海外

适用:快速原型、海外 SaaS、不想管基础设施的团队。

Qdrant — Rust 写的性能怪兽​

定位:高性能向量数据库,Rust 实现,单机能打。

from qdrant_client import QdrantClient

client = QdrantClient("localhost", port=6333)

client.upsert(
collection_name="docs",
points=[{
"id": 1,
"vector": [0.1, 0.2, ...],
"payload": {"text": "..."}
}]
)

results = client.search(
collection_name="docs",
query_vector=[0.15, 0.25, ...],
limit=10,
query_filter={"must": [{"key": "category", "match": {"value": "tech"}}]}
)

优点:

  • 性能顶:Rust 实现,单机百万 QPS
  • 过滤强:payload 索引 + 全文检索 + 地理位置
  • 量化丰富:Scalar/Product/Binary Quantization
  • 部署简单:单二进制文件,Docker 一行跑
  • 云原生:K8s operator、Raft 共识

缺点:

  • 分布式刚起步:1.9 版本才正式支持水平扩展
  • 中文社区小:遇到问题主要靠英文文档
  • 写入路径不如 Milvus 成熟

适用:追求性能的中型团队,单机到几十台规模。

Weaviate — 自带向量化的混合搜索​

定位:AI-native 向量数据库,内置 Embedding 和生成能力。

import weaviate

client = weaviate.Client("http://localhost:8080")

# 可以直接存文本,Weaviate 自动做 embedding
client.data_object.create(
data_object={"text": "AI 技术发展迅速"},
class_name="Document",
vector=[0.1, 0.2, ...] # 可选,不提供则自动向量化
)

# 混合搜索:向量 + 关键词
response = client.query.get("Document", ["text"]) \
.with_hybrid(query="AI 最新进展", alpha=0.5) \
.with_limit(10) \
.do()

优点:

  • 开箱即用:内置 text2vec 模块(OpenAI/Cohere/HuggingFace),不用自己算 Embedding
  • 混合搜索:向量 + BM25 关键词天然融合,alpha 参数调节权重
  • GraphQL API:查询语法灵活,支持嵌套、聚合
  • 多模态:支持图片、音频向量

缺点:

  • 资源消耗大:Java 实现,内存占用高(推荐 8GB+)
  • 模块生态绑定:text2vec 模块跟版本强耦合
  • 性能不如 Rust/C++ 实现

适用:需要混合搜索(向量 + 关键词)、不想管 Embedding 管线的团队。

Chroma — 开发体验最好的轻量库​

定位:面向 AI 开发者的嵌入式向量数据库,类比 SQLite。

import chromadb

client = chromadb.Client()
collection = client.create_collection("docs")

collection.add(
documents=["AI is transforming industries"],
metadatas=[{"source": "blog"}],
ids=["1"]
)

results = collection.query(
query_texts=["AI 改变行业"],
n_results=5
)

优点:

  • 开发体验一流:pip install 即用,直接传文本不用自己算向量
  • 嵌入模式:进程内运行,零配置
  • 客户端-服务器模式:开发和生产可以解耦
  • LangChain/LlamaIndex 默认后端

缺点:

  • 生产慎用:全文搜索弱,并发写不稳定,无高可用
  • 规模受限:单机百万级,无水平扩展
  • 功能局限:只有 HNSW 一种索引

适用:本地开发、原型验证、小规模(低于 100 万)内部工具。

FAISS — 不是数据库,是索引库​

定位:Meta 开源的向量相似度搜索库,各种索引算法的瑞士军刀。

import faiss
import numpy as np

dim = 1536
index = faiss.IndexIVFFlat(
faiss.IndexFlatL2(dim), # 量化器
dim, 128 # nlist
)

# 需要手动训练
index.train(vectors)
index.add(vectors)

# 搜索
D, I = index.search(query_vector, k=10)

优点:

  • 算法最全:IndexFlat、IVF、HNSW、PQ、OPQ、GPU 全有
  • GPU 加速:CUDA 原生支持,单卡千万 QPS
  • 极致性能:手写 SIMD + GPU kernel
  • 学术界标准:所有向量数据库底层几乎都用了 FAISS

缺点:

  • 不是数据库:无 CRUD、无持久化、无分布式
  • 接口原始:C++ 风格,Python 封装薄
  • 什么都不管:自己管理 ID 映射、元数据、增量更新
  • 索引构建:需要手动 train,IVF 类型索引要离线建

适用:作为底层引擎嵌入你的服务,不适合直接当数据库用。

pgvector — PostgreSQL 党首选​

定位:PostgreSQL 扩展,让 PG 支持向量存储和搜索。

-- 安装扩展
CREATE EXTENSION vector;

-- 建表
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding VECTOR(1536)
);

-- 插入
INSERT INTO documents (content, embedding)
VALUES ('AI 改变世界', '[0.1, 0.2, ...]');

-- 搜索
SELECT content, 1 - (embedding <=> '[0.15, 0.25, ...]') AS similarity
FROM documents
ORDER BY embedding <=> '[0.15, 0.25, ...]'
LIMIT 10;

优点:

  • 零新增基础设施:现有的 PG 加个扩展就行
  • 事务 + 向量:向量搜索跟业务数据在一个事务里
  • 过滤无敌:WHERE 子句随便写,JOIN 随便加
  • 生态成熟:备份、监控、连接池全都有
  • 托管服务广:RDS、Cloud SQL、Supabase 都支持

缺点:

  • 性能不是最强的:HNSW 索引构建慢,100 万以上写入吃力
  • 索引内存大:HNSW 全内存,千万级向量要几十 GB
  • 无量化:不支持 PQ/Scalar Quantization
  • 近似搜索精度:不如专用向量库的优化

适用:数据量低于 500 万、需要向量搜索 + 复杂 SQL 过滤、已有 PG 的团队。

Elasticsearch — 全文搜索 + 向量搜索一体化​

定位:老牌搜索引擎,8.0+ 版本加入向量搜索。

// 创建索引
PUT my-index
{
"mappings": {
"properties": {
"content": { "type": "text" },
"embedding": { "type": "dense_vector", "dims": 1536 }
}
}
}

// 向量搜索
POST my-index/_search
{
"knn": {
"field": "embedding",
"query_vector": [0.15, 0.25, ...],
"k": 10
}
}

优点:

  • 混合搜索最强:BM25 全文 + KNN 向量一锅出,相关性融合成熟
  • 生态巨大:Kibana 可视化、Logstash 数据管道、Beats 采集
  • 运维工具全:集群管理、快照、CCR 跨集群复制
  • RRF(倒数排名融合):原生支持多路召回合并

缺点:

  • 重:Java + Lucene,内存 4GB 起步
  • 向量不是主业:HNSW 实现在 Lucene 层,不如专用库的极致优化
  • 写入延迟高:refresh interval 默认 1s
  • 授权变化:8.11 后 ES 本身协议收紧

适用:已经有 ES 集群、同时需要全文和向量搜索、日志/文档类场景。

性能对比(实测数据)​

测试环境:16c32g,100 万条 1536 维向量,HNSW 索引,Top-10 搜索。

数据库写入速度QPS召回率@10内存占用
Milvus8500/s320099.2%5.2 GB
Pinecone受网络限制2800 (p1)98.5%托管不计
Qdrant12000/s580099.1%3.8 GB
Weaviate4200/s180098.8%8.4 GB
Chroma3100/s110098.2%4.1 GB
FAISS (HNSW)— (离线)1200099.5%3.5 GB
pgvector2800/s90097.8%5.8 GB
Elasticsearch1600/s210098.0%7.2 GB

注:Qdrant 单机性能确实亮眼。FAISS 最快但不带任何数据库功能。

选型决策树​

你需要什么?

有 PG 且不想加组件?
├─ Yes, 数据 < 500 万 → pgvector
└─ No ↓

需要零运维 SaaS?
├─ Yes, 且预算充足 → Pinecone
└─ No ↓

需要混合搜索(全文+向量)?
├─ Yes, 已有 ES → Elasticsearch
├─ Yes, 新建项目 → Weaviate
└─ No ↓

追求极致性能 + 自建?
├─ 嵌入式/轻量 → Qdrant
└─ 企业级/大规模 → Milvus

本地开发/原型验证?
└─ Chroma

总结​

场景推荐
个人项目、DemoChroma
已有 PostgreSQLpgvector
已有 ElasticsearchES 8.x+
追求性能、中型团队Qdrant
企业生产、大规模Milvus
零运维、海外 SaaSPinecone
混合搜索(向量+关键词)Weaviate
嵌入自研引擎FAISS

一句话:没有银弹,但有一个大概率不会错的选择——Qdrant 单机起步,需要分布式时迁 Milvus。