向量数据库选型:pgvector、Qdrant、Pinecone 怎么选

向量数据库选型的核心不是性能最好,而是总拥有成本最低。100 万向量以下 pgvector 是默认选择,其价值在于和业务数据的事务一致性。

先说一个反直觉的结论

很多人在做 RAG 或语义搜索时,第一反应是「我需要一个向量数据库」。但在动手之前,请先看这个数字:

绝大多数应用,在向量数量少于 100 万条时,用 Postgres 加一个 pgvector 扩展就够了。

这句话的含义是:你可能根本不需要引入一个独立的向量数据库。而引入它的代价是——多一套需要运维、备份、监控、调优的系统,以及多一个可能出故障的环节。

所以这篇文章的顺序是:先讲怎么判断你到底需不需要,再讲如果真的需要,怎么选。

第一步:先算清楚你的规模

决策的核心变量只有一个:向量数量和查询并发

规模建议方案
< 10 万条pgvector 或内存索引,完全够用
10 万 – 100 万条pgvector(配合合适的索引),多数场景可撑住
100 万 – 1000 万条开始考虑专用向量数据库
> 1000 万条需要专用方案,且要认真做容量规划

怎么估算向量数量?公式很简单:

向量数 = 文档数 × 平均每文档分块数

举个例子。假设你有 5000 份文档,每份文档切成 30 个块,那就是 15 万个向量——这仍然在 pgvector 的舒适区

但如果你的场景是「用户上传的每一张图片都要做向量检索」,且日活用户上万,那规模可能迅速突破千万。

先算这个数,再谈选型。 跳过这一步直接对比产品特性,是最常见的浪费。

第二步:理解真正的性能瓶颈

向量检索的性能,取决于三个因素:

因素一:索引类型

向量检索的精确算法是暴力计算(和每个向量都算一次距离),复杂度是 O(n)。这在百万级就不可接受了。

所以实际用的是近似最近邻(ANN) 算法。主流三类:

  • HNSW(分层可导航小世界图):查询最快,召回率高,但内存占用大,构建慢
  • IVF(倒排文件):内存友好,构建快,但召回率不如 HNSW
  • PQ(乘积量化):压缩率高,能处理超大规模,但精度损失明显

实践中最常用的是 HNSW,因为它查询快、召回好。代价是内存。

因素二:内存

这是最容易被低估的成本。HNSW 索引通常需要把全部向量和索引结构放在内存里

算一笔账:假设 100 万个向量,维度 1536,用 float32 存储:

1,000,000 × 1536 × 4 bytes ≈ 6.1 GB

这还只是原始向量,HNSW 的图结构还要额外开销。所以 100 万向量的 HNSW 索引,实际内存需求可能在 10 GB 以上。

这是选型时最实际的约束——很多时候不是性能不够,是内存买不起

因素三:过滤条件

真实查询往往不是「找最相似的 10 个」,而是「在某个分类下找最相似的 10 个」。

这看起来是个小需求,但对性能影响巨大:

  • 先过滤再检索:如果过滤后只剩 100 条,暴力算就够了,不用 ANN
  • 先检索再过滤:如果过滤条件很苛刻,可能召回 100 条结果后发现过滤完只剩 2 条

过滤和检索的顺序,会显著影响结果质量和性能。 这是很多选型对比文章不会提的细节。

三个主流方案的差异

pgvector:被低估的选择

优势

  • 你的业务数据本来就在 Postgres 里,向量和元数据可以在同一个事务里操作
  • 不需要额外运维一套系统
  • 支持完整的 SQL 能力——JOIN、聚合、复杂过滤
  • 事务保证一致性

劣势

  • 超大规模(千万级以上)性能下降明显
  • HNSW 索引构建和调优不如专用数据库成熟
  • 水平扩展困难

关键优势是「事务一致性」。举个例子:如果你用独立的向量数据库,当你删除一份文档时,需要同时删除 Postgres 里的记录和向量库里的向量。这两步如果有一边失败,数据就不一致了。而用 pgvector,这在同一个事务里完成,天然一致。

这个优势在多数业务场景里被严重低估。

Qdrant:工程实现的平衡点

优势

  • 用 Rust 写的,性能好且资源占用合理
  • 原生支持 payload 过滤,且过滤与检索结合得比较好
  • 部署简单,单二进制或 Docker 即可
  • 支持量化,能显著降低内存占用

