最近邻搜索 (Nearest Neighbor Search)是指在给定一个查询向量时,从海量数据集中找到与之距离最近(最相似)的向量。精确最近邻需要遍历整个数据集,计算所有向量与查询向量的距离,这在数据量小、维度低时可行,但一旦数据达到百万、亿级且维度高达几百甚至上千,暴力搜索就变得不可行。

1
什么是近似最近邻(ANN)?
近似最近邻(Approximate Nearest Neighbor, ANN) 的核心思想是: 在可接受的精度损失下,大幅提升搜索速度 。也就是说,它找到的可能不是绝对最近的邻居,但通常是“足够近”的,并且搜索时间可以快几个数量级。
类比:
2
ANN算法的基本原理
所有ANN算法都遵循一个通用框架: 构建索引 + 搜索索引 。
1. 构建索引(离线阶段)
对原始数据集进行预处理,建立一种特殊的索引结构。
这个结构可以是树、图、哈希表或量化码本,目的是将相似的向量“聚类”或“链接”在一起,以便在搜索时快速缩小范围。
2. 搜索索引(在线阶段)
给定查询向量,利用索引结构快速定位到候选区域。
在这些候选区域中进行距离计算,返回最相似的K个结果。
3. 核心权衡
ANN算法必须在三个指标间平衡:
3
主流的ANN算法及其原理步骤
1. HNSW(Hierarchical Navigable Small World)—— 基于图的方法
原理 :构建多层图结构,上层图稀疏(长距离跳跃),下层图密集(精细搜索)。搜索时从顶层开始,快速定位到查询点所在区域,然后逐层向下细化。
步骤 :
建图 :
搜索 :
特点 :速度极快,召回率高,但内存占用较大(需存储图结构)。
2. IVF(Inverted File Index)—— 基于聚类的方法
原理 :先对数据集进行聚类(如K-means),将向量分配到不同的簇(Voronoi单元)。搜索时只查询与查询点最近的几个簇内的向量。
步骤 :
建索引 :
搜索 :
特点 :内存效率高,适合超大規模数据,召回率由nprobe控制(nprobe越大越精确,但越慢)。
3. PQ(Product Quantization)—— 基于量化的方法
原理 :将高维向量分解成多个子向量,分别量化,用码本表示,极大压缩向量存储空间,同时支持快速距离计算(通过查表)。
步骤 :
建索引 :
搜索 :
特点 :压缩比极高(内存占用可降低几十倍),适合内存受限的场景,但可能损失一定精度。
4. LSH(Locality-Sensitive Hashing)—— 基于哈希的方法
原理 :设计一组哈希函数,使得相似的向量有更高概率被哈希到同一个桶中。搜索时只需查询查询点所在桶内的向量。
步骤 :
建索引 :
搜索 :
特点 :理论保证强,但实际应用中为了达到高召回率需要很多哈希表,内存和查询时间可能较大。
4
ANN算法对比
算法 | 核心思想 | 速度 | 召回率 | 内存 | 适合场景 |
|---|---|---|---|---|---|
HNSW | 多层图导航 | 5 | 5 | 2 | 需要极高速度和精度的场景(推荐系统、实时搜索) |
IVF | 聚类+倒排 | 4 | 4 | 4 | 超大规模数据,可调节精度与速度 |
PQ | 乘积量化压缩 | 3 | 3 | 5 | 内存严格受限的场景(移动端、嵌入式) |
LSH | 哈希分桶 | 2 | 3 | 2 | 理论保证需求高,但实际已较少单独使用 |
5
ANN算法的适用场景
1. 大规模向量检索
2. 实时推荐系统
3. 重复检测与去重
检测相似图片、新闻、代码片段等,防止重复入库。
4. 异常检测
正常模式向量构建索引,新向量如果离最近邻较远,视为异常。
5. 机器人领域
6
向量数据库选择ANN算法
考虑因素 | 算法倾向 |
|---|---|
数据规模 ≤ 100万 | HNSW 或 IVF(均可) |
数据规模 100万 - 1亿 | IVF-Flat(精度高) 或 IVF-PQ(内存低) |
数据规模 > 1亿 | IVF-PQ 或 分布式索引 |
实时性要求极高(<10ms) | HNSW |
内存有限(如嵌入式设备) | PQ 或 量化类算法 |
需要频繁更新数据 | IVF 类(支持动态增删)优于 HNSW |
在实际工程中,常用组合: