讓你的RAG應用更加智能!引入自我反思的大模型 RAG 框架(Self-RAG) 原創
Self-RAG 出現的背景
經典的RAG模型通過提供與問題相關的上下文信息來支持LLM在回答知識密集型問題。然而,這種方法存在兩個主要問題:
- 過度檢索:RAG系統并不針對用戶意圖進行精細的判斷,而是對每次輸入都執行top-k的知識檢索,可能導致引入不必要或偏離主題的信息,從而影響輸出的質量。例如,當用戶僅是打招呼時(如 "hello"),理想的做法是直接利用LLM的能力來回答,而不需要查詢知識庫
- 輸出一致性問題:無法百分百確定回答的內容就是完全參考檢索到的上下文還是來自模型自己的生成,因為大模型本身不能保證絕對的遵循,更何況知識的相關性也會存疑。
在實際應用RAG時,我們常常通過精細化的工作流程設計和創新性的Prompt調整來盡量緩解上述問題。具體來說:
- 我們可以利用LLM的能力,在執行檢索步驟之前先判斷是否真的需要進行檢索。
- 在給出Prompt指令時,我們可以確保LLM嚴格按照找到的參考知識來形成答案。
- 我們還可能依賴LLM的強大能力對答案進行評估,經過多輪迭代優化,以提升答案的質量。
然而這些方案往往比較復雜,并可能引入一些難以控制的潛在問題。Self-RAG則是另一種解決這些挑戰的方案。
什么是Self-RAG
Self-RAG是由來自華盛頓大學、IBM人工智能研究院等機構技術專家提出的一種增強的RAG范式, Self-RAG 的論文地址可以看SELF-RAG: LEARNING TO RETRIEVE, GENERATE, AND CRITIQUE THROUGH SELF-REFLECTION。它主要是在模型層面的微調,讓大模型本身直接具備了判斷按需檢索與自我評判的能力,并進而通過與應用層的配合,達到提升生成準確性與質量的問題。Self-RAG的運作流程如下:

基本流程
Self-RAG的基本工作流程用網上的這張圖進行說明:

