大规模向量检索算法IVF_FLAT和HNSW介绍
IVF_FLAT和HNSW是两种主流的大规模向量检索算法,均属于近似最近邻搜索方法。IVF_FLAT通过聚类分桶实现高效检索,在倒排列表中进行暴力搜索,适合平衡速度与精度的场景;HNSW基于多层图结构,通过分层导航快速定位相似向量,召回率高、搜索速度快,适用于高精度要求的任务。两者在内存占用、构建速度和检索效率上各有优势,选择时需综合考虑数据规模、召回需求和响应时间等因素。实际应用中可单独或组合使
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) 库提出并广泛使用。
核心步骤:
-
聚类(Clustering):
首先对所有向量进行聚类(通常使用K-means算法),将整个向量空间划分为 N 个聚类中心(Cluster / Voronoi Cell / 簇),每个中心代表一个“桶”或“分区”。这个过程也叫量化(Quantization),聚类中心数量记作
nlist。 -
向量分配(Bucket Assignment):
每个输入向量会被分配到距离它最近的某一个聚类中心(即所属的“桶”或“cell”),形成多个倒排列表(Inverted List)。也就是说,每个聚类中心维护一个列表,里面包含所有属于该簇的向量。
-
检索(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)快速找到与查询向量最相似的向量,属于基于图的启发式搜索。
构建过程(简化):
-
分层图结构:
构建一个具有多层的图,其中:
-
顶层(高层):节点较少,图比较稀疏,用于快速“导航”到目标区域;
-
底层(底层):包含所有数据向量,图比较稠密,用于精细搜索。
-
-
插入向量:
每插入一个新向量,会从顶层开始,逐层向下寻找最近邻节点,并在每一层都建立连接(边),最终在底层图中将该向量插入到合适的位置,与周围的若干节点相连。
-
搜索过程:
-
查询时,从顶层开始,找到当前层的最近邻节点,然后“下降”到下一层,继续在该层中搜索最近邻;
-
重复这个过程直到最底层,然后在最底层的小世界图中做贪婪搜索(或受限的 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 或向量检索系统的关键!
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐

所有评论(0)