match:一款基於深度學習的層級問答匹配工具

開源項目專題系列

(一)

1.開源項目名稱:qa_match

2.github地址:

https://github.com/wuba/qa_match

3.簡介:qa_match是58同城推出的一款基於深度學習的輕量級問答匹配工具,它融合領域識別與意圖識別,對問答意圖進行精確理解。目前已經過大量實戰,並取得了不錯的問答效果。


qa_match於2020年3月份開源,具備的Features如下:

  • 支持快速搭建一套基於QABot的問答系統
  • 基於 tensorflow 框架進行開發,靈活性高,可擴展性強
  • 代碼簡潔,支持領域、意圖的快速識別,領域意圖模型融合,識別準確率高
  • 模型訓練輸入格式簡單
  • 模型訓練過程中支持基於測試集的最優效果model 保存
  • 對信息含量少、語序不一致、語義相同但問法不同等難以識別的問題都能較好識別


為什麼需要qa_match

基於QABot一問一答的業務諮詢服務是智能客服系統的核心功能,依賴知識庫進行自動問答,知識庫一般是通過人工總結、標註、機器挖掘的方式進行構建,知識庫中包含大量的標準問題,每個標準問題有一個標準答案和一些擴展問法,我們稱這些擴展問法為擴展問題。在實際場景中,知識庫一般具有兩級結構,每個標準問題及其擴展問題都有一個類別,我們稱為領域,同時我們把標準問題稱為意圖,一個領域包含多個意圖。實現問答的思路是當用戶輸入一個query時,我們通過一定的策略(如分類、檢索、匹配等)從知識庫中找到與用戶query語義最相近的問題,並把對應的答案回覆給用戶。具體流程如下圖所示:

開源|qa_match:一款基於深度學習的層級問答匹配工具

在QABot一問一答實際應用中,當用戶提問一個問題時,系統一般會給予用戶三種回答方式:當用戶提問問題與知識庫中標準問題語義匹配程度很高時,系統會直接回復標準答案答案(唯一回答)。當用戶提問問題語義比較模糊時,系統會回覆用戶一個標準問題列表,讓用戶選擇想問的問題(列表回答)。當用戶提問問題與業務諮詢無關時,系統會拒絕回答(拒識)。

在QABot一問一答實際場景下經常會遇到如下難點:

開源|qa_match:一款基於深度學習的層級問答匹配工具

針對上述問題,現有技術方案通常採用單模型分類、匹配、檢索的方式來直接識別用戶意圖,這樣雖然能部分解決上述問題,但在我們的應用場景效果不是很理想。為了提升問答效果,我們實現了一種類似bagging方法的模型融合策略qa_match。qa_match用標準問題、擴展問題和它們對應的類別訓練BiLSTM領域分類模型,用標準問題當做意圖,標準問和擴展問題當做語料訓練DSSM意圖匹配模型,對用戶問題先進行BiLSTM領域分類,然後進行DSSM意圖匹配,最後對分類結果和匹配結果進行融合。qa_match於2018年9月份上線,並在我們的應用場景取得了最佳效果。qa_match雖然實現邏輯簡單,但高效、問答效果不錯,後續我們考慮在qa_match中開源預訓練模型和知識庫半自動挖掘流程。


算法架構

qa_match主要包含的三個體模塊,架構如下圖所示:

開源|qa_match:一款基於深度學習的層級問答匹配工具

1. 領域識別

為了更準確理解用戶問題屬於哪個意圖,可以先對用戶問題進行領域識別,用識別出的領域來約束後續的意圖識別,使整體的問答匹配更準確。qa_match領域包括三大類:“拒識”,“列表回答”和“具體領域”,具體領域是指賬號類,信息類等具體的類別。“拒識”和“列表回答”是兩個抽象的領域,“拒識”指的是應該拒絕回答用戶的問題,“列表回答”指的是用問題列表詢問用戶想問哪個問題。

qa_match中採用BiLSTM+attention的方式進行領域識別(如下圖),一方面考慮到領域類別較少,訓練性能問題,不宜選擇較複雜的分類模型。另一方面由於BiLSTM具有雙向全局化處理方式、記憶單元、較複雜的門機制等特點,在對短文本時序數據進行處理時,相對於其他RNN類模型,BiLSTM在避免梯度消失的同時,更容易對上下文進行完整建模。BiLSTM和attention機制的組合,更容易找出對識別具有貢獻的特徵,使得領域識別更加精準。

開源|qa_match:一款基於深度學習的層級問答匹配工具

2. 意圖識別

意圖識別是判斷用戶問題可能屬於哪些標準問題,為了精確識別用戶的意圖,我們既可以對用戶意圖進行分類又可以進行匹配。但由於用戶意圖種類很多,單純的分類任務效果要遜於匹配任務。深度文本匹配任務可以用representation-based模型、interaction-based模型。representation-based模型是將文本轉化為句向量後,再計算句向量間的相似度,但它容易產生語義偏移的現象。interaction-based模型的核心思想是獲取交叉矩陣,進行更細粒度的匹配,它可以解決語義偏移的現象,在很多文本匹配比賽中都獲得了優異的效果。

我們嘗試了上述兩類模型,發現在工業級數據集中,以DSSM為代表的representation-based模型具有更好地表現,而interaction-based模型因為同一類問題的表達方式過於豐富,反而效果不如DSSM,由此qa_match中採用DSSM進行意圖識別。

