数据库转大模型:向量库选型这件事老本行占便宜

版权与内容来源声明
本文为原创整理。文中涉及官方文档、开源仓库、论文与公开报道的内容,均在附表 A 中标注来源;引用官方原文保持原样,不作改写。文中命令、版本号与界面截图以本文成文时的实测/核验结果为准,标注「待验证」的部分请以你本地环境实际输出为判断依据。本文不推荐任何不合规的软件获取方式,也不对任何收益结果作承诺。转载请注明出处。

第 1 章 · DBA 转大模型,为什么先卡在检索层

1.1 先把概念对齐:向量库到底在干什么

大模型应用里想让模型回答「你自己那堆资料」的问题,通常先走检索增强(RAG,Retrieval-Augmented Generation,意思是先查到相关资料,再让模型基于资料作答)。查资料这一步做的事是:把文档切成小片段,用嵌入模型(Embedding,把一段文字变成一串数字的模型)把每个片段转成向量(vector,就是一串浮点数,比如 768 个数字排成一行)。

向量库(vector database)就是存这些向量、并按「距离最近」把相似片段找回来的库。传统数据库按等值条件或范围条件找行,向量库按「像不像」排序找行——这是两者最本质的差别,也是你换视角的第一站。

DBA 的直觉会立刻跳出来:要找得快,就得建索引。这个直觉是对的,但向量索引和 B 树索引不是一回事,很多转岗的人就是在这里把经验套错了地方。

1.2 老本行能套用的地方,和套不上的地方

下面这张表把两类索引的直觉逐条摆开。左边是你已经形成的判断,右边是套到向量检索时的真实情况。

表 1 · 传统索引直觉与向量索引对照

传统数据库里的直觉向量检索里的真实情况迁移结论
建了索引,查询结果和没建时一致加近似索引后,同样的查询会返回不同结果结果集不再"确定",得改用召回率衡量
索引越大越准,代价是慢近似索引是「拿召回换速度」的连续旋钮要在召回与延迟之间选一个工作点
索引只影响性能,不影响语义距离度量方式(余弦、内积、欧氏)会改变"最近"的定义建库前就得定死度量方式
索引与数据强一致部分近似索引存在"先灌数据还是先建索引"的时序约束导入顺序成了运维约定

这张表最后一行值得单独记住:它不是性能问题,而是正确性问题。转到向量库,你要核对的第一件事往往不是"快不快",而是"结果还对不对"。

1.3 本文给你的是判断顺序,不是产品排名

下面各章按五个维度展开:索引类型、召回质量、内存占用、构建时间、带过滤条件的检索。第 2 章先给总表,之后逐维给阈值,第 6、7 章讲清你原本的优势和反向判据。

第 2 章 · 一张五维选型对照表

2.1 这五个维度是怎么挑出来的

选向量库常见的一种错法,是先看别人推荐哪个产品,再倒过来找理由。更稳的顺序是:先把你的数据形状写成五个可回答的问题,再去挑能满足这些答案的库。这五个问题恰好也是 DBA 每天都在回答的容量、性能、约束、变更和安全问题。

2.2 五维对照总表

表 2 · 向量库选型五维对照(每一维都给出判断阈值)

维度关键问题判断阈值 / 起手做法
① 索引类型要精确检索还是近似最近邻?图索引还是倒排聚类索引?候选集占比高、要求结果确定 → 精确检索;追求低延迟且能接受召回损失 → 近似索引
② 召回质量用哪个指标量、拿谁的数据测?用自己的数据跑 recall@k,别只看公开榜单
③ 内存占用向量本体加索引开销要多少内存?先按「条数 × 维度 × 每维字节数」粗算本体,再叠加索引额外开销
④ 构建时间批量导入还是增量写入?索引构建慢于数据到达速度时,考虑先停写、批量建完再开写
⑤ 带过滤检索过滤条件该在检索前还是检索后生效?过滤命中比例是核心变量,比例越低越要警惕

五维里,①③④是你最有发言权的,⑤几乎就是你的老本行,②是唯一需要补的新知识。

2.3 怎么用这张表

不要五维同时调。建议先卡住 ②(召回质量),因为它是唯一决定"答案对不对"的维;再卡 ③(内存占用),因为它决定你的机器买不买得起;①④⑤是拿到预算和硬件后,再逐个调的工作点。

