向量数据库怎么选?
一句话回答
先看数据规模、过滤和混合检索的需求,以及团队已有的技术栈。数据量不大、已经在用 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)。
一个实用的决策顺序
- 已经在用 PostgreSQL,估算下来单机放得下 → pgvector
- 已经有 Elasticsearch/OpenSearch,关键词检索很重要 → 直接用它做混合检索
- 数据量大、查询压力高,需要多种索引和量化 → 专用向量数据库
- 团队没有精力运维 → 托管服务
不管选哪个,都在业务代码和数据库之间封装一层检索接口(如 search(query, filters, k)),以后换库只需要改这一层。
代码示例
用 pgvector 存储和检索,语法以 pgvector 官方文档为准:
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 轮
这道题你掌握了吗?
选一个最接近的状态,没掌握的题会出现在"我的进度 · 待复习"里。
学习记录暂存在本机浏览器。登录后自动同步到账号,换设备也能看到。