人人都会AI编程

3.3 向量索引原理

更新时间:2026-07-12

向量检索是 RAG 系统能够从海量文档中快速找到相关片段的关键。但当知识库规模增长到数十万甚至数百万条切片时,逐条计算问题向量与每一个切片向量的相似度会变得极慢,完全无法满足实时问答的延迟要求。向量索引就是为了解决这个效率问题而出现的。

3.3.1 为什么需要向量索引

向量相似度计算本质上是在高维空间中寻找最近邻。如果采用暴力扫描(flat search),时间复杂度为 O(N·D),其中 N 是切片数量,D 是向量维度。当 N 超过 10 万时,单次查询就可能需要几百毫秒甚至数秒,这对用户交互来说是不可接受的。

向量索引通过牺牲少量精度换取数量级的速度提升,使得在百万级甚至亿级向量上的检索都能在毫秒级完成,这是 RAG 得以落地的工程基础。

3.3.2 近似最近邻搜索(ANN)

向量索引的核心思路是近似最近邻搜索(Approximate Nearest Neighbor,简称 ANN)。它不保证一定找到绝对最近的前 K 个向量,但能够以极高的概率找到非常近似的结果,同时将计算量降低几个数量级。

常见的 ANN 算法主要有以下几类,它们在多数向量数据库(如 Milvus、Qdrant、Weaviate)中都有成熟实现:

1. 基于图的索引(Graph-based)

代表算法是 HNSW(Hierarchical Navigable Small World),目前在实际项目中使用最广泛。其思想是构建一个多层图结构:

  • 每个向量是图中的一个节点,节点之间根据相似度建立连接。
  • 检索时从最上层稀疏的入口点开始,逐层向下“跳跃”,每一层都在局部范围内寻找更近的邻居,最终在底层找到近似最近的结果。
  • 可以类比为在高速公路与街区道路之间切换:高层图是“高速路”,用于快速接近目标区域;底层图是“街区道路”,用于精细定位。

HNSW 的优势在于查询速度快(通常亚毫秒级),召回率高(可达 95% 以上),缺点是在构建索引阶段较慢,且内存占用相对较高。

2. 基于倒排的索引(IVF)

IVF(Inverted File Index) 先将整个向量空间用聚类算法(如 K-Means)划分成若干个区域(称为聚类中心或桶)。查询时,先将问题向量与所有聚类中心比较,找到最近的几个区域,然后只在这些区域内做精确搜索。

  • 相当于先把图书馆的书按大类分好,找书时只去最可能的两三个书架翻找,而不需要遍历整个图书馆。
  • IVF 可以通过参数平衡速度与精度,聚类数量越多,搜索范围越小,速度越快,但可能漏掉跨区域的正确结果。

3. 基于量化的索引(Quantization-based)

PQ(Product Quantization) 将高维向量拆分成多个低维子向量,每个子向量用有限的码本(codebook)进行压缩表示。检索时将查询向量同样量化,通过查表快速估算距离。

  • 这类方法的主要优势在于极致的内存压缩,可以在有限资源下支撑超大规模索引,代价是精度通常略低于图索引。

在实际应用中,许多向量数据库会组合多种技术,例如 IVF+PQHNSW+PQ,在速度、精度和内存之间取得平衡。

3.3.3 一个直观的运行示例

假设知识库中有 100 万条文档切片,每条切片对应一个 768 维的向量。使用暴力扫描,每次查询需要比较 100 万次 768 维的距离计算,耗时约 200 毫秒。

改用 HNSW 索引后,检索过程变为:

  1. 从顶层入口点开始,仅计算与少量邻居节点的距离。
  2. 逐层下探,每层最多探索几十个节点。
  3. 在底层集中搜索数十到数百个最可能的节点,最终返回 top-5 结果。

整个过程的距离计算次数从 100 万次降低到几千次,时间缩短至 5 毫秒以内,同时保持召回率超过 98%。

3.3.4 索引选择的实用建议

不同场景对速度、精度、内存的侧重各异:

| 场景特征 | 推荐索引类型 | 说明 |
|----------|-------------|------|
| 中小规模(<50 万向量),追求高精度 | HNSW | 维护成本低,查询快,精度高 |
| 大规模(百万至千万),内存有限但可接受一定精度损失 | IVF+PQ | 压缩高,内存占用小 |
| 规模极大(亿级),对延迟要求极低 | 分层聚类 + 量化 | 需针对性调参,部署复杂度较高 |

在设计 RAG 系统时,通常不需要从零实现索引算法,主流的向量数据库都已内置上述索引类型,只需根据数据规模和性能要求选择合适的索引并设置关键参数(如 HNSW 的 ef_search、IVF 的 nlist)即可。

掌握向量索引的原理,能帮助我们在面对检索速度慢、召回率低等问题时,准确判断是索引参数设置不当,还是数据分布本身需要调整,从而做出有效的优化决策。