文章目录
- 1. 核心逻辑:为什么需要“分桶”?
- 2. IVF 核心组件与结构
-
- 2.1. 核心组件
- 2.2. 整体结构示意图
- 3. IVF 关键流程:构建与搜索
-
- 3.1. 索引构建:聚类分桶,建立倒排表
-
- 步骤 1:数据采样与聚类(生成 K 个中心)
- 步骤 2:向量分桶(分配到倒排表)
- 步骤 3:桶内优化(可选,提升搜索效率)
- 3.2. 查询搜索:粗筛候选桶 + 桶内精查
-
- 步骤 1:粗筛(找候选桶)
- 步骤 2:桶内精查(找最近邻)
- 步骤 3:结果返回
- 4. 关键参数说明(性能平衡核心)
-
- 参数调优示例(基于 Sift1M 数据集,128 维向量)
- 5. IVF 的优势、缺陷与改进方向
-
- 5.1. 核心优势
- 5.2. 主要缺陷
- 5.3. 改进方向
- 6. 总结
HNSW的原理看这里:图解 HNSW(Hierarchical Navigable Small Worlds)原理
IVF(Inverted File)是一种经典的近似最近邻(ANN)搜索算法,核心思想是“分桶(聚类)+ 局部搜索”——通过将高维向量按聚类划分到不同“桶”(聚类中心),搜索时仅在目标桶及邻近桶内查找,大幅减少需比对的向量数量,实现搜索加速。其结构简单、内存效率高,是高维向量搜索的基础算法之一,常与 HNSW、PQ(乘积量化)等算法结合使用。
1. 核心逻辑:为什么需要“分桶”?
高维向量的直接暴力搜索(遍历所有向量计算相似度)存在致命缺陷:
- 时间复杂度为 O(N×D)(N 为向量总数,D 为向量维度),百万级以上数据时搜索速度极慢;
- 高维空间中“距离”失去直观意义(维度灾难),全局搜索效率低下。
IVF 的解决方案:“先粗筛(找候选桶),再精查(桶内搜索)” 通过聚类将相似向量归为一类(桶),搜索时先定位与查询向量最相似的几个桶,再在这些桶内进行精准搜索,避免全局遍历。

(示意图说明:左图为暴力搜索,需遍历所有向量;右图为 IVF 搜索,仅遍历目标桶及邻近桶的向量,搜索范围大幅缩小。)
2. IVF 核心组件与结构
IVF 的核心结构由“聚类中心”和“倒排表(桶)”组成,整体架构如下:
2.1. 核心组件
| 聚类中心(Centroids) | 桶的“代表” | 共 K 个(参数 K 为桶数),通过聚类算法(如 k-means)从所有向量中学习得到,每个中心对应一个桶 |
| 倒排表(Inverted List) | 存储桶内向量 | 每个桶是一个倒排表项,包含该桶内所有向量的索引(或向量本身) |
| 量化器(Quantizer) | 向量分桶依据 | 负责计算查询向量与 K 个聚类中心的相似度,确定目标桶 |
2.2. 整体结构示意图
参考 https://www.youtube.com/watch?v=chz74Mtd1AA
![]() |
第一步,对所有向量进行聚类,得到聚类中心 |
![]() |
第二步,计算查询向量与每个聚类中心的距离,找到最近的聚类中心(如图中是黄色) |
![]() |
第三步,计算查询向量和选中的聚类(黄色)中每个点的距离,选出top k个最近的,返回。(注意到,红色区域中有一个点和查询向量更接近【d_2】,但是该点由于所在的聚类中心不如黄色聚类,所以不会被考虑。这里其实暴露出了IVF的不足——有时会损失最精确的结果,但从检索效率上来看,牺牲这一点精确度是值得的。) |
3. IVF 关键流程:构建与搜索
IVF 的完整流程分为“索引构建”和“查询搜索”两步,每一步的逻辑直接影响搜索性能。
3.1. 索引构建:聚类分桶,建立倒排表
构建过程的核心是“通过聚类生成桶,将向量分配到对应桶中”,步骤如下:
步骤 1:数据采样与聚类(生成 K 个中心)
- 从原始向量集合(记为 X,共 N 个向量)中采样部分向量(或全量向量);
- 使用 k-means 算法对采样向量聚类,得到 K 个聚类中心(记为 C = [c₁, c₂, …, c_K]),每个中心代表一个桶。
步骤 2:向量分桶(分配到倒排表)
- 对每个原始向量 x_i ∈ X,计算 x_i 与 K 个聚类中心的相似度(如欧氏距离、余弦相似度);
- 将 x_i 分配到“最相似的聚类中心对应的桶”中(即“硬分配”,一个向量仅属于一个桶);
- 所有向量分配完成后,形成 K 个倒排表(桶),每个桶存储该类向量的索引或原始数据。
步骤 3:桶内优化(可选,提升搜索效率)
- 对每个桶内的向量进行排序(如按与聚类中心的距离排序),或构建局部索引(如 k-d 树、Flat 索引),减少桶内查找时的比对次数。

