☰
跟着Datawhale打卡·【ai-agent-book:从入门到 Agent 工程实践】学习笔记Task2-2
2026/10/19 2:08:51 网站建设 项目流程

本篇记录实验3-6Hybrid Retrieval Pipeline with Neural Reranking / 混合检索流水线与神经重排序

一、对比实验A组

python3 evaluate.py --no-dense --no-rerank

解析下这个命令,他的参数含义是:关掉稠密向量检索、关掉重排,只跑纯 BM25 稀疏检索,用来单独评估 BM25 基线效果。

二、结果是:

(.venv) td@air retrieval-pipeline % python3 evaluate.py --no-dense --no-rerank ============================================================================== 混合检索流水线 · 逐阶段评测对比 ============================================================================== 语料: 20 篇文档 → 22 个 chunk (chunk_size=280, overlap=40) 查询: 12 条 稠密模型: (禁用) 重排模型: (禁用) 检索 top_k=10 融合 k(RRF)=60 重排候选池=10 评测截断 k=3 设备=mps 耗时: 0.0s ------------------------------------------------------------------------------ Stage / Method Recall@3 MRR nDCG@3 ------------------------------------------------------------------------------ BM25 (sparse) 0.8333 0.7917 0.8026 ------------------------------------------------------------------------------ 读表:从上到下逐步加入 稠密检索 / 融合 / 重排 阶段,观察指标的变化。 ============================================================================== 逐条查询 MRR 明细(1.00=正确文档排在第 1 位;粗看哪一路在哪类查询上翻车) ------------------------------------------------------------------------------ Query BM25 Dense RRF Wgt Rerank ------------------------------------------------------------------------------ XR-7003 1.00 - - - - XR-7005 1.00 - - - - HTTP-403 1.00 - - - - HTTP-400 1.00 - - - - Alexander Humphrey 1.00 - - - - a beginner friendly language with tidy... 1.00 - - - - reclaiming unused heap space without p... 0.00 - - - - how vegetation turns light into food 0.50 - - - - hiding a note so eavesdroppers cannot ... 1.00 - - - - 植物如何把阳光转化为食物 0.00 - - - - how does water move between the ocean ... 1.00 - - - - how are volcanoes formed from molten rock 1.00 - - - - ==============================================================================

1、分析下Recall@3 、MRR、nDCG@3三个评估指标,之前提到过这三个指标都是分数越高模型效果越好。

1)Recall@3 = 0.8333召回率:12 条查询里,83.3% 的查询,目标正确 chunk 被成功召回在前 3 条结果。 12 条里,12 × 0.8333 ≈ 10条命中,2 条没找到。

2)MRR = 0.7917(平均倒数排名)衡量正确结果排在第几位。

  • 正确结果排第 1 名:MRR 贡献 1/1 = 1.0
  • 排第 2 名:贡献 1/2 =0.5
  • 排第 3 名:贡献 1/3≈0.33
  • 不在前 3:贡献 0 MRR 兼顾「有没有找到」+「排的位置靠前与否」,比单纯召回更严格。

3)nDCG@3 =0.8026归一化折损累计增益,看重结果列表内部排序质量:正确文档越靠前,分数越高;适合多份文档都相关的场景。

2、逐条查询 MRR=0的2条例子分析

1)reclaiming unused heap space(内存堆回收),文档里有“堆内存回收”,但是用词不一样。所以bm25在做词频匹配过程中reclaiming、unused这些字面匹配率很低。语义是同一个东西,但是单词不一样 → BM25 识别不出来,直接漏召回。

2)植物如何把阳光转化为食物,文档里都是英文资料。英文 query 去查:how vegetation turns light into food→ 能匹配上英文文档的单词,拿到 MRR=0.5。BM25 是纯字面单词匹配:文档里没有任何中文汉字,中文词汇和英文单词完全无法字面重合。直接匹配失败,MRR=0。

