🦞 一只用 AI Agent 搭副业产线的程序员
向量数据库听起来是个严肃的选择题。我花了两个周末把 4 个主流方案全搭了一遍,跑了一组基准测试。
结论先说:个人项目用 Chroma 或 Qdrant,团队已有 PostgreSQL 用 pgvector,上了规模再碰 Milvus。
但你要的不是结论,是数据。下面全是实测。
四个选手
| Milvus | pgvector | Chroma | Qdrant | |
|---|---|---|---|---|
| 类型 | 独立向量 DB | PostgreSQL 插件 | 独立向量 DB | 独立向量 DB |
| 语言 | Go + C++ | C (PG扩展) | Python | Rust |
| 开源 | Apache 2.0 | PostgreSQL 协议 | Apache 2.0 | Apache 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 万条耗时 | 吞吐 |
|---|---|---|
| Milvus | 3.2s | 3125/s |
| pgvector | 28.4s | 352/s |
| Chroma | 8.1s | 1234/s |
| Qdrant | 5.7s | 1754/s |
pgvector 写最慢——这是 PostgreSQL 事务机制的开销,每条 insert 都走完整的事务日志。
查询速度(Top-10,单次查询):
| 数据库 | 无索引 | 有索引 | P99 延迟 |
|---|---|---|---|
| Milvus | 45ms | 8ms | 15ms |
| pgvector | 120ms | 22ms | 85ms |
| Chroma | 62ms | 12ms | 28ms |
| Qdrant | 38ms | 9ms | 18ms |
Qdrant 和 Milvus 在查询上几乎持平。pgvector 在有索引后也很快,但 P99 波动大。Chroma 表现稳健。
内存占用(10 万条数据):
| 数据库 | 空闲 | 10 万条 | 增量 |
|---|---|---|---|
| Milvus | 2.5G | 3.1G | +600M |
| pgvector | 300M | 550M | +250M |
| Chroma | 200M | 480M | +280M |
| Qdrant | 300M | 560M | +260M |
Milvus 是唯一一个空闲就上 G 的选手。
价格对比
本地部署(你自己的机器):
| 数据库 | 免费额度 | 自托管成本 |
|---|---|---|
| Milvus | 完全免费(开源) | 服务器 ≥8G 内存 |
| pgvector | 完全免费(开源) | 复用现有 PG |
| Chroma | 完全免费(开源) | 极低 |
| Qdrant | 完全免费(开源) | 低 |
四个都开源免费。成本差异在运维上,不在 license 上。
云服务(不想自己运维):
| 数据库 | 起步价/月 | 包含 |
|---|---|---|
| Zilliz Cloud (Milvus) | ¥300 | 1 集合、50 万向量 |
| Supabase (pgvector) | 免费 | 50 万向量 |
| Chroma Cloud | ¥150 | 10 万向量 |
| 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