向量检索中的 ANN(Approximate Nearest Neighbor)技术是一种在高维空间中高效查找与查询向量 q 最相似的 Top-K 个向量的方法,其核心在于牺牲一定的精度(召回率)以换取比精确最近邻搜索(Exact NN)高数个数量级的查询速度。它广泛应用于图像/视频检索、自然语言处理(如语义搜索、问答)、推荐系统、生物信息学等场景。
⸻
一、 基本问题定义
- 目标: 给定一个查询向量
q
,在一个庞大的向量集合{v_1, v_2, ..., v_n}
(通常 n 在百万到十亿甚至万亿级)中,快速找到与q
最相似的前K
个向量(K-nearest neighbors, KNN)。 - 相似性度量 (距离度量): 向量相似性通过距离函数来衡量,常用:
- 欧氏距离 (L2):
dist(q, v) = || q - v ||_2
。两点间的直线距离。适用于需要物理距离的场景(如图像特征),计算前通常需要对向量进行L2归一化以确保结果与内积/余弦相似度一致。 - 内积 (Dot Product):
sim(q, v) = q^T * v
。数值越大越相似。常见于深度学习模型输出的 Embedding(需归一化)。 - 余弦相似度 (Cosine Similarity):
cos(q, v) = (q^T * v) / (||q|| * ||v||)
。衡量向量方向的夹角,忽略向量长度(模)。本质是内积在 L2归一化后的特例 (||q|| = ||v|| = 1
时,cos = q^T * v
),广泛用于文本、语义相似度。在向量索引构建前进行归一化是标准操作。
- 欧氏距离 (L2):
⸻
二、 ANN 的核心技术原理与分类
由于精确最近邻(Exact NN)算法(如线性扫描、KD树在高维失效)在维度 > 100 时检索速度急剧下降(“维度灾难”),ANN 采用各种近似策略规避精确计算的复杂度。主流方法可分为:
1. 空间划分法
- 核心思想: 将整个高维向量空间划分为多个子区域(簇)。检索时只搜索查询向量
q
最可能属于的少数几个区域。 - 代表算法:
- IVF (Inverted File Index, 倒排索引):
- 构建: 使用聚类算法(如 K-Means)将所有数据向量划分到
N
个簇(或叫 Voronoi 单元),每个簇维护一个属于它的向量列表(倒排列表)。 - 查询: 计算
q
到所有簇中心(质心)的距离,选出距离最近的nprobe
个簇,然后仅在选出的nprobe
个簇的倒排列表内进行精确搜索(或与其他技术结合)。 - 优点: 大幅减少参与精确比较的向量数量 (
nprobe * (N / 平均簇大小)
),速度提升巨大。 - 缺点: 存在“边缘问题”——靠近多个簇边界的目标向量可能因为
nprobe
设置不足而丢失(召回率下降)。nprobe
越大,召回率越高,速度越慢。构建索引需要聚类时间。
- 构建: 使用聚类算法(如 K-Means)将所有数据向量划分到
- 树结构 (KD-Tree, Annoy, Ball-Tree): 递归地使用超平面对空间进行划分形成树状结构。在高维数据上效果不如IVF和HNSW/PQ等主流方法,常用于低维或作为混合索引的组件。
- 随机投影树 (Annoy): 使用随机选择的超平面分割空间构建多棵树,检索时遍历树并合并叶子节点结果。是树结构中在高维表现相对较好的一种。
- IVF (Inverted File Index, 倒排索引):
- 为什么高效? 仅计算
q
到少量簇中心/超平面的距离,大幅过滤掉了不相关的向量。
2. 量化法 (Quantization)
- 核心思想: 不直接存储和计算原始高维向量,而是将其压缩(编码)成低维度的码字,在压缩空间中进行近似距离计算。
- 代表算法:
- PQ (Product Quantization, 乘积量化):
- 构建: 将高维向量 (D维) 分割成
M
个子向量(每个D/M
维)。对每个子空间独立进行K
-means 聚类,得到M
个码本(每个码本含K
个聚类中心/码字)。一个原始向量由其每个子向量最近的中心索引(一个M
维的整数向量)表示(即编码)。 - 查询 (ADC - Asymmetric Distance Computation): 将查询向量
q
同样分割成M
个子向量。查询向量用原始子向量,数据库向量用其码字表示。 预先计算q
的每个子向量到对应码本中所有K
个中心的距离(M x K
大小的表)。计算q
到某个数据库向量的距离时,只需查表获取对应子空间的M
个距离 (q
的子向量到该数据库向量对应码本中心的距离),然后将这M
个距离累加即可。避免了直接计算高维向量距离。 - 优点: 内存占用极低(一个向量仅存
M
个整数索引,每个索引约需log2(K)
bits,压缩率可达32倍或更高)。查表累加快(尤其适合 SIMD/GPU)。 - 缺点: 引入了量化误差(用聚类中心代表原始子向量)。
- 变种:
IVF-PQ
(PQ 应用在 IVF 的每个簇内残差向量上),OPQ
(Optimized PQ,先对向量空间进行旋转优化,使子空间更独立,降低量化误差)。
- 构建: 将高维向量 (D维) 分割成
- PQ (Product Quantization, 乘积量化):
- 为什么高效? 显著减少内存占用和存储/传输成本;关键的距离计算简化为查表和累加,效率极高。
3. 图索引法 (Graph-based Index)
- 核心思想: 构建一个近邻图(每个向量是一个节点,节点间有边连接其近邻)。查询时从入口点出发,通过“导航”图结构(沿着连接邻居的边)逐步靠近目标。
- 代表算法:
- HNSW (Hierarchical Navigable Small World):
- 构建: 构建一个多层图。底层包含所有向量节点,边连接其近邻。上层是下层的稀疏“概览”。插入节点时随机分配一个最高层(指数衰减),然后从该层向下逐层插入,并建立该层内的近邻连接。
- 查询: 从顶层(稀疏)的入口点开始,在当前层以贪心算法查找
q
最近邻。找到后,下降到下一层(更密集),以上一层的最近邻为起点继续搜索。如此迭代,直到最底层,找到最近邻。 - 优点: 查询速度极快(尤其在精确度高要求下),召回率非常高(常可达 99%+),是目前 SOTA 之一。支持增量插入(动态更新)。
- 缺点: 构建索引时间长(需要精确计算大量邻居),内存占用高(存储图和邻居指针)。对内存带宽敏感。
- NSG (Navigating Spreading-out Graph): 构建更规则、度可控的近邻图,旨在优化图结构以减少冗余计算,通常在内存占用或查询延迟上有轻微优势,但构建更慢,动态更新支持不如 HNSW。
- HNSW (Hierarchical Navigable Small World):
- 为什么高效? 利用了“小世界网络”的特性(平均路径短),能快速导航到目标区域。尤其是 HNSW 的分层结构加速了全局探索。
4. 局部敏感哈希 (Locality-Sensitive Hashing, LSH)
- 核心思想: 设计一组哈希函数,使得相似的向量经过散列后更可能被映射到相同的哈希桶(或邻近桶)中。
- 原理: 选择对特定距离度量敏感的哈希函数族。例如,对余弦相似度常用随机投影哈希:生成一组随机向量,计算
q
与每个向量的点积,根据点积结果的正负将q
映射到一个二进制哈希值(位串)。相似向量的哈希值在汉明距离上相近。 - 查询: 计算
q
的哈希值,检查其所在桶(及邻近桶)中的向量作为候选者,然后在候选者中进行精确(或精细)搜索。 - 优点: 构建相对简单,查询在哈希表上快。对超高维数据仍有效(在某些场景下是优势)。内存占用中等(主要存储哈希表和桶)。
- 缺点: 为了达到高召回率,通常需要构建多组(
L
套)哈希表(多表索引),增加了内存消耗和查询时多表访问的开销。在精度要求非常高(>95%)或数据分布复杂时,达到同等召回率往往比 IVF/PQ 或 HNSW 需要更多的资源和时间开销。 哈希函数选择和参数(哈希长度k
、表数量L
)调优对性能影响大。
5. 混合方法
- 核心思想: 组合多种技术,取长补短。
- 代表方案:
- FAISS (IVF + PQ):
IVF-Flat
(IVF 空间划分 + 簇内原始向量精确搜索),IVF-PQ
(IVF + PQ 压缩簇内残差向量)。是工业界大规模检索最常见、高效的组合。 - HNSW 与量化结合 (如 HNSW + PQ): 用 PQ 压缩存储图节点中的向量(减少内存),在搜索时对召回后的候选集进行 Refinement (通过查表或解码部分数据)。
- FAISS 中的多种组合: 还支持
IndexHNSWFlat
(HNSW 索引全精度向量),IndexHNSWSQ
(HNSW + Scalar Quantization),IndexIVFScalarQuantizer
(IVF + SQ) 等。
- FAISS (IVF + PQ):
- 为什么高效? 结合空间划分的快速过滤、量化的小内存消耗、图索引的高精度导航等优势。
⸻
三、 ANN 系统典型流程
- 向量入库 / 索引构建阶段:
- 向量提取: 从原始数据(文本、图片等)通过模型(如 BERT, ResNet)提取特征向量。
- 预处理: 标准化(如 L2 归一化、中心化缩放)。
- 索引构建: 根据选择的算法(IVF、PQ、HNSW 等),执行聚类、训练码本、构图等操作,创建优化的索引结构。
- 查询阶段:
- 输入查询向量: 对查询对象(如一段文本、一张图片)进行相同的特征提取和预处理。
- 执行 ANN 检索: 根据索引类型,执行相应搜索算法(如 IVF 的选簇+计算、HNSW 的图导航、PQ 的查表计算等),返回一组候选近邻及其距离(或相似度)。
- 可选 Refinement: 如果索引使用了压缩(如 PQ),可能对召回的前 Top-K 个 ID 对应的向量(或向量更精细的表示)进行精确距离计算并重排序。
- 返回结果: 输出最终的 Top-K 个近邻向量 ID 及其相似度(或距离)。
⸻
四、 主流向量检索库与适用场景
库名 | 核心技术与特点 | 适用场景 |
---|---|---|
FAISS | **IVF , PQ , HNSW ** 及组合 (CPU/GPU), 优化极致 | 海量向量 (百亿+),资源(尤其内存)敏感场景,需灵活调整。主流首选之一。 |
Annoy | 随机投影树, 简单轻量 | 中小规模数据量 (数百万级),简单部署,需要快速原型或资源极其有限(如嵌入式)。 **hnswlib 或 faiss 通常更优。** |
hnswlib | 纯 HNSW 实现,轻量级,高效 | 需要 HNSW 高精度、低延迟查询,数据规模中等 (千万-亿级),内存相对充足。 |
Milvus / Zilliz Cloud | FAISS/HNSW/IVF-PQ/SCANN/Cagra/... + 分布式引擎,支持多节点、数据管理、多客户端、丰富API | 企业级应用,需要 分布式扩展性、数据持久化、实时更新、API接口、多租户等功能。支持超大规模 (万亿级)。 |
scaNN (Google) | **Anisotropic Vector Quantization ** 等先进量化技术 (CPU/GPU) | 追求在压缩率和精度之间达到极佳平衡的大规模向量检索,Google内部产品应用广泛,开源版本亦强大。 |
RAFT (NVIDIA RAPIDS) | GPU 优化 IVF-PQ , Cagra (GPU 图索引) | 需要极致 GPU 加速性能 的场景,十亿级向量上的毫秒级响应。 |
NMSLIB (Non-Metric Space Library) | **HNSW , SW-graph (NSW)** 等,API多样,算法较新 | 需要最新图算法实现或特定距离度量的研究、实验场景。 |
QDrant | 类似 Milvus 的向量数据库,HNSW , Product Quantization ,内存映射 | 轻量级向量数据库,易于部署和管理,适合中小型项目。 |
Pinecone | SaaS 向量数据库,集成主流算法,易用性高 | 快速构建应用,无需管理底层基础设施。 |
(注:Cagra
是NVIDIA基于图索引优化的GPU高效检索算法)
⸻
五、 总结对比 (主要特征趋势)
方法 / 特性 | 查询精度 (召回率) | 查询速度 | 索引构建时间 | 内存/存储占用 | 动态更新 | 适用场景关键词 |
---|---|---|---|---|---|---|
LSH | 低 - 中 | 快 (依赖于桶大小) | 快 | 中 | 较难 | 超大维、内存尚可、精度要求中等、离线 |
空间划分 (IVF) | 中 - 高 (依赖nprobe) | 非常快 | 中 (聚类时间) | 中 (原始向量/索引) | 较难 (重建簇) | 海量数据、内存敏感、速度优先、常用基础组件 |
量化 (PQ/OPQ) | 中 - 高 (依赖精度) | 快 (查表+累加) | 中 (训练码本) | 低 (压缩优势) | 难 (重训练?) | 海量数据、内存极其敏感、成本敏感 |
图索引 (HNSW) | 非常高 (SOTA) | 非常快 (SOTA) | 慢 (构图) | 高 (图+向量) | 支持 (好) | 精度与速度要求都极高、内存充足、低延迟在线服务 |
混合方法 (IVF-PQ) | 高 | 非常快 | 中-慢 | 低-中 (PQ优势) | 较难 | 工业界主流,海量+内存敏感+高速度+较好精度 |
混合方法 (HNSW+PQ) | 高 | 快 (需refine?) | 慢 | 中 (图+压缩) | 支持 (好) | 需要 HNSW 精度但内存受限 |
GPU加速方法 (Cagra, RAFT) | 非常高 | 极快 (GPU) | 中-快 (GPU辅助) | 高 (GPU显存) | 支持 | 十亿/万亿级实时检索、毫秒级延迟 |
重要说明:
- “召回率”通常比“精度”更常用:衡量找到真实 Top-K 近邻的比例。表格中的“精度”更准确应指“召回率潜力”。实践中可通过参数(如
nprobe
,efSearch
)在召回率和速度/资源间做权衡。- 比较基于典型场景和合理配置: 不同库的实现、参数配置、硬件环境会对性能产生显著影响。例如,优化好的 IVFPQ 在 GPU 上的速度远快于 CPU 上的 HNSW。HNSWlib 通常比 NMSLIB 中的 HNSW 实现更优。
- 内存占用复杂: IVF 存储原始向量+索引开销;PQ 主要是码本+压缩码字存储;HNSW 存储原始向量+图的邻居指针(邻居列表大小是主要开销);混合方法内存介于各基础方法之间。
- 动态更新: HNSW 原生支持增量插入是它一大优势。IVF 更新通常需要部分或全部重建集群。PQ 在向量分布显著变化后可能需要重训练码本。