AI神功 KNOWLEDGE BASE
内功05 · RAG 检索增强生成·第 8 关 / 36 约 4 分钟

INNER 05 / RAG / 04 · ENGINE v1

混合检索与重排序优化(Hybrid Search & Cross-Encoder Reranking)

本关练习:手写 RRF 倒数排名融合算法与两阶段重排流水线。

约 4 分钟·免费阅读·整理自 AI 现代必修课 · 内功05·来源精读 ↓·直接做题 ↓

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,倒数排名融合算法) 合并去重,兼顾精确型号匹配与语义泛化理解。

逐点读懂

  1. 写出标准 RRF(Reciprocal Rank Fusion)打分公式(含平滑常数 k = 60)及 Python 融合排序实现 (
  2. 5 分);
  3. 设计粗排(Recall Top-20)→ Reranker 精排(Select Top-4)的两阶段调用流程;

怎么对应本关练习

先读 30 秒与 3 分钟拆解,再读本关原文与实验,最后做客观题和实操题;答案在下方。

例子在哪

本关任务与参考答案见页面下方;来源为本册 PDF 对应关卡。

本关先记住:写出标准 RRF(Reciprocal Rank Fusion)打分公式(含平滑常数 k = 60)及 Python 融合排序实现 (

SOURCESPDF 第 4 关(用户提供)

核心原理

纯向量语义检索有一个致命短板:对精确专有名词、产品型号代码(如“错误码 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 倒数排名融合算法与两阶段重排流水线

本地检查在你的浏览器里完成,不上传。覆盖检查需要先登录(免费注册),并把这段答案发送到服务器计算一次,算完即弃、不存档,需你点同意;只核对本关评分项覆盖的方向,不在评分项里的题目不会被检查。

0 字未保存

评分项

评分项加载中…

结构分 — / 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 ↗
← 上一关 下一关 →