解密Prompt系列22. LLM Agent之RAG的反思:放棄了壓縮還是智能麼?

已經嘮了三章的RAG,是時候回頭反思一下,當前的RAG是解決幻覺的終點麼?我給不出直接的答案,不過感覺當前把RAG當作傳統搜索框架在大模型時代下的改良,這個思路的天花板高度有限~

反思來源於對RAG下模型回答的直觀感受,最初我們被ChatGPT的能力所震驚,並不是它能背誦知識,而是模型在知識壓縮後表現出的“湧現能力”,更具體到RAG所屬的問答領域,是模型能夠精準的基於上文從壓縮的參數中召回並整合相應的知識,甚至進行知識外推的能力。通俗點說它有可能生成我在任何地方都檢索不到的答案!

但RAG當前的多數使用方法,採用只讓模型基於檢索到的內容進行回答的方案,其實限制了模型自身對知識壓縮形成的智能,大模型似乎變成了文本抽取和總結潤色的工具。體驗上大模型直接回答的效果就像是學霸答題文采四溢,而RAG有時倒像是學渣開卷考試,答得小心翼翼一有不慎還會抄錯答案......

既要保證事實性,又要保留模型智能,則需要最大化的使用模型已經內化壓縮到參數中的信息,只在需要使用外部知識增強的時候再進行工具調用。看到過以下幾種方案

  1. Detection:通過前置判斷,決策模型何時需要使用外掛,在模型可以自行回答的時候,使用模型回答,當模型不能回答的時候走RAG檢索生成
  • Realtime Data:需要獲取動態世界的信息,部分場景可以通過意圖進行決策,相對好解決
  • Incorrect or Incomplete:模型不知道,或者模型推理幻覺,如何知道模型可能不知道是更難解決的問題
  1. Calibration:通過後置處理,讓模型先生成,再使用召回內容對模型回答進行修正校準和事實性檢查
  2. 兩種方案勾兌一下:高置信度判斷模型可以自行完成直接回答,中置信度先生成再校驗,低置信度直接走RAG檢索生成,或者通過意圖和場景進行決策

如何勾兌就不在這裏說了,這裏我們聊聊基礎的前置判斷和後置處理分別有哪些方案~

前置判斷-Detection

檢測模型回答存在幻覺可以通過檢索外部知識進行校驗,不過考慮生成式模型覆蓋問題的廣泛性,Self-Contradictory論文中評估chatgpt生成的回答中38.5%的內容無法通過Wiki等外部知識進行校驗

因此這裏我們先介紹一種完全基於模型自身,不依賴外部知識的幻覺判斷方案自我矛盾。後介紹一種模型直接拒絕回答的方案,和RLHF裏面的事實性原則類似,這裏是基於SFT的模型自我拒絕方案,不過個人對拒識類的方案持一定的保留意見,但不妨礙學習新思路哈哈~~

自我矛盾

第一種發現模型幻覺的方案是基於模型多次回答的不一致性來判斷模型是否在胡說八道。相似的概念在解密Prompt系列9. 模型複雜推理-思維鏈基礎和進階玩法裏面聊Self-Consistency COT時就提到過,該論文是使用多路COT推理來投票出一個最合理的推理路徑,從而提高思考的準確率。這裏只不過改變了使用的形式,通過模型多次回答的不一致來判斷模型是否出現了幻覺。有以下幾種生成模型多次回答,並度量一致性的方案

單模型推理

  • SELFCHECKGPT: Zero-Resource Black-Box Hallucination Detection for Generative Large Language Models
  • SELF-CONTRADICTORY HALLUCINATIONS OF LLMS: EVALUATION, DETECTION AND MITIGATION

對於如何度量模型隨機生成的多個回答之間的不一致性,Self-Check嘗試了包括Bert相似度計算在內的5種方法,其中效果最好的兩種分別是傳統NLI和基於大模型prompt的NLI,從推理性價比上傳統NLI有優勢,效果上LLM更好,以下是使用不同相似度計算方案來衡量模型多次隨機解碼的不一致性,並用該指標來計算模型回答是否符合事實性的AUC效果

傳統NLI推理任務,是給定前提(premise)判斷假設(hypothesis)是否成立或者矛盾。這裏論文就是使用MNLI數據訓練的Debarta-v3-Large來判斷模型生成的回答r(hypothesis),是否和其他N個採樣生成的回答(premise)相矛盾。論文分別嘗試了句子級的判斷和整個回答粒度的判斷,句子級別的效果顯著更好。

\[S_{NLI}(i) = \frac{1}{N}\sum_{n=1}^N P(contradict|r_i,S^n) \]

而基於大模型prompt,同樣是NLI任務的思路,只不過改成了自然語言指令,以下context等同於以上的 \(S^n\), sentence就是 \(r_i\), 大模型推理返回的Yes/NO會被轉化成0/1,並計算均值。

