向量数据库索引结构入门:从 Flat 到 HNSW
为什么需要向量索引
在检索增强生成(RAG)系统中,我们经常要在数百万条向量里找出与查询最相似的几十条。如果每次查询都把所有向量与查询向量算一遍距离,准确率当然最高,但计算量会随数据规模线性增长。以一百万条 768 维向量为例,一次暴力检索大约要做七亿次浮点乘加,延迟很难稳定在几十毫秒以内。向量索引的核心任务,就是用少量精度或召回率的代价,换取数量级的速度提升。
Flat:最简单的基线
Flat 索引不建任何结构,查询时遍历全部向量,通常配合 SIMD 指令和 GPU 做批量距离计算。它的召回率是百分之百,适合数据量小、或者需要离线评估其他索引效果的场景。工程上不要因为它简单就忽略它:Flat 往往是压测的基线,也是判断其他索引是否真的带来收益的参照物。
IVF:先聚类再搜索
IVF(Inverted File)先用 K-Means 把向量聚成若干簇,查询时只扫描距离查询最近的若干个簇。参数 nlist 决定簇数量,nprobe 决定扫描多少簇。nprobe 越大,召回率越高,延迟也越高。IVF 的难点在于数据分布变化后簇中心会漂移,需要定期重训练,否则靠近边界的查询容易漏掉邻居。
PQ:用编码换内存
PQ(Product Quantization)把高维向量切成若干段,每段用一个小码本编码成字节。查询时用查表代替乘法,内存占用可以降低一个数量级。它常与 IVF 组合成 IVF-PQ:先用粗聚类缩小范围,再用压缩编码快速排序。代价是距离估算存在误差,通常还需要用原始向量对候选集做重排,才能把召回率补回来。
HNSW:图索引的工程折中
HNSW 把向量组织成分层小世界图,上层稀疏、下层稠密,查询从顶层入口点开始贪心地向近邻移动。关键参数是 M(每个节点的连接数)和 efConstruction(建图时的候选队列长度),查询时用 efSearch 控制搜索宽度。HNSW 的召回率和延迟都比较稳定,但内存开销大,构建也慢,删除和更新更麻烦,很多系统采用标记删除加定期重建来处理。
如何选型
如果数据规模在十万以内、内存充足,Flat 的确定性很有吸引力。百万级、内存敏感的场景,IVF-PQ 更合适。对延迟和召回率都苛刻的在线服务,HNSW 往往是首选,但要接受它的内存成本。无论选哪种,都应该用真实业务查询构造评测集,同时看召回率、P99 延迟和内存三项指标,而不是只看某个压测报告里的单一数字。
结语
向量索引没有最好,只有匹配。理解每种结构背后的取舍,才能在上线后遇到召回率下降或延迟抖动时,快速判断问题出在参数、数据分布,还是索引本身已经不适合当前规模。
- 点赞
- 收藏
- 关注作者
评论(0)