混合检索与重排序
混合检索同时使用关键词检索和向量检索召回候选,再把结果融合;重排序用更精确但更慢的模型对候选重新打分。两者组成 RAG 的“粗召回—精排”结构。本文讲 BM25 与向量检索的互补、RRF 融合、Rerank 模型的原理与 Top-K 截断。
1. 面试核心
先记住这几条,再读正文- BM25 擅长精确匹配专有名词、编号、代码标识符;向量检索擅长同义改写和语义相关。两者召回的错误类型不同,组合后召回率更高。卡 · 关键词检索与向量检索
- 不同检索器的分数尺度不同(BM25 无上界,余弦在 -1 到 1),不能直接相加。RRF 只使用排名:
score(d) = Σ 1 / (k + rank_i(d)),k 常取 60。卡 · 融合 - Rerank 通常是交叉编码器:把查询和文档拼在一起输入模型直接输出相关性分数,比分别编码的 Embedding 更准,但每个候选都要单独计算,只能用于少量候选。卡 · 重排序
- 典型参数:每路召回几十个候选,融合后取前几十个送入 Rerank,最终取前 3–10 个块放入上下文,并可以按分数阈值截断。
2. 关键词检索与向量检索
BM25 是基于词频的排序函数。词在文档中出现越多分数越高,但增长会饱和;词在整个语料中越少见(IDF 越高)权重越大;文档越长,单个词的贡献越小。
| 场景 | BM25 | 向量检索 |
|---|---|---|
| 查询“ERR_CONN_RESET 怎么解决” | 精确命中含该错误码的文档 | 可能召回泛泛讨论网络错误的文档 |
| 查询“怎么请假” | 文档写的是“休假申请流程”时匹配不上 | 能理解语义相近 |
| 产品型号、人名、代码函数名 | 准确 | 不稳定,罕见词向量表示弱 |
| 拼写错误、口语化表达 | 差 | 较好 |
中文 BM25 需要先分词,分词词典中缺少的专有名词要补充。
3. 融合
RRF(Reciprocal Rank Fusion):
score(d) = Σ_i 1 / (k + rank_i(d))
rank_i(d) 是文档 d 在第 i 路结果中的排名(从 1 开始),没有出现在某一路中的文档该项为 0。k 是平滑常数,通常取 60,用来降低排名第一与第二之间的差距,避免某一路的头部结果主导融合结果。
例如 k=60,文档 A 在 BM25 中排第 1、向量中排第 3:1/61 + 1/63 ≈ 0.0323;文档 B 只在向量中排第 1:1/61 ≈ 0.0164。两路都认为相关的 A 排在前面。
不直接把分数相加的原因:BM25 分数没有固定范围,随查询长度和语料变化;向量相似度集中在很窄的区间。直接相加时,尺度大的那一路会主导结果。也可以先把分数归一化(如 min-max)再加权求和,但权重需要在评测集上调,而且归一化对异常值敏感。RRF 不需要调权重,是默认首选。
4. 重排序
| 对比 | Embedding(双编码器) | Rerank(交叉编码器) |
|---|---|---|
| 输入 | 查询和文档分别编码 | 查询和文档拼接后一起编码 |
| 输出 | 两个向量,再算相似度 | 一个相关性分数 |
| 能否预计算 | 文档向量离线算好 | 必须在查询时对每个候选计算 |
| 精度 | 较低,查询与文档之间没有逐词交互 | 较高,注意力可以在查询和文档之间交互 |
| 适用 | 从百万级文档中召回 | 对几十到上百个候选精排 |
Rerank 放在召回融合之后、组装上下文之前。也可以用大模型做重排,精度更高但延迟和成本更大。
Top-K 截断:Rerank 后取多少个块,取决于问题类型和上下文预算。常见做法是固定取前 N 个,再加分数阈值,低于阈值的丢弃,全部低于阈值时进入“未找到相关资料”的回答。阈值要在评测集上确定。
降级:Rerank 服务超时或不可用时,退回融合排名直接截断,保证可用性,并记录降级比例。
5 · 面试题卡片
5.1 BM25 和向量检索有什么区别?为什么需要多路召回?
出现公司:字节跳动、虾皮、快手、ZS、蚂蚁
考察重点
- 词频匹配与语义匹配各自的优势和失败场景。
- 多路召回的互补原理。
相关内容:关键词检索与向量检索。
参考回答
BM25 按词频和逆文档频率打分,适合精确匹配错误码、产品型号、函数名等专有名词,但无法理解同义表达。向量检索按语义相似度召回,能处理同义改写和口语化查询,但对罕见词和精确编号不敏感。
两者的错误类型不同:查询包含专有名词时向量检索可能漏掉,查询换了说法时 BM25 可能漏掉。多路召回把各自的候选合并,提高召回率,再通过融合和重排保证精度。中文 BM25 要先分词,并补充业务专有名词词典。
5.2 多路召回结果如何融合?RRF 怎么计算?为什么不直接把分数相加?
出现公司:药明康德
考察重点
- 分数尺度不一致的问题。
- RRF 公式与 k 的作用,加权融合的调参成本。
相关内容:融合。
参考回答
不同检索器的分数尺度不同:BM25 没有固定上界,并随查询和语料变化;向量相似度集中在很窄的区间。直接相加时尺度大的一路会主导结果。
RRF 只用排名:每个文档的融合分数是它在各路结果中 1/(k + rank) 的和,没出现的路记 0,k 通常取 60,用来减小头部排名之间的差距。在多路中都排名靠前的文档得分最高,而且不需要调权重。也可以先归一化分数再加权求和,但权重要在评测集上调,归一化还容易受异常值影响,所以 RRF 是默认首选。
5.3 Rerank 模型的原理是什么?和 Embedding 模型有什么区别?放在哪个阶段?
出现公司:阿里云、虾皮、快手、字节跳动、浪潮
考察重点
- 双编码器与交叉编码器的结构差异。
- 粗召回—精排的分工、Top-K 截断和降级。
相关内容:重排序。
参考回答
Embedding 是双编码器:查询和文档分别编码成向量,文档向量可以离线算好,适合从海量数据中快速召回,但查询和文档之间没有逐词交互,精度有限。Rerank 一般是交叉编码器:把查询和文档拼接后一起输入,直接输出相关性分数,注意力能在两者之间交互,所以更准,但每个候选都要在查询时计算,只能处理几十到上百个候选。
因此 Rerank 放在多路召回融合之后、组装上下文之前。重排后取前几个块,并设置分数阈值,全部低于阈值时回答未找到资料;数量和阈值通过评测确定。Rerank 服务异常时降级为按融合排名截断。