3、实验核心结论:纯bm25基线的特点是关键词重合高的查询,检索效果很好、速度极快、不需要 GPU / 大模型向量。短板是跨语言检索能力比较低,同义词改写、概念转述这种情况下容易漏召回,并且只靠词频无法理解语义。

二、对比试验B组(纯bm25vsBM25 + Dense 混合检索vsBM25+Dense+Rerank 重排)

python3 evaluate.py --no-rerank

结果

混合检索流水线 · 逐阶段评测对比 ============================================================================== 语料: 20 篇文档 → 22 个 chunk (chunk_size=280, overlap=40) 查询: 12 条 稠密模型: sentence-transformers/all-MiniLM-L6-v2 重排模型: (禁用) 检索 top_k=10 融合 k(RRF)=60 重排候选池=10 评测截断 k=3 设备=mps 耗时: 2.39s ------------------------------------------------------------------------------ Stage / Method Recall@3 MRR nDCG@3 ------------------------------------------------------------------------------ BM25 (sparse) 0.8333 0.7917 0.8026 Dense 1.0000 0.9167 0.9385 Hybrid-RRF 1.0000 1.0000 1.0000 Hybrid-Weighted 1.0000 0.9583 0.9692 ------------------------------------------------------------------------------ 读表:从上到下逐步加入 稠密检索 / 融合 / 重排 阶段,观察指标的变化。 ============================================================================== 逐条查询 MRR 明细(1.00=正确文档排在第 1 位;粗看哪一路在哪类查询上翻车) ------------------------------------------------------------------------------ Query BM25 Dense RRF Wgt Rerank ------------------------------------------------------------------------------ XR-7003 1.00 0.50 1.00 1.00 - XR-7005 1.00 0.50 1.00 1.00 - HTTP-403 1.00 1.00 1.00 1.00 - HTTP-400 1.00 1.00 1.00 1.00 - Alexander Humphrey 1.00 1.00 1.00 1.00 - a beginner friendly language with tidy... 1.00 1.00 1.00 1.00 - reclaiming unused heap space without p... 0.00 1.00 1.00 1.00 - how vegetation turns light into food 0.50 1.00 1.00 0.50 - hiding a note so eavesdroppers cannot ... 1.00 1.00 1.00 1.00 - 植物如何把阳光转化为食物 0.00 1.00 1.00 1.00 - how does water move between the ocean ... 1.00 1.00 1.00 1.00 - how are volcanoes formed from molten rock 1.00 1.00 1.00 1.00 - ==============================================================================

重点看下第一个实验中两条rff=0的查询实验条例

1)reclaiming unused heap space without p...bm25=0.00、Dense=1.00、RRF:1.00

2)植物如何把阳光转化为食物,bm25=0.00、Dense=1.00、RRF:1.00

三、对比试验C组(BM25+Dense+Rerank 重排)

python3 evaluate.py
混合检索流水线 · 逐阶段评测对比 ============================================================================== 语料: 20 篇文档 → 22 个 chunk (chunk_size=280, overlap=40) 查询: 12 条 稠密模型: sentence-transformers/all-MiniLM-L6-v2 重排模型: BAAI/bge-reranker-base 检索 top_k=10 融合 k(RRF)=60 重排候选池=10 评测截断 k=3 设备=mps 耗时: 1.64s ------------------------------------------------------------------------------ Stage / Method Recall@3 MRR nDCG@3 ------------------------------------------------------------------------------ BM25 (sparse) 0.8333 0.7917 0.8026 Dense 1.0000 0.9167 0.9385 Hybrid-RRF 1.0000 1.0000 1.0000 Hybrid-Weighted 1.0000 0.9583 0.9692 Hybrid-RRF+Rerank 1.0000 0.9583 0.9692 ------------------------------------------------------------------------------ 读表:从上到下逐步加入 稠密检索 / 融合 / 重排 阶段,观察指标的变化。 ============================================================================== 逐条查询 MRR 明细(1.00=正确文档排在第 1 位;粗看哪一路在哪类查询上翻车) ------------------------------------------------------------------------------ Query BM25 Dense RRF Wgt Rerank ------------------------------------------------------------------------------ XR-7003 1.00 0.50 1.00 1.00 1.00 XR-7005 1.00 0.50 1.00 1.00 1.00 HTTP-403 1.00 1.00 1.00 1.00 1.00 HTTP-400 1.00 1.00 1.00 1.00 0.50 Alexander Humphrey 1.00 1.00 1.00 1.00 1.00 a beginner friendly language with tidy... 1.00 1.00 1.00 1.00 1.00 reclaiming unused heap space without p... 0.00 1.00 1.00 1.00 1.00 how vegetation turns light into food 0.50 1.00 1.00 0.50 1.00 hiding a note so eavesdroppers cannot ... 1.00 1.00 1.00 1.00 1.00 植物如何把阳光转化为食物 0.00 1.00 1.00 1.00 1.00 how does water move between the ocean ... 1.00 1.00 1.00 1.00 1.00 how are volcanoes formed from molten rock 1.00 1.00 1.00 1.00 1.00 ==============================================================================

