INNER 05 / RAG / 04 · ENGINE v1
混合检索与重排序优化(Hybrid Search & Cross-Encoder Reranking)
本关练习:手写 RRF 倒数排名融合算法与两阶段重排流水线。
30 SECONDS / 30 秒看懂
这一关只解决一件事:纯向量语义检索有一个致命短板:对精确专有名词、产品型号代码(如“错误码 ERR-4092-B”)、 人名与法规条文编号非常不敏感!根据 RAG Zero to Hero Guide 与 RAG All-in-One 的进阶架构,工业级知识库普遍采用“两阶段漏斗架构”: 第一阶段(粗排召回:BM25 关键词检索 + 向量稠密检索):两路并行各取 Top-20,通过 RRF (Reciprocal Rank Fusion,倒数排名融合算法) 合并去重,兼顾精确型号匹配与语义泛化理解。
- 写出标准 RRF(Reciprocal Rank Fusion)打分公式(含平滑常数 k = 60)及 Python 融合排序实现 (
- 5 分);
- 设计粗排(Recall Top-20)→ Reranker 精排(Select Top-4)的两阶段调用流程;
3 MINUTES / 3 分钟拆解
先看来源里的例子:PDF 本关任务(来源)
售后工程师搜索“变频器报 E-017 故障怎么复位”,向量检索召回了第 [D3, D1, D8] 号文档, BM25 关键词检索召回了第 [D1, D5, D3] 号文档。
发生了什么
来源要求:写出标准 RRF(Reciprocal Rank Fusion)打分公式(含平滑常数 k = 60)及 Python 融合排序实现 ( / 5 分); / 设计粗排(Recall Top-20)→ Reranker 精排(Select Top-4)的两阶段调用流程;
输出
参考答案:参考答案:RRF 倒数排名融合算法与两阶段重排序流水线 from collections import defaultdict from typing import List def reciprocal_rank_fusion( dense_results: List[str], sparse_bm25_results: List[str], k: int = 60, top_n: int = 20 ) -> List[str]: "
术语拆开
- BM25
- 基于关键词的经典检索算法。
- RRF
- 用排名而不是原始分数融合多路结果。
为什么有效
来源核心原理:纯向量语义检索有一个致命短板:对精确专有名词、产品型号代码(如“错误码 ERR-4092-B”)、 人名与法规条文编号非常不敏感!根据 RAG Zero to Hero Guide 与 RAG All-in-One 的进阶架构,工业级知识库普遍采用“两阶段漏斗架构”: 第一阶段(粗排召回:BM25 关键词检索 + 向量稠密检索):两路并行各取 Top-20,通过 RRF (Reciprocal Rank Fusion,倒数排名融合算法) 合并去重,兼顾精确型号匹配与语义泛化理解。 第二阶段(精排重排序:Cross-Encoder Reranker):使用 BGE-Reranker 或 Cohere Rerank 等交叉编码模型,对粗排召回的 20 个片段与用戶问题做深度交叉注意力打分,精选出真正最相关的 Top-3 喂给大模型。
结构长什么样
写出标准 RRF(Reciprocal Rank Fusion)打分公式(含平滑常数 k = 60)及 Python 融合排序实现 ( 5 分); 设计粗排(Recall Top-20)→ Reranker 精排(Select Top-4)的两阶段调用流程; 解释为什么不能直接用 Cross-Encoder Reranker 对全库 10 万篇文档做第一阶段暴力检索。 第三阶段:生成演进篇(第 5‒6 关)——溯源生成闭环与多轮对话记忆
为什么不能对 10 万篇文档全部跑 Cross-Encoder?
SOURCE READING / 来源精读
纯向量语义检索有一个致命短板:对精确专有名词、产品型号代码(如“错误码 ERR-4092-B”)、 人名与法规条文编号非常不敏感!根据 RAG Zero to Hero Guide 与 RAG All-in-One 的进阶架构,工业级知识库普遍采用“两阶段漏斗架构”: 第一阶段(粗排召回:BM25 关键词检索 + 向量稠密检索):两路并行各取 Top-20,通过 RRF (Reciprocal Rank Fusion,倒数排名融合算法) 合并去重,兼顾精确型号匹配与语义泛化理解。
逐点读懂
- 写出标准 RRF(Reciprocal Rank Fusion)打分公式(含平滑常数 k = 60)及 Python 融合排序实现 (
- 5 分);
- 设计粗排(Recall Top-20)→ Reranker 精排(Select Top-4)的两阶段调用流程;
怎么对应本关练习
先读 30 秒与 3 分钟拆解,再读本关原文与实验,最后做客观题和实操题;答案在下方。
例子在哪
本关任务与参考答案见页面下方;来源为本册 PDF 对应关卡。
本关先记住:写出标准 RRF(Reciprocal Rank Fusion)打分公式(含平滑常数 k = 60)及 Python 融合排序实现 (
核心原理
纯向量语义检索有一个致命短板:对精确专有名词、产品型号代码(如“错误码 ERR-4092-B”)、 人名与法规条文编号非常不敏感!
根据 RAG Zero to Hero Guide 与 RAG All-in-One 的进阶架构,工业级知识库普遍采用“两阶段漏斗架构”: 第一阶段(粗排召回:BM25 关键词检索 + 向量稠密检索):两路并行各取 Top-20,通过 RRF (Reciprocal Rank Fusion,倒数排名融合算法) 合并去重,兼顾精确型号匹配与语义泛化理解。
第二阶段(精排重排序:Cross-Encoder Reranker):使用 BGE-Reranker 或 Cohere Rerank 等交叉编码模型,对粗排召回的 20 个片段与用戶问题做深度交叉注意力打分,精选出真正最相关的 Top-3 喂给大模型。
第 4 关实操练习题:手写 RRF 倒数排名融合算法与两阶段重排流水线
任务背景
售后工程师搜索“变频器报 E-017 故障怎么复位”,向量检索召回了第 [D3, D1, D8] 号文档, BM25 关键词检索召回了第 [D1, D5, D3] 号文档。
通关硬性要求(满分 12.5 分)
1. 写出标准 RRF(Reciprocal Rank Fusion)打分公式(含平滑常数 k = 60)及 Python 融合排序实现 (
5.5 分);
2. 设计粗排(Recall Top-20)→ Reranker 精排(Select Top-4)的两阶段调用流程(4 分);
3. 解释为什么不能直接用 Cross-Encoder Reranker 对全库 10 万篇文档做第一阶段暴力检索(3 分)。 第三阶段:生成演进篇(第 5‒6 关)——溯源生成闭环与多轮对话记忆
PRACTICE / 本关练习 · 本地规则 + 覆盖检查
手写 RRF 倒数排名融合算法与两阶段重排流水线
本地检查在你的浏览器里完成,不上传。覆盖检查需要先登录(免费注册),并把这段答案发送到服务器计算一次,算完即弃、不存档,需你点同意;只核对本关评分项覆盖的方向,不在评分项里的题目不会被检查。
评分项
结构分 — / 12.5 分
查看参考答案与得分点 先自己写,再打开+
参考答案与得分要点
参考答案:RRF 倒数排名融合算法与两阶段重排序流水线 from collections import defaultdict from typing import List def reciprocal_rank_fusion( dense_results: List[str], sparse_bm25_results: List[str], k: int = 60, top_n: int = 20 ) -> List[str]: """RRF 公式: score(d) = sum( 1 / (k + rank(d)) ),无需对两路异构得分做复杂的分布归一化""" rrf_scores = defaultdict(float) for rank, doc_id in enumerate(dense_results, start=1): rrf_scores[doc_id] += 1.0 / (k + rank) for rank, doc_id in enumerate(sparse_bm25_results, start=1): rrf_scores[doc_id] += 1.0 / (k + rank) sorted_docs = sorted(rrf_scores.items(), key=lambda x: x[1], reverse=True) return [doc_id for doc_id, _ in sorted_docs[:top_n]] # 两阶段检索精排调用: # Stage 1: 向量 Top-20 + BM25 Top-20 -> RRF 融合选出 20 个候选块(D1 在两路分列第2和第1,得分最高稳居榜首) # Stage 2: 调用 cross_encoder_reranker.rank(query, candidate_20_chunks) 精排截取 Top-4 # 原理解析:Cross-Encoder 需将 Query 与每篇文档拼接后过完整 Transformer 自注意力层,计算复杂度高, 仅适合对粗排后的几十个候选块做精排,不可直接遍历 10 万全库。 得分要点拆解:准确实现 `1 / (k + rank)` RRF 公式(5.5 分);清晰构建粗排召回 + Cross-Encoder 精排两阶段流水线(4 分);准确解释双塔 Bi-Encoder 与交叉编码器 Cross-Encoder 的计算开销差异(3 分)。 第 5 关
网页永久免费。完整 PDF 会按顺序发给留邮箱的读者,不转售、不群发广告。
留邮箱,获取完整 PDF ↗