DSSM(Deep Structured Semantic Models)深度語義匹配模型,結構上一般分為:輸入層、表示層、匹配層。DSSM通常把query和多個doc表徵為相應的語義向量,並通過計算餘弦相似度來衡量query和doc的距離,最終訓練出語義相似度模型,該模型可以用來很好的預測兩個句子的語義相似度。

qa_match在訓練DSSM模型時,由於知識庫中每個標準問題都有若干個擴展問題,為了讓模型學習到它們具有相同的語義,我們通過下面的方法構建訓練集:從知識庫隨機抽取一個query(標準問題或擴展問題),使用這個query對應的標準問題作為正例,從其餘的標準問題中隨機抽取N條作為負例,通過訓練,模型可以很好地表示這一類問題的語義。在線推理時,我們使用用戶問題作為query,所有的標準問題作為doc,為保證推理性能我們事先對每個doc做特徵表徵得到相應向量並保存在計算圖裡,線上我們只需用BiLSTM對query進行特徵表徵得到其對應的向量,然後與事先保存好的doc對應的向量計算餘弦相似度,最終取相似度最高的topn doc做為query的候選意圖做為意圖識別模塊的輸出。

開源|qa_match:一款基於深度學習的層級問答匹配工具

3. 模型融合

對用戶問題進行領域識別和意圖識別,得到問題所屬領域和意圖範圍後,我們考慮對兩種結果進行融合,以獲取用戶的真實意圖並給予合適的回答(唯一回答、列表回答、拒絕回答)。模型融合的思路是:用戶問題所屬領域具有較高的置信度(領域識別打分較高)時,對應的意圖範圍傾向於保留該領域下的意圖,並根據意圖識別模型的置信度情況給予合適回答。

當前版本的模型融合主要是通過人工及統計經驗配置參數,使用方可按照各自的場景數據進行配置。流程如下圖所示,舉個例子:如當用戶提問“為什麼我發佈不了帖子?”,Bi-LSTM領域識別成“信息類”的概率為0.99,DSSM意圖識別TOP1為“為什麼無法發佈信息?”的概率為0.98。當“信息類”的概率>=0.9(b1)且“為什麼無法發佈信息?”的概率>=0.95(x2)時候,結果按照下圖黃色箭頭所示流程進行融合,最終用戶提問被匹配為標準問題“為什麼無法發佈信息?”並給予唯一回答,其它分支類似。

開源|qa_match:一款基於深度學習的層級問答匹配工具

如何訓練qa_match

qa_match支持兩層結構的知識庫問答,訓練集中的一條問題需要同時具有意圖標籤和領域標籤。但是對於簡單的識別的任務,也可以直接使用本工具提供的領域識別模型或者意圖識別模型。


1. 數據準備

我們總共需要四種數據:

* 領域識別任務的數據格式為:領域標籤 問題

* 意圖識別任務的數據格式為:意圖標籤 問題

* 標準問題的數據格式為:意圖標籤 問題

* 領域和意圖的映射關係的數據格式為:領域標籤 意圖標籤 領域名稱 問題

數據中的“問題”要求以空格分隔。


2. 項目運行

要完成層級問答匹配任務,只需要三步:先進行領域識別,再進行意圖識別,最後進行模型融合。我們將執行的命令寫進了腳本run.sh裡面,只需要執行命令bash run.sh即可。


3. 模型融合參數設置

我們模型融合參數的選擇是基於統計的,首先會在測試集上計算同一參數不同閾值所對應標籤的f1值,然後選取較大的f1值(根據項目需求可偏重準確率/覆蓋率)對應的閾值做為該參數的取值。如:在選取BiLSTM拒絕回答標籤對應參數閾值a1(2.5模型融合圖中的a1)時,先會在測試集上確定不同的a1取值對應模型的回答標籤(模型top1回答為拒絕回答&分值大於a1時則認為拒絕回答,否則認為應該回答),後續根據樣本的真實標籤計算f1值,最後選取合適的f1值(根據項目需求可偏重準確率/覆蓋率)對應的取值作為a1的值。具體使用說明請參考github倉庫中的README。


未來規劃

未來我們會繼續優化擴展qa_match的能力,計劃開源如下:

(1)基於LSTM的預訓練模型。在bert模型問世後,我們參考bert預訓練的原理開發了基於LSTM的預訓練模型,在推理效果跟bert相差不大情況下,參數規模大幅減少、推理性能顯著提升、已經在生產環境使用。

(2)知識庫半自動挖掘流程。基於知識庫的構建,我們開發了一套結合人工和機器挖掘的算法流程,已經在生產環境使用,並取得了不錯的效果。

(3)目前tensorflow已發版到2.1版本,後續我們會根據需求發佈tensorflow 2.X版本或pytorch版本的qa_match。


如何貢獻&問題反饋

本次開源只是qa_match貢獻社區的一小步,我們誠摯地希望開發者向我們提出寶貴的意見。

您可以挑選以下方式向我們反饋建議和問題:

(1)在 https://github.com/wuba/qa_match.git提交 PR 或者 Issue

(2)郵件發送至 [email protected]


王勇,58同城 AI Lab 算法架構師,主要負責58智能問答相關算法研發工作。

陳璐,58同城 AI Lab 資深算法工程師,主要負責58智能質檢相關算法研發工作。


與項目成員零距離交流?

一切應有盡有


開源|qa_match:一款基於深度學習的層級問答匹配工具

添加小秘書微信後由小秘書拉您進項目交流群


分享到:


相關文章: