跳转至

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 同时包含:

  1. 粗筛桶可能漏召回;
  2. PQ 量化引入距离误差。

所以不能保证 100% Recall。即使扩大 nprobe,量化误差仍可能改变排序。需要更高准确率时,可保留原始向量对候选做二次精排。

四、HNSW:图上的近邻导航

HNSW 构建多层小世界图:上层节点少、负责快速跳转;下层更密、负责局部搜索。

典型参数:

  • M:每个节点的连接规模,影响内存、构建成本和图质量;
  • efConstruction:建图搜索宽度;
  • efSearch:查询搜索宽度,越大通常召回越高但越慢。

HNSW 查询性能通常很好,但图边和节点结构会额外占用较多内存;删除和高频更新也比简单索引更复杂。

五、如何选择

数据规模较小

先用 FLAT。简单、准确,避免过早引入 ANN 复杂度。

中大规模、内存充足、低延迟优先

HNSW 常是强基线。通过 efSearch 调节延迟和召回。

超大规模、内存受限

考虑 IVF_PQ、HNSW_PQ、DiskANN 等压缩或磁盘方案,但需要接受召回损失和更复杂调参。

批量构建、查询远多于更新

IVF 系列比较适合;若文档频繁增删,需要评估聚类漂移、重建和删除维护成本。

六、调参方法

不要照抄参数,建立曲线:

x 轴:P95 查询延迟 / QPS / 内存
 y 轴:Recall@K

以 FLAT 结果为 Ground Truth,在真实数据和 Query 上分别扫描:

  • IVF 的 nlistnprobe
  • HNSW 的 MefConstructionefSearch
  • 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 参数更影响最终召回。