向量检索全链路:距离度量、搜索算法与结果重排
在大模型时代,向量检索已成为 RAG(检索增强生成)、推荐系统、图像检索等场景的核心基础设施。无论是 RAG 中“先检索再生成”的关键环节,还是推荐系统中“找相似用户/物品”的核心逻辑,向量检索的性能(速度、精度)直接决定了上层应用的体验——它负责将高维向量(文本、图像、音频的特征表示)快速匹配,从海量数据中找到最相关的结果,是连接原始数据与 AI 模型的“桥梁”。
本文面向后端、AI 及 RAG 开发者,拆解向量检索全链路的三大核心模块:距离度量(怎么判断“相似”)、ANN 搜索算法(怎么快速找相似)、结果重排(怎么让结果更有用),兼顾理论严谨性与工业界实用性,可直接用于技术分享或开发参考。
一、距离度量:相似性的“打分标准”
向量检索的核心是“判断两个向量的相似性”,而距离度量就是这个判断的“打分公式”——不同的公式适用于不同的向量特征(如归一化向量、稠密向量),选对度量方式是检索准确的前提。以下是工业界最常用的 3 种距离度量方式,重点区分适用场景与核心差异。
1. 余弦相似度(Cosine Similarity)
定义: 衡量两个向量的夹角大小,取值范围 [-1, 1],夹角越小,相似度越高(1 表示完全同向,-1 表示完全反向)。
公式:
其中:
- 是向量内积
- 、是向量的 L2 范数(模长)
适用场景:
文本向量(如 BERT embedding)、图像特征向量等,核心关注“方向相似”而非“长度相似”。例如 RAG 中,用户 query 向量与文档向量的余弦相似度,可直接反映内容相关性;归一化后的向量(模长为 1),余弦相似度等价于内积,计算效率更高。
2. L2 距离(欧氏距离,Euclidean Distance)
定义: 衡量两个向量在高维空间中的直线距离,取值范围 [0, +∞),距离越小,相似度越高。
公式:
n 为向量维度。
适用场景:
未归一化的向量、关注“绝对差异”的场景,如用户行为向量(点击、停留时长)、图像像素特征。注意:L2 距离对向量模长敏感,若向量模长差异较大(如有的文档向量模长是 1,有的是 100),会优先被模长影响,需先归一化再使用。
3. 内积(Inner Product)
定义: 两个向量对应元素乘积的和,取值范围 (-∞, +∞),内积越大,相似度越高(归一化后等价于余弦相似度)。
公式:
适用场景:
已归一化的向量场景(如 Transformer 输出的 embedding 默认归一化),计算效率比余弦相似度高(少了模长计算步骤),是工业界 RAG、推荐系统的常用选择。
三者核心区别
| 度量方式 | 核心特点 | 适用场景 | 注意事项 |
|---|---|---|---|
| 余弦相似度 | 关注方向,与模长无关 | 文本向量、归一化特征 | 未归一化时需计算模长,效率略低 |
| L2 距离 | 关注绝对距离,受模长影响大 | 未归一化向量、行为特征 | 需先归一化,否则结果偏差大 |
| 内积 | 计算高效,归一化后等价余弦 | 归一化向量、高并发场景 | 未归一化时,模长会主导结果 |
二、主流 ANN 搜索算法:快速找到相似向量
当向量库规模达到百万、千万级时,暴力搜索(遍历所有向量计算距离)的效率极低(时间复杂度 O(n)),无法满足工业界低延迟需求。ANN(Approximate Nearest Neighbor,近似最近邻)算法通过“牺牲少量精度”换取“毫秒级检索速度”,是向量检索的核心实现方式。以下重点讲解工业界最常用的两种算法及选型逻辑。
1. HNSW:分层可导航小世界,分层图检索,兼顾速度与精度
核心原理:
基于“分层图”结构,将向量构建成多层导航网络——底层是所有向量的完整图(每个向量连接相似向量),上层是底层的“缩略图”(仅保留部分核心向量)。检索时,从最上层开始,快速导航到最接近目标向量的节点,再逐层下沉,最终找到近似最近邻。
核心优势:
- 检索速度极快(毫秒级)
- 精度接近暴力搜索
- 支持动态插入/删除向量
- 适配实时更新场景(如 RAG 文档增量更新)
缺点:
- 内存占用较高(需存储图结构和向量)
- 构建索引时间较长(尤其是向量规模极大时)
适用规模:
百万到亿级向量,适合对检索延迟敏感、精度要求高的场景(如 RAG 对话系统、实时推荐)。
2. IVF / IVF-PQ:分桶 + 量化,平衡内存与速度
IVF(Inverted File,倒排文件)
核心原理:
- 将所有向量通过聚类算法(如 K-Means)分成 K 个“桶”(聚类中心)
- 检索时先找到目标向量最接近的几个桶,再在桶内暴力搜索
- 时间复杂度降至 O(K + n/K)
IVF-PQ(Product Quantization,乘积量化)
在 IVF 基础上:
- 将每个向量量化成短码(如将 128 维向量量化成 16 字节)
- 存储的是量化后的短码而非原始向量
- 内存占用可降低 8–16 倍
具体实现步骤(工业界标准流程,适配后端/AI开发者落地)如下:
- 向量分块:将高维向量拆分为多个相互独立的子向量(如128维向量拆分为16个8维子向量),子向量的数量与最终短码的字节数一致(16个子向量对应16字节短码);
- 聚类生成码本:对所有向量的同位置子向量,分别用K-Means聚类(如每个8维子向量聚成256类),每个聚类中心对应一个“码元”(8位,即1字节),所有子向量的码元集合构成“码本”;
- 子向量量化编码:将每个向量的每个子向量,替换为其最接近的聚类中心对应的码元(1字节),16个子向量对应16个码元,拼接后形成16字节的短码;
- 检索时解码匹配:查询向量同样按上述步骤生成短码,先通过IVF找到目标桶,再计算查询短码与桶内所有短码的“码元距离”(如汉明距离、L2距离),快速筛选出近似相似的向量。 核心逻辑:用“聚类中心的码元”替代原始子向量,通过牺牲少量量化精度,换取内存占用的大幅降低(128维float32向量占512字节,16字节短码可降低32倍内存)。
核心优势:
- 内存占用极低(适合大规模向量存储)
- 索引构建速度快
- 支持亿级以上向量检索
缺点:
- 精度比 HNSW 略低(量化会损失信息)
- 动态插入/删除向量时需重新聚类,实时性较差
适用规模:
亿级到十亿级向量,适合对内存敏感、精度要求可容忍轻微损失的场景(如大规模图像检索、离线推荐)。
HNSW vs IVF-PQ:工业界选型指南
| 对比维度 | HNSW | IVF-PQ |
|---|---|---|
| 检索速度 | 极快(毫秒级,适合实时) | 较快(亚毫秒到毫秒级) |
| 检索精度 | 高(接近暴力搜索) | 中(量化有精度损失) |
| 内存占用 | 高(存储原始向量+图结构) | 低(存储量化短码) |
| 动态更新 | 支持(插入/删除高效) | 支持差(需重新聚类) |
| 适用场景 | RAG 实时检索、实时推荐(百万-亿级) | 大规模离线检索、图像检索(亿级+) |
选型建议:
优先看“实时性”和“内存”—— RAG 对话、实时推荐等低延迟场景选 HNSW; 大规模离线检索、内存有限场景选 IVF-PQ; 若需平衡,可选用 IVF-HNSW(IVF 分桶 + HNSW 桶内检索)。
三、MMR:结果重排,平衡相关性与多样性
很多开发者会混淆“搜索算法”与“结果重排”—— MMR(Maximum Marginal Relevance,最大边际相关性)不是距离度量,也不是检索算法,而是检索后的结果重排策略。
1. 核心痛点:为什么需要重排?
ANN 检索的结果是“与 query 最相似”的向量,但这些结果往往存在高度重复(如多个文档讨论同一细分话题),导致信息覆盖不全。
例如 RAG 中,用户 query 是“向量检索的应用场景”,检索结果可能全是 RAG 相关,忽略推荐、图像检索等场景,此时需要重排来平衡“相关性”和“多样性”。
2. MMR 核心原理与公式
参数说明:
- :待选文档向量
- :用户 query 向量
- :已选中的文档集合
- :权重系数(0 ≤ λ ≤ 1)
- :相似度(常用余弦相似度)
3. MMR 在 RAG 中的应用
典型流程:
- 用 ANN 算法(如 HNSW)检索出 Top N(如 Top 50);
- 用 MMR 重排,设置 λ = 0.7;
- 将重排后的 Top K(如 Top 5)输入大模型生成回复。
优势:
- 避免回复重复、片面
- 提升信息覆盖
- 提升生成质量
四、全链路总结与选型建议
1. 向量检索完整流程
- 向量生成:原始数据 → 模型(BERT、CLIP) → 向量
- 距离度量:定义“相似”标准
- ANN 检索:HNSW / IVF-PQ
- 结果重排:MMR 等策略
2. 工业界选型总结
- 距离度量:文本向量(归一化)→ 内积/余弦;未归一化 → L2
- ANN 算法:实时场景 → HNSW;大规模离线 → IVF-PQ
- 结果重排:RAG/推荐 → MMR(λ 0.6–0.8);精准搜索 → 可不启用