大模型幻覺的起因、評估及落地場景下基于知識圖譜的緩解策略探索
針對大模型落地應用的問題,當前行業內普遍的做法是利用大模型進行問答,但在實際應用中,這種方法往往效果不佳,很多問題的答案并不具有實際參考價值。作為算法人員,我們需要深入了解問題的來源,對于大模型產生的幻覺問題,我們需要明確其定義,是主觀的還是客觀的,并探討如何給出一個可執行的解決方案。在業務應用中,除了提供答案,我們還需給出一個概率值來評估答案的可靠性。此外,關于圖譜技術,雖然現在有一種觀點認為圖譜已經過時,但實際上圖譜和大模型之間存在一些結合點,我將這些結合點總結為若干條策略,這些策略可以幫助我們更好地將大模型和圖譜技術結合應用。
一、大模型用于行業問答的實現和挑戰
首先,讓我們深入探討大模型行業問答的實現和挑戰。
1、大模型在知識管理中的形態
在解決行業問答時,了解現有產品的性能至關重要。以 360 企業云盤為例,它為我們提供了一個清晰的流程,我們對大量文檔進行分類整理后,可以運用 360 智腦大模型完成許多任務,比如將撰寫的周報轉化為文字形式,或者通過提各種問題就能輕松地得到答案,這也有助于我們在同事之間傳遞重要信息。
此外,我們還可以通過上傳 PDF 文件,然后在輸入框針對這個文件的相關內容提問,例如提出對文章進行總結,系統就能快速地進行總結,幫助我們提高工作效率。此外,系統還能夠利用搜索策略為用戶提供相關的文件推薦,例如當用戶上傳一個文章后,系統會推薦與之相關的文件,并幫助用戶查找這些文件。其中值得注意的是,如何找到相關文件是其中的一個關鍵點,這正是圖譜在其中發揮的作用,系統預先構建了文檔之間的關聯關系和事件,從而幫助用戶快速找到所需內容。
在實際業務中,許多客戶都希望能面向他們的文檔資源,快速地構建問答機器人。比如,有一個文檔,需要發布到自己的小程序、網頁或公眾號的問答機器人,這時只需要將發布的內容及時上傳到云盤,通過云盤易于理解的總結性回答、及時識別上下文、自動內容更新等功能,就能夠快速地進行知識內容的問答。舉個例子,上圖是我們已經對接的拱墅區政策咨詢,只需要將相關的文件更新到云盤,就可以直接詢問相關的信息了,比如指導思想是什么等。
我們還可以將功能進行模塊化,使系統可重復使用,滿足個人和專業場景的知識問答配置。首先創建為一個知識號,然后進行問答配置的數據管理、訓練、發布、匹配測試以及數據集管理等一系列操作。通過這種方式,實現了復用并提高效率,為業務流程帶來了更好的靈活性。
2、大模型如何實現文檔問答
在探討大模型如何實現文檔智能時,我們發現其背后存在六種關鍵環節:語料庫準備、問題輸入、向量檢索、計算向量相似度、Prompt 優化、結果返回。
(1)語料庫準備
語料庫的準備主要在離線環境下進行,主要是將與行業相關的大量知識或語料上傳至向量數據庫,儲存為向量化文本。
準備好語料文件后,會進行 chunk 處理,將文檔切分為小塊。隨著技術不斷發展,大家對于上下文長度的需求在增長,從之前的 2K、4K、8K 到現在的 192K 或 200K。然而并不是 chuck 越大越好,在真正的大模型應用中,4K 達到很高的精度就很不錯了。在完成 chunk 處理后,需要對切分后的問題文本進行向量化操作,BGE、M3E 等嵌入模型都是不錯的選擇。完成這一步后,就已經得到帶有向量的語料片段了,將其加入到向量數據庫中,例如 Faiss 等。完成這些步驟后,語料庫就準備好了。
(2)問題輸入
當一個 query 到來后,用上一步驟同樣的嵌入模型對 query 進行處理,將輸入的問題轉變成帶有向量的提問。
(3)問題搜索
將 query 轉變成的向量,放入提前準備好的語料生成的向量數據庫中檢索,通過計算 query 與 vector 的相似度,可以得出匹配結果。值得注意的是,這里所做的是 QD 匹配,而不是 QQ 匹配。QD 匹配存在一個很大的問題,即 Q 通常很短,例如大家做相似度通常使用的是幾十字的 query 進行訓練。但實際在正式場景下,QQ 基本上就是 100 字對 100 字,而 QD 會變成 100 字對上 300 字、400 字、500 字,這個時候召回的準確性就是一個需要去優化的問題。
(4)計算向量相似度
向量相似度可以采用 L1、L2 或余弦相似度,比如采用余弦相似度,需要設置一個閾值,通常在 0.8 或 0.9 左右,然后匹配出 TopN 條語義最相關的 Facts。
(5)Prompt 優化
將匹配出的 TopN 條 Facts,和用戶的問題一起作為 Prompt 輸入給模型。為了提供盡可能真實的回答,需要確保問題的回答是準確的,如果無法回答問題,我們希望模型應該明確指出這一點。在 prompt 的設置中,需要注意每一個重要的細節,例如,一個簡單的換行符“\n”可能會對結果產生很大的影響,因此,需要確保其準確性和一致性。
(6)結果返回
通過上下文組裝的 Prompt,就可以得到在有記憶交互下生成的內容,這樣的結果更精準且緩解了幻覺問題。
在處理大模型知識庫問答時,整個流程的六個步驟每一步都有可能導致誤差累積,因此要提高整體準確率,需要關注每一個階段的細節,盡可能提高每個階段的準確率,即使只是將每個階段的準確率從 0.8 提高到 0.98,那么整體就是從 0.8 的 6 次方到 0.98 的 6 次方,準確率會有顯著的提升。
3、大模型文檔問答現實問題
第一個問題是文檔板式復雜,特別是表格、圖片、單雙欄情況等,處理起來相當困難。比如金融場景中的研報,涉及到公司名稱、發布時間、k 線圖等。此外,在處理 PDF 文件時,如需識別圖表中的線,則需要進行斷裂和合并處理,這個時候就需要一個文檔版式模塊來處理這類問題。
第二個問題是模型固執己見,在處理下游任務時無法充分關注檢索到的知識,尤其是當檢索到的知識與 LLMs 的參數知識相沖突,還是會跳出回答。
第三個問題是領域 embedding 的去噪問題,現有的通用 embedding 如 BGE、M3E 在特定領域上性能并不高。在特定領域中,如果沒有足夠的數據進行去噪處理,embedding 的性能將會受到限制。此外,相似度的控制也是一個挑戰,如何篩選 top k 結果是一個關鍵問題,選擇合適的閾值和 k 值是關鍵,過嚴或過松的篩選可能導致召回率過低或召回大量無關內容。
最后,大模型在處理文檔時只關注開頭和結尾部分,而忽略中間內容。這種“lost in middle”的現象在文本長度較長時尤為明顯。因此,為了提高模型的性能,我們需要盡量將關鍵信息放在文本的前后部分。
上面所有的問題都是幻覺問題,為了具體說明幻覺問題,這里舉一個例子。在安全領域的知識問答中,提問“海蓮花組織是什么?”,我們知道海蓮花是一個 APT 組織,但大模型給出的答案卻是“海蓮花是一個出現在中國互聯網的神秘組織,涉嫌違法犯罪,名稱中的海代表海洋。”,這個答案在語言上毫無破綻,但實際上卻與事實不符,這就是幻覺問題的表現。
出現以上幻覺的主要原因就是缺乏訓練數據,因為安全領域的數據是很少的,而且很多的日志數據并不如文本數據那么規范化,這就導致安全領域大模型的幻覺問題更加顯著。
為了解決這個問題,我們可以引入安全知識庫,當我們需要回答關于海蓮花的問題時,可以從知識庫中進行召回。經過檢索,我們了解到海蓮花組織是一個具有東南亞背景的組織,同時為了確保模型在回答問題時不會產生幻覺,需要一個大型模型來判斷是否應回答問題,如果模型無法找到正確答案,應該直接告訴用戶無法回答,因此,需要添加一個拒答環節來規避此類幻覺,以確保模型不會胡說八道。
當面臨新的數據缺乏問題時,可以使用圖譜生成的方式來解決,通過結合安全知識圖譜,我們可以觀察到優化結果,例如海蓮花的高度組織化等。
二、什么是幻覺?從哪兒來?如何評估
1、什么是大模型幻覺
在我們落地場景中最直接的一個幻覺就是語境沖突性幻覺。在多輪對話中,常常會出現前后語境不一致的情況,比如,前面提到了某個話題,但在后續對話中突然轉換到了另一個話題,導致之前的信息被忽略或遺忘,這可能會引發用戶的困惑,降低對話的連貫性和用戶體驗,這種問題通常出現在問答場景中,當答案與問題語境不匹配時。例如上圖中我們希望大模型針對以色列和哈馬斯的沖突進行總結,answer 結果就明顯出現了語境沖突。
另外一個幻覺就是與事實相沖突的幻覺,指的是 LLM 生成的內容不忠實于既定的世界知識。例如,對于葡萄牙的三任國王的問題,回答錯誤地將 Castile 的女王 Urraca 列入其中;對于月球漫步的第一個人的問題,回答錯誤地提到了查爾斯·雷德伯格,實際上,第一個在月球漫步的人是阿姆斯特朗。
2、大模型幻覺從哪兒來
當我們深入研究大模型的訓練流程時,會發現數據問題是最為關鍵的。在預訓練階段,我們無法控制數據的來源,因為網上充滿了隨機網頁內容,很多內容可能并不準確,我們無法完全清洗這些數據,只能盡量讓語言更加通順。此外網頁內容又有很多包含故事性質的內容,這些導致存在一些導致幻覺的訓練數據,使得大模型將虛假的相關性作為事實知識,因為LLM 偏向于肯定測試樣本,LLMs 容易復制甚至放大這種幻覺行為。
大模型有時會高估自己的能力,這主要是因為它們在預測 next token 的概率時,本質上是在處理數據分布的問題,對于非常大的 LLMs 來說,正確答案和錯誤答案的分布熵可能是相似的,LLM 在生成錯誤答案時和生成正確答案時同樣自信。
在 SFT 階段,幻覺問題被引入得最為顯著,有問題的對齊過程可能會誤導大模型產生幻覺,如果 LLM 在預訓練階段沒有獲得相關的先決知識,在訓練指令的時候一個錯誤的對齊過程,會促使 LLM 產生幻覺。
比如上圖右下角的兩個圈,左邊是我們通過預訓練獲得的參數化知識,右邊是 SFT 數據,中間部分是兩者的交集,如果SFT 數據落在了中間這一塊,那么它是正確的,如果右側的 SFT 數據本身沒有學過,而你卻告訴它某些信息,那就相當于是在欺騙模型。舉個例子,假設這是一個金融模型,你問它中國某部法律是在什么時候頒布的,而它之前從未見過這方面的數據,即使你的 SFT 數據很漂亮,但如果你教它撒謊,那么你和它的答案都會出現問題,因此,SFT 數據的質量需要盡可能準確。
LLM 采用的生成策略,如現在常見的 top-k、top-p 等方法,其實是一種局部最優解,不能確保全局最優。這意味著搜索空間變小了,因此可能引發幻覺問題。
從數據端和解碼端來看,無論是數據的生成還是解碼過程,都可能導致模型產生幻覺。因此,我們需要對模型進行仔細地評估和調整,以確保其能夠準確地處理知識并避免幻覺問題。
3、大模型幻覺如何評估
要評估大模型的表現,關鍵在于如何制定一個可靠的指標來衡量其輸出。目前有一些方法可以實現這一目標,其中一種是基于生成事實陳述評估,將幻覺視為一種生成特征,類似于流暢性和連貫性,并對 LLM 生成的文本進行評估,查看一個 query 前一個查詢的答案與下一個查詢的兩個答案之間是否存在蘊含關系,類似于自然語言推理(NLI)中的三元組問題。此外,還可以進行基于問答對的評估,比較兩個答案之間是否存在重疊。
為了更好地評估大模型的幻覺問題,已經出現了一些基準測試,如 TruthfulQA 和各種其他的基準測試,其中清華大學的 Atlas 使用了知識圖譜來評估大模型的幻覺問題。
三、緩解大模型幻覺的策略
1、策略 1:構造高質量微調數據和拒答
如果 LLM 在預訓練階段沒有獲得相關的先決知識,在訓練指令時是一個錯誤的對齊過程,會促使 LLM 產生幻覺。這就要求我們加工整理數據,在經過編輯的指令數據上進行微調的 LLM 能表現出更高的真實性和事實性水平。此外,還可以通過加入拒答環節,采用以誠實為導向的 SFT,即在 SFT 數據中引入一些誠實樣本,誠實樣本指的是承認自己無能的回答,如“對不起,我不知道”,學會拒絕回答特定問題以減少幻覺。
關于拒答數據配比的問題,我們在實際中發現,鼓勵拒答問題的數據達到千級以上就能夠比較好地形成一個拒答的意識。如果拒答數據過多,會造成大模型對任何問題都說不知道。
2、策略 2:強化階段引入誠實對齊
- GPT4 使用合成幻覺數據來訓練獎勵模型并執行 RL,從而將 Truth-fulOA 的準確率從約 30% 提高到 60%。
- 優化 Reward 模型,設計用于減輕幻覺的特殊獎勵函數:“Unhedged/HedgedCorrect/Wrong”代表 LLM 用肯定或猶豫的語氣提供正確或錯誤的答案。
3、策略 3:優化解碼策略:CAD/RAML
- 上下文感知解碼策略(CAD),更關注上下文
LLMs 在處理下游任務時有時無法充分關注檢索到的知識,尤其是檢索到的知識與 LLMs 本身的參數知識相沖突。
迫使 LLMs 更關注上下文信息,而不是過度依賴自身的參數知識做出決策。 - KNN+LLM 策略
在推理中將兩個 next_token 分布進行融碼,一個分布來自自身 LLM 輸出,一個是來自檢索 top-k token,利用 LLM embedding 方式在外掛知識庫中查找與 query token 相似的 token。 - RALM 策略
用自回歸方式檢索解碼策略 https://arxiv.org/pdf/2302.00083.pdf。
先利用 LLM 解碼出部分 tokens,再檢索與該 tokens 相似的文本,然后拼接在 prompt 中,進行 next-tokens 預測,這樣自回歸式完成解碼。
4、策略 4:外掛知識庫增強,緩解幻覺
外掛知識增強涉及到幾個關鍵問題:何時進行外掛、外掛的頻率以及具體的外掛方式。一種常見的做法是在接收到 query 后,先進行檢索,然后將檢索結果輸入到大語言模型中生成答案,這種一次性的外掛方式在某些情況下是有效的。然而,在使用 GPT4 等模型時會發現,模型對于某些問題的回答不夠確定或準確,這時采用迭代的方式進行外掛,在得到模型的初步回答后,再次將問題或模型的回答作為輸入,進行多次迭代,然后對生成答案進行事后干預,比如再利用知識圖譜(KG)等工具對答案進行檢索和修正,可以提高答案的準確性和可靠性。
在選擇外掛時機時,可以考慮三種方式:在模型生成答案前、生成答案過程中以及生成答案后進行外掛。同時,我們還需要考慮使用何種知識庫或工具進行外掛,如搜索引擎、API 代碼執行器等。在選擇具體的外掛方式時,需要根據生成式模型和糾正模型的特點進行權衡和選擇。
四、總結
最后分享一些總結性認識。
1. 什么是大模型幻覺,應該如何看待
(1)大模型幻覺的分類維度各不一樣。
(2)有的場景需要幻覺【創作等】,有的場景不需要【如醫療、法律】。
2. 大模型的幻覺跟多樣性是怎樣的邏輯關系?雞生蛋、蛋生雞?
多樣性是造成幻覺的重要原因,因為生成多樣,所以幻覺。
3. 大模型幻覺的產生都有哪些原因?
數據、訓練方式、解碼方方面面都有。
4. 大模型的幻覺能不能解?
(1)無根本解,只能緩解,并且要跟具體業務場景做區分;
(2)現有的 RAG 并沒有觸及大模型本身,都是治標不治本。
5. 大模型知不知道自己知不知道?
不知道,本質上都是概率。
6. 在大模型背景下,知識圖譜應該找到自身定位
做好結構化數據,發揮好知識管理、網絡結構化特性。
五、問答環節
Q1:關于 OpenAI 獲取 embedding 可以細致講一下嗎?改變 embedding 的方式提升效果的范圍大概在多少?對整體響應速度有提升嗎?
A1:OpenAI 的 embedding 是通過 API 接口獲取的,你可以根據提供的文檔編寫相應的代碼直接調用 OpenAI 的接口;具體準確度提升的范圍取決于數據集、模型架構以及embedding 質量,我們在 RAG 場景做了一些對比,自己構造了一些 QD 對和 QD 的負樣本,在測試樣本大約是在幾千的場景下,召回側有 30% 的提升;調用 OpenAI 的 embedding 的話是有限速的,對于一些自有模型,如果你的整個服務部署在性能較好的顯卡上,處理速度會有明顯提升,可以達到毫秒級別。
Q2:幻覺出現引起的錯誤大概占比是多少?以及您使用策略優化之后帶來的優化是多少?
A2:這個占比其實在不同場景下會有所差異,如果不使用 RAG(問答對生成),很多占比的內容可能都是胡說八道,完全不知所云。但如果你將其放在 RAG 場景下,就會發現其中大約有 30% 的內容是跳出你的回答的,加入拒答后,在某個極端場景的情況下,我們整個流程的準確率從 25% 大幅提升到了 95%,這是一個相當大的提升。
Q3:你剛說到那個大模型是一個壓縮器,我理解的就是說如果模型反向去學習自己生成的一些知識,就有點像縮略圖的一個縮略圖,它最終是不是會變得有些模糊?業界是怎么看待這個問題的,或者有沒有一些相關的研究。
A3:我認為如果生成的內容在之前的訓練數據中出現過,那么它會強化了數據分布,使其更容易記住,更加清晰地留在記憶中,不會變得模糊。然而,如果生成大量之前未知的內容,并大量追加到數據集中,這可能會干預模型的數據分布,導致其輸出變得模棱兩可。
Q4:在將業務流程轉化為知識圖譜的過程中,特別是關于如何將示例圖轉化為知識圖譜,節點的變化如何處理的問題,您在這方面是否有一些經驗可以分享呢?
A4:我前幾年其實也一直在做事理圖譜,每一個節點就是一個動作,每一個流程被固定成一個事件短語并為其排序。這本質上是一個生成和轉發的關系,整個生成過程是需要人工構建的。在通用領域,比如說游記的案例,我們先把事件抽出來,然后把事件的關系抽出來,最后拉出一條邊。這種東西在通用領域和特定場景中都很好用,但由于我們的 case 需要解決 agent 的問題,其業務場景非常固定,在這種情況下,人工花費一些時間來構建它以確保 100% 的準確性就足夠了。
Q5:為了解決大模型的幻覺問題,我們發現它實際上無法從根本上解決,因為你之前增加了一個前置的拒答模型。在我看來在文檔總結或問答過程中,沒有什么問題是這個模型無法回答的,我想了解這個拒答模型的實現方式以及它是如何判斷大模型無法回答問題的。
A5:這是分成兩個維度去解。第一個就是問一些確定性的,就比如說問一些海蓮花這種特定場景的安全場景,因為他有個安全圖譜,當問一個實體的時候,你會發現就是因為這個模型在這個場景是沒有見過這些東西的。按照大模型沒有見過這東西問海蓮花的時候,它可能就會答錯,那怎么去做呢?我們先用剛才圖譜的方式去構造正負樣本,這是 KG 場景。然后另外一個場景就是去做一個 summary 的拒答,比如我們建立一個關于原政策的知識庫,并確定每個庫大致能夠問哪些問題。然后,通過生成相關內容,當用戶詢問范冰冰是誰時,系統可以直接拒答。
Q6:進行文檔問答時,您設置了一個前置的搜索增強環節,涉及到文本召回方面,您在 PPT 中也提到了這個閾值確實很困難,我非常想知道您是否有具體的解決方案。在我自己的實踐中,我不僅在文檔上,還包括圖像上設置相似性閾值時,目前采用的方法是打標并觀察,例如,當閾值設置為 0.7 時,其準確率是多少?如果閾值設為 0.6,就需要經過一個非常繁瑣的嘗試過程,幾乎就像一個流水線工程。所以,我想知道是否有更智能化的方法來解決這個問題。
A6:首先,這個 case 確實不好解決,我們團隊也遇到過類似的問題。關于閾值的問題,我們更傾向于深入研究。具體來說,我們嘗試在 rank 后面接多個 rank,比如在您與某個段落 p1 進行比較后,p1 可以進行分解。由于 QD 之間無法看到,所以它們無法壓縮到一個空間上,為了解決這個問題,我們會進行 query 改寫并加入其中。在選擇一個段落 p 之后,我們還會將其底下的句子進行比較,當在 QD 匹配上的值域較低時,經過下一個 rerank,對應的句子分數會提高。通過這種方式,可以減少這種問題,但具體效果如何很難說,因為在算法優化過程中,我們經常會遇到顧此失彼的情況,為了解決文本切割和比較的問題,我們做了很多工作,包括各種花式的切割方法,盡管如此,仍然存在許多挑戰需要克服。