\[S_{prompt}(i) = \frac{1}{N}\sum_{n=1}^N x_i^n \,\, x \in {(0,1)} \]

SELF-Contradictory的思路很相似,方法更加複雜些,感興趣的朋友自己去看論文吧~

多模型問答

  • DeepMind LM vs LM: Detecting Factual Errors via Cross Examination
  • Improving Factuality and Reasoning in Language Models through Multiagent Debate

同樣是自我矛盾的思路,還可以通過多模型對話的方式來進行。LM VS LM採用了模型B多次反覆提問模型A的方式來生成多個回答。類似的方式也用於問卷中問題的設計,出題人會用不同的方式把一個問題問好幾遍,如果每次回答都不一樣,說明做題人對類似問題的回答是不確定的。如下圖

第一步模型A先生成回答(claim)。第二步模型B會針對cliam,從多個角度生成提問並讓模型A再次進行回答。第三步模型B會基於A的原始回答,和對多個問題的回答來判斷原始回答的正確性。以上B提問A回答的步驟,如果B判斷需要進行補充提問的話,可能會重複多次。

這裏涉及到的三個任務都是通過大模型指令來進行的,三個任務分別是:模型B基於A的cliam進行提問,模型B判斷是否繼續提問,模型B基於A的所有回答判斷claim是否正確。對應的具體prompt如下

相比上面SELF-CHECK隨機解碼生成多個答案的方案,從多角度進行提問,個人感覺更有針對性,但兩種方法都會有遺漏和誤傷。推理成本上SELF-CHECK更低,LM vs LM更高。

自我拒絕

  • R-Tuning: Teaching Large Language Models to Refuse Unknown Questions

除了通過不一致性判斷模型出現幻覺,另一種更乾脆直接的方案,是讓模型在碰到自己不確定的問題時,直接選擇拒絕回答,和RLHF中的事實性原則的是一個思路。但我對這類方案最大的疑惑是拒識能力的泛化性。究竟模型是學到了對於自身parametric knowledge置信度較低,混淆度較高的問題進行拒絕回答,還是模型背下來了對某些知識和上文語義空間進行拒絕回答。這個我也還沒想明白哈哈哈~

所以這裏我們繞過這個問題,聊一種中間策略,畢竟西醫好多疾病也沒研究明白,但病還得治不是。R-Tunning提出指令微調可能放大了模型的回答幻覺。因爲指令微調的數據集中所有問題都有答案,微調任務就是負責教會模型各種任務範式,以及在不同的任務中如何召回預訓練中學習的知識並回答問題。但我們忽略了SFT中很多任務涉及到的知識在模型預訓練中可能是沒接觸過的,但我們依舊選擇讓模型去進行回答。這種預訓練和指令微調間的不一致性,可能會進一步放大模型幻覺。

R-Tunning給出的解決方案是在構建指令微調數據集時,加入模型是否對改答案表示肯定的描述,這樣允許模型拒絕自己不確定的問題。分成2個步驟

  1. 找到模型不確定的問題,論文嘗試了兩種方案
  • R-Tuning:模型回答和標註答案不一致,適用於有標準答案的QA問題
  • R-Tuning-U:模型回答自我矛盾,這裏論文計算模型回答包含的所有答案的熵值
  1. 構建允許模型拒絕的指令數據集,論文也嘗試了以下兩種prompt指令模板
  • R-Tuning:"Q:{Question},A:{Answer}.{Propmt}.",其中prompt是Are you sure you accurately answered the question based on your internal knowledge:對於上面模型確定的問題加上I am sure,不確定的問題加上I am not sure
  • R-Tuning-R: 對於確定給的問題使用"Q:{Question},A:{Answer}",對於不確定的問題用I am not sure 的各種相似表達來直接替換Answer

然後使用以上加入模型不確定性表達的數據集進行指令微調即可。在我們的使用場景中R-Tunning-R這種直接拒絕的方案更加合適,畢竟我傾向於指令微調的核心並不是知識注入,而是任務對齊,所以模型只要學習到對於自己不確定的問題選擇拒絕回答即可。在論文驗證的MMLU等數據集上這種拒絕微調方案有一定的領域外的泛化效果,不過這些數據集和我們的使用場景相差很大,具體效果要等測試後才知道了。

後處理:Calibration Method

和Detection相反,Calibration把重心放在模型回答的後處理上。也就是先不做判斷直接使用模型生成回答,再調用工具對回答進行校驗和修改。這裏我們介紹谷歌和微軟提出的幾種方案。不同方案對於如何後處理,和調用哪些工具進行後處理存在差異,不過整體流程都和下圖相似:模型生成 -> 召回相關知識 -> 對生成結果進行校驗和修復

指令方案

  • RARR: Researching and Revising What Language Models Say, Using Language Models
  • CRITIC: LARGE LANGUAGE MODELS CAN SELFCORRECT WITH TOOL-INTERACTIVE CRITIQUING