第 3 章 · 维度一:索引类型,精确还是近似

3.1 精确检索与近似最近邻

精确检索(也叫暴力检索、全量扫描)就是拿查询向量和库里每条向量逐个算距离,结果必然最准,代价是随数据量线性变慢。近似最近邻(ANN,Approximate Nearest Neighbor,意思是牺牲一点准确性换取速度)则通过索引只访问可能相近的一部分数据。

pgvector(PostgreSQL 的向量扩展)官方仓库写得很直白:默认执行精确检索,结果完美召回;一旦加上近似索引,同一个查询会给出不同结果。这句话是理解整件事的钥匙——近似索引是「拿召回换速度」,不是"免费的加速"。

3.2 图索引与倒排式聚类索引各用在哪

主流的近似索引大致分两大族:

  • 图索引(HNSW):HNSW 是 Hierarchical Navigable Small World 的缩写,分层可导航小世界图。人话解释:把向量当成地图上的点,索引预先修好"高速公路"和"小路",检索时从高速逐层下到小路,几跳就接近目标。论文《Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs》(arXiv:1603.09320)提出的就是这一结构。
  • 倒排式聚类索引(IVF):IVF 是 Inverted File 的缩写,先把向量聚成若干簇,检索时只进最接近的少数几个簇。人话解释:先按"片区"分好类,查的时候只翻最近的几个片区,其余不翻。

表 3 · 两大索引族对照

对照项图索引(HNSW)倒排聚类索引(IVF)
检索速度与召回的平衡同等召回下更快略逊
构建时间更长更短
内存占用更多更少
适合的导入时机可以在有数据后增量累积官方建议先有数据再建索引
参数旋钮构建用 m、ef_construction,查询用 hnsw.ef_search建索引用 lists,查询用 probes

表 3 的"构建时间更长、内存更多"不是我的判断,而是 pgvector 官方仓库对两种索引的原话对比。Qdrant 官方文档也说明它当前只用 HNSW 作为稠密向量索引,默认 m 为 16、ef_construct 为 100——不同产品的默认值不一样,这正说明参数要按自己数据调,而不能照抄。

3.3 参数怎么起手

以 pgvector 为例,先建表。

⚠️ 代码待验证

-- pgvector:建表,向量维度必须和嵌入模型输出一致
CREATE TABLE docs (
    id        bigserial PRIMARY KEY,
    content   text,
    category  text,
    embedding vector(768)
);

再建 HNSW 索引,给余弦距离用。

⚠️ 代码待验证

-- HNSW:m 与 ef_construction 越大,召回越好、构建越慢、内存越多
CREATE INDEX ON docs USING hnsw (embedding vector_cosine_ops)
    WITH (m = 16, ef_construction = 64);

-- 查询期再定搜索候选宽度,越大召回越好、越慢
SET hnsw.ef_search = 100;

如果数据还在持续写、又不想等索引构建,IVF 更合适,但要先有数据再建。

⚠️ 代码待验证

-- IVF:lists 起手值,100 万行以内用 行数/1000,超过 100 万行用 行数的平方根
-- 查询时 probes 起手值约为 lists 的平方根
CREATE INDEX ON docs USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
SET ivfflat.probes = 10;

这几个默认值和起手公式都来自 pgvector 官方仓库 README,不是我拍脑袋写的。

第 4 章 · 维度二与维度三:召回质量、内存占用

4.1 召回质量怎么量

召回率(recall)的人话解释是:真正最相近的那些结果里,你的检索找回来了多少。常用指标是 recall@k,即取回来的前 k 条里,命中了多少条本该在前 k 的。

量它的唯一可靠办法,是拿自己的数据跑一遍:先小批量做一次精确检索当"标准答案",再用近似索引跑同一批查询,比较两者重叠比例。下面是一段流程示意。

⚠️ 代码待验证

# 召回测量流程示意(非完整可运行脚本)
# 1) 用精确检索取标准答案 top_k
# 2) 用近似索引取同一条查询的 top_k
# 3) 计算两者重叠数 / k,即 recall@k
def recall_at_k(exact_ids, approx_ids, k):
    exact_set = set(exact_ids[:k])
    hit = sum(1 for i in approx_ids[:k] if i in exact_set)
    return hit / k

