为什么不能暴力、召回率定义与代价、树/哈希/量化/图四大类方法对比,以及工业界现状。
精确 k-NN 在数据量大、维度高时只能暴力扫描全部 N 个向量,耗时 ∝ N。当 N=1 亿、d=768,单次查询要算 768 亿次乘加,十几秒——无法服务在线请求。于是退一步:允许召回略有损失,换取几个数量级的加速,这就是近似最近邻(Approximate Nearest Neighbor, ANN)。
比如真实最近 10 个里,算法只找回 9 个,Recall@10 = 0.9。召回率越高,越接近暴力结果,但通常意味着要访问更多候选、更慢、更占内存。
KD-tree / Ball-tree:按维度递归划分空间。低维(<20 维)高效,但高维时"维度灾难"下退化成近似暴力,实际用得少。
局部敏感哈希:用随机超平面把相似向量以高概率分进同一桶,桶内再精排。有理论保证,但高维下内存大、召回不稳。详见《LSH 局部敏感哈希》。
乘积量化(PQ)把向量压缩成几十字节,检索时在压缩域算距离。内存极低,适合十亿级。IVF-PQ 是其代表。详见《IVF+PQ》。
HNSW / NSG:把向量建成"可导航小世界"图,查询沿边贪心逼近最近邻。当前工业界主流——高召回、低延迟。详见《HNSW》。
| 方法 | 高维适应性 | 召回 | 延迟 | 内存 | 动态写入 |
|---|---|---|---|---|---|
| 树(KD) | 差 | 高 | 中 | 低 | 难 |
| LSH | 中 | 中 | 中 | 高 | 易 |
| IVF-PQ | 好 | 中高 | 低-中 | 极低 | 中 |
| HNSW | 好 | 高 | 低 | 高 | 中(删难) |