向量数据库选型:Milvus / pgvector / Chroma / Qdrant 实测对比 一只用 AI Agent 搭副业产线的程序员向量数据库听起来是个严肃的选择题。我花了两个周末把 4 个主流方案全搭了一遍跑了一组基准测试。结论先说个人项目用 Chroma 或 Qdrant团队已有 PostgreSQL 用 pgvector上了规模再碰 Milvus。但你要的不是结论是数据。下面全是实测。四个选手MilvuspgvectorChromaQdrant类型独立向量 DBPostgreSQL 插件独立向量 DB独立向量 DB语言Go CC (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:8000volumes:-chroma_data:/chroma/chroma单个容器200MB 内存。部署体验最好的一个。Qdrant —— 轻量但功能全# docker-compose.ymlservices:qdrant:image:qdrant/qdrant:latestports:-6333:6333-6334:6334volumes:-qdrant_data:/qdrant/storage单个容器300MB 内存。自带 Web UI6333 端口能直接看数据调试体验极好。性能实测测试环境MacBook M1 Pro16G 内存Docker 分配 8G。测试数据10,000 条 1536 维向量模拟 10,000 个文档片段。写入速度数据库写入 1 万条耗时吞吐Milvus3.2s3125/spgvector28.4s352/sChroma8.1s1234/sQdrant5.7s1754/spgvector 写最慢——这是 PostgreSQL 事务机制的开销每条 insert 都走完整的事务日志。查询速度Top-10单次查询数据库无索引有索引P99 延迟Milvus45ms8ms15mspgvector120ms22ms85msChroma62ms12ms28msQdrant38ms9ms18msQdrant 和 Milvus 在查询上几乎持平。pgvector 在有索引后也很快但 P99 波动大。Chroma 表现稳健。内存占用10 万条数据数据库空闲10 万条增量Milvus2.5G3.1G600Mpgvector300M550M250MChroma200M480M280MQdrant300M560M260MMilvus 是唯一一个空闲就上 G 的选手。价格对比本地部署你自己的机器数据库免费额度自托管成本Milvus完全免费开源服务器 ≥8G 内存pgvector完全免费开源复用现有 PGChroma完全免费开源极低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 技术栈 / 快速原型 → ChromaPython 生态最深 └── 生产环境 / 千万级以上 → Milvus性能天花板最高我选的是 Qdrant。为什么单容器部署、自带 Web UI 调试方便、Rust 写的性能够用、Go SDK 好用。后面所有文章都用 Qdrant 作为示例。Go 代码用 Qdrant 客户端的完整写入和查询用 Qdrant 官方 Go SDK 比手写 HTTP 方便得多packagemainimport(contextfmtlogqcgithub.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