Self-RAG 学习笔记 —— 从论文思想到代码实现
一、什么是 Self-RAG
Self-RAG(Self-Reflective Retrieval-Augmented Generation,自我反思检索增强生成)是一种改进传统 RAG 的框架。它的核心目标是让大语言模型在生成内容时,能够按需检索外部知识,并对自己生成的内容以及检索到的证据进行自我批判和评估,从而提升生成内容的准确性、事实可靠性和有用性。
传统 RAG 通常采用固定流程:收到查询后无条件检索 top-k 文档,把文档拼进提示词,再让模型生成答案。这种方式在查询不需要事实支撑时,反而可能引入无关信息;也无法保证生成内容与检索文档一致。
Self-RAG 的关键改进在于:把“检索—生成”流程变成“检索—生成—反思—选择”的循环,并且让模型学会自己决定什么时候该检索、检索来的内容是否靠谱、生成的内容是否得到支持。
二、Self-RAG 与传统 RAG 的本质区别
| 维度 | 传统 RAG | Self-RAG |
|---|---|---|
| 检索触发 | 每个查询都检索固定数量文档 | 模型通过特殊 token 判断是否需要检索 |
| 质量监控 | 检索后直接用文档生成,缺乏对一致性的评估 | 引入反思 token,评估相关性、支持度、有用性 |
| 多路径处理 | 通常基于 top-k 文档生成单一答案 | 可并行处理多个段落,生成候选并择优 |
| 可控性 | 推理逻辑固定 | 可在测试时调整各反思维度的权重,定制模型行为 |
| 引注能力 | 一般不提供细粒度证据引注 | 能为每个片段提供引注及自我评估结果 |
三、反思令牌(Reflection Tokens)
Self-RAG 通过引入特殊 token 把“反思”变成可学习的结构化动作。这些 token 分为两大类:检索令牌和评注令牌。
1. 检索令牌(Retrieve)
用于决定当前片段是否需要检索外部知识。
- Yes:需要检索外部事实背景
- No:不需要事实支撑,或仅凭模型自身知识即可生成
- Continue:可继续使用之前检索到的证据,无需新检索
2. 评注令牌(Critique Tokens)
用于评估检索文档质量和生成回复质量。
- ISREL(Is Relevant):判断检索到的证据是否对解决查询有用
- 取值:Relevant / Irrelevant
- ISSUP(Is Supported):判断生成回复中的陈述是否得到证据支持
- 取值:Fully supported / Partially supported / No support / Contradictory
- ISUSE(Is Useful):评估回复对查询的整体帮助程度
- 取值:1 到 5,分数越高越有用
四、训练方式:两阶段端到端训练
论文中的 Self-RAG 是一个经过专门训练的模型,而不是简单的提示词工程。训练分为两个阶段。
阶段一:训练评论家模型(Critic Model)
- 使用 GPT-4 等强模型生成反思令牌的标注数据
- 将这些标注作为监督信号,蒸馏到一个本地模型(如 Llama 2-7B)
- 评论家模型学习预测 Retrieve、ISREL、ISSUP、ISUSE 等 token 可以看作是一个生成对应样本的模型,是一个生成模型
阶段二:训练生成器模型(Generator Model)
- 用训练好的评论家模型对原始指令-回复数据进行离线标注
- 构建增强语料库:在适当位置插入检索决定、相关性、支持度、有用性等 token
- 将反思令牌统一加入模型词表
- 用标准的“下一个 token 预测”目标训练生成器,遮蔽检索到的参考文档,只学习生成原始回复文本和反思 token
训练完成后,实际推理时只需要一个生成器模型,它既能生成内容,也能输出反思 token 进行自我评判,无需再外挂评论家模型。 这里容易混淆的是,实际推理只需要生成器模型,有两个模型参与的是训练阶段
五、代码实现:self_rag.ipynb 的 workflow 版本
这里参考的是NirDiamant/RAG_TECHNIQUES仓库的ipynb,这是一个简化版本的self-rag 论文中的 Self-RAG 是把反思能力“内化”到模型权重中,而 self_rag.ipynb 提供的是一种不依赖微调、用代码把工作流显式化的实现方式。它把 Self-RAG 拆成多个步骤,每个步骤调用一次 LLM 做离散判断。
1. 工作流程
query
↓
Retrieval Decision(LLM 判断是否需要检索)
↓
Document Retrieval(向量检索 top-k)
↓
Relevance Evaluation(LLM 判断每个 chunk 是否相关)
↓
Response Generation(LLM 基于相关上下文生成答案)
↓
Support Assessment(LLM 判断答案是否被上下文支持)
↓
Utility Evaluation(LLM 给答案有用性打分 1-5)
↓
Response Selection(选择支持度最高且效用最好的答案)
2. 核心代码片段
判断是否检索:
retrieval_decision = retrieval_chain.invoke(input_data).response.strip().lower()
判断文档是否相关:
relevance = relevance_chain.invoke(input_data).response.strip().lower()
判断答案支持度:
support = support_chain.invoke(input_data).response.strip().lower()
评估有用性:
utility = int(utility_chain.invoke(input_data).response)
选择最佳答案:
best_response = max(responses, key=lambda x: (x[1] == 'fully supported', x[2]))
3. 关键超参数
-
top_k=3:检索返回的 chunk 数量 -
chunk_size、chunk_overlap:控制 PDF 切分粒度 -
temperature=0:让 LLM 输出更确定
六、论文版 vs. Notebook 版
| 维度 | 论文原版 Self-RAG | self_rag.ipynb 实现 |
|---|---|---|
| 决策方式 | LLM 在生成 token 时自发输出特殊 token | 用 5 个独立 PromptTemplate + LLMChain 分别判断 |
| 训练 | 需要专门微调,用 critic model 生成反思标签 | 不需要训练,纯 prompt 工程 |
| 生成与反思 | 反思 token 和答案文本混合在同一个生成流里 | 每个步骤都是一次独立的 LLM 调用 |
| 可解释性 | 较低,靠特殊 token 的概率分布控制 | 很高,每步都打印决策和评估结果 |
| 检索轮次 | 可多轮反复检索 | 单轮检索,没有循环 |
| 本质 | 把“反思”变成模型的内在能力 | 把“反思”变成显式的工作流节点 |
可以这么理解:论文版是让模型“学会”反思;notebook 版是用代码把反思流程“写死”,让 LLM 在每个节点做二选一判断。
七、推理时的评分函数与测试时定制
论文版 Self-RAG 在推理时使用段落级束搜索(Segment-level Beam Search),对每个候选片段打分:
score = p(y_t | x, d, y_<t) + S(Critique)
其中反思分数 S(Critique) 是各评注 token 得分的加权和:
S(Critique) = w_ISREL · s_ISREL + w_ISSUP · s_ISSUP + w_ISUSE · s_ISUSE
由于权重是超参数,用户可以在不重新训练模型的情况下,通过调整权重改变模型行为:
- 追求事实严谨性:调高
w_ISSUP,优先选择每句话都被检索文档完全支持的答案 - 追求开放性与流利度:调高
w_ISUSE,允许模型生成信息更完整、表达更流畅的回答 - 硬约束:直接过滤掉 ISSUP = No support 的候选
- 调整检索频率:通过 Retrieve token 的概率阈值控制模型多“勤快”地查资料
默认配置通常给 ISREL、ISSUP、ISUSE 分配 1.0、1.0、0.5 的权重。
八、适用场景与不适用场景
适合:
- 有些查询不需要检索(如开放创意问题)
- 检索到的文档质量参差不齐,需要过滤
- 对答案可信度要求高,需要显式支持度评估
不适合:
- 延迟敏感场景(多步 LLM 调用较慢)
- 成本敏感场景(一次查询可能调用 5 次以上 LLM)
- 需要严格多轮检索的场景(notebook 版只检索一次)
九、评估指标
Self-RAG 的评估不仅看答案是否正确,还关注生成内容与证据的一致性:
- Citation Precision / Recall:引用是否准确
- Answer Correctness / EM / F1:答案是否正确
- Utility:答案有用性(1-5 分)
- Retrieval Precision:检索文档的准确率
- Support Assessment:生成内容与证据的一致程度
相比 BLEU/ROUGE,这些指标能更好地捕捉“看起来对但引用错”的幻觉问题。
十、一句话总结
Self-RAG 把 RAG 从“检索—拼接—生成”的固定流程,升级为“按需检索、生成、反思、择优”的闭环框架。论文版让模型内化反思能力,notebook 版则用显式工作流让同样的思想快速落地。
本文内容大部分内容由 AI 根据论文介绍、我的notebooklm记录以及 self_rag.ipynb 代码整理总结而成。
Enjoy Reading This Article?
Here are some more articles you might like to read next:
- Google Gemini updates: Flash 1.5, Gemma 2 and Project Astra
- Displaying External Posts on Your al-folio Blog
- Graph RAG with Milvus —— 纯向量库造图的多跳推理
- Hierarchical Indices 层级索引 —— 先粗后细的两级检索
- HyDE 与 HyPE —— 假设检索技术的两个方向
- 二叉树刷题总结
- RAG 技术体系化分类——从 Pipeline 阶段到失败模式
- MemoRAG 记忆增强型 RAG 总结
- Microsoft GraphRAG 基于知识图谱的 RAG 总结
- Multimodal RAG with Captioning 图像描述型多模态 RAG 总结