LLM應用實戰:當KBQA整合LLM

mengrennwpu發表於2024-04-11

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實現,主要模組包括對齊、解析、潤色、多輪問答等內容,而且基於業務測試集效果相對較好。

純純的乾貨篇!!


原創宣告,禁止轉載!

相關文章