{"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-hant","path":"/content/papers/zh-hant/retrieval-augmented-generation/self-rag.96a29de61e5e.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}}}
