IVF_FLAT 和 HNSW 是两种常用于大规模向量检索的索引算法,广泛应用于相似性搜索​(如图像检索、语义搜索、推荐系统、RAG系统中的文档召回)场景。它们都属于近似最近邻搜索(Approximate Nearest Neighbor Search, ANN)​方法,在牺牲少量精度的前提下,大幅提升海量高维向量的检索效率(速度与内存占用)。下面分别介绍它们的原理、特点及适用场景。


一、IVF_FLAT(Inverted File with Flat Compression)

1. 基本原理

IVF_FLAT 是基于倒排文件(Inverted File, IVF)​结构的一种向量索引方法,属于聚类+分桶检索的思想,由 ​FAISS(Facebook AI Similarity Search)​​ 库提出并广泛使用。

核心步骤:
  1. 聚类(Clustering)​​:

    首先对所有向量进行聚类(通常使用K-means算法),将整个向量空间划分为 ​N 个聚类中心(Cluster / Voronoi Cell / 簇)​,每个中心代表一个“桶”或“分区”。这个过程也叫量化(Quantization)​,聚类中心数量记作 nlist

  2. 向量分配(Bucket Assignment)​​:

    每个输入向量会被分配到距离它最近的某一个聚类中心(即所属的“桶”或“cell”),形成多个倒排列表(Inverted List)。也就是说,每个聚类中心维护一个列表,里面包含所有属于该簇的向量。

  3. 检索(Search)​​:

    • 查询时,先计算 Query 向量与所有聚类中心的距离,选取距离最近的 ​nprobe 个聚类中心(桶)​​ 作为候选范围(nprobe 是可调参数,控制搜索范围)。

    • 然后只在这 nprobe 个选中的簇对应的向量列表(即倒排列表)中,做暴力精确搜索(Flat L2 或内积)​,找出每个桶里最相似的向量。

    • 最终综合所有候选桶的 Top 结果,返回全局最相似的 Top-K 向量。

🧠 简单理解:把向量空间分成很多“抽屉”(聚类簇),查询时只翻看最可能相关的几个抽屉,然后在抽屉里暴力搜一遍,不用查全部向量。


2. 特点

特性

说明

索引类型

基于聚类的分桶 + 桶内暴力搜索

是否压缩向量

❌ 否,桶内向量保持原始向量形式(Flat),未压缩

精度

较高(尤其当 nprobe 接近 nlist 时接近暴力搜索)

检索速度

比全量暴力搜索快很多(尤其当 nprobe ≪ nlist 时);速度随 nprobe 增大而变慢

内存占用

较高(因为桶内向量未压缩,存储原始向量)

适用场景

数据量大,但对内存不太敏感,追求检索精度与速度的平衡;适合对召回要求较高的场景


3. 关键参数

  • nlist​:聚类中心数(即分桶数),决定向量被分配到多少个“抽屉”。值越大,聚类越细,但索引构建和搜索开销越大。

  • nprobe​:检索时搜索的聚类中心数(即查看几个“抽屉”),控制搜索范围。值越大,召回率越高,但速度越慢。

调参建议:nlist 通常设为几千到几万(视数据量而定),nprobe 一般从几十到几百开始调优,根据业务对速度/精度的要求权衡。


二、HNSW(Hierarchical Navigable Small World Graph)

1. 基本原理

HNSW(Hierarchical Navigable Small World Graph)是一种基于图结构的近似最近邻搜索算法,是目前公认的精度高、速度较快的 ANN 方法之一,被广泛应用于 FAISS、Milvus、Weaviate、NMSLIB 等主流向量数据库/搜索引擎中。

核心思想:

HNSW 构建了一个多层图结构(Hierarchical Graph)​,通过图的导航(traversal)快速找到与查询向量最相似的向量,属于基于图的启发式搜索

