解密Prompt系列37. RAG之前置決策何時聯網的多種策略

风雨中的小七發表於2024-09-03

之前我們分別討論過RAG中的召回多樣性,召回資訊質量和密度,還有calibration的後處理型RAG。前置判斷模型回答是否要走RAG的部分我們之前只提及了自我矛盾和自我拒絕者兩個方案。這一章我們再補充幾種RAG前置判斷方案

每種方案我們會挑1篇論文並主要關注論文中檢索決策相關的部分,方案包括微調模型來決策,基於模型回答置信度判斷,基於問題KNN判斷,以及使用小模型代理回答等方案。各類方案分類彙總在本文末尾~

模型微調

  • SELF-RAG: LEARNING TO RETRIEVE, GENERATE, AND CRITIQUE THROUGH SELF-REFLECTION
  • When to Retrieve: Teaching LLMs to Utilize Information Retrieval Effectively

SELF-RAG是基於微調,來動態判斷下一個文字段是否需要進行RAG的方案。論文定義瞭如下4種和RAG相關的反思特殊字元

image

這裡我們核心關注的就是【Retrieve】字元,負責決策下一句推理前是否要進行檢索增強的。
既然是微調方案,那就核心說一下有【Retrieve】標籤和檢索內容的訓練樣本是如何構造的,樣本格式如下,

image

為了得到上面Interleave的樣本, 其實可以直接使用GPT4進行標註,只不過論文考慮GPT4的推理成本太高,因此基於GPT4標註的4K樣本,微調了Llama2-7B的模型,然後使用7B的Critic模型標註了更大量級的20K樣本用於訓練Generator。我們來看下Interleave樣本的標註流程,以及【Retrieve】標籤標註的相關Prompt,基於原始資料輸入輸出,對輸出部分進行以下操作

  • Critic先基於Input判斷是否需要檢索,如果預測【Retrieve=NO】則只判斷Output【IsUse】,GPT4的標註prompt如下

image

  • 如果Critic判斷Input需要檢索,則輸出【Retrieve=YES】並插入到Ouput的句首,再基於Input和Output進行內容檢索

  • 得到檢索內容後,對Ouput進行分句,每句話都基於輸入,前一句推理,和最初的檢索內容來聯合判斷本句話是否需要補充資訊檢索,如果需要則在句首插入【Retrieve=YES】,否則插入【Retrieve=NO】,GPT4的標註prompt如下

image

  • 如果【Retrieve=YES】,則使用輸入和前一句推理進行補充資訊檢索,並對每一個檢索到的內容分別預測【IsSUP】和【IsREL】,保留分數最高的【IsREL=Relevant】和【IsSUP=Fully Supported/Partially Supported】的檢索內容,並把該檢索到內容作為段落插入到【Retrieve】後面

  • 最後在句尾判斷推理內容的【IsUSE】

基於以上標註樣本直接訓練Generator,需要先把特殊字元擴充進模型詞表,然後在訓練過程中計算損失函式時MASK掉檢索內容。這樣模型可以在推理過程中直接解碼生成以上四種特殊字元,並基於字元決定是否檢索,是否使用檢索內容等等。

模型回答置信度

  • FLARE: Active Retrieval Augmented Generation

這裡的FLARE的全稱是Forward-Looking Active REtrieval augmentation,也就是在模型每推理完一句話,讓模型判斷下一句話是否需要使用RAG,如果需要則生成檢索query,搜尋內容,並基於前面已經推理出的內容,使用者提問和新檢索到的內容,進行繼續推理。

這裡不細說這個動態按句子粒度進行RAG的框架,而是關注每一步要如何判斷是否使用RAG。論文嘗試了兩種方案:

  • Instruct:和ToolFormer相似,每推理完一句,prompt指令會讓模型生成新的Seach(query)命令。論文發現這種基於prompt+few-shot指令的RAG決策方案效果並不好。

image

  • Confidence:每一句都讓模型先直接進行推理,然後基於模型推理的置信度來判斷是否需要進行檢索,然後基於檢索內容來對句子進行重新推理生成。這裡推理置信度使用模型推理句子中每個token的生成機率是否都超過閾值,如果都超過閾值,則保留模型推理生成的句子,否則去做檢索生成。

如果基於置信度判斷模型對答案不確定,需要進行檢索的話。論文給出了兩個生成搜尋query的方案:

  • mask sentence:直接把上面模型推理生成的句子中機率小於閾值的token刪掉,然後使用剩餘的token作為query進行檢索。對低閾值token進行掩碼是為了避免錯誤回答影響檢索質量。例如使用者提問哪些國家發生過嚴重經濟危機,模型回答了“法國發生過經濟危機”,其中法國的機率低於閾值,這時如果不刪掉法國,則檢索重心會從經濟危機而像法國偏離,導致檢索不到有效內容。但對於整體機率都很低的句子,掩碼方案可能導致最後沒有有效token去進行檢索。
  • generate question:除了掩碼,論文還提供了query生成方案,把句子中機率小於閾值的每個span,都透過大模型指令來生成檢索query,如下圖

image

