向量数据库怎么选?

进阶对比实践约 6 分钟读完

一句话回答

先看数据规模、过滤和混合检索的需求,以及团队已有的技术栈。数据量不大、已经在用 PostgreSQL 时,pgvector 往往就够了,向量和业务数据放在一起,事务、权限和过滤都能复用;已有 Elasticsearch/OpenSearch 集群、又很依赖关键词检索时,可以直接用它们的向量检索;数据量大、查询压力高、需要水平扩展时,再考虑 Milvus、Qdrant、Weaviate 这类专用向量数据库或云厂商的托管服务。

详细解析

几类方案

类型 例子 优点 缺点
现有数据库加向量扩展 PostgreSQL + pgvector 向量和业务数据在一个库里,能 JOIN、能用事务;团队熟悉,不用多维护一套系统 数据量和查询量很大时扩展性不如专用库;关键词检索要自己组合,中文全文检索还需要额外的分词插件
搜索引擎的向量检索 Elasticsearch、OpenSearch BM25 关键词检索成熟,适合做混合检索;已有集群可以直接用 资源占用大、运维复杂,向量检索的功能和调参方式各家不同
专用向量数据库 Milvus、Qdrant、Weaviate 为向量检索设计:索引类型多、支持带过滤的检索、分布式扩展、向量量化压缩 多了一套系统要运维,还要和业务库同步数据
云厂商托管服务 各云平台的向量检索服务 免运维、弹性扩容 成本随规模上涨,有厂商锁定,数据要放到云上

原型阶段也可以用 FAISS 这类向量检索库,或者 Chroma、LanceDB 这类嵌入式的向量库,但要留意它们在持久化、过滤和并发写入上的能力差异。

选型要考虑什么

维度 要回答的问题
数据规模 现在多少条、一年后多少条、向量多少维?索引放不放得进单机内存
元数据过滤 是否要按权限、租户、时间过滤?过滤条件很严格时,结果数量和召回率还有没有保证
混合检索 是否需要关键词检索?数据库是否内置 BM25 和结果融合
更新频率 文档多久更新一次?写入后多久能查到?删除后空间怎么回收,索引要不要重建
多租户 每个租户一个集合,还是共用一个集合、按租户 ID 过滤
运维和成本 谁负责部署、备份、监控和扩容;托管服务按什么计费

规模可以先粗算:向量本身的存储 = 条数 × 维度 × 4 字节(float32)。假设有 100 万条 1024 维的向量,原始数据约 4 GB;HNSW 这类索引还要额外存储图结构,而且通常要放在内存里才快(原理见 HNSW 和 IVF)。

一个实用的决策顺序

  1. 已经在用 PostgreSQL,估算下来单机放得下 → pgvector
  2. 已经有 Elasticsearch/OpenSearch,关键词检索很重要 → 直接用它做混合检索
  3. 数据量大、查询压力高,需要多种索引和量化 → 专用向量数据库
  4. 团队没有精力运维 → 托管服务

不管选哪个,都在业务代码和数据库之间封装一层检索接口(如 search(query, filters, k)),以后换库只需要改这一层。

代码示例

用 pgvector 存储和检索,语法以 pgvector 官方文档为准:

SQL
CREATE EXTENSION IF NOT EXISTS vector;

CREATE TABLE chunks (
  id        bigserial PRIMARY KEY,
  doc_id    bigint NOT NULL,
  dept      text NOT NULL,           -- 权限过滤用
  content   text NOT NULL,
  embedding vector(1024) NOT NULL    -- 维度要和 Embedding 模型的输出一致
);

-- HNSW 索引,使用余弦距离
CREATE INDEX ON chunks USING hnsw (embedding vector_cosine_ops);

-- 查询时的候选数(默认 40),调大召回更高、查询更慢
SET hnsw.ef_search = 100;

-- <=> 是余弦距离,越小越相似;1 - 距离 就是余弦相似度
SELECT id, doc_id, content, 1 - (embedding <=> $1) AS similarity
FROM chunks
WHERE dept = $2
ORDER BY embedding <=> $1
LIMIT 5;

面试官可能追问

带过滤条件的向量检索,为什么返回的结果不够 k 条?

很多实现(比如 pgvector)先用近似索引按相似度取出一批候选,再应用 WHERE 条件过滤。过滤条件只匹配少量数据时,候选里符合条件的可能远少于 k 条。pgvector 文档举过例子:条件只匹配 10% 的行、hnsw.ef_search 为默认的 40 时,平均只能返回 4 条。解决办法:调大候选数;开启迭代扫描(pgvector 的 hnsw.iterative_scan,结果不够时继续扫描索引);按租户分区或建部分索引;或者选用在遍历索引时就处理过滤条件的向量库。

向量和业务数据分开存,怎么保证一致?

以业务库为准,向量库只是从它派生出来的索引。文档的新增、修改、删除和权限变更,通过消息队列或订阅数据库变更(CDC)同步到向量库,删除和权限变更要优先处理,再定期全量对账。检索结果返回后,可以回业务库确认文档还存在、用户仍有权限,再交给模型。

要换 Embedding 模型,怎么迁移?

新旧模型的向量空间不兼容,即使维度相同也不能混用(见 Embedding 是什么)。迁移的重点是不中断服务:新建一个索引,后台用新模型重新向量化全部文档,期间新写入的数据两边都写;用评测集确认新索引的效果后再切换查询,旧索引保留一段时间以便回滚。

只有几千条数据,也需要向量数据库吗?

不需要单独部署。数据量小时,直接在内存里暴力计算相似度就很快,结果还是精确的;也可以用 pgvector 这类扩展放在现有数据库里。只要检索接口封装好了,等规模上来再迁移也不难。

易错点

  • 把向量库当成效果的决定因素:检索效果主要取决于切分、Embedding 模型和检索策略,向量库决定的是规模、性能和运维成本
  • 只存向量,不存原文和元数据,检索后还要回查,也没法按条件过滤
  • 建索引用的距离度量和查询用的不一致,索引就用不上;比如 pgvector 的余弦索引(vector_cosine_ops)只对 <=> 运算符生效
  • 拿别人的基准测试数字做决定,没有用自己的数据量、维度和过滤条件压测

AI 模拟面试官

用自己的话回答,AI 对照参考答案打分、指出遗漏,再追问,最多 3 轮

登录后就可以和 AI 面试官对练,面试记录也会保存下来。登录

这道题你掌握了吗?

选一个最接近的状态,没掌握的题会出现在"我的进度 · 待复习"里。

学习记录暂存在本机浏览器。登录后自动同步到账号,换设备也能看到。