基礎方案是RARR提出的Research-then-revise框架,整個流程分爲以下幾個步驟

Generation Stage,先讓LLM直接生成問題回答X

Research Stage,用於收集可以校驗回答的事實性證據。針對X使用Few-shot-prompt, 生成用來校驗X的多個搜索問題,每個問題分別進行谷歌搜索並召回Top5內容。這裏論文沒有使用搜索自帶的snippet,而是對網頁內容進行分塊(每4個句子一塊),並使用T5-Encoder計算每個chunk和query的相似度保留top-J個內容塊。這裏會得到一個(Q1,chunk1)(Q1,chunk2),(Q2,chunk1),.....的(問題,事實)列表

**Revise Stage,獲取所有檢索到的事實之後,進入校驗階段。**論文會遍歷以上列表,針對每一個問題,分別先使用few-shot-cot判斷每個事實和模型回答X之間是否是一致的(agreement model如下)。如果一致則遍歷下一個,如果不一致則使用few-shot-prompt讓大模型基於事實+問題對模型回答進行修改(revision model如下)。論文在修改回答時,會先定位原始回答X中哪個span和事實不符再進行修改,從而避免大幅修改原始回答

評估部分,後處理方案需要兼顧對模型原始回答的保留和事實性,這裏RARR提出了兩個指標:

  • Attribution Score計算歸因得分,既給定所有事實,修改後回答Y中每個句子和所有事實的最大NLI打分的平均值,既整體回答能獲得事實性支撐的平均概率
  • Preservation score計算保留率,由回答原始意圖的保留概率 * 前後答案的未改變率(編輯距離度量)得到

RARR最大的問題在於效率,一部分是大模型的推理效率,一方面是最後的Revise部分採用了串行修改,這部分在後面的微調方案中會有改良

另一篇論文CRITIC提出的verify-then-correct和RARR非常相似,只不過在不同的任務上嘗試使用了不同的外部工具進行校驗。在開放問答上使用搜索,在代碼問題就用代碼解釋器,並未涉及動態的工具選擇,只是在不同數據集上固定選用不同的工具,這裏就不展開說啦,感興趣的盆友自己去看論文吧~

微調方案

  • PURR: Efficiently Editing Language Model Hallucinations by Denoising Language Model Corruptions
  • Check Your Facts and Try Again: Improving Large Language Models with External Knowledge and Automated Feedback
  • Fusion-in-decoder: Leveraging Passage Retrieval with Generative Models for Open Domain Question Answering

PURR針對RARR的效率問題進行了優化,使用的是大模型能力通過數據蒸餾到小模型的方案,也就是把上面最耗時的Revise部分使用T5-large模型來實現,query生成的部分也用T5-large來實現,並且把串行修改的方案優化爲了所有事實進行一次性融合修改。

論文的核心就在於如何使用大模型來構建用於事實性修改的T5模型。論文使用了corrput的方案,也就是把正確的回答,人爲進行破壞構造幻覺,再訓練模型進行還原,具體包含以下幾個步驟

  1. 生成正確的回答:整理了來自各個領域和話題的6000個種子問題,每個問題調用搜索引擎獲取TopN網頁,並進行chunking分段,使用和上面RARR相同的T5-Encoder計算每個段落和Q的相似度,閾值以上的爲positive evidence(\(E^+\))這裏限制最多4條,其餘閾值以下的爲negative evidence(\(E^-\))。然後使用zero-shot-prompt來讓大模型基於\(E^+\)生成多文檔總結,作爲正確的回答Y。
  2. 對回答添加噪聲:同樣使用大模型基於2shot-cot-prompt,來對以上獲得的正確答案進行破壞,指令要求大模型先生成修改方案,再對回答進行魔改。魔改包括但不限於魔改實體,魔改語義關係,魔改語法等等,這裏論文使用了text-davinci-003,指令和效果如下圖

  1. 訓練T5:微調使用\(E^+\)的事實和添加噪聲的回答作爲輸入,模型目標是把噪聲回答修復成正確答案。這裏如果\(E^+\)不足4條的會隨機採樣\(E^-\)這樣可以提高模型對噪聲事實的識別能力。值得說一下的是這裏多個事實並非採用拼接的形式進行融合,而是使用Fusion-in-decoder的形式在encoder層編碼後進行拼接,再進入Decoder。

效果上PURR對比RARR,對模型原始回答有更高的保有率(Pres),以及更高的平均歸因率(Attr)。

但整體上後處理相關的論文,和實際應用中模型回答的錯誤的五花八門相比,還是簡化了太多。在實際應用中使用這類後處理的修復邏輯,感覺還有很多需要踩的坑。Anyway都是明年要解決的問題啦哈哈哈哈哈!新年快樂呀盆友們~

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章