論文對比了,基於下一句推理置信度進行動態RAG的方案(FLARE),基於固定長度的歷史token進行召回,基於固定歷史單句話進行召回,FLARE的效果都要更好,主要體現在兩個部分

  • 使用歷史句子,不如使用模型下一句推理的句子更能反映模型意圖
  • 動態RAG相比固定進行召回能更有效的利用內部和外部知識

小模型代理回答

  • Small Models, Big Insights: Leveraging Slim Proxy Models to Decide When and What to Retrieve for LLMs

百川論文中採用了讓小模型,這裡是Llama2-7B對使用者提問進行回答(Heurisitic Answer),然後使用Judgement Model對問題和模型回答進行綜合判斷,最終輸出是否需要進行檢索的標籤。如果需要檢索,再走RAG流程,讓Llama-70B進行最終的問題回答。

其中Judgement模型的輸入如下

image

那核心其實就在Judgement模型的訓練資料構建,這裡論文在已有QA資料集上構建了樣本,資料集構成如下。

image

這裡論文只使用了真實答案較短的樣本,透過計算答案和小模型回答之間的匹配率來給樣本打標,匹配率高(回答質量高)為正否則為負,然後使用該樣本集來微調Judgement模型,這裡也是llama2-7B。

論文並沒有給出對Judgement模型更多的分析,例如哪些回答會被判定為模型知道,哪些回答會被判定為不知道。個人其實是有些困惑,只基於模型回答學出來的JudgeMent Model,究竟學到了哪些特徵。但是使用更小的模型作為Proxy模型進行預推理的思路可以借鑑,雖然可能存在大模型和小模型知識空間不同的問題,但主觀感受是小模型的知識空間更大可能是大模型的子集,所以問題不會太大。

問題最近鄰判別

  • SKR-KNN: Self-Knowledge Guided Retrieval Augmentation for Large Language Models

論文嘗試了多種判斷模型是否知道該問題答案的方案,包括直接問模型“你知道不?”,帶上few-shot再問“你知道不?”以及小模型二分類,但是最後驗證比較靠譜的還是基於問題的最近鄰進行判別的KNN方案。哈哈放在最後壓軸,因為這是我個人偏好的方案的一部分,具體實施包括兩個步驟

第一步構建KNN樣本集,論文使用了TabularQA和CommonsenseQA資料集,每個問題分別讓模型自己回答,以及使用向量檢索召回Wiki後保留Topk上文讓模型基於上文進行回答。然後透過對比兩個回答和真實答案的Exact Match的區別,來判斷對於該問題,模型到底知道還是不知道,這一步稱之為收集SELF-KNOWLEDGE。

這裡QA問題其實是對真實場景的簡化,真實世界的問題多是開放問答,沒有正確唯一的答案,這個時候要收集訓練集,判斷模型究竟是基於內化知識回答更好,還是加上RAG檢索增強回答效果更好,我想到的是可以藉助RM,或者一些JudgeLM的效果打分來實現。

第二步就是基於樣本集對新問題進行判別,論文簡單使用了SimCES等向量,對新問題和樣本集內的問題進行編碼,每個問題都檢索醉相思的K個問題,然後基於這K個問題的標籤【知道 vs 不知道】來決定新問題要不要走RAG檢索。

論文只評估了KNN的效果會優於Bert分類,大模型prompt等等,但其實除了效果,個人看好這個方案的原因是KNN可以實時擴充套件,可以持續基於線上問題的回答效果,補充正負樣本集,進行增量更新。不過KNN的一個問題在於部分問題的相關性無法透過通用的語義相似度來識別,例如問題的複雜程度和通用語義是無關的,這個我們下一章會提到。

這裡也順便提一嘴,論文還嘗試了讓大模型自己回答它是否知道該問題的這個方案,論文嘗試了以下幾種prompt。畢竟個人認為是否走RAG的判斷並非是單一策略,而是多個策略組合,基於大模型Prompt的方案也是其中之一,可能不會像論文這樣直接使用,這樣的推理成本太高,但可以和使用者的提問進行合併使用。這樣能回答直接回答,不能回答或者以上其他策略判斷模型不知道,再走RAG。

image

總結

最後讓我們把兩章提及RAG前置檢索決策的方案做下簡單的分類

  • 基於輸入
    • 無監督分類:基於歷史問題使用KNN最近鄰判
    • 有監督分類:微調模型去判斷什麼時候需要檢索
    • Verbose:基於指令讓模型自己回答該問題否需要檢索
    • RLHF: 透過對齊讓模型自我判斷並拒絕
  • 基於輸入和輸出(輸出可以是完整回答,也可以是下一句推理)
    • Verbose: 讓模型先回答,再用指令讓模型基於問題和回答一起判斷是否需要檢索
    • Contradicotry: 基於單模型,多模型回答的矛盾來判斷模型是否可能不知道
    • Confidence 基於模型回答的熵值
  • 更多細節最佳化
    • Decompose:對原始提問進行角度拆分和分別判斷,也可以分句進行動態檢索
    • Proxy:基於輸入和輸出的判斷,可以使用小模型作為代理模型,來最佳化推理速度

想看更全的大模型相關論文梳理·微調及預訓練資料和框架·AIGC應用,移步Github >> DecryPrompt

相關文章