從圖上我們可以看出Self-RAG相比經典RAG有以下幾點不同:
- 按需檢索
- 如果無需檢索(比如”hello“),則由模型直接生成
- 如果需要檢索(比如”what is new features of iphone15“),則執行檢索
- 并行生成:使用檢索出的K個相關知識與輸入問題組裝Prompt,并行生成K個輸出。而傳統的RAG則是把K個知識一起和輸入問題組成Prompt只生成1個輸出。
- 評估和選擇:先對生成的多個響應進行評分,然后選擇上一步其中一個響應作為輸出
仔細研究上面的流程可以看出,有兩個環節需要借助LLM進行評判:
- 用戶的問題是否需要進行知識檢索
- 如果進行檢索,如何對多個輸出計算評分
那么我們應該如何進行評判呢?常規的方式是借助LLM與Prompt來判斷,這種方式的好處是完全在應用層實現,但缺點是:
- 過多的LLM交互會帶來響應性能下降與tokens成本升高
- 生成的評判指標只能定性的判斷,難以量化
Self-RAG采用了一種不同的方法:通過微調訓練LLM,讓LLM在推理過程中實現自我反省,直接輸出一些特殊的Tokens,一般稱之為“Reflection Token”。我們可以利用這些特殊的Token來進行不同的操作。下面我們會對上面需要LLM進行評判的兩個環節做詳細說明。
按需檢索
Self-RAG 開始使用 LLM 對問題進行生成時,會輸出 ??Retrieve??類型的 Reflection Token。Reflection Token有三種可能的值,分別代表不同的行動指示:
- "Retrieval":表示需要查找更多相關信息。
- "No Retrieval":表示無需進一步檢索,模型應該根據已有的知識或信息回答問題。
- "Continue to Use Evidence":表示模型應繼續利用先前檢索到的信息進行問題的解答。
來看幾個例子,首先是一個不需要檢索的例子:
Question: Write a essay of your best summer vacation.
Answer: Sure![No Retrieval]As an AI, I don't have personal experiences or memories, but I can write about the importance and significance of summer vacations for individuals and families.[No Retrieval]......在返回結果中我們可以看到包含了??[No Retrieval]??關鍵字,表示這個問題不需要檢索,可以直接返回結果。
我們再問一個需要檢索的問題:
Question: How did US statues get their names?
Answer: A number of them.[Retrieval]<paragraph>[Irrelevant]Some were named for the people who originally sponsored them, some were named for events or issues that they represented, and some were named for mythological figures.[Utility:4]在返回結果中我們可以看到包含了??[Retrieval]<paragraph>?? 關鍵字,表示這個問題需要補充外部知識,即需要檢索。
在沒有Self-RAG之前,我們可以首先使用 LLM(Language Model)確定查詢問題是否需要檢索。如果無需檢索,那么直接用 LLM 生成最終答案。這種方式的一個缺點是,如果查詢問題實際上不需要檢索,那么標準的 RAG 模型將需要進行兩次 LLM 調用。而 Self-RAG 模型則更高效,即便在此類情況下也只需調用一次 LLM。可以看到在不需要檢索的這個分支上,Self-RAG的效率更高。
檢索和生成
在這個階段,Self-RAG LLM會生成三種類型的Reflection Token:
- IsREL: 檢查檢索到的文檔是否為查詢提供了有用信息,值為?
?[Relevant]??和??[Irrelevant]??表示相關性。 - IsSUP:檢查檢索到的文檔是否都為生成的答案提供了支持,它的值有?
?[Fully supported]??,??[Partially supported]??,??[No support / Contradictory]??,表示支持的程度 - IsUSE: 表示生成的答案是否對查詢有幫助,值[Utility:5]?
?、??[Utility:4]??、??[Utility:3]??、??[Utility:2]??、??[Utility:1]`,表示答案的質量,數字越大表示質量越高,表示答案的質量,數字越高表示質量越高。

我們來看下 Self-RAG 在這個階段的生成結果,問題和輸出結果示例如下:
Question: What mysterious object did Loki use in his attempt to conquer Earth?
Answer1: [Relevant]The mysterious object that Loki used in his attempt to conquer Earth was the Tesseract, which is a powerful energy source of unknown potential.[Fully supported][Utility:5]
Answer2: [Relevant]Thanos used the Time Stone to dodge Loki's attack.[No support / Contradictory][Utility:5]可以看到,在每個生成結果中,基本上都包含了以上 3 種 Reflection Token,這些 Token 會在后面的評估階段進行使用,評估得分最高的文檔被選作最終結果。
評估算法
我們看到的標記tokens并非量化指標,因此這里需要借助到LLM推理輸出結果的一個字段:logprobs(對數),我們來了解一下這個字段和相對應的算法。
LLM的工作方式是通過連續預測并生成token,直到整個文本生成完畢。它并不是事先確定下一個token,而是通過復雜的計算和神經網絡處理來推測下一個可能的詞元。輸出結果是一個包含多個可能詞元及其相應概率的列表,從中LLM選擇概率最高的詞元進行輸出。可以參考下圖簡單理解下:

LLM最后從多個候選tokens中選擇“機器”這個詞輸出,并將其附加到輸入提示,進入下一次生成。而logprobs就是用來保存這里每一步預測時的多個可能的token概率(取對數,所以叫對數概率).
我們再來看下 OpenAI API 返回的一個結果示例:
{
"id": "copl-6yE4TGqItUpYJ6xYcIzY6",
"object": "text_completion",
"created": 1723073722,
"model": "davinci",
"choices": [
{
"text": " I'm good, thanks!",
"index": 0,
"logprobs": {
"tokens": [" I'm", " good", ",", " thanks", "!"],
"token_logprobs": [-0.1, -0.05, -0.2, -0.3, -0.15],
"top_logprobs": [
{
" I'm": -0.1,
" I am": -2.3,
" I": -3.1
},
{
" good": -0.05,
" fine": -1.5,
" great": -2.0
},
{
",": -0.2,
".": -2.5,
"!": -3.0
},
{
" thanks": -0.3,
" thank you": -1.8,
" thank": -2.6
},
{
"!": -0.15,
".": -1.9,
"?": -2.7
}
],
"text_offset": [5, 9, 14, 15, 21]
},
"finish_reason": "length"
}
],
"usage": {
"prompt_tokens": 5,
"completion_tokens": 5,
"total_tokens": 10
}
}在這個示例中,logprobs 參數的輸出如下:
- tokens:生成的 token 列表 [" I’m", " good", ",", " thanks", "!"]
- token_logprobs:每個生成的 token 的對數概率值 [-0.1, -0.05, -0.2, -0.3, -0.15]
- top_logprobs:每個生成的 token 的前幾名候選 token 的對數概率值及其對應的 token,例如第一個 token?
?I’m??的前幾名候選 token 及其對數概率值為??{" I’m": -0.1, " I am": -2.3, " I": -3.1}?? - text_offset:每個 token 在生成文本中的偏移量 [5, 9, 14, 15, 21]
在Self-RAG中,評估函數使用logprobs參數來計算IsREL、IsSUP和IsUSE反射標記的分數。這里給出計算公式,數學不好的可以跳過:
- 知識相關度:s(ISREL) = p(ISREL = RELEVANT) / (p(ISREL = RELEVANT) + p(ISREL = IRRELEVANT)),即用“relevant”token的概率占本類型兩種token的概率和的比例
- 響應支持度:s(ISSUP) = p(ISSUP = FULLY) / S + 0.5 * p(ISSUP = PARTIALLY) / S,即用“fully supported”token的概率占本類型三種類型token概率和的比例,加上“partially supported”token的概率所占比例。但后者要乘以權重0.5
- 響應有效性:s(ISUSE) = (∑i wi * p(ISUSE = i)) / S,用本類型的5種類型token的概率占總概率的比例乘以對應的權重(分別為從-1到1不等),然后求和
好了,Self-RAG 基本的原理就先分享到這,下一篇文章會分享如何實現一個真正的Self-RAG應用。
本文轉載自公眾號AI 博物院 作者:longyunfeigu
原文鏈接:??https://mp.weixin.qq.com/s/8A6SSjAx07KBDFKmENvjxA??

















