在上一篇文章中,我们构建了一个完整的 RAG 系统------从文档加载到混合检索再到 Agent 集成。但有一个关键组件贯穿始终,却容易被忽视:向量数据库。它是 RAG 的"记忆中枢",决定了检索的速度、精度和成本。选错了向量数据库,轻则查询慢如蜗牛,重则系统无法扩展、成本失控。 但市面上的选择令人眼花缭乱:Chroma 轻量易用、pgvector 与关系数据统一管理、Milvus 为百亿级设计、Qdrant 性能优异......到底该怎么选?本文基于 2026 年最新的基准测试数据,从性能、召回率、成本、运维四个维度,帮你建立一套清晰的向量数据库选型框架。
一、向量数据库的三大选型路线
当前向量数据库市场可以归纳为三条路线:

选型的第一条原则:不要从"哪个性能最好"出发,而要从"我的场景需要什么"出发。一个只处理 10 万条文档的个人知识库,用 Milvus 是杀鸡用牛刀;一个处理 1 亿向量的企业搜索系统,用 Chroma 则是自找麻烦。
二、性能基准:100M 向量下的真实数据
2026 年最全面的向量数据库基准测试之一,在 100M 向量、1536 维、HNSW 索引的同等硬件条件下(32 vCPU、128GB RAM、NVMe SSD),对比了七款主流数据库。
2.1 核心性能指标

数据来源:jhondados/vector-database-benchmark(2026),100M 向量,HNSW 索引(ef=200, M=16)。
2.2 单线程速度对比
在单线程、相同召回率(Recall@10 = 0.95)的公平对比条件下,各引擎的 QPS 表现如下:
text
Redis 764 → Qdrant 377 → Milvus 342 → Weaviate 341 → pgvector 257 → Chroma 197 → LanceDB 70
单线程下,Redis(需关闭持久化)以 764 QPS 领先,Qdrant 以 377 QPS 位居第二,LanceDB 以 70 QPS 垫底,首尾相差 10 倍。
2.3 并发吞吐量对比
在生产环境的多进程并发场景下(32 vCPU,512 并发请求),排名发生了显著变化:
Weaviate 从单线程的中间位置攀升至 8,330 QPS 的平台
pgvector 的多进程峰值达到 4,832 QPS,远超其单进程峰值(536 QPS)
Redis 从单线程第一变为并发场景下最低
关键洞察:单线程性能不代表生产性能。多进程并发场景下,支持多线程服务的引擎(Weaviate、Milvus)和独立后端连接的 pgvector 能够更好地利用多核 CPU。
三、四大主流方案深度对比
3.1 Qdrant:性能与精度的平衡大师
核心优势:HNSW + Filtering 原生支持,召回率最高(0.991),单线程性能第二(377 QPS),P99 延迟仅 12ms。
技术特点:Rust 实现,内存安全和高性能兼顾。原生支持过滤向量搜索------在检索时同时应用元数据过滤,而不是先检索再过滤,这在大规模场景下显著减少无效计算。
适用场景:RAG 系统、实时检索、需要高性能过滤的场景。
代码示例:
python
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct
client = QdrantClient("localhost", port=6333)
# 创建集合
client.create_collection(
collection_name="documents",
vectors_config=VectorParams(size=1536, distance=Distance.COSINE),
)
# 插入向量
client.upsert(
collection_name="documents",
points=[
PointStruct(id=1, vector=[0.1]*1536, payload={"text": "..."}),
],
)
# 带过滤的检索
results = client.search(
collection_name="documents",
query_vector=[0.1]*1536,
query_filter={"must": [{"key": "category", "match": {"value": "tech"}}]},
limit=5,
)
3.2 pgvector:关系数据的"顺带"向量能力
核心优势:成本最低($0.08/百万查询),与 PostgreSQL 无缝集成,事务一致性保障。
技术特点:作为 PostgreSQL 扩展,pgvector 让向量检索和关系查询在同一个事务中完成。这意味着你可以"查询用户订单的同时检索相似商品推荐",无需跨系统同步。
性能局限:由于事务开销,pgvector 在插入操作上较慢------完成相同插入任务需要 14.9 秒,而专用向量数据库通常在毫秒级。并发场景下多进程峰值 4,832 QPS,但单进程峰值仅 536 QPS。
适用场景:已有 PostgreSQL 体系、数据量在百万级以内、需要向量与关系数据统一查询。
代码示例:
sql
-- 启用扩展
CREATE EXTENSION vector;
-- 创建带向量列的表
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
text TEXT,
embedding vector(1536)
);
-- 创建 HNSW 索引
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);
-- 向量检索
SELECT text, 1 - (embedding <=> '[0.1, 0.2, ...]') AS similarity
FROM documents
ORDER BY embedding <=> '[0.1, 0.2, ...]'
LIMIT 5;
3.3 Milvus:百亿级向量的专业选择
核心优势:QPS 4,600,P99 延迟 11ms,支持分布式部署,索引类型最丰富。
技术特点:从零为向量检索设计,支持多种索引类型(HNSW、IVF_FLAT、IVF_PQ、DiskANN、SCANN)。DiskANN 支持 SSD 上的十亿级向量检索,大幅降低内存需求。
性能表现:在 100M 向量下,Milvus 以 4,600 QPS 位居第二,仅次于 Weaviate。但在大规模场景下,Milvus 的单线程 QPS 从第三下降到第六,说明其优势在高并发而非单线程。
适用场景:大规模企业知识库、十亿级向量检索、需要分布式部署。
代码示例:
python
from pymilvus import Collection, CollectionSchema, FieldSchema, DataType, connections
connections.connect("default", host="localhost", port="19530")
# 定义 Schema
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=1536),
FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=65535),
]
schema = CollectionSchema(fields)
collection = Collection("documents", schema)
collection.create_index("embedding", {"index_type": "HNSW", "metric_type": "COSINE", "params": {"M": 16, "efConstruction": 200}})
# 检索
results = collection.search(
data=[[0.1]*1536],
anns_field="embedding",
param={"metric_type": "COSINE", "params": {"ef": 200}},
limit=5,
)
3.4 Chroma:原型验证的快速通道
核心优势:成本最低($0.04/百万查询),零配置启动,与 LangChain 深度集成。
性能局限:Recall@10 为 0.976,QPS 仅 890,P99 延迟 67ms------在高并发场景下性能差距明显。
适用场景:快速原型验证、个人项目、中小规模(10 万级以内)文档检索。
代码示例:
python
import chromadb
client = chromadb.Client()
collection = client.create_collection("documents")
collection.add(
documents=["文档内容..."],
embeddings=[[0.1]*1536],
ids=["doc1"],
)
results = collection.query(query_embeddings=[[0.1]*1536], n_results=5)
四、选型决策框架
4.1 按数据规模选型

