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_sizechunk_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: