讓你的RAG應(yīng)用更加智能!引入自我反思的大模型 RAG 框架(Self-RAG) 原創(chuàng)
Self-RAG 出現(xiàn)的背景
經(jīng)典的RAG模型通過提供與問題相關(guān)的上下文信息來支持LLM在回答知識密集型問題。然而,這種方法存在兩個(gè)主要問題:
- 過度檢索:RAG系統(tǒng)并不針對用戶意圖進(jìn)行精細(xì)的判斷,而是對每次輸入都執(zhí)行top-k的知識檢索,可能導(dǎo)致引入不必要或偏離主題的信息,從而影響輸出的質(zhì)量。例如,當(dāng)用戶僅是打招呼時(shí)(如 "hello"),理想的做法是直接利用LLM的能力來回答,而不需要查詢知識庫
- 輸出一致性問題:無法百分百確定回答的內(nèi)容就是完全參考檢索到的上下文還是來自模型自己的生成,因?yàn)榇竽P捅旧聿荒鼙WC絕對的遵循,更何況知識的相關(guān)性也會(huì)存疑。
在實(shí)際應(yīng)用RAG時(shí),我們常常通過精細(xì)化的工作流程設(shè)計(jì)和創(chuàng)新性的Prompt調(diào)整來盡量緩解上述問題。具體來說:
- 我們可以利用LLM的能力,在執(zhí)行檢索步驟之前先判斷是否真的需要進(jìn)行檢索。
- 在給出Prompt指令時(shí),我們可以確保LLM嚴(yán)格按照找到的參考知識來形成答案。
- 我們還可能依賴LLM的強(qiáng)大能力對答案進(jìn)行評估,經(jīng)過多輪迭代優(yōu)化,以提升答案的質(zhì)量。
然而這些方案往往比較復(fù)雜,并可能引入一些難以控制的潛在問題。Self-RAG則是另一種解決這些挑戰(zhàn)的方案。
什么是Self-RAG
Self-RAG是由來自華盛頓大學(xué)、IBM人工智能研究院等機(jī)構(gòu)技術(shù)專家提出的一種增強(qiáng)的RAG范式, Self-RAG 的論文地址可以看SELF-RAG: LEARNING TO RETRIEVE, GENERATE, AND CRITIQUE THROUGH SELF-REFLECTION。它主要是在模型層面的微調(diào),讓大模型本身直接具備了判斷按需檢索與自我評判的能力,并進(jìn)而通過與應(yīng)用層的配合,達(dá)到提升生成準(zhǔn)確性與質(zhì)量的問題。Self-RAG的運(yùn)作流程如下:
基本流程
Self-RAG的基本工作流程用網(wǎng)上的這張圖進(jìn)行說明:
從圖上我們可以看出Self-RAG相比經(jīng)典RAG有以下幾點(diǎn)不同:
- 按需檢索
- 如果無需檢索(比如”hello“),則由模型直接生成
- 如果需要檢索(比如”what is new features of iphone15“),則執(zhí)行檢索
- 并行生成:使用檢索出的K個(gè)相關(guān)知識與輸入問題組裝Prompt,并行生成K個(gè)輸出。而傳統(tǒng)的RAG則是把K個(gè)知識一起和輸入問題組成Prompt只生成1個(gè)輸出。
- 評估和選擇:先對生成的多個(gè)響應(yīng)進(jìn)行評分,然后選擇上一步其中一個(gè)響應(yīng)作為輸出
仔細(xì)研究上面的流程可以看出,有兩個(gè)環(huán)節(jié)需要借助LLM進(jìn)行評判:
- 用戶的問題是否需要進(jìn)行知識檢索
- 如果進(jìn)行檢索,如何對多個(gè)輸出計(jì)算評分
那么我們應(yīng)該如何進(jìn)行評判呢?常規(guī)的方式是借助LLM與Prompt來判斷,這種方式的好處是完全在應(yīng)用層實(shí)現(xiàn),但缺點(diǎn)是:
- 過多的LLM交互會(huì)帶來響應(yīng)性能下降與tokens成本升高
- 生成的評判指標(biāo)只能定性的判斷,難以量化
Self-RAG采用了一種不同的方法:通過微調(diào)訓(xùn)練LLM,讓LLM在推理過程中實(shí)現(xiàn)自我反省,直接輸出一些特殊的Tokens,一般稱之為“Reflection Token”。我們可以利用這些特殊的Token來進(jìn)行不同的操作。下面我們會(huì)對上面需要LLM進(jìn)行評判的兩個(gè)環(huán)節(jié)做詳細(xì)說明。
按需檢索
Self-RAG 開始使用 LLM 對問題進(jìn)行生成時(shí),會(huì)輸出 ??Retrieve?
?類型的 Reflection Token。Reflection Token有三種可能的值,分別代表不同的行動(dòng)指示:
- "Retrieval":表示需要查找更多相關(guān)信息。
- "No Retrieval":表示無需進(jìn)一步檢索,模型應(yīng)該根據(jù)已有的知識或信息回答問題。
- "Continue to Use Evidence":表示模型應(yīng)繼續(xù)利用先前檢索到的信息進(jìn)行問題的解答。
來看幾個(gè)例子,首先是一個(gè)不需要檢索的例子:
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]......
在返回結(jié)果中我們可以看到包含了??[No Retrieval]?
?關(guān)鍵字,表示這個(gè)問題不需要檢索,可以直接返回結(jié)果。
我們再問一個(gè)需要檢索的問題:
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]
在返回結(jié)果中我們可以看到包含了??[Retrieval]<paragraph>?
? 關(guān)鍵字,表示這個(gè)問題需要補(bǔ)充外部知識,即需要檢索。
在沒有Self-RAG之前,我們可以首先使用 LLM(Language Model)確定查詢問題是否需要檢索。如果無需檢索,那么直接用 LLM 生成最終答案。這種方式的一個(gè)缺點(diǎn)是,如果查詢問題實(shí)際上不需要檢索,那么標(biāo)準(zhǔn)的 RAG 模型將需要進(jìn)行兩次 LLM 調(diào)用。而 Self-RAG 模型則更高效,即便在此類情況下也只需調(diào)用一次 LLM??梢钥吹皆诓恍枰獧z索的這個(gè)分支上,Self-RAG的效率更高。
檢索和生成
在這個(gè)階段,Self-RAG LLM會(huì)生成三種類型的Reflection Token:
- IsREL: 檢查檢索到的文檔是否為查詢提供了有用信息,值為?
?[Relevant]?
?和??[Irrelevant]?
?表示相關(guān)性。 - IsSUP:檢查檢索到的文檔是否都為生成的答案提供了支持,它的值有?
?[Fully supported]?
?,??[Partially supported]?
?,??[No support / Contradictory]?
?,表示支持的程度 - IsUSE: 表示生成的答案是否對查詢有幫助,值[Utility:5]?
?、?
?[Utility:4]??、?
?[Utility:3]??、?
?[Utility:2]??、?
?[Utility:1]`,表示答案的質(zhì)量,數(shù)字越大表示質(zhì)量越高,表示答案的質(zhì)量,數(shù)字越高表示質(zhì)量越高。
我們來看下 Self-RAG 在這個(gè)階段的生成結(jié)果,問題和輸出結(jié)果示例如下:
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]
可以看到,在每個(gè)生成結(jié)果中,基本上都包含了以上 3 種 Reflection Token,這些 Token 會(huì)在后面的評估階段進(jìn)行使用,評估得分最高的文檔被選作最終結(jié)果。
評估算法
我們看到的標(biāo)記tokens并非量化指標(biāo),因此這里需要借助到LLM推理輸出結(jié)果的一個(gè)字段:logprobs(對數(shù)),我們來了解一下這個(gè)字段和相對應(yīng)的算法。
LLM的工作方式是通過連續(xù)預(yù)測并生成token,直到整個(gè)文本生成完畢。它并不是事先確定下一個(gè)token,而是通過復(fù)雜的計(jì)算和神經(jīng)網(wǎng)絡(luò)處理來推測下一個(gè)可能的詞元。輸出結(jié)果是一個(gè)包含多個(gè)可能詞元及其相應(yīng)概率的列表,從中LLM選擇概率最高的詞元進(jìn)行輸出??梢詤⒖枷聢D簡單理解下:
LLM最后從多個(gè)候選tokens中選擇“機(jī)器”這個(gè)詞輸出,并將其附加到輸入提示,進(jìn)入下一次生成。而logprobs就是用來保存這里每一步預(yù)測時(shí)的多個(gè)可能的token概率(取對數(shù),所以叫對數(shù)概率).
我們再來看下 OpenAI API 返回的一個(gè)結(jié)果示例:
{
"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
}
}
在這個(gè)示例中,logprobs 參數(shù)的輸出如下:
- tokens:生成的 token 列表 [" I’m", " good", ",", " thanks", "!"]
- token_logprobs:每個(gè)生成的 token 的對數(shù)概率值 [-0.1, -0.05, -0.2, -0.3, -0.15]
- top_logprobs:每個(gè)生成的 token 的前幾名候選 token 的對數(shù)概率值及其對應(yīng)的 token,例如第一個(gè) token?
?I’m?
?的前幾名候選 token 及其對數(shù)概率值為??{" I’m": -0.1, " I am": -2.3, " I": -3.1}?
? - text_offset:每個(gè) token 在生成文本中的偏移量 [5, 9, 14, 15, 21]
在Self-RAG中,評估函數(shù)使用logprobs參數(shù)來計(jì)算IsREL、IsSUP和IsUSE反射標(biāo)記的分?jǐn)?shù)。這里給出計(jì)算公式,數(shù)學(xué)不好的可以跳過:
- 知識相關(guān)度:s(ISREL) = p(ISREL = RELEVANT) / (p(ISREL = RELEVANT) + p(ISREL = IRRELEVANT)),即用“relevant”token的概率占本類型兩種token的概率和的比例
- 響應(yīng)支持度:s(ISSUP) = p(ISSUP = FULLY) / S + 0.5 * p(ISSUP = PARTIALLY) / S,即用“fully supported”token的概率占本類型三種類型token概率和的比例,加上“partially supported”token的概率所占比例。但后者要乘以權(quán)重0.5
- 響應(yīng)有效性:s(ISUSE) = (∑i wi * p(ISUSE = i)) / S,用本類型的5種類型token的概率占總概率的比例乘以對應(yīng)的權(quán)重(分別為從-1到1不等),然后求和
好了,Self-RAG 基本的原理就先分享到這,下一篇文章會(huì)分享如何實(shí)現(xiàn)一個(gè)真正的Self-RAG應(yīng)用。
本文轉(zhuǎn)載自公眾號AI 博物院 作者:longyunfeigu
原文鏈接:??https://mp.weixin.qq.com/s/8A6SSjAx07KBDFKmENvjxA??