(示意图说明:① 原始向量集合(杂乱分布);② k-means 聚类生成 K 个中心;③ 每个向量分配到最近的中心对应的桶;④ 最终形成 K 个有序桶,每个桶内向量相似度较高。)
3.2. 查询搜索:粗筛候选桶 + 桶内精查
搜索过程的核心是“先快速定位候选桶,再在桶内精准查找最近邻”,步骤如下:
步骤 1:粗筛(找候选桶)
- 输入查询向量 q,计算 q 与 K 个聚类中心的相似度;
- 选择相似度最高的 nprobe 个聚类中心(参数 nprobe 为“查询时访问的桶数”),对应的 nprobe 个桶即为候选桶。
- 关键:nprobe 越小,搜索越快但召回率可能越低;nprobe 越大,召回率越高但搜索越慢。
步骤 2:桶内精查(找最近邻)
- 遍历 nprobe 个候选桶,取出桶内所有向量;
- 计算查询向量 q 与这些向量的相似度;
- 按相似度排序,取 Top-K 个最相似的向量作为查询结果。
步骤 3:结果返回
- 合并 nprobe 个桶内的 Top-K 结果,去重后按相似度排序,返回最终的近似最近邻。

(示意图说明:① 输入查询向量 q;② 计算 q 与所有聚类中心的距离,选择最近的 2 个(nprobe=2)候选桶;③ 遍历候选桶内向量,计算相似度;④ 排序后返回 Top-K 结果。)
4. 关键参数说明(性能平衡核心)
IVF 的性能(搜索速度、召回率、内存占用)由两个核心参数控制,调整逻辑如下:
| K | 聚类中心数量(桶数) | – K 越大:桶内向量越少,桶内搜索越快;但聚类中心越多,粗筛阶段计算量越大,且易出现“桶分布不均”(部分桶向量过多)- K 越小:粗筛越快,但桶内向量越多,桶内搜索越慢 | 通常取 √N(如 N=100 万时,K=1000) |
| nprobe | 搜索时访问的候选桶数 | – nprobe 越大:覆盖的相似向量越多,召回率越高;但访问桶数增加,搜索时间变长- nprobe 越小:搜索越快,但可能遗漏目标向量,召回率降低 | 默认值 10~50,需根据业务平衡速度与召回率 |
参数调优示例(基于 Sift1M 数据集,128 维向量)
| 搜索速度 | 0.1ms/query | 0.5ms/query | 1ms/query |
| 召回率(Recall@10) | 75% | 92% | 97% |
可见:nprobe 是“速度-召回率”的直接调节杠杆,K 需提前根据数据量优化。
5. IVF 的优势、缺陷与改进方向
5.1. 核心优势
- 速度快:避免全局遍历,搜索时间随 N 增长缓慢(近似 O(nprobe×(N/K)×D));
- 内存高效:仅需存储聚类中心和原始向量(或向量索引),无复杂图结构开销;
- 兼容性强:可与 PQ(乘积量化)结合(如 IVF-PQ),进一步压缩向量,降低内存占用;也可与 HNSW 结合(如 IVF-HNSW),提升桶内搜索效率。
5.2. 主要缺陷
- 聚类依赖:聚类质量直接影响召回率,若向量分布不均匀(如多簇、离群点多),易出现“桶内向量过多”或“目标向量被分到非最优桶”;
- 召回率上限:仅访问 nprobe 个桶,可能遗漏全局最优的最近邻,召回率低于暴力搜索和 HNSW;
- 高维适应性有限:维度灾难会影响聚类中心与向量的相似度计算精度,高维(如 D>1000)场景下性能下降。
5.3. 改进方向
- 软分配:一个向量分配到多个相似桶(而非仅一个),提升召回率,但增加内存开销;
- 动态聚类:定期更新聚类中心,适应数据分布变化(如在线增量数据场景);
- 混合索引:结合 HNSW 作为“粗筛器”(替代 k-means 聚类),或结合 PQ 压缩桶内向量,平衡速度、召回率与内存。
6. 总结
IVF 的核心原理是“聚类分桶+局部搜索”,通过将高维向量按相似度划分到不同桶,大幅缩小搜索范围,实现高效近似最近邻搜索。其优势在于结构简单、速度快、内存占用低,缺陷是依赖聚类质量、召回率有上限。实际应用中,常通过调整 K 和 nprobe 平衡性能,或与 PQ、HNSW 等算法结合,适配不同场景(如低内存场景用 IVF-PQ,高召回场景用 IVF-HNSW)。
IVF 是向量搜索的“基础工具”,理解其分桶逻辑,能更好地掌握复杂混合索引的设计思路。
网硕互联帮助中心







评论前必须登录!
注册