{"notes":[{"id":"retrieval-augmented-generation/self-rag","category":"retrieval-augmented-generation","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"Self-RAG","subtitle":"吾日三省吾身","author":"Z. Yuan","paperDate":"2023-10-17","publishedOn":"2026-06-21","world":"external/self-rag","paperTitle":"Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection","paperUrl":"https://arxiv.org/abs/2310.11511","bibliography":{"title":"Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection","authors":["Akari Asai","Zeqiu Wu","Yizhong Wang","Avirup Sil","Hannaneh Hajishirzi"],"url":"https://arxiv.org/abs/2310.11511","pdfUrl":"https://arxiv.org/pdf/2310.11511v1","codeUrl":null,"preprint":{"id":"2310.11511","submittedOn":"2023-10-17","url":"https://arxiv.org/abs/2310.11511"},"publication":{"venue":"ICLR","year":2024,"kind":"conference","url":"https://proceedings.iclr.cc/paper_files/paper/2024/hash/25f7be9694d7b32d5cc670927b8091e1-Abstract-Conference.html"},"citation":"@misc{retrievalaugmentedgenerationselfrag2023,\n  title = {{Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection}},\n  author = {Akari Asai and Zeqiu Wu and Yizhong Wang and Avirup Sil and Hannaneh Hajishirzi},\n  year = {2023},\n  eprint = {2310.11511},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2310.11511}\n}\n","citationPath":"/content/papers/citations/retrieval-augmented-generation/self-rag.7e4f68374820.bib"},"thumbnail":{"src":"/content/papers/assets/a967fd9c8d63065a0369d6a07be24dc71bb92dab181e5083c3f13ce21c92cabb.png","width":1122,"height":622},"locale":"zh-hans","path":"/content/papers/zh-hans/retrieval-augmented-generation/self-rag.d519b7ca5c3b.md","headings":[{"id":"定义问题","text":"定义问题","depth":2},{"id":"解决问题","text":"解决问题","depth":2},{"id":"反思标记","text":"反思标记","depth":3},{"id":"一步一步看推理","text":"一步一步看推理","depth":3},{"id":"分数怎么算","text":"分数怎么算？","depth":3},{"id":"怎么教会模型打分数","text":"怎么教会模型打分数？","depth":3},{"id":"讨论","text":"讨论","depth":2},{"id":"实验设置","text":"实验设置","depth":3},{"id":"主要结果","text":"主要结果","depth":3},{"id":"哪些设计有用","text":"哪些设计有用？","depth":3},{"id":"其他观察","text":"其他观察","depth":3},{"id":"结论","text":"结论","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[]}],"text":"到了 2023 年，RAG 的标准做法已经很固定：不管用户问什么，先检索前 $K$ 份文档，贴在问题前面，再交给语言模型回答。\n\n这个做法有三个常被忽略的问题。\n\n第一，**有些问题根本不需要查**。请模型写一篇「我最难忘的暑假」，去数据库捞五份文档只会碍事。\n\n第二，**捞回来的文档不一定相关**。问「美国各州的名字怎么来的」，检索器可能抓回一篇「德州最受欢迎的婴儿名字」，因为都有「名字」和「州」。\n\n第三，**就算文档相关，模型也不一定照着写**。模型没有被明确训练去遵循文档内容，可能一边引用文档，一边写出文档里没有、甚至相反的话。\n\n这篇来自华盛顿大学、艾伦人工智能研究所（AI2）与 IBM Research 的论文，后来发表于 ICLR 2024；本文依 arXiv v1 阅读。作者的想法是：让模型自己决定要不要查，查回来之后自己评估，写完之后再自己检查。\n\n## 定义问题\n\n先看论文的第一张图。左边是传统 RAG，右边是作者提出的 Self-RAG：\n\n[![传统 RAG 与 Self-RAG 的比较：左侧固定检索 K 份文档后生成，右侧按需检索、并行生成并以反思标记评估后选出最佳片段](/content/papers/assets/a967fd9c8d63065a0369d6a07be24dc71bb92dab181e5083c3f13ce21c92cabb.png)](/content/papers/assets/a967fd9c8d63065a0369d6a07be24dc71bb92dab181e5083c3f13ce21c92cabb.png)\n\n*原论文 Figure 1，取自 [**v1 PDF 第 2 页**](https://arxiv.org/pdf/2310.11511v1#page=2)，CC BY 4.0。左为传统 RAG，右为 Self-RAG；下方一行是不需要检索的写作题。*\n\n先看左边。问题是「美国各州的名字怎么来的？」，检索器找回三份文档：第 1 份说 50 州中有 11 州以人名命名；第 2 份在讲德州流行的婴儿名字；第 3 份说加州的名字来自一本西班牙小说里的虚构岛屿。\n\n三份一起丢给模型，模型写出来的答案里有一句「加州以哥伦布命名」，红色底线标着 **Contradictory**：这和第 3 份文档刚好矛盾。另一句「德州和犹他州以原住民部落命名」，则标着 **No information in passages**：三份文档都没有提到。\n\n最下面那一行更直接：请模型写暑假作文，传统 RAG 也照样检索三份文档。\n\n所以作者要解决的问题是：\n\n- **能不能让一个语言模型自己判断何时该检索、检索回来的东西有没有用、自己写的内容有没有根据？**\n\n## 解决问题\n\n### 反思标记\n\n作者的做法是在模型的词汇表里加入一组特殊 token，称为**反思标记**（reflection tokens）。模型生成文本时，也会在适当的地方生成这些标记，就像在写作途中替自己打分数。\n\n一共四种：\n\n| 标记 | 看什么 | 可能的值 | 意思 |\n| --- | --- | --- | --- |\n| Retrieve | 问题（和已写的内容） | yes／no／continue | 现在要不要检索 |\n| IsRel | 问题、文档 | relevant／irrelevant | 这份文档对解题有没有用 |\n| IsSup | 问题、文档、这段输出 | fully／partially／no support | 这段输出有没有被文档支持 |\n| IsUse | 问题、输出 | 5／4／3／2／1 | 这个回答整体有没有用 |\n\n*整理自原论文 Table 1。*\n\n后三种合称**评论标记**（critique tokens），负责评估；Retrieve 则负责决定要不要去查。\n\n### 一步一步看推理\n\n回到图的右半边，我们跟着同一个问题走一次。\n\nSelf-RAG 以**片段**为单位生成，论文的实验里，一个片段就是一句话。\n\n**第一步：要不要查**？模型先写出第一句「美国各州的名字有各种来源。」接着生成了 `Retrieve` 标记，判断接下来需要事实依据，于是调用检索器，拿回三份文档。\n\n**第二步：并行生成**。模型把三份文档**各自**接在问题后面，并行写出三个候选的下一句，并替每一份文档、每一句候选打上评论标记：\n\n- 第 1 份：`Relevant`，写出「50 州中有 11 州的名字来自人名」，`Supported`。\n- 第 2 份：`Irrelevant`，写出「德州以原住民部落命名」，这句没有根据。\n- 第 3 份：`Relevant`，写出「加州的名字源自 16 世纪小说《Las Sergas de Esplandián》」，`Partially`。\n\n**第三步：评分选最好的**。第 1 份文档的候选，相关又被完全支持，排名最高；第 3 份次之；第 2 份最后。模型采用第 1 份的那句话，再继续写下一句，需要时再检索一次。\n\n最下面的写作题，模型一开始就生成 `No Retrieval`，像一般语言模型一样直接写下去。\n\n### 分数怎么算？\n\n第三步的「排名」，作者写成一个分数。每一个候选片段 $y_t$ 搭配文档 $d$，分数是：\n\n$$\nf(y_t,d)=p(y_t\\mid x,d,y_{<t})+\\mathcal{S}(\\text{Critique})\n$$\n\n前一项是模型生成这句话的概率，后一项是评论标记的加权和：\n\n$$\n\\mathcal{S}(\\text{Critique})=\\sum_{G\\in\\{\\text{IsRel},\\,\\text{IsSup},\\,\\text{IsUse}\\}} w^G\\, s^G_t\n$$\n\n其中 $s^G_t$ 是该类标记中**最理想的那个值**的概率，例如 IsRel 取 `Relevant` 的概率、IsSup 取 `fully supported` 的概率、IsUse 取 `5` 的概率，并在同类标记之间归一化。\n\n我们用一组假设的数字算一次。论文默认的权重是 $w^{\\text{IsRel}}=1.0$、$w^{\\text{IsSup}}=1.0$、$w^{\\text{IsUse}}=0.5$。假设两个候选的评论标记概率如下：\n\n| 候选 | IsRel＝Relevant | IsSup＝fully | IsUse＝5 |\n| --- | ---: | ---: | ---: |\n| 用第 1 份文档 | 0.90 | 0.80 | 0.60 |\n| 用第 3 份文档 | 0.85 | 0.30 | 0.70 |\n\n评论分数分别是：\n\n$$\n\\begin{aligned}\n\\mathcal{S}_1 &= 1.0\\times0.90+1.0\\times0.80+0.5\\times0.60=2.00\\\\\n\\mathcal{S}_3 &= 1.0\\times0.85+1.0\\times0.30+0.5\\times0.70=1.50\n\\end{aligned}\n$$\n\n如果两句话本身的生成概率差不多，第 1 份文档的候选胜出。\n\n这组权重可以在推理时调整，**不用重新训练**。假如你的应用特别在意「每句话都要有出处」，就把 $w^{\\text{IsSup}}$ 调高到 2.0，差距会从 0.5 拉大到 1.0（2.80 对 1.80）。\n\n也可以改成硬性规定：只要某个候选生成了 `IsSup = No support`，就直接淘汰。\n\n至于要不要检索，除了让模型直接生成 `Retrieve=Yes`，也可以设一个门槛：`Retrieve=Yes` 的归一化概率超过门槛 $\\delta$ 就去查。门槛越低，查得越频繁。\n\n实际搜索时，作者在片段层级使用宽度为 2 的 beam search，片段内的 token 则用 greedy decoding。\n\n\n> [!NOTE]\n> \n> 上面的评论标记概率是本文为了说明公式而假设的数字，不是论文的实验结果。权重 1.0、1.0、0.5 与 beam 宽度 2 则是论文的默认设置。\n\n\n### 怎么教会模型打分数？\n\n推理时看起来很神奇：模型自己会判断、会打分数。这些能力是怎么训练出来的？\n\n作者分两步。\n\n**第一步：训练一个评论模型 $\\mathcal{C}$**。人工替每一句话标注反思标记太贵，所以作者请 GPT-4 来标：针对每种标记写一段指令，例如「给定一个指示，判断从网络上找一些外部文档，是否有助于产生更好的回应」，再附上几个演示。每种标记收集 4 千到 2 万笔数据，用来微调一个 Llama 2-7B。作者报告，这个评论模型在大多数标记类别上，和 GPT-4 的判断一致率超过 90%。\n\n**第二步：用评论模型改写训练数据，再训练生成模型 $\\mathcal{M}$**。拿 15 万笔指令与回答，逐句跑过评论模型：需要检索的地方插入 `Retrieve` 标记和检索回来的文档，文档后面接上 IsRel，句子后面接上 IsSup，整个回答最后加上 IsUse。\n\n处理完的数据长得像这样（简化自原论文 Figure 2）：\n\n```text\nInput: How did US states get their names?\n\nOutput: [Retrieve]<p>Of the fifty states, eleven are named after an individual person</p>\n        [Relevant] 11 of 50 states' names come from person. [Supported]\n        [Retrieve]<p>LOUISIANA: Named in honor of Louis XIV of France.</p>\n        [Relevant] For instance, Louisiana was named after King Louis XIV, and\n        Georgia was named after King George II. [Partially] [Utility:5]\n```\n\n接着就是最普通的语言模型训练：预测下一个 token。唯一的差别是，`<p>` 和 `</p>` 之间的检索文档不计入损失，因为那是检索器给的，不是模型该学会写出来的。\n\n训练完成后，生成模型自己就会产生这些标记，推理时不需要再调用评论模型。\n\n作者也拿它和 RLHF 比较：PPO 训练时需要一直调用奖励模型，Self-RAG 则是事先把评论写进训练数据，用标准的语言模型目标训练，成本低很多。\n\n\n> [!TIP]\n> \n> **「Self-RAG」教学和这篇论文，不完全是同一件事**\n> \n> 网络上不少 Self-RAG 教学，例如 LangGraph 已封存的 [**Self-RAG 示例**](https://github.com/langchain-ai/langgraph/blob/fbcb8a911b626b4373fd4aff9624124e9532987f/examples/rag/langgraph_self_rag.ipynb)，借用了论文的判断流程：文档相不相关、回答有没有根据、有没有回答到问题。\n> \n> 但实现方式不同。这类示例是另外调用一个 LLM，用提示词请它回答 yes 或 no，再依结果决定要重新检索、改写问题，还是重新生成。论文的做法，则是把这些判断**训练成生成模型自己会吐出的 token**，在同一次生成里完成，还能用概率加权排序。\n> \n> 两者都可以用，只是读到「Self-RAG」时，最好先确认指的是哪一种。\n\n\n## 讨论\n\n### 实验设置\n\n所有评测都是 zero-shot：只给任务说明，不附演示。\n\n- **封闭选项**：PubHealth（公共卫生事实核查）、ARC-Challenge（科学考题），看准确率。\n- **短答案**：PopQA 的长尾子集，共 1,399 题，都是维基百科页面月浏览量不到 100 的冷门实体；以及 TriviaQA-unfiltered 的 11,313 题。标准答案出现在输出中就算对。\n- **长篇生成**：人物传记用 FactScore 评事实性；ASQA 长答案问答，另外评引用的精确率与召回率。\n\n生成模型是 Llama 2 的 7B 与 13B，检索器是现成的 Contriever-MS MARCO，默认取前 5 份文档；传记与开放域问答另外加上网络搜索引擎的前 5 份。\n\n### 主要结果\n\n原论文 Table 2 比较了很多模型，这里挑出几个最能说明问题的：\n\n| 模型 | PopQA | PubHealth | 传记 FactScore | ASQA 引用精确率 |\n| --- | ---: | ---: | ---: | ---: |\n| ChatGPT | 29.3 | 70.1 | 71.8 | — |\n| ChatGPT＋检索 | 50.8 | 54.7 | — | 65.1 |\n| Llama2-chat 13B＋检索 | 51.8 | 52.1 | 79.9 | 19.8 |\n| Llama2-FT 7B＋检索 | 48.7 | 64.3 | 78.2 | 5.0 |\n| **Self-RAG 7B** | 54.9 | 72.4 | 81.2 | 66.9 |\n| **Self-RAG 13B** | 55.8 | 74.5 | 80.2 | 70.3 |\n\n*整理自原论文 Table 2。*\n\n有几件事值得看。\n\n**检索不一定有帮助**。ChatGPT 加上检索后，PopQA 从 29.3 升到 50.8，冷门知识确实需要查；但 PubHealth 反而从 70.1 掉到 54.7。这正是开场说的第一个问题：不该查的时候硬查，反而有害。\n\n**引用精确率差距最大**。一般的 RAG 基线，引用精确率大多只有个位数到两成；Self-RAG 13B 达到 70.3，甚至高于加了检索的 ChatGPT 的 65.1。引用精确率看的是：模型引用了某份文档的句子，是否真的被那份文档完整支持。\n\n**不只是训练数据的功劳**。Llama2-FT 7B 用的是和 Self-RAG 一模一样的 15 万笔指令数据，只是没有反思标记和检索文档，测试时再加上检索。除了 ASQA 的 str-em 与 ROUGE 两项略高（31.0 对 30.0、35.8 对 35.7），其余各项都落后 Self-RAG 7B。\n\n不过 Self-RAG 并没有每项都赢。在 TriviaQA 和 ARC-Challenge 上，ChatGPT 分别是 74.3 和 75.3，仍高于 Self-RAG 13B 的 69.3 和 73.1；ASQA 的正确率（str-em）与引用召回率，也是加了检索的 ChatGPT 较高。\n\n### 哪些设计有用？\n\n[![Self-RAG 分析：(a) 训练与推理的消融实验，(b) IsSup 权重对引用精确率与 MAUVE 的影响，(c) 检索门槛对准确率与检索频率的影响](/content/papers/assets/ed98a0625c59ca4eaa3a682d3fddfda9963f66ff78e56b8a320597c846caf562.png)](/content/papers/assets/ed98a0625c59ca4eaa3a682d3fddfda9963f66ff78e56b8a320597c846caf562.png)\n\n*原论文 Figure 3，取自 [**v1 PDF 第 9 页**](https://arxiv.org/pdf/2310.11511v1#page=9)，CC BY 4.0。(a) 消融实验，(b) 推理时调整权重，(c) 调整检索门槛。*\n\n**(a) 消融实验**。为了节省成本，这组实验用 5 万笔训练数据的 7B 模型，在 PopQA（PQA）、PubHealth（Med）、ASQA（AS）上测试。\n\n- 训练时拿掉评论模型（No Critic，等于每笔数据固定接一份检索文档、没有反思标记），ASQA 从 32.1 掉到 18.1。\n- 推理时不分青红皂白只用第一名文档（Retrieve top1，最像传统 RAG），PopQA 从 45.5 掉到 41.8，ASQA 掉到 28.6。\n- 完全不检索（No retrieval），PopQA 只剩 24.7；但 PubHealth 还有 73.0，几乎没变。\n\n最后一点和主结果互相呼应：PopQA 需要查，PubHealth 不太需要。\n\n**(b) 调整 IsSup 权重**。横轴是 $w^{\\text{IsSup}}$。权重调高，引用精确率上升；但流畅度指标 MAUVE 下降。作者的解释是，句子写得越长越流畅，越容易混进没有被引用完全支持的内容。这就是刚才说的「不用重新训练，就能调整模型行为」。\n\n**(c) 调整检索门槛**。门槛越高，检索频率越低。PubHealth 少查一点，准确率影响不大；PopQA 少查，准确率就明显下降。\n\n### 其他观察\n\n- **训练数据越多越好**。从 5 千笔增加到 15 万笔，PopQA 和 ASQA 的提升特别明显；作者认为再扩大数据可能还会更好。\n- **小型人工评估**。作者从 PopQA 和传记结果各抽 50 笔人工检查。模型预测的 IsRel，与人工判断的一致率分别是 95.0% 和 90.0%；IsSup 则是 90.0% 和 85.0%。\n- **推理成本**。每次检索都要并行处理多份文档、产生多个候选，再做片段层级的 beam search。作者用 vLLM 加速，但论文没有报告和传统 RAG 比较的延迟或成本，实际部署时需要自己量。\n\n## 结论\n\nSelf-RAG 把 RAG 流程中几个原本写死的决定，交还给模型自己：\n\n1. **要不要检索**：用 `Retrieve` 标记按需检索，写作题可以不查。\n2. **哪份文档有用**：用 `IsRel` 评估每份检索文档。\n3. **写的有没有根据**：用 `IsSup` 检查每一句话是否被文档支持。\n4. **整体好不好**：用 `IsUse` 评估回答的整体质量。\n\n这些标记由 GPT-4 标出、蒸馏成评论模型、再写进训练数据，最后让生成模型学会自己产生。推理时，标记的概率能组成分数，用权重调整模型的取舍，不必重新训练。\n\n在论文的实验中，7B 和 13B 的 Self-RAG 在 PopQA、PubHealth、传记与 ASQA 引用精确率上，都优于表中有报告数字的 ChatGPT 与 Llama2-chat 对照组；ChatGPT 则在 TriviaQA、ARC-Challenge 等项目仍然领先。\n\n固定检索前 $K$ 份文档，曾经是 RAG 的默认值。这篇论文提醒我们：该不该查、查到的能不能用，本身就是需要判断的事。\n","imageSizes":{"/content/papers/assets/a967fd9c8d63065a0369d6a07be24dc71bb92dab181e5083c3f13ce21c92cabb.png":{"width":1122,"height":622},"/content/papers/assets/ed98a0625c59ca4eaa3a682d3fddfda9963f66ff78e56b8a320597c846caf562.png":{"width":1122,"height":447}}}