4.2 按场景选型

4.3 混合策略:不要只选一个
在生产环境中,混合使用往往是更务实的选择:
热数据(最近 30 天):Qdrant / Milvus,高性能检索
冷数据(历史归档):pgvector / Chroma,低成本存储
原型验证:Chroma,快速迭代
生产部署:Qdrant / Milvus,稳定可靠
五、向量数据库与 Agent 的集成
在 LangChain 生态中,向量数据库通过 VectorStore 接口统一抽象,切换数据库只需改一行初始化代码:
python
# 切换向量数据库只需改这一行
# vectorstore = Chroma(...) # 原型
# vectorstore = PGVector(...) # 关系库扩展
vectorstore = QdrantVectorStore(...) # 生产级
# 之后的使用方式完全一致
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
LangChain 支持的向量数据库(部分):Chroma、PGVector、Qdrant、Milvus、Weaviate、Pinecone、FAISS、LanceDB、Redis、Elasticsearch 等。
六、实战:在同一 RAG 场景下对比 pgvector 与 Chroma
以下代码演示如何在相同文档集上对比两个数据库的检索表现:
python
import time
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_postgres import PGVector
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 准备数据
documents = [...] # 加载的文档
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(documents)
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
# 构建 Chroma
chroma = Chroma.from_documents(chunks, embeddings, persist_directory="./chroma_db")
# 构建 pgvector
pgvector = PGVector.from_documents(
chunks, embeddings,
connection="postgresql://user:pass@localhost:5432/ragdb",
collection_name="benchmark",
)
# 对比检索
query = "退款政策是什么?"
start = time.time()
chroma_results = chroma.similarity_search(query, k=5)
chroma_time = time.time() - start
start = time.time()
pgvector_results = pgvector.similarity_search(query, k=5)
pgvector_time = time.time() - start
print(f"Chroma: {chroma_time*1000:.1f}ms, pgvector: {pgvector_time*1000:.1f}ms")
print(f"Chroma 首条: {chroma_results[0].page_content[:100]}")
print(f"pgvector 首条: {pgvector_results[0].page_content[:100]}")
七、小结
三大选型路线:专用向量数据库(Milvus、Qdrant)、关系数据库扩展(pgvector)、嵌入式库(Chroma、FAISS)。
性能基准:Qdrant 召回率最高(0.991),Weaviate QPS 最高(5,100),pgvector 成本最低($0.08/百万查询),Chroma 最便宜但性能最弱。
单线程 vs 并发:单线程 Redis 最快(764 QPS),但并发场景下 Weaviate 和 pgvector 反超。
选型决策:按数据规模和场景选择,混合策略往往最优。
LangChain 集成:统一 VectorStore 接口,切换数据库只需改一行代码。
实战建议:原型用 Chroma,生产用 Qdrant/Milvus,已有 PostgreSQL 用 pgvector。