LLM-Embedding 構建問答系統的侷限性及優化方案

近期 LangChain + LLM 方案高速發展,降低了知識問答等下游應用的開發門檻。但隨着業務深入,一些侷限性也日漸顯露,比如:LLM 意圖識別準確性較低,交互鏈路長導致時間開銷大;Embedding 不適合多詞條聚合匹配等。本文結合實際案例,分析上述問題存在的根源,並提出基於傳統 NLP 技術的解決思路。

背景

筆者在基於大語言模型構建知識問答系統一文中描述了,以 LLM 爲基礎的知識問答系統構建方法,核心在於:

原文通過 OpenAI API 和 ChatGPT 交互,缺陷也很明顯:

LangChain 的誕生就是解決這些問題的,它抽象了業務應用和 LLM 交互的方式,內置通用環節實現,標準化工具鏈交互接口,極大提升開發效率。LangChain 的大致結構如下所示:

基於 LangChain + LLM 的組合,下游應用在:“場景拓展” 和 “效能提升” 方面取得長足進步,但垂直領域一些深層問題也逐漸暴露出來。本文就開發問答系統時遇到的實際案例,說明上述方式的侷限性,並提出解決方案。

侷限性分析

問題簡介

首當其衝的是:多知識點聚合處理場景下,Embedding-Search 召回精度較低 的問題。典型應用範式是:

這種場景在遊戲攻略問答中很常見,以體育遊戲 NBA2K Online2 爲例:

多知識點——簡單查詢

Q: 皮蓬、英格利什和布蘭德的身高、體重各是多少?

多知識點——篩選過濾

Q: 皮蓬、英格利什和布蘭德誰的第一位置是 PF?

多知識點——求最值

Q: 皮蓬、英格利什和布蘭德誰的金徽章數最多?

Embedding 缺陷

原始的 Embedding Search 在面對多知識點聚合處理時,存在幾個問題:

  1. 本地知識建立索引時,通常對單個知識點進行 Embedding;不會也不可能,爲不同知識點的排列組合分別製作索引。不難想象,不同記錄和屬性的組合方式有 QH2NpW (C 問題數,如過濾,查詢,最值;A 即排列),所有組合都建立索引的開銷是巨大的。

  1. 原始問題直接 Embedding ,和單條知識點的向量相似度比較低。爲了避免召回結果有遺漏,就需要 降低 相似度評分下限 (vector similarity score threshold),同時提高召回結果數量上限 (top k)。併產生不好的副效應:

下面給出一個示例:

再看看 LLM( ChatGLM-6B )對召回結果整合後的反饋,耗時 16s 用於處理大量輸入,結果讓人啼笑皆非:

皮蓬、鶯利什和布蘭德的推薦位置是前鋒 / 後衛。

幾處很明顯的錯誤:英格利什莫名其妙變爲鶯利什;且三人的位置回答不準確,由於過多冗餘信息導致混淆。也許和 LLM 自身的性能有關,但也能說明 Embedding Search 低效且不可靠

方案分析

針對上面的問題重新整理思路,想要更加精準的回答問題,需要從兩個層面入手:

1. 問題理解——準確識別用戶意圖

這是問答系統的基礎:通過解析用戶問題,精準把握意圖後,才能更好的規劃後續處理步驟:

langchain 中的 Agents 已經對上述步驟提供了標準化接口,它相對於 Chains 一個重要不同在於:結合應用場景,通過提示詞引導 LLM 和用戶多輪交互,摸清在什麼時候應該需要選擇什麼樣的工具鏈進行處理。其中 Plan-and-Execute Agents 用於制定動作計劃;Action Agents 決定實施何種動作。

有了 Agents 和 Chains 的標準抽象,下面再來看看摸清用戶意圖的幾種方法,這樣才能開發合適的工具:

