在做RAG知识库问答系统的过程中,我遇到了一个绕不开的选型问题:向量数据存哪?网上推荐一堆——Chroma、Milvus、pgvector、Qdrant、Weaviate——每个都说自己好。为了给项目一个靠谱的结论,我花了一周时间把主流方案都实测了一遍。这篇文章把选型过程和结论整理出来,帮你少走弯路。
动手之前,我先列出了自己的真实需求:
我重点实测了三个:Chroma(轻量嵌入式)、Milvus(专用向量数据库)、pgvector(PostgreSQL扩展)。
维度 | Chroma | Milvus | pgvector |
|---|---|---|---|
部署复杂度 | 极简,一个进程/容器 | 组件多(etcd、MinIO等) | 只需装PostgreSQL插件 |
10万向量检索延迟 | ~50ms | ~20ms | ~80ms |
百万级扩展性 | 一般,单机为主 | 优秀,分布式 | 尚可,单库扛不住要分片 |
运维成本 | 低 | 高 | 低(复用已有库) |
适合场景 | 原型、小规模、单机 | 大规模、高并发生产 | 已有PG、量不大 |
测到10万向量这个量级,三个方案的检索准确率几乎一样(都用的HNSW索引,结果基本一致),延迟差距也就是几十毫秒的差别。对大多数中小企业场景,数据量根本撑不到需要Milvus的地步——很多团队一上来就上Milvus,结果运维成本全花在了用不到的能力上。
实测中最意外的发现:换一个更好的Embedding模型,检索准确率的提升远大于换数据库。同样的数据,用bge-m3做向量比用老模型高好几个百分点。还有文档切分策略——切分太粗、太细都会让检索质量明显下降。所以选型时别把宝全押在数据库上,先把"向量怎么来、文档怎么切"这些前置环节做扎实。
单纯向量检索在专业术语多、同义词多的场景会丢分。我给pgvector和Milvus都加了BM25全文检索做混合(向量+关键词加权融合),准确率提升明显。如果你的场景术语密集,建议直接选支持混合检索的方案,或者像我们一样向量库+Elasticsearch搭配。
Milvus在生产环境要部署etcd、MinIO、Proxy、Coordinator等一串组件,排障难度高;pgvector就是一个插件,跟着PostgreSQL的备份、监控、权限体系走,运维负担几乎为零。
最终我们选了 pgvector,理由很实际:
同时我在架构上留了"逃生通道":向量检索逻辑封装成独立接口,如果未来数据量真的涨到千万级,可以无缝切换到Milvus,业务代码不用改。
我的选型心得就三条:
如果你正在做RAG选型,建议从"已有设施优先、够用就好"的角度出发。很多时候,最朴素的选择就是最好的选择。