为什么必须用自己的数据测、而不是看公开榜单:向量分布、查询分布、过滤条件都不同,榜单上的默认参数在你这里往往不是好工作点。这不是否定榜单,而是说榜单只能帮你排除,不能替你定参。

表 4 · 召回相关指标该看什么

指标人话解释什么时候必须看
recall@k前 k 条里找回了多少该在前 k 的每次调索引参数后
延迟分位(如 95 分位)95% 的查询都在多久内返回定工作点时和召回一起看
结果集稳定性同一查询多次执行结果是否一致近似索引下用来确认行为

4.2 内存占用:先粗算,再买机器

DBA 最熟的容量规划在这里可以直接用。粗算公式分两层:

第一层是向量本体:向量条数 × 向量维度 × 每维字节数。pgvector 官方仓库给出更精确的式子:每个向量占「4 × 维度 + 8」字节,且向量最多可到 16000 维;能被 HNSW 索引的 vector 类型最多 2000 维,半精度类型可到 4000 维。

第二层是索引的额外开销,随 m 增大而增加,且 HNSW 的内存占用高于 IVF。

把数字代进去看一遍:

⚠️ 代码待验证

假设:100 万条向量,768 维,用 FP32(每维 4 字节)
本体内存 = 1,000,000 × 768 × 4 字节 ≈ 3.07 GB
换算成半精度(每维 2 字节)≈ 1.54 GB
再加上 HNSW 图结构的额外开销(随 m 增大而增加)
最终常驻内存 = 向量本体 + 索引开销 + 数据库自身开销

表 5 · 内存分项与判断

分项影响变量判断动作
向量本体条数、维度、精度先算本体,超内存就先降精度或换更小嵌入模型
索引结构索引类型、m 等参数内存吃紧时先在 IVF 与 HNSW 之间权衡
库自身与缓存连接数、缓存配置预留余量,别按"刚好装下"买机器

Milvus 官方文档给了一条容量判据可供参考:大约四分之一原始数据能进内存时,考虑面向磁盘的 DiskANN 以获得更稳定的延迟;全部数据能进内存时,则考虑常驻内存的索引类型。

第 5 章 · 维度四与维度五:构建时间、带过滤检索

5.1 构建时间:批量导入还是增量写入

索引构建和写入会互相抢资源。判断方法很简单:问一句「索引构建速度,跟得上数据到达速度吗」。

表 6 · 批量导入与增量写入的取舍

场景建议做法触发停写重建的信号
一次性灌历史数据先停写,全量导入后再统一建索引不需要,天然是批量
数据持续小批到达用构建更快的 IVF 承接写入IVF 召回不达标,且能接受一段停写窗口
数据持续大批到达增量写入 + 定期重建索引重建耗时已超过可接受的停写窗口

一句话结论:当索引构建速度跟不上数据到达速度时,先停写、批量建完再开写,比硬扛增量写入更省事。这也是你在传统库里「大表加索引要选维护窗口」的同一套判断。

5.2 带过滤条件的检索:老本行的主战场

这是 DBA 最能占便宜的一维。向量检索常带业务过滤,比如「只在某个分类里找相似片段」。问题在于:过滤和向量检索谁先谁后,结果和性能差很多。

pgvector 官方仓库讲得很清楚:使用近似索引时,过滤是在索引扫描之后才生效的。并且举了一个具体数字——如果一个条件只命中 10% 的行,在 HNSW 默认 hnsw.ef_search 为 40 的情况下,平均只有 4 行能命中。也就是说,你明明只想在某个分类里找 5 条,索引却可能因为过滤发生在后面而返回不足。

pgvector 从 0.8.0 起提供迭代索引扫描,在结果不够时会自动多扫一部分索引。下面是带过滤检索的写法示意。

⚠️ 代码待验证

-- 近似索引下,先看过滤命中比例,再决定是否开迭代扫描
SET hnsw.iterative_scan = relaxed_order;

SELECT id, content
FROM docs
WHERE category = 'tutorial'
ORDER BY embedding <=> '[0.1, 0.2, ...]'   -- 余弦距离,按距离升序
LIMIT 5;

表 7 · 先过滤与后过滤的差别

