向量数据库索引算法三剑客:HNSW、LSH、PQ 原理深度解读
- 1. 开篇:从“大海捞针”到“精准导航”的密钥
- 2. 一张图看懂三大算法的定位与协作(多色流程图)
- 3. HNSW:图结构的“高速路网”
- 3.1 设计动机:让贪心搜索找到“捷径”
- 3.2 核心原理:像查地图一样找向量
- 3.3 关键参数与权衡
- 3.4 优缺点与适用场景
- 4. LSH:哈希分桶的“智能分类”
- 4.1 设计动机:用哈希把“相似的”聚到一起
- 4.2 核心原理:随机超平面的“切分游戏”
- 4.3 优缺点与适用场景
- 5. PQ:向量压缩的“极致瘦身”
- 5.1 设计动机:让万亿向量也能装进内存
- 5.2 核心原理:拆碎了分别“编字典”
- 5.3 距离计算如何加速?——查表法
- 5.4 PQ的局限性
- 6. 三类算法横向对比与协同使用
- 7. 选型速查:场景决定算法
- 8. 总结:三句话记住三大算法
🌺The Begin🌺点点关注,收藏不迷路🌺 ⬇ ⬇ 底部 ⬇ ⬇ |
1. 开篇:从“大海捞针”到“精准导航”的密钥
在向量数据库的世界里,索引算法决定了一切。没有索引,每一条查询都要和库里的每一个向量做距离计算——1亿条数据就是1亿次浮点运算,再强的服务器也扛不住几秒一次的响应延迟。正是HNSW、LSH、PQ这三类算法,让向量检索从“大海捞针”变成了“精准导航”。
但很多开发者对这三个缩写的理解停留在“知道名字,不清楚原理”的层面——HNSW为什么快?LSH的哈希和传统哈希有什么不同?PQ到底是怎么把向量“压缩”到那么小的?
本文将从设计动机、核心原理、关键参数、适用场景四个维度,把这三类算法彻底讲透。全文配有多色流程图,核心要点采用三色标注,即使没有深厚的数学背景也能看懂它们的“灵魂”。
2. 一张图看懂三大算法的定位与协作(多色流程图)
下图展示了HNSW、LSH、PQ在向量检索中的角色分工。其中蓝色代表索引构建主流程,金色代表三类算法的核心机制,红色代表需要注意的权衡点。
三大算法的核心定位:HNSW擅长图导航快速定位,PQ擅长极致压缩节省内存,LSH擅长哈希分桶快速过滤。三者常被组合使用(如IVF+PQ、HNSW+PQ),各取所长。
3. HNSW:图结构的“高速路网”
3.1 设计动机:让贪心搜索找到“捷径”
HNSW的全称是Hierarchical Navigable Small World(分层可导航小世界网络)。它的设计灵感来自两个经典思想:
- 跳表(Skip List):一种概率数据结构,通过多层链表让查找从O(N)降到O(log N)
- 可导航小世界图(NSW):一种基于图的近似最近邻算法,通过节点间的连接实现“六度分隔”式搜索
HNSW把这两个思想融合在一起——用多层图结构,让搜索从顶层快速“跳”到目标区域,再在底层精细定位。
3.2 核心原理:像查地图一样找向量
HNSW构建的图结构可以想象成不同缩放级别的地图:
- 底层(Level 0):包含所有数据点,节点密集,连接精细,用于最终精确定位
- 上层(Level 1, 2, …):只包含部分数据点,逐层稀疏,节点之间的连接距离更长,用于快速“跳跃”
搜索过程分为三步:
- 顶层跳转:从最高层的入口节点开始,贪心搜索该层中与查询向量最接近的节点
- 层层下降:将上一层的搜索结果作为下一层的入口,重复贪心搜索,逐层逼近目标区域
- 底层精搜:在最底层进行局部精细搜索,返回最相似的K个结果
整个过程就像开车找路——先上高速(顶层)快速到达城市附近,再下到普通道路(底层)精确找到目的地。
3.3 关键参数与权衡
HNSW有三个核心参数,直接影响速度、精度和内存的平衡:
| 参数 | 作用 | 调大效果 | 调小效果 |
|---|---|---|---|
| M | 每个节点的最大连接数 | 召回率↑,精度↑,但内存↑,构建↓ | 内存↓,速度↑,但召回率↓ |
| efConstruction | 构建时的候选队列长度 | 索引质量↑,但构建时间↑ | 构建速度↑,但索引质量↓ |
| efSearch | 搜索时的候选队列长度 | 召回率↑,但查询延迟↑ | 查询速度↑,但召回率↓ |
【实战经验】:Milvus官方建议M在[5, 100]范围内调优,efConstruction在[50, 500]范围内,efSearch在[K, 10K]范围内(K为返回结果数)。
3.4 优缺点与适用场景
| 优点 | 缺点 | 适用场景 |
|---|---|---|
| 查询复杂度O(log N),亿级数据毫秒响应 | 内存占用高(全量数据需加载到RAM) | 实时推荐系统、高吞吐在线服务 |
| 召回率极高(接近暴力搜索) | 构建时间较长 | 对精度要求高的语义检索 |
| 支持动态插入,无需重建索引 | 删除操作支持不完善 | 数据频繁更新的场景 |
4. LSH:哈希分桶的“智能分类”
4.1 设计动机:用哈希把“相似的”聚到一起
LSH的全称是Locality-Sensitive Hashing(局部敏感哈希)。传统哈希的目标是“不同的输入尽量映射到不同位置”,而LSH恰恰相反——让相似的输入以高概率映射到同一个“桶”(Bucket)里。
它的核心思想可以概括为:“相似的在一起,不相似的各走各的路”。查询时,只需在查询向量命中的桶里搜索,跳过其他所有桶,大幅减少计算量。
4.2 核心原理:随机超平面的“切分游戏”
LSH最常见的实现方式是基于随机投影(Random Projection):
- 生成随机超平面:在向量空间中生成K个随机超平面(随机向量)
- 计算哈希码:对于每个向量,计算它与每个超平面的位置关系(在正侧为1,负侧为0),得到一个K位的二进制哈希码
- 分桶存储:相同哈希码的向量落入同一个哈希桶
当两个向量在空间中距离较近时,它们被这些超平面“切”到同一侧的概率更高,因此哈希码相同的概率也更高。
为了提高召回率,LSH通常会构建L张独立的哈希表(每张表使用不同的随机超平面组)。查询时,在所有L张表中命中同一个桶的候选集合并去重,再进行精细距离计算。
4.3 优缺点与适用场景
| 优点 | 缺点 | 适用场景 |
|---|---|---|
| 查询复杂度接近O(1),极快 | 需多张表(L)和长哈希码(K)保证精度,内存占用高 | 对延迟极度敏感的场景(如实时推荐) |
| 支持动态插入,更新高效 | 精度相对HNSW较低 | 动态数据集 |
| 实现简单,理论成熟 | 参数调优需要经验 | 高维数据的快速初筛 |
5. PQ:向量压缩的“极致瘦身”
5.1 设计动机:让万亿向量也能装进内存
PQ的全称是Product Quantization(乘积量化)。它解决的不是“检索速度”,而是**“内存容量”**问题——HNSW再快,如果向量太大装不进内存,也跑不起来。
一个768维的float向量占768×4=3072字节。1亿条这样的向量需要约300GB内存。PQ的目标就是把这个数字压缩几十甚至几百倍。
5.2 核心原理:拆碎了分别“编字典”
PQ的压缩过程分为三步:
第一步:拆分子向量
将一个高维向量切成m个等长的子向量。例如,768维切成m=8段,每段96维。
第二步:对每段独立聚类
对每一段子向量,用K-Means聚类生成k个“中心点”(即码本/Codebook)。通常k=256(即8位索引)。这就像为每一段编一本“字典”,256个词条代表这段空间中最典型的模式。
第三步:用索引替代浮点数
对于原始向量的每一段,找到该段在码本中最近的中心点,只存储这个中心点的索引编号(8位)。最终,原始的768个浮点数被压缩为8个索引号(8×8=64位)。
压缩效果示例:128维向量,float32占4096位;PQ压缩后(m=64, nbits=8)仅占512位,压缩8倍。高维场景下,压缩比可达256:1。
5.3 距离计算如何加速?——查表法
PQ的妙处不止在压缩,还在于距离计算的加速。查询时:
- 把查询向量也切成m段
- 对每一段,提前计算查询子向量与该段码本中所有256个中心点的距离,生成一张“距离查找表”
- 对于库中的任意向量,只需查表、累加m个距离值,即可得到近似距离——避免了解压缩和浮点乘法的开销
5.4 PQ的局限性
- 精度损失:量化本质是有损压缩,相似的向量可能因量化误差而被判为不相似
- 训练成本:需要提前在数据上训练K-Means码本,数据量大时训练时间较长
- 通常不单独使用:PQ一般和IVF配合(即IVF_PQ),先用IVF筛选候选簇,再在候选簇内用PQ做距离近似
6. 三类算法横向对比与协同使用
| 对比维度 | HNSW | LSH | PQ |
|---|---|---|---|
| 核心策略 | 图结构导航 | 哈希分桶过滤 | 向量量化压缩 |
| 解决什么问题 | 如何快速找到最近邻 | 如何快速跳过无关数据 | 如何节省内存 |
| 时间复杂度 | O(log N) | O(1)(查桶) | O(N)(需配合IVF) |
| 内存占用 | 高 | 中-高 | 极低 |
| 召回率 | 极高 | 中-高 | 中(需配合精排) |
| 动态更新 | 支持 | 支持 | 需重训练码本 |
| 典型组合 | HNSW | LSH + 多表 | IVF + PQ(IVF_PQ) |
【协同使用】:在实际生产中,三类算法不互斥。例如:
- HNSW + PQ:用PQ压缩向量后再建HNSW图,既节省内存又保持高速
- IVF + PQ:最经典的组合,IVF负责粗筛、PQ负责压缩,被Milvus等数据库广泛采用
7. 选型速查:场景决定算法
| 场景特征 | 推荐算法 | 理由 |
|---|---|---|
| 数据量<10万 | 暴力搜索(FLAT) | 精度100%,不需要近似 |
| 数据量<1亿,追求高召回 | HNSW | 精度最高,但内存消耗大 |
| 数据量>1亿,内存受限 | IVF_PQ | 压缩比极高,可支撑十亿级 |
| 实时推荐,延迟<10ms | HNSW 或 LSH | 两者都支持极速查询 |
| 动态写入频繁 | LSH 或 HNSW | 两者都支持增量插入 |
8. 总结:三句话记住三大算法
HNSW:建一张多层“高速路网”,顶层跳远路、底层走细路,用对数时间找到最近邻。
LSH:用随机超平面把向量“切”成哈希码,相似的切到同一桶,查询只翻桶、不翻全库。
PQ:把向量切成段、每段编字典,用“字典索引号”替代“浮点数”,压缩几十倍,内存压力骤降。
理解了这三句话,你就掌握了向量数据库索引算法的核心精髓。实际应用中,三者常组合使用——HNSW管“找路”,PQ管“瘦身”,LSH管“快速初筛”——共同构建起支撑亿级向量毫秒检索的技术底座。
🌺The End🌺点点关注,收藏不迷路🌺 ⬆ ⬆ 顶部 ⬆ ⬆ |