劣势

  • 生态相对较新
  • 复杂数据分析能力不如 SQL

适合:中大规模、需要独立向量服务、又不想引入过重运维负担的场景。可以在这里查看 Qdrant 的详细信息

Pinecone:全托管的省心方案

优势

  • 完全托管,无需运维
  • 弹性扩缩容
  • 上手快,适合快速验证

劣势

  • 成本随规模线性增长,规模大了会很贵
  • 数据在第三方,有合规顾虑
  • 供应商锁定

适合:想快速验证想法、团队没有运维能力、或者数据量小但要求高可用的场景。详见 Pinecone 介绍

选型决策树

把上面的分析整理成可以直接用的判断路径:

数据量 < 100 万?
├── 是 → 业务数据已在 Postgres?
│         ├── 是 → 用 pgvector(最省事,且天然事务一致)
│         └── 否 → 仍建议 pgvector(引入 Postgres 比引入向量库简单)
└── 否 → 需要独立向量服务
          ├── 团队能接受运维 → Qdrant(性价比高)
          └── 不想运维 → Pinecone(贵但省心)

注意我把 pgvector 放在了「默认选项」的位置。 原因不是它性能最好,而是它的总拥有成本最低——这包括开发成本、运维成本、和出问题时的排查成本。

除了向量数据库,还有一个选项

如果你的场景是「小规模 + 只读 + 可以全量加载」,还有一个被忽略的方案:在应用内存里做向量检索

LlamaIndex 这类框架,它内置了内存向量索引。几万条向量直接放内存,查询是纯内存计算,延迟极低,且零运维

限制是:

  • 进程重启要重建(除非做持久化)
  • 内存受限于单机
  • 不适合频繁更新

对于原型验证和中小规模的固定知识库,这是最快的方案。

常见误区

误区一:追求极致召回率

很多人执着于把召回率从 92% 优化到 97%,但忽略了——后面还有重排序环节

实际上,粗召回阶段稍微放宽(比如召回 50 条),再用重排序模型精排,效果往往比死磕召回率更好,而且成本更低。

别在召回率上做过度优化,给重排序留出空间。

误区二:忽略嵌入模型的成本

嵌入模型的选择往往被当成「顺便决定」的事,但实际上:

  • 换嵌入模型 = 全量重建向量,这是不可逆的操作
  • 有些模型按 token 计费,大规模文档的嵌入成本可能很高
  • 不同模型维度不同,直接影响内存和存储

嵌入模型一旦上线,就当成数据库 schema 级别的决策来对待。

误区三:不做数据清理

向量数据库里的「删除」往往不是真删除(为了性能)。长期运行后,你会发现:

  • 明明删了文档,检索还能查到
  • 存储持续增长,但有效数据没增加

要定期做真空/压实操作,或者设计时就把「软删除 + 标记过滤」考虑进去。

误区四:只用向量检索

纯向量检索对精确匹配很弱。比如搜索产品型号「XR-2000」,向量检索可能返回一堆语义相似但型号不对的产品。

混合检索(向量 + 关键词)几乎是标配,除非你的数据完全是自然语言且没有专有名词。

一个务实的落地建议

如果你正要做技术选型,我的建议是这个顺序:

第一步:用 pgvector 起步。 不要纠结。它能撑到百万级,覆盖绝大多数场景。先把业务跑通。

第二步:埋点收集真实数据。 记录查询延迟、召回率、数据增长率、内存占用。这是未来选型的唯一依据。

第三步:等数据说话。 当 pgvector 真的成为瓶颈(而不是你猜它会成为瓶颈)时,再迁移。

迁移的代价是可接受的——向量数据可以重建,而且到那时你已经清楚知道自己的真实需求是什么。

最糟的做法是:一开始就为了「未来的规模」引入复杂的分布式向量数据库,结果运维成本吃掉了大部分开发时间,而业务量根本没到那个规模。

小结

向量数据库选型的核心不是「哪个性能最好」,而是「在你的规模下,总拥有成本最低」

  • < 100 万向量:pgvector 是默认选择,它的价值在于和业务数据的事务一致性
  • 中大规模:Qdrant 是工程上的平衡点
  • 不想运维:Pinecone 省心但贵
  • 原型/小规模只读:内存索引最快

最后强调一点:先算清楚你的向量数量。这一个数字,能帮你排除掉 80% 不必要的选型纠结。

相关阅读

返回 AI 教程列表