方式大致行为风险应对
后过滤(近似索引默认)先按向量取候选,再筛条件过滤命中比例低时,候选里可用行太少开迭代扫描;或给过滤列单独建索引
先过滤(精确检索友好)先按条件缩小范围,再算距离命中比例高时,等于对大量行做全量计算命中比例极低时用精确检索
分区 / 部分索引按条件物理切开数据分区键选错会失效按业务过滤维度分区

Milvus 官方文档给了一组可对照的阈值:过滤比例小于 85% 时,图索引通常优于 IVF;比例在 85% 到 95% 之间时用 IVF;比例高于 98% 时用暴力检索最准。Qdrant 官方文档则强调,要让过滤与图检索配合得好,应在写入数据之前先建好 payload 索引,否则需要重建 HNSW 索引。这两条都在说同一件事:过滤不是查询期才想的,它要在建库阶段就规划。

大模型学习路线图:这份资料把从零基础到能自己动手做 Agent 的每一步拆成了阶段表,其中「检索与向量库」一节正好承接本文的五维判断。放在资料包里,扫码即可获取:

配套资料获取

第 6 章 · DBA 的三个可直接迁移的优势

6.1 容量规划与索引调优思维

上面第 4 章的粗算公式、第 3 章的参数旋钮,本质都是你做了很多年的「先估容量、再调参数」。向量库只是把「行数 × 行宽」换成了「条数 × 维度 × 字节数」,把「选择度」换成了「过滤命中比例」。你不必重新学一套方法论,只需要把老公式里的变量名换掉。

6.2 事务与一致性

向量库不是只有"搜得快"这一个指标。写上去了但查不到、删了还在结果里、主从读到旧数据,这些你在关系库里天天防的问题,向量库同样存在。判断一个向量库能不能上生产,除了看召回,还要看它的写入可见性、删除语义与一致性模型怎么写。这是很多只从算法视角看向量库的人会漏掉的一层。

6.3 运维与备份

备份、恢复、监控、扩容——这套运维动作在向量库上照样要做,只是对象从数据文件变成了「数据文件 + 索引结构」。近似索引有个额外的坑:重建索引会带来一段可用性下降,所以你得把"重建窗口"纳入运维排期,就像过去给大表加索引要挑时间一样。

第 7 章 · 什么时候不该上专用向量库

7.1 反向判据

转岗的人容易犯的错,是把"新工具"当成"必须用"。向量库也有明确的"不该上"边界。

表 8 · 该不该上专用向量库

你的处境判断理由
数据量小(几万条以内)先别上专用向量库精确检索就够快,索引开销省了
已经有 PostgreSQL 且体量可控优先 pgvector少一套系统要运维
过滤条件复杂、强依赖多表关联优先关系库 + 向量扩展过滤与事务都在同一个库里
数据量很大、写入吞吐高、延迟敏感考虑专用向量库可独立扩容、针对检索优化
需要多路检索混合打分考虑专用向量库检索能力更完整

7.2 用 PostgreSQL 就够的边界

如果数据在几万条、向量维度也不夸张、业务查询就是"按分类找相似",那么给现有 PostgreSQL 装一个 pgvector 扩展,通常比另起一套向量库更省事:备份、权限、监控都能复用现有体系。这也是"老本行占便宜"最直接的体现——你不需要换掉熟悉的东西,只需要给表加一个向量列和一个向量索引。

⚠️ 代码待验证

# 在已有 PostgreSQL 上启用 pgvector 扩展(示意)
# 具体安装方式以你的 PostgreSQL 版本与操作系统官方说明为准
psql -d your_db -c "CREATE EXTENSION IF NOT EXISTS vector;"

反过来,当数据量和写入吞吐已经让"表和索引都在同一个库里"变成瓶颈时,再拆出专用向量库才是划算的。

7.3 收个尾

向量库选型这件事,算法背景的人容易从模型和榜单切入,而你从索引、容量、过滤、运维切入,反而更接近生产里真正会出事的地方。要补的新知识其实只有一块:召回怎么量。把这一块补上,剩下的五维里你有四维是现成的。

640 套 AI 大模型行业报告 + 经典 PDF 书籍:里面有大量向量检索与知识库落地的案例拆解,可以和本文的选型判据对着看。放在资料包里,扫码即可获取:

配套资料获取

附表 A:本文引用事实与出处对照表