1)reclaiming unused heap space without p...bm25=0.00、Dense=1.00、RRF:1.00

2)植物如何把阳光转化为食物,bm25=0.00、Dense=1.00、RRF:1.00

三种试验结果对比分析

检索方式Recall@3MRRnDCG@3
BM25(稀疏关键词)0.83330.79170.8026
Dense 稠密向量1.00000.91670.9385
Hybrid-RRF(BM25+Dense 融合,无重排)1.00001.00001.0000
Hybrid-Weighted 加权融合1.00000.95830.9692
Hybrid-RRF+Rerank(全链路,开启重排)1.00000.95830.9692

结论:加上重排之后,整体 MRR 反而从满分 1.00 降到 0.9583。这也是RAG的特性,加上重排效果不一定会变得更好,会引入误判风险。

可以重点看下c组试验的HTTP-400这一条从1.00降低到了0.5。也就是RRF 融合阶段,目标文档排第 1;经过重排模型打分,把正确文档挤到了第 2 位,MRR 变成 0.5。

Q:为什么会出现这种现象?

原理:重排模型 BAAI/bge-reranker-base 会拿「query + 候选 chunk」成对打分,判断相关性。 它偶尔会出现假阴性:误判了文档相关性,把正确文档分数压低、排序靠后。

最后结合三次实验的过程,我们对应【文档切分、Embedding、Retrieval】整条流程可以学到:1)原始长文档不能直接丢给 Embedding 模型,按chunk_size=xxx,overlap=xx切割,切成xx 个短 chunk。这一步的作用是原始资料预处理是RAG的第一步;2)Embedding,用all-MiniLM-L6-v2,把每一个 chunk 文本,转换成一串数字向量;作用是把文本变成机器能计算语义距离的数据,是稠密检索的基础;3)Retrieval 检索,也是实验2-1重点去学的。两路检索(bm25|稠密搜素)各自输出 top-k 候选,再用 RRF 融合排序,可选 Rerank 重排二次打分。

注:这里标记一下chunk是怎么计算得到的。

公式:chunk_size=280,overlap=40每次滑动窗口:每次前进步长 = chunk_size − overlap = 280 − 40 = 240窗口大小 280,每切完一段,往后挪 240 个字符,保留末尾 40 个字符重叠到下一个 chunk

整条链路的运行闭环就是:文档先切块,全部向量化保存->用户提问,问题转向量->同时走关键词 + 语义两路检索->把相关片段捞出来->排序之后交给大模型。用贴合我们实际生活的例子去理解就是:

知识库 RAG:后台导入《DeepSeek 产品手册》。你问 “DeepSeek 模型支持什么上下文窗口?” → 检索手册文档,返回资料。资料是提前上传的外部文档。

User Memory:和你聊天,记住「美然,2.7 年风控,会 Python SQL,面试项目经理」。之后对话自动读取你的个人背景,记住你这个人,不是查外部文档。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询