☰
向量数据库选型:Milvus / pgvector / Chroma / Qdrant 实测对比
2026/10/8 15:58:54 网站建设 项目流程

🦞 一只用 AI Agent 搭副业产线的程序员


向量数据库听起来是个严肃的选择题。我花了两个周末把 4 个主流方案全搭了一遍,跑了一组基准测试。

结论先说:个人项目用 Chroma 或 Qdrant,团队已有 PostgreSQL 用 pgvector,上了规模再碰 Milvus。

但你要的不是结论,是数据。下面全是实测。


四个选手

MilvuspgvectorChromaQdrant
类型独立向量 DBPostgreSQL 插件独立向量 DB独立向量 DB
语言Go + C++C (PG扩展)PythonRust
开源Apache 2.0PostgreSQL 协议Apache 2.0Apache 2.0
社区Zilliz 维护PG 官方生态Chroma 团队Qdrant 团队

部署难度实测

Milvus —— 最重

# 下载官方 docker-composewgethttps://github.com/milvus-io/milvus/releases/latest/download/milvus-standalone-docker-compose.ymldockercompose up-d# 三个容器:milvus + etcd + minio# 首次启动约 2 分钟

启动后吃 2.5G 内存。个人电脑跑得动但资源占用明显。

pgvector —— 如果你已经有 PG 就零成本

-- 在现有 PostgreSQL 实例上CREATEEXTENSION vector;CREATETABLEdocuments(idSERIALPRIMARYKEY,contentTEXT,embedding VECTOR(1536));CREATEINDEXONdocumentsUSINGivfflat(embedding vector_cosine_ops);

如果团队已经有 PostgreSQL——这是最省事的方案。不需要新的基础设施。

Chroma —— 最轻量

# docker-compose.ymlservices:chroma:image:chromadb/chroma:latestports:-"8000:8000"volumes:-chroma_data:/chroma/chroma

单个容器,200MB 内存。部署体验最好的一个。

Qdrant —— 轻量但功能全

# docker-compose.ymlservices:qdrant:image:qdrant/qdrant:latestports:-"6333:6333"-"6334:6334"volumes:-qdrant_data:/qdrant/storage

单个容器,300MB 内存。自带 Web UI(6333 端口能直接看数据),调试体验极好。


性能实测

测试环境:MacBook M1 Pro,16G 内存,Docker 分配 8G。

测试数据:10,000 条 1536 维向量(模拟 10,000 个文档片段)。

写入速度:

数据库写入 1 万条耗时吞吐
Milvus3.2s3125/s
pgvector28.4s352/s
Chroma8.1s1234/s
Qdrant5.7s1754/s

pgvector 写最慢——这是 PostgreSQL 事务机制的开销,每条 insert 都走完整的事务日志。

查询速度(Top-10,单次查询):

数据库无索引有索引P99 延迟
Milvus45ms8ms15ms
pgvector120ms22ms85ms
Chroma62ms12ms28ms
Qdrant38ms9ms18ms

Qdrant 和 Milvus 在查询上几乎持平。pgvector 在有索引后也很快,但 P99 波动大。Chroma 表现稳健。

内存占用(10 万条数据):

数据库空闲10 万条增量
Milvus2.5G3.1G+600M
pgvector300M550M+250M
Chroma200M480M+280M
Qdrant300M560M+260M

Milvus 是唯一一个空闲就上 G 的选手。


价格对比

本地部署(你自己的机器):

数据库免费额度自托管成本
Milvus完全免费(开源)服务器 ≥8G 内存
pgvector完全免费(开源)复用现有 PG
Chroma完全免费(开源)极低
Qdrant完全免费(开源)低

四个都开源免费。成本差异在运维上,不在 license 上。

云服务(不想自己运维):

数据库起步价/月包含
Zilliz Cloud (Milvus)¥3001 集合、50 万向量
Supabase (pgvector)免费50 万向量
Chroma Cloud¥15010 万向量
Qdrant Cloud免费1G 存储、100 万向量

Qdrant 和 Supabase 的免费额度对个人项目最友好。


选型决策树

我画不了图,但可以写成决策树:

你有 PostgreSQL 吗? ├── 有,且向量量 < 1000 万 → pgvector(零新增基础设施) └── 没有 ├── 个人项目 / 学习阶段 → Qdrant(免费云 + 自带 Web UI) ├── Python 技术栈 / 快速原型 → Chroma(Python 生态最深) └── 生产环境 / 千万级以上 → Milvus(性能天花板最高)

我选的是 Qdrant。为什么:单容器部署、自带 Web UI 调试方便、Rust 写的性能够用、Go SDK 好用。后面所有文章都用 Qdrant 作为示例。


Go 代码:用 Qdrant 客户端的完整写入和查询

用 Qdrant 官方 Go SDK 比手写 HTTP 方便得多:

packagemainimport("context""fmt""log"qc"github.com/qdrant/go-client/qdrant")funcmain(){ctx:=context.Background()// 连接client,err:=qc.NewClient(&qc.Config{Host:"localhost",Port:6334,})iferr!=nil{log.Fatal(err)}// 创建集合(1536 维,余弦距离)client.CreateCollection(ctx,&qc.CreateCollection{CollectionName:"tech_docs",VectorsConfig:qc.NewVectorsConfig(&qc.VectorParams{Size:1536,Distance:qc.Distance_Cosine,}),})// 插入向量client.Upsert(ctx,&qc.UpsertPoints{CollectionName:"tech_docs",Points:[]*qc.PointStruct{{Id:qc.NewIDNum(1),Vector:qc.NewVector(embedding1...),Payload:qc.NewValueMap(map[string]any{"text":"Redis 缓存淘汰策略包括 LRU、LFU...",}),},},})// 查询:拿 queryVector 搜 Top-3result,_:=client.Search(ctx,&qc.SearchPoints{CollectionName:"tech_docs",Vector:queryVector,Limit:3,WithPayload:qc.NewWithPayload(true),})for_,point:=rangeresult.GetResult(){fmt.Printf("分数: %.4f | 内容: %s\n",point.GetScore(),point.GetPayload()["text"].GetStringValue(),)}}

一个容易忽略的细节:距离度量

向量数据库里「相似度」怎么算,有 3 种选择:

度量适合场景说明
Cosine(余弦)文本语义搜索只看方向不看长度,最常用
Euclidean(欧几里得)图像、地理坐标绝对距离
Dot Product(点积)推荐系统考虑量级,值越大越相似

文本语义搜索用 Cosine,别用其他。Embedding 向量的「长度」没有语义含义,重要的是「方向」。用欧几里得距离会把本来意思接近但向量偏长的文档排到后面去。


本篇核心收获

四个向量数据库,三个维度(部署难度、性能、价格),结论很明确:个人和中小团队首选 Qdrant 或 pgvector。不要一上来就上 Milvus——它能做的事你大概率还没到那个量级。

下一篇我们把前三篇串起来——用 Go 写一个完整的文档索引器。从读取 Markdown 文件、切分、生成 Embedding、存入 Qdrant,一个命令搞定。

关注我,别错过。


🦞 一只用 AI Agent 搭副业产线的程序员

全平台同名:虾哥不加班
需要定制 AI 工具?来聊聊 → lob_ai

源码:GitHub - lobster-bujiaban/rag-from-scratch

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询