FLAT、IVF、PQ、HNSW 等向量索引如何选择?¶
- ID:Q023
- 难度:进阶 / 系统设计
- 标签:ANN、FLAT、IVF、PQ、HNSW、召回率、延迟、内存
同义问法¶
- 向量数据库为什么不能直接暴力搜索?
- IVF、HNSW、PQ 的原理是什么?
- IVF+PQ 为什么不能保证 100% 召回?
- HNSW 为什么快但占内存?
- 如何调 nprobe、efSearch、nlist?
来源¶
可视化图解¶
flowchart TD
N[向量规模与延迟目标] --> E{是否需要精确检索}
E -->|是| F[FLAT]
E -->|否| M{内存是否充足}
M -->|是| H[HNSW]
M -->|否| I[IVF]
I --> P{是否需要进一步压缩}
P -->|是| Q[PQ / IVF-PQ]
P -->|否| I2[IVF-Flat]
F --> B[在真实数据上 Benchmark]
H --> B
Q --> B
I2 --> B
核心结论¶
向量索引是在召回率、查询延迟、构建时间、更新成本和内存之间做近似搜索的工程交换。 不存在脱离数据规模、维度、更新模式和 SLA 的“最佳索引”。
一、FLAT:精确搜索基线¶
FLAT 对 Query 与全部向量计算距离,再取 Top-K。
优点:
- 在给定距离度量下是精确结果;
- 无训练和复杂调参;
- 适合小数据集和评测基线。
缺点:复杂度随向量数量线性增长。数据规模较大时,延迟和计算成本不可接受。
面试中要强调:任何 ANN 调优都应该与 FLAT 的真值结果对比,才能知道 Recall 损失。
二、IVF:先分桶,再局部搜索¶
IVF 通过聚类把向量划入 nlist 个倒排桶。查询时先找到较近的聚类中心,只搜索其中 nprobe 个桶。
对应流程使用 Mermaid 图解展示。
参数影响:
nlist大:桶更细,训练和管理成本更高;nprobe大:扫描更多桶,召回更高、延迟更高。
IVF 的主要误差来源是:真实近邻可能落在没有被探测的桶里,尤其是聚类边界附近。
三、PQ:压缩向量和近似距离¶
Product Quantization 将高维向量拆成多个子空间,每个子空间用码本中心近似表示,存储的是码字编号而非完整浮点向量。
优点:显著降低内存和带宽。
代价:距离基于量化后的近似值,可能导致近邻排序错位。
IVF+PQ 同时包含:
- 粗筛桶可能漏召回;
- PQ 量化引入距离误差。
所以不能保证 100% Recall。即使扩大 nprobe,量化误差仍可能改变排序。需要更高准确率时,可保留原始向量对候选做二次精排。
四、HNSW:图上的近邻导航¶
HNSW 构建多层小世界图:上层节点少、负责快速跳转;下层更密、负责局部搜索。
典型参数:
M:每个节点的连接规模,影响内存、构建成本和图质量;efConstruction:建图搜索宽度;efSearch:查询搜索宽度,越大通常召回越高但越慢。
HNSW 查询性能通常很好,但图边和节点结构会额外占用较多内存;删除和高频更新也比简单索引更复杂。
五、如何选择¶
数据规模较小¶
先用 FLAT。简单、准确,避免过早引入 ANN 复杂度。
中大规模、内存充足、低延迟优先¶
HNSW 常是强基线。通过 efSearch 调节延迟和召回。
超大规模、内存受限¶
考虑 IVF_PQ、HNSW_PQ、DiskANN 等压缩或磁盘方案,但需要接受召回损失和更复杂调参。
批量构建、查询远多于更新¶
IVF 系列比较适合;若文档频繁增删,需要评估聚类漂移、重建和删除维护成本。
六、调参方法¶
不要照抄参数,建立曲线:
以 FLAT 结果为 Ground Truth,在真实数据和 Query 上分别扫描:
- IVF 的
nlist、nprobe; - HNSW 的
M、efConstruction、efSearch; - PQ 的子空间数和码本配置。
同时观察:
- 索引构建时间;
- 增量写入速度;
- 删除与更新成本;
- 冷启动加载时间;
- 多租户过滤后的性能。
七、容易忽略的过滤问题¶
向量搜索经常还带租户、权限、时间和业务标签过滤。若先 ANN 再过滤,候选可能被过滤光;若过滤条件极强,索引也可能无法充分利用。
因此要评估数据库对 Pre-filter、Post-filter、分区和标量索引的支持,不能只看纯向量 Benchmark。
常见错误回答¶
HNSW 精度最高,所以生产都用 HNSW。
忽略了内存、更新、过滤和数据规模。
nprobe 设置成 nlist 就能达到精确搜索。
对于 IVF_FLAT,扫描全部桶接近全量距离计算;但 IVF_PQ 仍有量化误差,而且此时性能优势基本消失。
面试口述版¶
FLAT 是精确搜索基线;IVF 用聚类分桶减少扫描范围,nprobe 控制召回与延迟;PQ 通过子空间量化压缩向量,但引入距离误差;HNSW 用多层近邻图快速导航,通常查询快但内存和维护成本高。选型时我会用 FLAT 生成真值,在真实 Query 上画 Recall@K、P95 延迟、QPS 和内存曲线,同时评估更新、删除和权限过滤。索引不是只看单次查询速度,而是整个数据生命周期的取舍。
结合个人项目¶
内部知识库规模初期不大时没有必要直接上复杂 PQ。先用 FLAT 或 HNSW 建立效果基线,确认真正瓶颈后再压缩。CI/CD 检索还包含环境、服务和时间范围过滤,过滤策略往往比 ANN 参数更影响最终召回。