混合检索与重排序
混合检索同时用关键词检索和向量检索寻找候选,再把多路结果合并排序。重排序(Rerank)则让模型结合当前问题,为这些候选重新打分。两者组成先广泛召回、再精细排序的处理流程。
本文先说明 BM25 与向量检索各擅长什么,再介绍 RRF 排名融合和重排模型。最后讨论候选数量、上下文截断,以及重排服务异常时的处理。
1. 面试核心
先记住这几条,再读正文- 多路召回。 BM25 根据词项统计匹配错误码、型号等文本,向量检索利用语义表示匹配同义改写,两者能补充不同的候选。卡 · 关键词检索与向量检索
- 排名融合。 RRF 将文档在各路的排名按
Σ 1 / (k + rank)累加,减少原始分数尺度不同带来的影响。卡 · 融合 - 重排序。 交叉编码器把查询与文档一起输入模型,让两者的 Token 相互影响,再为每个候选计算相关性分数。卡 · 重排序
- 候选范围。 重排只处理已经召回的候选,检索遗漏的证据需要通过补充检索找回。卡 · 候选预算与证据覆盖
2. 关键词检索与向量检索
同一个问题换一种说法,适合它的检索方式也会变化。关键词检索依靠查询与文档中的词项重合,向量检索则比较模型学到的语义表示。词项是文本经过分词等处理后,用于匹配的单位。
BM25 是一种基于词项统计的排序函数,它综合以下三项因素:
- 词频:查询词在文档中出现越多,相关得分越高。但增益会逐渐饱和,避免重复堆词持续推高分数。
- 逆文档频率(IDF):包含某个词的文档越少,这个词的区分能力越强,权重也越高。
- 文档长度:长文档更容易多次包含同一个词。长度归一化会减轻这种优势,让不同长度的文档更便于比较。
下表对比常见查询,以及两种检索方式能补充的候选:
| 查询特点 | 词项检索的作用 | 向量检索的作用 |
|---|---|---|
| 错误码、型号 | 匹配保留的精确词项 | 补充相关描述。 |
| 同义表达 | 依赖词项重合或扩展 | 匹配语义改写。 |
| 专业缩写 | 依赖分词和词典 | 依赖模型的领域表示。 |
| “ERR_CONN_RESET 怎么解决” | 错误码作为完整词项保留时,能命中包含它的文档。 | 容易找到网络错误的相关说明,但要检查是否对应同一错误码。 |
| “怎么请假”与“休假申请流程” | 缺少共同词项时,需要同义词扩展等处理。 | 语义表示有助于把两种说法匹配起来。 |
| 产品型号、人名、代码函数名 | 完整保留名称有助于匹配指定对象。 | 罕见名称的表示不足时,会混淆相近对象。 |
| 拼写错误、口语化表达 | 依赖纠错、词典或查询扩展。 | 可覆盖模型学过的近似表达,效果要用实际错误样本检查。 |
精确匹配也依赖正确的分析器,也就是执行分词等文本处理的组件。错误码被拆散后,BM25 同样会漏掉目标文档。中文分词、同义词和业务词典应单独测试,并补充缺少的专有名词。要求编号完全一致时,可使用保留原值的 keyword 字段查询。
两种检索方式遗漏的文档不同,所以取多路候选的并集能补充证据。不过,最终保留的数量有限,融合时仍会淘汰部分结果。因此,混合检索的净收益要在业务问题集上验证。
3. 融合
融合要把多路结果放进同一个排序,但原始分数的含义和范围不同。RRF(Reciprocal Rank Fusion,倒数排名融合)只使用排名,减少分数尺度差异的影响。
score(d) = Σ_i 1 / (k + rank_i(d))
其中,rank_i(d) 表示文档 d 在第 i 路结果中的名次,从 1 开始。文档未出现在某一路时,该路贡献为零。平滑常数 k 越大,相邻名次的贡献越接近,也就越弱化单路头部名次的优势。这里的小写 k 与召回数量 K 是两个参数。
k 可以从常用的 60 开始评测。比如,A 在两路分别排名第 1 和第 3,得分为 1/61 + 1/63 ≈ 0.0323。B 仅在一路排名第 1,得分为 1/61 ≈ 0.0164。本例中,两路都认为相关的 A 排在前面。
BM25 分数没有跨查询统一的固定上界,会随查询和语料变化。原始余弦相似度则在 -1 到 1 之间,实际候选的分数还会集中在较窄区间。直接相加时,数值较大的一路就容易主导结果。
另一种融合方式是先归一化分数,再按权重相加。比如,min-max 归一化把当前分数按最小值与最大值缩放到同一范围。极端分数会影响这个范围,所以它对异常值敏感,权重也要用评测集校准。RRF 省去了原始分数校准,可以作为融合的起始基线。各路候选窗口和 k 仍需选择,候选窗口就是参与融合的前若干条结果。
融合时还要统一文档或块 ID,合并多路命中的同一条记录。相同正文若在索引中保存了多次,也要结合版本和内容标识去重。否则,重复候选会占掉后续重排和上下文的名额。
4. 重排序
粗召回需要快速筛选大量文档,重排则要细看问题与候选是否相关。两者采用不同的编码方式,可以把在线计算集中在较少的候选上。
| 机制 | 编码方式 | 计算位置 |
|---|---|---|
| 双编码器 | 查询和文档分别编码 | 文档向量可离线计算。 |
| 交叉编码器 | 查询与候选联合输入 | 每次查询重新评分。 |
双编码器分别输出查询向量与文档向量,再计算相似度。文档向量能提前算好,适合从百万级文档中检索候选。分别编码时,文档的表示与当前问题无关,也就缺少两者在 Token 层面的直接交互。
交叉编码器把查询与候选拼接后一起输入,直接输出相关性分数。注意力机制可以同时读取问题和文档中的词,帮助模型判断局部内容是否回答了问题。代价是每个查询都要重新计算每个候选,所以更适合几十到上百个候选的精排。
重排放在融合之后、上下文组装之前,用有限候选的在线计算换取更细的相关性判断。实际精度仍取决于模型和任务。也可以用大模型重排,但需要独立比较收益、延迟和费用。
重排模型也有输入长度上限。输入过长时,应拆分文档或选取相关段落;直接截断若丢掉关键证据,就会影响模型打分。
4.1 候选预算与证据覆盖
决定最终放入多少块之前,需要分别控制三种候选预算。它们影响的是不同环节,适合分开评测:
- 每路召回量决定正确证据进入候选集的机会。可以从每路几十个候选开始比较,检查增加候选是否补回遗漏。
- 重排输入量决定在线打分的工作量。可以从融合后的前几十个开始,评测需要时再扩大到上百个。
- 最终块数和块长度共同决定提示占用。可把 3–10 个块作为初始试验范围,再按问题类型和上下文预算调整。
这些数量是试验起点。比如,多跳问题需要关联多个事实,单个高分片段不足以支持完整回答。相关但重复的块会挤掉互补证据,所以应合并同源重复片段,再检查所需条件是否齐全。
需要补齐命中段落的前后文时,可以回取父块,见文档解析与切分。
重排无法找回候选集外的证据。因此,诊断时应分别记录粗召回、融合、重排和最终上下文中的块。对照各阶段的证据覆盖,就能知道正确文档在哪一步被淘汰。
4.2 阈值与降级
即使已经选出了前几个候选,其中也会有与问题无关的片段。可以先取排名前 N 的结果,再用分数阈值排除相关性过低的块。
阈值要用所选模型和业务标注样本校准,相关性分数不直接等于答案正确的概率。模型升级后,分数分布会改变,所以要重新检查阈值与拒答效果。全部候选低于阈值时,可以说明未找到相关文档,再追问或补充检索。
重排服务超时或不可用时,可以退回融合排名,并直接按预算截断,维持问答服务可用。同时要记录降级比例,并单独评测降级后的回答质量,避免正常流程的评测掩盖异常时的问题。
5 · 面试题卡片
本页题目与参考回答
5.1 BM25 和向量检索有什么区别?为什么需要多路召回?
考察重点:解释两种检索方式的匹配依据,并用错误码、同义表达等例子说明多路召回为何能互补。
相关内容:关键词检索与向量检索。
参考回答
BM25 按词项统计匹配文本,向量检索按语义表示匹配文本,多路召回用两者补充不同候选。
BM25 结合词频、逆文档频率和文档长度,适合匹配错误码、型号和函数名。向量检索有助于匹配同义改写和口语表达,但对罕见名称、精确编号的表示容易不足。比如,查询“怎么请假”与文档“休假申请流程”词项不同,却有相近含义。
多路候选合并后再融合与重排,可以兼顾精确词项与语义表达。中文分词、纠错和专业词典仍要单独检查,避免在词项处理时丢失名称。最终数量固定时,还要评测正确证据是否在融合后被淘汰。
5.2 多路召回结果如何融合?RRF 怎么计算?为什么不直接把分数相加?
考察重点:解释 RRF 的计算和 k 的作用,并比较排名融合与分数归一化后加权的取舍。
相关内容:融合。
参考回答
多路结果可用 RRF 融合:将文档在各路的 1/(k+rank) 相加,避开原始分数尺度的差异。
排名从 1 开始,未出现的路贡献为零。k 是平滑常数,可从 60 开始评测,用来缩小头部相邻名次的贡献差距。它与召回数量 K 不同。
BM25 分数随查询和语料变化,原始余弦相似度在 -1 到 1 之间。直接相加容易让数值较大的一路主导结果。另一方案是先做 min-max 等归一化再加权,但异常值会影响缩放范围,权重也需要校准。RRF 省去分数校准,仍需评测 k、候选窗口和去重方式。
5.3 Rerank 模型的原理是什么?和 Embedding 模型有什么区别?放在哪个阶段?
考察重点:解释两类编码器的输入与计算差异,并说明重排位置、候选截断和异常降级的关系。
相关内容:重排序。
参考回答
交叉编码器重排将查询与文档一起输入并输出相关性分数,位于候选融合之后、上下文组装之前。
双编码器分别生成两个向量,再算相似度,文档部分可离线计算。交叉编码器让查询与文档的 Token 直接交互,有助于判断文档是否回答了当前问题。但每个候选都要在线计算,所以适合先召回,再对几十到上百个候选精排。
最终块数由证据覆盖和 Token 预算决定,可以从 3–10 个块开始评测。再用标注集校准分数阈值,全部低于阈值时说明未找到相关文档。服务异常时退回融合排名,并记录降级比例、单独评测回答质量。
5.4 召回、重排和最终 Top-K 应怎样分配?
考察重点:区分三个阶段的数量预算,说明怎样定位遗漏证据,以及怎样保留多跳问题需要的互补证据。
相关内容:候选预算与证据覆盖。
参考回答
召回量、重排量和最终 Top-K 应分别分配,依据是证据覆盖、在线计算成本和上下文预算。
每路召回可从几十个候选开始,融合后取前几十个重排,最终可从 3–10 个块开始比较。增加召回量有助于补充候选,增加重排量则会增加在线打分计算。最终块数还要结合块长度,确保有足够空间生成回答。
逐阶段记录候选,才能判断证据丢在召回、排序还是上下文截断环节。多跳问题要保留互补证据,并去掉重复片段。候选集外的证据需要重新检索,重排本身无法补回。