第七篇:《向量数据库选型:从 Chroma 到 Milvus 的落地对比》

在上一篇文章中,我们构建了一个完整的 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 按数据规模选型

![数据规模 推荐方案 理由

< 100 万 Chroma / pgvector 零运维,成本低

100 万 - 1000 万 Qdrant / pgvector 性能与成本平衡

1000 万 - 1 亿 Qdrant / Milvus 需要分布式或高性能

1 亿 Milvus / Weaviate 专业分布式方案](https://i-blog.csdnimg.cn/direct/f4196ad9ecf440569c2da1460092a240.png)

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。

相关推荐
正在走向自律1 小时前
KingbaseES 列存储踩坑记:cstore_fdw 建表灌数全过程,以及数据改不动怎么办
数据库·国产数据库·kingbasees·金仓数据库·列存储
我科绝伦(Huanhuan Zhou)1 小时前
Oracle 体系结构深度解析:从内存、进程到日志与事务一致性的全链路技术详解
数据库·oracle
一木 之林1 小时前
LangChain 第8章 记忆系统:短期/长期记忆与 PostgreSQL 持久化
数据库·postgresql·langchain
云絮.1 小时前
mybatis(二)
java·数据库·mybatis
yyuuuzz1 小时前
云服务器搭建个人博客记录:一次访问超时的复盘
运维·服务器·数据库
花间相见1 小时前
【计算基础|MySQL06】MySQL 架构与一条 SQL 的旅程
数据库·后端
oradh1 小时前
Oracle 分析函数使用总结
数据库·oracle
updayday8542 小时前
印染产线电脑进程异常占用资源却要逐台排查 - Ping64 远程进程管理
大数据·网络·数据库·安全·智能路由器
QYRdata2 小时前
年复合增长率8.2%!2026-2032年数据库开发服务赛道增长动能持续释放
数据库·服务发现·数据库开发·恒州博智