HyDE 要求與用戶問題相關的知識,已經存在於 LLM 基礎模型中。但專業領域知識,可能本來就是未聯網、未公開的;LLM 生成的虛構文檔,可能包含很多噪音,所以效果不一定很明顯;另外生成文檔的額外交互,進一步增加了時間開銷。目前,LangChain 提供了 HyDE ChainLlamaIndex 也提供了類似的能力;大家有興趣可以嘗試,面對中文可能需要自定義 Prompt Template。

    "球員打法" : {
        "球員名稱" : ____,
        "年代" : ____,
        "比賽模式": ____,
    }
  1. 搜索召回——提升精度

將用戶的訴求轉化爲語義槽後,可以較爲準確的體現問答意圖,這有助於提升搜索命中精度。原始知識點在建立索引時,除了原始的 Embedding 方法,可以做更多優化:

解決思路

意圖識別和召回優化,屬於一體兩面,均有助於提升問答系統的精度。搜索層面知識圖譜相對於 Embedding 方式,加工成本較高。在遵從奧卡姆剃刀的前提下,有沒有什麼高性價比的方式來解決這個問題?

筆者想到,意圖識別和召回,其實有一個共同點:均可用 關鍵詞/主題詞 表示。那麼問題可以轉變爲:

基於關鍵詞 Embedding 的入庫和搜索的流程圖如下所示:

這種方式怎麼解決原始 Embedding 存在的幾個侷限呢?

語句:姚明和奧尼爾的內線與三分能力。

關鍵詞提取後,按照從屬關係叉乘,得到的結果應該是:

  • 姚明內線
  • 姚明三分
  • 奧尼爾內線
  • 奧尼爾三分

帶着這樣的思路,下文主要描述關鍵詞提取實現方法和效果。

關鍵詞提取

我們的目標是,從無標註文本(零樣本)是實現信息抽取(Information Extraction,IE),因爲很少涉及人爲干預,該問題非常具有挑戰性。IE 包含三類任務:

筆者針對知識問答這樣的特定場景,將上述三類任務簡化爲兩個過程:

  1. 名詞短語提取。即:主語、賓語。通常由名詞,和名詞的限定詞或者修飾詞組成。比如:

姚主席如何評價周琦的組織進攻能力?
主語:姚主席
賓語:能力。但真正具有實際意義的是能力的限定修飾詞,即 “周琦組織進攻能力”。

  1. 謂語。體現名詞短語之間的事件。比如:評價。在更多場景中是:比較、查詢、過濾、統計等,存在動態計算、處理的需求。因此即使忽略謂語,僅通過名詞短語的組合也可以獲得完備的知識。謂語所代表的事件,可以交給 LLM 處理。

筆者在經過對多種業務場景的分析後,最終萌生出下面的 關鍵詞提取方式

將該思路應用到上面的例子中:

如圖所示,使用 NLU 的基本處理流程,分析原始問句:

  1. 分詞

  2. 詞性標註 (Part-Of-Speech Tagging, Penn Chinese Treebank),用於識別名詞短語。比如:NR 表示人名、機構、地名等專有名詞;NT 表示時間名詞,NOI 表示漢字順序顛倒產生的噪聲,NN 表示其它類型名詞。

  3. NER 識別。比如姚,周琦等。

  4. 然後還需要考慮語義間的依存關係,確定名詞間的關係,比如:

這樣不難得到應該搜索的關鍵詞列表:['姚主席', '周琦', '組織進攻能力']。下面來看看這種思路究竟如何實現,還是分爲兩大類:LLM、傳統 NLP。

基於 LLM 提取

LLM 已經天然具備 NLU 和 NLG 的能力,所以做名詞短語提取按道理應該手到擒來。業界已經有嘗試,比如《Zero-Shot Information Extraction via Chatting with ChatGPT》一文,提出兩階段多輪問答信息提取方式:

在該思想的啓發下,筆者使用 langchain 開發了信息提取 Chain,LLM 使用的是 ChatGLM-6B 本地部署,提取部分測試片段如下所示:

發現問題了嗎:明明是分析張三丰;結果李四和王五怎麼冒出來了。要知道,Prompt 已經添加了 “不要編造內容” 的說明,但無濟於事。總體而言,使用 LLM 提取信息效果如下:

簡單而言:不是不能做,但對 LLM 的要求較高;結果不準確、開銷也大。

傳統 NLP 方法提取