构建过程(简化):
  1. 分层图结构​:

    构建一个具有多层的图,其中:

    • 顶层(高层)​​:节点较少,图比较稀疏,用于快速“导航”到目标区域;

    • 底层(底层)​​:包含所有数据向量,图比较稠密,用于精细搜索。

  2. 插入向量​:

    每插入一个新向量,会从顶层开始,逐层向下寻找最近邻节点,并在每一层都建立连接(边),最终在底层图中将该向量插入到合适的位置,与周围的若干节点相连。

  3. 搜索过程​:

    • 查询时,从顶层开始,找到当前层的最近邻节点,然后“下降”到下一层,继续在该层中搜索最近邻;

    • 重复这个过程直到最底层,然后在最底层的小世界图中做贪婪搜索(或受限的 beam search)​,找出 Top-K 最相似的向量。

🧠 类比:想象你在一座多层停车场找车,先在顶层俯瞰大致区域,然后逐层下降,每层都往目标方向靠近,最后在底层精确找到车位。


2. 特点

特性

说明

索引类型

基于多层小世界图的启发式搜索

是否压缩向量

❌ 否,存储原始向量(但图结构本身很紧凑)

精度

非常高(通常比 IVF_FLAT 更准,尤其召回率高)

检索速度

极快(尤其在大规模数据上),搜索复杂度接近 O(logN)

内存占用

较高(因为要存储图的连接关系,但比存储所有向量关系要好)

适用场景

对召回率和精度要求极高;数据量极大(百万~亿级);适合对搜索速度和准确性都有高要求的场景(如 RAG、语义搜索、推荐系统)


3. 关键参数

  • M​:控制图中每个节点的最大连接数(即邻居数),影响图的连通性和搜索效率。值越大,搜索路径越多,精度越高,但内存占用也越大。

  • efConstruction​:构建索引时的搜索范围参数,影响索引质量。值越大,构建的图质量越高,但构建越慢。

  • efSearch​:查询时的搜索范围参数,决定搜索时考察的候选节点数。值越大,召回率越高,但查询越慢。

调参建议:M 通常取 16~64,efConstruction 构建时设为 100~500,efSearch 查询时设为 50~200(根据精度和速度需求权衡)。


三、IVF_FLAT 与 HNSW 对比总结

对比维度

IVF_FLAT

HNSW

索引结构

聚类分桶(倒排文件)+ 桶内暴力搜索

多层小世界图(图导航搜索)

检索方式

先选若干簇,再在簇内暴力精确搜索

图遍历(从上层到下层,最后精细搜索)

精度 / 召回率

较高,但取决于 nprobe;可能漏掉部分相近点

非常高,通常召回率优于 IVF_FLAT

检索速度

快(尤其 nprobe 小),但比 HNSW 略慢

极快,尤其适合大规模数据

内存占用

较高(存储所有桶内原始向量)

较高(存储图结构,但比原始向量关系好)

构建速度

较快(只需聚类)

较慢(需逐点构建图结构)

适用场景

数据量大,希望平衡速度与精度,内存充足

对精度/召回要求极高,数据量大,追求极速检索

典型应用

企业知识库、大规模向量检索(中等精度)

RAG、语义搜索、推荐系统、高精度召回


四、在 RAG 或向量检索中的应用建议

  • 如果你更关注检索速度,且对召回率要求不是极端高​(比如初步召回后还有生成模型过滤),可以选择 ​IVF_FLAT,并通过调节 nprobe控制速度与精度的权衡。

  • 如果你希望召回尽可能多的相关向量(高召回率)、对答案准确性要求高(如 RAG 中不想漏掉关键文档)​,或者数据规模极大(百万级以上),推荐使用 ​HNSW,它能以更快的速度实现更高的召回精度。

  • 进阶方案​:某些系统(如 Milvus、FAISS、Weaviate)支持混合索引或多阶段检索,例如先用 IVF 快速过滤出候选集,再用 HNSW 或精确搜索做精排,兼顾效率与精度。


五、总结一句话

  • IVF_FLAT​:像“分抽屉+挑几个抽屉暴力搜”,​速度快、内存可控,适合大部分通用场景

  • HNSW​:像“多层地图导航+精细搜索”,​精度高、召回强,适合高要求场景

根据你的数据规模、召回需求、响应时间、硬件资源等因素,选择合适的索引类型,甚至组合使用,是构建高效 RAG 或向量检索系统的关键!

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