1. 背景
應專案需求,本qiang~這兩週全身心投入了進去。
專案是關於一個博物館知識圖譜,上層做KBQA應用。實現要求是將傳統KBQA中的部分模組,如NLU、指代消解、實體對齊等任務,完全由LLM實現,本qiang~針對該任務還是灰常感興趣的,遂開展了專案研發工作。
注意,此篇是純純的乾貨篇,除了原始碼沒有提供外,整體核心元件均展示了出來。也是這兩週工作的整體總結,歡迎大家查閱以及加關注(不強求哈~)
2. 整體框架
整體思想還是遵循RAG策略,從圖譜召回候選背景知識,讓LLM進行潤色回答。
具體的流程如下:
(1) 使用者提問:已發現的體重最大的肉食性恐龍是什麼
(2) 對齊模組。
對齊模組的主要作用是針對問題與知識圖譜中的實體、概念、關係、屬性進行對齊。
其中候選概念、候選屬性、候選關係在圖譜中的數量是少量有限的,而實體的數量可多可少,因此候選概念、候選屬性、候選關係可以在查詢hugegraph後,直接拼到對齊prompt中(對齊的prompt預留了佔位符),而實體則需要進行預篩選,篩選的方式是透過問題query與實體名進行語義相似度比較,透過語義相似度引擎實現,比如simbert, bge, gte等開源模型,預篩選後的少量實體可以拼接到對齊prompt。
對齊的prompt增加要求和few-shot示例,可以解決常見對齊問題,比如實體、概念、屬性、關係存在缺字、多字、相似字等情況。
(3) 對齊模組經過LLM進行對齊,輸出對齊結果。
本示例的對齊結果為:(屬性-等於-體重)且(屬性值-等於-最大); (屬性-等於-食性)且(屬性值-等於-肉食性);(概念-等於-恐龍)。
(4) 對齊校準模組。
對齊校準模組主要針對LLM對齊結果進行二次校對,解決的問題如下:
1) 一些LLM將概念與實體混淆的情況;
2) 與圖譜中的實體、概念、屬性、關係進行對齊匹配;
3) 實體名和概念名重複時,二者均進行召回等
(5) 解析及溯源模組
解析模組:
針對校準後的對齊結果,執行解析模組,解析模組會基於對齊結果進行判斷,該執行如下哪種解析,候選的解析列表有:純實體解析、純概念解析、實體-屬性解析、概念-屬性解析、屬性-屬性值解析、屬性-屬性值-概念解析等。
(Ps: 候選解析列表是分析了大量資料之後,抽象出來的解析列表,常見的問答基本就涵蓋在這些列表中)
每個解析模組會有不同的解析邏輯,例如:
1) 純實體解析:會將查詢hugegraph得到的實體作為背景知識提供給LLM,如介紹下霸王龍
2) 純概念解析:會查詢概念下有哪些實體,且僅列出實體名稱作為背景知識提供給LLM,如恐龍都有哪些?
3) 實體-屬性解析:會查詢實體對應的屬性或關係,並作為背景知識,如霸王龍有多重多高?
4) 概念-屬性解析:會查詢概念下實體的屬性資訊作為背景知識,如恐龍目下動物的體重分別是多少?
5) 屬性-屬性值解析:會查詢屬性對應屬性值的資訊,並作為背景知識,如肉食性的動物有?
溯源模組:主要功能就是從圖譜中查詢的結果,需要返回圖譜對應的實體id、概念id、屬性等
6) 問答模組
透過將解析後的背景知識以及使用者的問題,經過問答prompt,然後呼叫LLM進行潤色回答。
PS:
對齊prompt呼叫大模型是非流式輸出,因為對齊結果不需要實時同步給使用者;
問答prompt呼叫大模型是流式輸出,因為問答結果需要實時同步給使用者
3. 優缺點
(1) 優點
1) 整體架構簡單,僅需要2個prompt,與LLM僅互動2次
2) 解析模組基於多資料集進行抽象,可覆蓋多數查詢場景
3) 針對未覆蓋的場景,解析模組可支援快速擴充套件適配
4) 遷移新圖譜時,業務只需要更改prompt即可,對業務相對友好
(2) 缺點
1) 首字響應時間主要耗時在對齊prompt與LLM的互動中,因為需要對齊完整輸出結果
2) 概念、屬性、實體對齊集中在1個prompt中,所以prompt的長度較長
4. 多輪問答實現
實現的思路如下:
1) 快取歷史問題以及快取歷史對齊的實體或概念,如可以快取最近10輪的使用者問題以及對齊結果
2) 針對指代消解、語義對齊prompt調優,且多輪問答的prompt也整合在對齊prompt中(因此,對齊prompt任務十分繁重)
具體示例如下(從對齊prompt擷取了部分,第一次輸入參考為空):
歷史輸入資訊: ``` 輸入:鹽都龍喜歡吃什麼 參考: 輸入:喜歡生活在什麼地方 參考:鹽都龍 輸入:三角龍是植食還是肉食 參考:鹽都龍 輸入:有什麼本事 參考:三角龍 輸入:普爾塔龍多重 參考:三角龍 ```
現在請回答: 輸入: 吃什麼 參考: 普爾塔龍 輸出: |
具體的效果可以查閱下面章節中的效果示例。
5. 效果
圖譜三元組總量3000+,測試樣例共計385條,其中單輪問答340條,多輪問答45條。
(1) 單輪問答效果,準確率93%+
一階問答 |
華陽龍的頭骨化石是在哪裡發現的 |
華陽龍的頭骨化石是在中國四川省發現的。 |
判斷問答 |
恐爪龍有4米長嗎 |
恐爪龍的身長是3.5米左右,沒有4米。 |
對比問答 |
三角龍和姜氏巴克龍誰更重 |
三角龍更重。 |
條件問答 |
化石在四川發現的恐龍有哪些 |
最大體型的長羽毛恐龍是二連巨盜龍。 |
組合問答 |
單爪龍身長體重多少? |
單爪龍的身長是1~1.2米,體重約3.5千克。 |
(2) 多輪問答效果,準確率93%+
1) 示例1:缺字情況
問:普爾塔多重
答:普爾塔龍的體重是75噸。
問:吃什麼
答:普爾塔龍是植食性的
2) 示例2:錯字情況
問:河堤列龍生活在什麼地方
答:河堤獵龍生活在英國的懷特島和奇爾頓嶺。
問:它是什麼時候的恐龍
答:河堤獵龍是早白堊世,巴雷姆期的恐龍。
3) 示例3:較困難的指代消解
問:三角龍是植食還是肉食
答:三角龍是植食性的。
問:有啥本事
答:三角龍的能力是快速奔跑。
問:和腫頭龍比,誰更長一些?
答:三角龍的身長為8米,而腫頭龍的身長為4~6米。因此,三角龍更長一些。
問:那它的體重是多少?
答:三角龍的體重是6.1~12噸。
6. 答疑解惑
(1) 候選實體、候選概念、候選屬性如何動態載入至prompt?
解:prompt預留佔位符,程式碼解析時進行格式化
(2) 概念、屬性數量有限,可以全部寫在prompt,但如果實體有1W個呢?
解:基於sim進行候選實體召回策略
(3) 如何實現流式輸出?
解:基於tornado的websocket框架,結合非同步框架asyncio以及python的yield、next等方法實現
(4) 非流式呼叫LLM出現網路不穩定導致超時,如何解決?
解:增加重試機制
(5) 對齊結果如何進一步保障?
解:增加對齊校準模組
(6) 如何減少頻繁呼叫hugegraph
解:預先載入圖譜至記憶體,然後使用python的lru_cache快取機制
(7) 如何提高屬性、概念、實體對齊的準確率,比如多字、缺字、相近字等?
解:對齊prompt增加要求以及few-shot
(8) 如何解決實體文字完全不一致,但指的同一個實體的情況,比如霸王龍和雷克斯暴龍?
解:透過圖譜的別名維護,且當前別名與正式名地位相同
(9) 溯源是如何實現的?
解:在每個解析分支中,基於解析結果增加對應圖譜的資訊
(10) 如何實現最大、最小之類的查詢,如體重最大的植食性恐龍是哪個?
解:對齊結果:(屬性-等於-體重)且(屬性值-等於-最大)且(概念-等於-恐龍)
解析邏輯:篩選恐龍概念下實體 -> 食性為植食性的實體 -> 其中體重最大的
(11) 如何實現關係的推理,比如魚石螈演進關係的演進關係是?
解:原始圖譜關係:魚石螈 -> 演進關係 ->蜥螈 -> 演進關係 -> 異齒龍
對齊結果:(實體-等於-魚石螈)且(屬性-等於-演進關係);(屬性-等於-演進關係)
答案:魚石螈的演進關係是蜥螈,而蜥螈的演進關係是異齒龍。
(12) 為什麼說解析模組便於快速擴充套件?
解:實體、概念、屬性查詢介面均封裝為獨立方法。
(13) 對比類、判斷類的問題回答如何更加口語化?
解:問答prompt調優
(14) 如何快速定位問題?
解:增加debug機制,即介面呼叫時,debug機制會將每個階段的處理結果均記錄下來,並返回。
(15) 目前支援多少輪問答?
解:理論上支援N多輪,且N支援配置
(16) 如何提高指代消解的準確率?
解:對齊prompt增加歷史的參考實體或概念
7. 遺留的問題
(1) 基於屬性值查實體未實現,分析部分badcase,屬於此類情況
(2) 路徑查詢未實現,因為當前圖譜關係數量極少
8. 總結
一句話足矣~
本文主要是KBQA方案基於LLM實現,主要模組包括對齊、解析、潤色、多輪問答等內容,而且基於業務測試集效果相對較好。
純純的乾貨篇!!
原創宣告,禁止轉載!