在 LLM 做信息提取,效果不盡如人意的情況下,轉而嘗試傳統 NLP 技術。前面提到的:分詞、詞性標註、NER 等,業界已經有不少傳統 NLP 工具可以使用。

“請比較詹姆斯和麥迪的屬性”
—— 無法識別任何人名
“詹姆斯、字母哥和傑林. 布朗的金徽章有何差異?”
—— 只能識別出布朗,且將 "傑林" 拋棄

經過測試後最終選擇 HanLP 作爲基礎工具,原因在於:

下面基於 HanLP,看看究竟如何解決前文提出的:多知識點聚合查詢問題?其核心點在於三步:

  1. 詞性標註
  2. 名詞短語關係分析:修飾、限定、並列等
  3. 名詞短語重新組織:修飾、限定關係級聯;並列關係與其他部分叉乘。

名詞短語提取與整合

舉一個更加複雜的例子,在主語和賓語中添加:並列和修飾關係。首先分詞,然後添加詞性標註,結果如下:

依存分析

詞性有了,下面需要進一步提取句子中單詞與單詞之間的語法關係,即 依存句法分析;筆者採取 Stanford Dependencies Chinese (SDC) 標準進行分析,並且爲了清晰展示,將分析結果轉化爲 Pandas DataFrame 的形式,如下圖所示:

根據 DataFrame 中提供的依賴關係,可以直觀地獲取名詞短語:

所以實際的客體,應該將並列的領事關係和本體叉乘後平鋪,結果就是:

['詹姆斯三分能力', '約基奇三分能力', '張伯倫三分能力']

用這三個關鍵詞,Embedding 後去本地知識庫搜索就可大大提升命中精度。不過大家如果細心的話可以發現:語義依存分析的結果其實 不準確,比如:

這種語義偏差的原因在於:同一個分詞的語義容易產生混淆。比如 “指導” 既可以作爲名詞,也可以作爲動詞。中文多義詞和語境比較複雜,導致語義依存分析有不小的概率會出現誤判。那麼怎麼解決這個問題呢?一定要使用有監督訓練方式,對基礎語義依存分析模型進行 Fine-Tuning 嗎?一旦涉及有監督,成本就不容小區了。不過幸好:詞性標註和依存句法分析,相對語義依存分析,準確率是更高的,所以筆者想到另外一種方式:

基於正確的詞性標註,構建出語法樹,從語法角度提取名詞短語。

成分句法分析

分析一個句子在語法上的遞歸構成,在 NLU 領域是經典的 成分句法分析 問題。下面羅列 Chinese Treebank 標準片段,描述對分詞單元類型的定義,請大家關注藍色背景內容。

再次回顧我們要解決的多知識點聚合處理的目標:

基於該思路,上文提到實例,可以轉化爲下面的成分句法分析樹:

這是典型的樹結構:

這樣來看,NP 的提取非常簡單,通過遞歸方式對三種基礎形式的樹結構進行識別即可,提取時注意區分:

在上述算法下,樣例中提取的名詞短語列表最終如下所示:

至此,已經介紹完筆者關於關鍵詞提取的基本思路,完整的處理流程如下圖所示:

應用效果

關鍵詞提取實現後,配合前文提到的召回方法,應用到文章開始的幾個示例問題,結果如下所示:

最後彙總筆者提出的解決多知識點聚合處理問題的方案:

該方法的優勢在於:

總結

LLM 的出現,推動下游應用激烈變革,各種探索如火如荼地展開。但在熱潮背後,我們還有一些細節問題需要仔細對待。LLM 的未來是偉大的,甚至可能是邁向 AGI 的重要里程碑;但現在並不能宣判傳統 NLP 技術的死亡。

本文提供了傳統 NLP 和 LLM 結合的一種可能,通過用戶問題和本地知識庫關鍵詞提取,能較好的解決 Embedding 精度缺失,以及 HyDE、LLM NLU 的精度和性能問題。實現單輪對話,對多知識點的聚合處理。後續將繼續探索 LLM 和傳統技術的角色分工,進一步提升綜合收益。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://zhuanlan.zhihu.com/p/641132245