#事实出处本文位置
1pgvector 支持 HNSW 与 IVFFlat 两种索引类型;默认执行精确检索、结果完美召回;加近似索引后同一查询结果会变pgvector 官方仓库 README(github.com/pgvector/pgvector)第 3 章 3.1
2pgvector HNSW 构建参数 m 默认 16、ef_construction 默认 64;查询参数 hnsw.ef_search 默认 40pgvector 官方仓库 README第 3 章 3.3
3pgvector IVFFlat 建议在建表有数据后再建索引;lists 起手值 100 万行以内取「行数/1000」、超过取「行数的平方根」;probes 起手值约为 lists 的平方根pgvector 官方仓库 README第 3 章 3.3
4采用近似索引时,过滤在索引扫描之后生效;条件命中约 10% 行、hnsw.ef_search 为默认 40 时平均仅约 4 行命中pgvector 官方仓库 README第 5 章 5.2
5pgvector 自 0.8.0 起支持迭代索引扫描,结果不足时自动多扫索引pgvector 官方仓库 README第 5 章 5.2
6pgvector 每个向量占「4 × 维度 + 8」字节;向量最多 16000 维;可建 HNSW 索引的 vector 最多 2000 维、半精度类型最多 4000 维pgvector 官方仓库 README第 4 章 4.2
7HNSW 论文题名《Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs》,编号 arXiv:1603.09320(Malkov、Yashunin)arXiv:1603.09320 摘要页第 3 章 3.2
8Qdrant 当前只用 HNSW 作为稠密向量索引;m 默认 16、ef_construct 默认 100;应在写入数据前先建 payload 索引,否则需重建 HNSWQdrant 官方文档(qdrant.tech/documentation/concepts/indexing)第 3 章 3.2、第 5 章 5.2
9Milvus 给出的过滤比例阈值:小于 85% 用图索引、85%–95% 用 IVF、高于 98% 用暴力检索;约四分之一原始数据可进内存时考虑 DiskANNMilvus 官方文档(milvus.io/docs/index-explained)第 4 章 4.2、第 5 章 5.2

附表 B:术语速查表

术语一句话解释在本文哪里用到
向量(vector)一串浮点数,用来表示一段文字或图片的语义第 1 章
嵌入模型(Embedding)把文字转成向量的模型第 1 章
向量库专门存向量并按"距离最近"检索的库第 1 章
精确检索与每条向量逐个算距离,结果最准但随数据量变慢第 3 章
近似最近邻(ANN)只访问可能相近的一部分数据,用少量召回换速度第 3 章
HNSW分层可导航小世界图索引,图索引的一种第 3 章
IVF(倒排文件)先把向量聚类,检索只进最近的少数几簇第 3 章
召回率(recall@k)前 k 条里找回了多少本该在前 k 的结果第 4 章
lists / probesIVF 的聚类数(建索引)与查询时探测的簇数第 3 章
迭代索引扫描结果不够时自动多扫一部分索引第 5 章
payload 过滤按附加字段(分类、时间等)缩小检索范围第 5 章
FP32单精度浮点,每个数占 4 字节第 4 章

写在最后:这篇用到的资料

写这篇文章时,把相关的官方文档和源码又翻了一遍,顺手也整理了几份配套的东西:

  • 大模型学习路线图:从零基础到能自己动手做 Agent,按阶段说明每一步该学什么、哪些可以先跳过
  • 《LangChain + LangGraph + MCP 智能体开发实战》视频课:7 个模块,从私有化部署、Embedding+RAG 到 MCP+Agent 全流程
  • AI 大模型知识库(在线可查):Agent Skills 从入门到落地、Claude Skills 完全指南等专题,按目录浏览即可
  • 640 套 AI 大模型行业报告 + 经典 PDF 书籍:看行业落地案例和别人怎么做的时候用得上
  • 大模型零基础到精通教学视频:跟着敲一遍,比只读文档快得多

资料是我自己整理的,放在下面这个码上,扫码即可获取:

配套资料获取
课程目录:私有化部署与 LangChain
课程总目录:7 个模块
在线知识库:Agent Skills 创建全流程
课程目录:LangGraph 开发智能体
在线知识库:Claude Skills 完全指南

添加时备注「AI」,优先通过。

资料按「先路线、再动手、最后查漏」的顺序整理好了,建议先看学习路线那一份,照着它挑一条适合自己当前基础的路径再往下看。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值