您的位置 首页 kreess

追一技術分享 | N2X技術:自然語言與多樣知識載體的高效交互

前言數字時代,信息量正呈幾何級增長。對企業來說,大量的信息以各種不同的形式儲存在計算機中。這些信息的儲存形式可分為結構化與非結構化兩個大類,例如企業中大類的說明文檔、合同文

前言

數字時代,信息量正呈幾何級增長。

對企業來說,大量的信息以各種不同的形式儲存在計算機中。這些信息的儲存形式可分為結構化與非結構化兩個大類,例如企業中大類的說明文檔、合同文檔等就是以一種非結構化的形式存放的,而SQL數據庫和圖譜則是一種典型的結構化數據。日常工作中我們經常需要對這些資料進行查詢、修改等操作。傳統的交互模式,比如SQL,文本搜索等方式效率不高,體驗也不夠好,如果能以類似人類語言自然交流的交互方式則效果會好很多。

NL2X技術就是是采用自然語言直接與不同的知識載體形式進行直接交互的一種技術,X代表瞭不同的知識載體形式。我們通常使用自然語言進行信息的獲取與傳遞,這個過程實際是以自然語言為媒介,與某種知識載體形式進行信息互換的過程,這會極大提升交互效率和體驗。

追一科技一直致力於利用AI為企業員工與客戶提供更加便捷、智能的交互方式。作為我們技術分享系列的第二篇文章,這次我們就來介紹一下追一科技如何采用NL2X技術,實現通過自然語言直接與文檔、數據庫以及圖譜這三種不同的信息形式進行交互。

1. NL2Doc:自然語言與非結構化文檔交互

NL2Doc指的是直接采用自然語言的方式對無結構化的文檔進行查詢,並從中找到相應的答案。舉例來說,在購買保險的過程中,購買者會針對保險產品的各個方面進行咨詢。要回答這些咨詢問題,往往需要專業的保險營銷人員根據產品合同的文檔內容進行回答,而現在這一過程則可以借助NL2Doc技術由機器來完成。

MRC模型

NL2Doc的核心是機器閱讀理解技術(MRC),它的基本形式是采用深度學習模型對文檔以及問題進行編碼,通過數據驅動的方式訓練模型,讓模型從原文中定位出與問題相關的信息並給出答案。我們可以將不同的閱讀理解形式按照任務類型大致劃分為四種:

  • 完形填空:任務形式為給定一篇文章,將文中部分單詞隱去,讓模型根據上下文預測被隱去部分的單詞,以CLOTH 數據集為代表。完形填空任務的數據集易於構建,可以用準確率指標進行評價。這種任務形式的缺點在於任務的答案限定為原文中的一個詞或實體,所以並不能很好的測試機器對自然語言的理解能力,且與實際應用相距較遠。
  • 多項選擇:任務形式為給定一篇文章、相關問題和候選答案列表,讓模型從候選答案中選擇出正確答案,代表數據集有MCTest, RACE, CoQA等。由於提供瞭候選答案,答案的形式相較於完形填空而言更為靈活,構建數據集可以直接利用現有的語言測試中的多項選擇題目,所以較為容易。而該任務形式的缺點在於,由於該任務要求從備選答案中選出正確答案,因此問題形式相對簡單(已經提供瞭候選答案),模型的搜索空間相對較小。在實際場景的使用中,這種任務形式需要由其它的模塊先將可能的答案候選進行召回(通常是采用各種文本檢索的方式),然後在進行MRC過程。
  • 片段抽取:任務形式為給定一篇或多篇文章,讓模型從原文中抽取連續的片段作為問題的答案,代表數據集有SQuAD, WikiHop等。這種方式數據集相對容易構建,答案限定為原文中的子片段,相較於多項選擇有瞭更大的搜索空間,也在一定程度上能測試機器對自然語言的理解能力,而這種任務形式也與實際的場景應用比較接近。
  • 自由作答:給定一篇或多篇文章,讓模型生成一個單詞序列,使其盡可能接近原答案,以微軟發佈的MS MARCO數據集為代表。這種方式的任務答案形式非常靈活,能很好的測試模型對自然語言的理解,與現實應用最為貼近。但是這類任務的數據集構建相對困難,另外由於采用的是生成式模型,因此對模型的測評和生成式模型一樣,精確的評價需要大量人工的參與。

2018年追一科技研發瞭MRC模型Z-Reader,該模型在R-NET的基礎上進行瞭進一步改進。同時,根據業務的實際需求,NL2Doc系統要求所使用的MRC模型帶有拒識能力。(拒識能力指的是當文檔中沒有問題的答案時,模型需要給出明確的指示以表明當前問題找不到答案。)因此我們對R-NET進行瞭相應的修改。Z-Reader采用的是片段抽取的方式,模型可以分為輸入、編碼、問題-文檔融合、文檔自融合以及預測模塊這5個部分。

輸入部分

在輸入部分我們采用瞭問句以及文檔的ELMo向量。同時我們發現在一些問題中,確定詞的詞性能給答案的定位提供明顯的幫助。例如在問題“壽險危險保額的累積金額是多少?”中,“壽險危險保額”是一個專有名詞,要從文檔中找到相關的答案,則文檔中的答案片段附近必定也會出現這個名詞,因此讓模型知道詞性可以輔助定位到答案片段的位置。我們在輸入部分加入瞭POS特征,顯式地將詞性等信息帶入模型當中。另一個加入的額外特征是詞共現特征,在對問題進行回答時,答案的片段附近通常會出現問題中相同的詞,這一特征能夠將這種關系顯式地表現出來。我們通過對這兩種特征進行拼接,然後輸入模型。

文檔編碼

模型采用雙向GRU分別對文檔以及問題進行分開編碼。假設輸入的問題與文檔的ELMo向量分別為 mathbf{Q}={mathbf{w}_mathbf{t}^mathbf{Q}}_{t=1}^mmathbf{P}={mathbf{w}_mathbf{t}^mathbf{P}}_{t=1}^n ,則采用如下的方式對文檔和問題進行編碼。

begin{aligned}mathbf{u}_{t}^{Q}&=operatorname{GRU}(mathbf{u}_{t-1}^{Q},[mathbf{w}_{t}^{Q},mathbf{e}_{t}^{Q},mathbf{k}_{t}^{Q}])\mathbf{u}_{t}^{P}&=operatorname{GRU}(mathbf{u}_{t-1}^{P},[mathbf{w}_{t}^{P},mathbf{e}_{t}^{P},mathbf{k}_{t}^{P}])end{aligned} \

其中[cdot,cdot,cdot]代表拼接操作,mathbf{e},mathbf{k}分別為POS與詞共現特征。然而,在做閱讀理解的時候,文檔與問題是密切相關的,因此模型中需有對兩者的編碼進行交互,而“問題-文檔融合”部分則起著這個作用。

問題-文檔融合

問題與文檔的融合目的是讓兩者的信息充分融合,這裡的融合首先讓問題的每個位置上的特征以當前文檔位置的特征為基礎進行註意力機制加權(attention)得到上下文表征mathbf{c}_{t},這種加權是希望按照當前位置的文檔信息來體現問句中的重要部分。

begin{aligned} s^{t}_{j}&=mathbf{v}^{intercal}operatorname{tanh}(mathbf{W}_{u}^{Q}u_{j}^{Q}+mathbf{W}_{u}^{P}u_{t}^{P}+mathbf{W}_{v}^{P}mathbf{v}_{t-1}^{P})\ a^{t}_{j}&=frac{exp(s^{t}_{j})}{sum_{j=1}^{m}exp(s_{j}^{t})}\ mathbf{c}_{t}&=sum_{i=1}^{m}a_{i}^{t}mathbf{u}_{i}^{Q} end{aligned} \

加權後的上下文表征通過單個GRU模塊再與文檔表征進行融合成為帶有問題信息的文檔表征mathbf{v}_{t}^{P}

mathbf{v}_{t}^{P}=operatorname{GRU}(mathbf{v}_{t-1}^{P},[mathbf{u}^{P}_{t},mathbf{c}_{t}]^{*}) \

而其中的[mathbf{u}^{P}_{t},mathbf{c}_{t}]^{*}則加入瞭門控機制來體現當前的文檔位置是否足夠重要

begin{aligned} g_{t}&=operatorname{sigmoid}(mathbf{W}_{g}[mathbf{u}^{P}_{t},mathbf{c}_{t}])\ [mathbf{u}^{P}_{t},mathbf{c}_{t}]^{*}&=g_{t}odot[mathbf{u}^{P}_{t},mathbf{c}_{t}] end{aligned} \

經過融合後的文檔編碼{mathbf{v}_{t}^{P}}_{t=1}^{n}攜帶瞭完整的問句信息,但它隻攜帶瞭當前位置的文檔信息。而通常閱讀理解的答案片段需要結合全局的文檔信息來考慮,因此僅使用這個編碼是不足夠的。通常來說我們可以在後面再加上一層RNN來解決這個問題,但RNN雖然在理論上能編碼無限長的序列,但實際上卻經常隻局限在短程內的信息上。因此這裡需要一個類似於Transformer結構中的自註意力(self-attention)機制來讓編碼攜帶上全文信息。同時在這一步中我們加入瞭拒識標識位,該位置與文檔一起輸入編碼層,進行“問題-文檔融合”的計算。

文檔自融合

文檔自融合的作用則是讓當前位置上的文檔特征融合整個文檔的信息內容。它采用的依然是類似於上一步中“問題-文檔融合”的結構。

mathbf{h}_{t}^{P}=operatorname{GRU}(mathbf{h}_{t-1}^{P},[mathbf{v}_{t}^{P},tilde{mathbf{c}}_{t}]^{*}) \

其中tilde{mathbf{c}}_{t}是文檔采用註意力機制計算,基於自身的上下文表征

begin{aligned} tilde{s}^{t}_{j}&=mathbf{v}^{intercal}operatorname{tanh}(mathbf{W}_{v}^{P}mathbf{v}_{j}^{P}+mathbf{W}^{tilde{P}}_{t}mathbf{v}_{t}^{P})\ tilde{a}^{t}_{i}&=frac{exp(tilde{s}^{t}_{j})}{sum_{j=1}^{n}exp(tilde{s}^{t}_{j})}\ tilde{mathbf{c}}_{t}&=sum_{i=1}^{n}tilde{a}^{t}_{i}mathbf{v}_{i}^{P} end{aligned} \

同理[mathbf{v}_{t}^{P},tilde{mathbf{c}}_{t}]^{*}也是按問題-文檔融合步驟中的方法計算的門控輸出。在這一步中,拒識標識也一樣參與計算。

答案預測

答案預測部分采用的是指針網絡(Pointer Network)來預測答案片段的開頭與結尾兩個位置。指針網絡本身也是一個GRU,但由於隻需要預測開頭和結尾,因此它實際的長度是2。由於開始和結束位置上有可能輸出文檔中全部詞的某一個,因此做法是使用指針網絡來指向文檔中的某個詞,如下:

begin{aligned} hat{s}_{j}^{t}&=mathbf{v}^{intercal}operatorname{tanh}(mathbf{W}^{P}_{h}mathbf{h}_{j}^{P}+mathbf{W}_{h}^{a}mathbf{h}^{a}_{t-1})\ hat{a}^{t}_{i}&=frac{exp(hat{s}_{i}^{t})}{sum_{j=1}^{n}exp(hat{s}_{j}^{t})}\ p^{t}&=operatorname{argmax}(hat{a}^{t}_{1},dots,hat{a}^{t}_{n}) end{aligned} \

由於隻需要開始和結尾位置,因此t={1,2}。其中mathbf{h}^{a}_{t-1}則為指針網絡在第t-1位置上的輸出向量,計算方式如下

begin{aligned} hat{mathbf{c}}&=sum_{i=1}^{n}hat{a}_{i}^{t}mathbf{h}_{i}^{P}\ mathbf{h}^{a}_{t}&=operatorname{GRU}(mathbf{h}_{t-1}^{a}, hat{mathbf{c}}) end{aligned} \

而當t=1時,采用問題編碼來對mathbf{h}^{a}_{0}進行初始化,

begin{aligned} dot{s}_{j}&=mathbf{v}^{intercal}operatorname{tanh}(mathbf{W}^{Q}_{u}mathbf{u}_{j}^{Q}+mathbf{b})\ dot{a}_{i}&=frac{exp(dot{mathbf{s}}_{i})}{sum_{j=1}^{m}exp(dot{mathbf{s}}_{j})}\ mathbf{h}_{0}^{a}&=sum_{i=1}^{m}dot{a}_{i}mathbf{u}_{i}^{Q} end{aligned} \

同時,在答案預測部分,拒識標識會進行一個二分類輸出,給出當前問題在文檔中是否有存在答案的預測,如果該預測大於某個預設閾值,則任務該文檔當中沒有問題的答案。

追一科技在閱讀理解技術上有著長期的探索與積累,我們在2018年中文信息學會舉辦的中文閱讀理解競賽CMRC2018中獲得瞭冠軍。此後我們又對NL2Doc中的MRC模型進行瞭調整,換成瞭基於大型預訓練模型的結構,在系列文章的第一篇中對這些大型的預訓練模型進行瞭詳細的介紹。在2019年我們再次在斯坦福大學發起的對話式問答挑戰賽CoQA中獲得榜單第一名,這是算法模型在這個榜單上首次超越人類成績。關於追一科技在各項比賽中的成績與介紹,將會在未來的文章中詳細介紹。

功能模塊

為瞭適應實際場景的需求,追一科技的NL2Doc系統中除瞭模型部分外,整個系統可以劃分為運營平臺、標註平臺、訓練平臺以及服務平臺四個功能模塊。

運營平臺是NL2Doc的管理後臺,負責模型的上下線以及文檔的增刪改等操作,而模型訓練所使用的數據可以在標註平臺進行標註,標註完成後可以發起訓練,模型則會在訓練平臺上進行訓練,訓練完成後模型會被推送到服務平臺進行在線服務。

標註平臺

標註平臺給使用者提供瞭簡單快捷的標註入口。如果我們想針對性地對某些領域的數據進行標註來微調模型,那麼這個標註的過程則可以在標註平臺完成。

上傳的待標註文檔將會顯示在頁面當中,針對文檔中與答案有關的片段,可以直接選定並創建標註,然後輸入相應的問題。執行完標註操作後,相應的片段則被視為創建出的問題的答案片段,為模型的訓練提供依據。

訓練平臺

訓練平臺主要提供模型訓練的能力。在標註平臺中標註的數據會被推送至這裡進行訓練。同時在運營平臺中選定的上線文檔集合會在模型訓練完成以後,經過導出模塊與模型一起打包發送到服務平臺。

將訓練好的模型與在線文檔綁定的目的是因為在教育調優過程中,通常是針對某個在線文檔集出現的一些badcase對模型進行調整,因此這種綁定的方式能夠明確將調優的模型版本與在線文檔進行對應關聯。

服務平臺

服務平臺是模型提供對外服務的部分,它包含瞭中控、文檔解析服務、檢索服務以及線上服務四個部分。通過標註平臺標註的數據會由中控向訓練平臺發起模型的更新訓練任務。此外考慮到模型訓練完成後,在線文檔也可能會根據業務需要進行一些更新,因此NL2Doc系統也具備在線文檔熱修改的功能。用戶可以通過運營平臺對在線服務中的被閱讀文檔進行修改,而這部分文檔通過文檔解析服務處理後,會通過中控直接進入在線服務的文檔庫中,作為被閱讀的文檔。

在實際使用的場景中,文檔的數量非常大。因此在MRC模型進行文檔閱讀之前,我們會針對輸入的問題,對全量文檔進行檢索,被召回後的文檔才會通過MRC模型進行進一步的閱讀理解。對文檔先進行召回的目的是因為閱讀理解模型通常是大型的神經網絡模型,耗時較高,所以采用檢索召回的方式來降低模型需要閱讀的文檔數量,以保證NL2Doc系統的性能。召回的文檔會被送入在線服務模型。我們采用TF-Serving掛載閱讀理解模型進行在線服務,召回的文檔會按照前面介紹的方法進行前處理,提取POS特征與詞共現特征,然後進入模型推理階段。

2. NL2SQL:基於關系型數據庫的自然語言問答

NL2SQL是指讓普通使用者可以在不懂SQL數據庫相關專用語言 (SQL語言)的前提下,直接通過自然語言對已有的SQL數據庫進行相關操作的一種技術。在企業的眾多資料信息中,SQL數據庫是一種典型的儲存結構化數據的方式。在實際場景中,對SQL數據庫的查詢需要使用專門的SQL語句進行,這給非專業人士設置瞭門檻。而另一方面,企業員工或客戶對企業數據的查詢又非常普遍,許多自然語言的查尋邏輯實際上可以直接對應到SQL語句上,例如下圖的例子:

“哪些城市本周成交量大於200平方米”可以直接轉換為SQL語句SELECT City FROM TABLE WHERE This week>20。而借助NL2SQL,可以將自然語言直接轉換為SQL語句,並對數據庫進行查詢。

NL2SQL模型

與NL2Doc系統一樣,NL2SQL系統中最核心的功能是由深度學習模型完成的。模型會對輸入的自然語言詢問以及SQL表格進行處理,然後返回完整的SQL語句。通常來說,輸入模型的內容包括瞭原本的自然語言問句,以及與表格相關的信息內容(schema),如下圖所示:

從本質上看,自然語言轉化為SQL語句主要需要解決兩個核心問題:

  1. schema linking: 找到自然語言中的相關信息片段,並與表格的schema(表名、列名以及值)進行關聯。例如上圖中的例子中需要找到“陳啟超和李四”關聯到表格的“姓名”列;
  2. logic linking: 找到自然語言中的相關邏輯表達,並與SQL語句的邏輯表達進行關聯。這種關聯通常體現在SQL的聚合函數、條件邏輯等方面。例如需要將自然語言中的“最大、多少”等邏輯表達與SQL語句中的“MAX,COUNT”等關鍵詞進行關聯。

當前的NL2SQL模型在schema linking的問題上投入瞭較多的關註,許多模型設計會采用特別的結構來加強shema linking的能力,例如為表名、列名以及值設計特殊的編碼方式等;而針對logic linking的設計則較少。

目前將自然語言通過模型轉化為SQL語句主要有兩種方式,一種是將SQL語句拆分為多個子任務,通過多任務學習來讓模型完成各個子任務的預測,然後再組合為SQL語句。另一種方式是采用生成式,即模型通過對問句以及表的相關信息進行編碼以後,直接生成出SQL語句。這兩種方式各有優缺點。直接生成式的方案在解碼時更加簡單,適合進行跨表查詢的情況。而拆分為多任務的形式則會讓NL2SQL系統更具可解釋與可控性,因為在多任務形式下,SQL的每個關鍵詞(例如SELECT,WHERE等)被拆分為不同的任務,模型會分別輸出這些子任務的預測。因此在將這些輸出重組為SQL語句的過程中,我們可以根據模型的單個任務輸出進行後處理來讓整個NL2SQL系統更加可控。

由於在工業場景下生成式的NL2SQL模型對標註數據的需求量較多,並且相比於多任務的方式更加不可控。為瞭保證實際場景應用中系統的可控性以及盡可能降低對數據量的需求,追一科技采用多任務方式的NL2SQL模型。

從SQL語句的結構來看,我們可以將其拆解為選擇列以及條件兩個大的部分,分別對應瞭SELECT以及WHERE這兩個關鍵詞。而選擇列則可以進一步拆解為選擇多少列(select-number)、選擇哪些列(select-column)以及選擇列的集合關系(select-aggregation)。而條件部分則可以進一步拆解為條件數量(where-number)、條件指定的列(where-column)、條件的類型(where-operator)以及條件的值(where-value)。除此以外,我們還加入瞭拒識(rejection)與表值感知(where-relation)兩個部分。模型的編碼部分采用瞭大型的預訓練模型(關於大型預訓練模型的介紹可以回看以前的文章),在這裡我們主要介紹上述任務的具體計算方式。我們將輸入的問句以及所有的列名用[SEP]字符間隔並拼接為一個長序列,然後通過預訓練模型進行混合編碼,設mathbf{h}_{i}^{c}為第c個列名中第i個字的輸出,我們以表列名的[SEP]位置輸出為表列的整體表征mathbf{h}_{c}

select-number

select-number的目的是確認選擇的列的數量,我們先對所有的列進行自註意力計算出所有列的上下文特征mathbf{h}_{text{col}},然後用上下文特征對問句中的每個字特征進行加權計算,得出融合列信息的問句表達:

begin{aligned} mathbf{h}_{text{col}}&=operatorname{selfatn}_{c}(mathbf{h}_{c})\ mathbf{s}_{text{col-q}}&=operatorname{softmax}_{n}(mathbf{h}_{n}mathbf{h}_{text{col}}^{intercal})\ mathbf{h}_{text{col-q}}&=mathbf{h}_{n}mathbf{s}_{text{col-q}}\ mathbf{h}_{text{col-q-s-num}}&=operatorname{relu}(mathbf{h}_{text{col-q}}mathbf{U}_{text{s-num}})\ p_{text{s-num}}&=operatorname{softmax}(mathbf{h}_{text{col-q-s-num}}mathbf{W}_{text{s-num}}) end{aligned} \

其中mathbf{U}_{text{s-num}},mathbf{W}_{text{s-num}}為模型參數,即我們對計算出的mathbf{h}_{text{col-q-num}}進行分類來確定選擇的列的數量

select-column

select-column的目的是確定選擇的列,我們先對問題中所有的詞進行自註意力計算得出問句的上下文特征mathbf{h}_{text{q-col}},然後用上下文特征對每個列中的每個詞進行加權計算,得出融合問句信息的列表達:

begin{aligned} mathbf{h}_{text{Q}}&=operatorname{selfatn}_{n}(mathbf{h}_{n})\ mathbf{s}_{text{q-col}}^{c}&=operatorname{softmax}_{i}(mathbf{h}_{i}^{c}mathbf{h}_{text{Q}}^{intercal})\ mathbf{h}_{text{q-col}}^{c}&=mathbf{h}_{i}^{c}mathbf{s}_{text{q-col}}^{c}\ p_{text{s-col}}^{c}&=operatorname{sigmod}([mathbf{h}_{text{q-col}}^{c}, mathbf{h}_{text{col-q-s-num}}]) end{aligned} \

select-aggregation

select-aggregation的目的是確定列的聚合操作方式,一共包含[Null, AVG, MAX, MIN, COUNT, SUM]這幾種,我們采用與計算select-column同樣的特征來進行分類預測:

p_{text{s-col-agg}}^{c}=operatorname{softmax}([mathbf{h}_{text{q-col}}^{c}, mathbf{h}_{text{col-q-s-num}}]mathbf{W}_{text{s-col-agg}}) \

where-number

where-number指的是SQL語句中在WHERE後條件語句的數量。我們把這個問題作為瞭一個分類問題來處理,即設定一個固定上限,比如說最多6個condition,然後做6分類。具體的做法和select-number一樣:

begin{aligned} mathbf{h}_{text{col-q-w-num}}&=operatorname{relu}(mathbf{h}_{text{col-q}}mathbf{U}_{text{w-num}})\ p_{text{w-num}}&=operatorname{softmax}(mathbf{h}_{text{col-q-w-num}}mathbf{W}_{text{w-num}})end{aligned}\

where-column

where-column是用來確定條件中列的位置的任務,如select-column一樣,我們對每列的位置進行二分類來判斷是否屬於條件中的列:

p_{text{w-col}}^{c}=operatorname{sigmod}([mathbf{h}_{text{q-col}}^{c}, mathbf{h}_{text{col-q-w-num}}]) \

where-operator

where-operator是用來確定條件中列的具體操作,我們定義瞭[>,<,==,!=]四種條件操作,類似於select-aggregation那樣,我們采用分類的方式來進行訓練。

p_{text{w-col-op}}^{c}=operatorname{softmax}([mathbf{h}_{text{q-col}}^{c}, mathbf{h}_{text{col-q-w-num}}]mathbf{W}_{text{w-col-op}}) \

where-value

where-value指的是在SQL中WHERE後的條件語句中,找到被提及的、與問句中相關的片段。針對問句中的每一個字,我們計算它與每一個表的關系,並以此確定value片段以及該片段屬於哪一個列:

p_{n}^{c}=operatorname{sigmoid}(operatorname{tanh}(mathbf{h}_{n}mathbf{U}_{text{w-va}}+mathbf{h}_{text{q-col}}^{c}mathbf{V}_{text{w-va}})mathbf{W}_{text{w-va}}) \

其中p_{n}^{c}代表問句中第n個字為第c個表列的value的概率。

追一科技在2018年就開始對NL2SQL進行研究,是國內對該技術進行研究與落地最早的企業之一。在2019年我們舉辦瞭首屆中文NL2SQL挑戰賽,並提供瞭全球首個中文NL2SQL數據集,填補瞭中文在NL2SQL這一技術領域上的空白。這次比賽共有1457來自於企業、科研院校的隊伍參加,最終復賽的最佳成績達到92%,這一比賽在中文NL2SQL技術積累與發展中起到瞭巨大的推動作用。

NL2SQL系統

NL2SQL系統中整體可以分為前端服務、後端平臺、解析引擎以及執行引擎四個模塊。其中解析引擎是NL2SQL系統的核心功能部件,其中包括信息抽取、表格篩選、模型以及指令編輯四個子模塊。

信息抽取與表格篩選

在問句進入模型前,會先對其中的關鍵信息進行抽取,用於表格的篩選。雖然NL2SQL模型理論上可以編碼多張表格,但為瞭提高系統的性能我們會對所有的表格進行一次預篩選。方式是用問句中抽取出的信息對所有表的表名以及表頭進行檢索,召回頭部的表格再送入模型當中。

指令編輯

在實際使用時,用戶經常會對相同類型的查詢進行多次細微的修改以確定最終想要的信息。為瞭讓這種重復查詢更加便利,需要讓用戶可以直接在上一次查詢的語句上做局部修改即可。

如上圖所示,第一次查詢的結果會在前端界面上顯示,而頁面上端會顯示這次查詢的關鍵字段,如果再次查詢隻更改某個字段,可以直接在關鍵字段上進行編輯而不用重新輸入自然語言問句。指令編輯的輸入則不需要再次經過模型的解析,直接以SQL語句的形式返回給後臺處理。這在提高使用便利性的同時也提升瞭系統性能。

3. NL2Graph:自然語言與知識圖譜直接交互

NL2Graph方法

NL2Graph是以知識圖譜作為結構化數據的存儲媒介,將自然語言轉化為知識圖譜的子圖或SPARQL、CYPHER等圖查詢語句的技術。知識圖譜是以實體、關系、屬性組成的三元組為最小單元構建的網狀聯通的結構化知識。知識圖譜有著與關系型數據庫相同的優點:可計算、可高效檢索。另一方面,與關系型數據庫相比,知識圖譜的結構更加靈活、其檢索和推理模式更加貼近自然語言,令其尤為適合作文本結構化的存儲和檢索媒介。

目前NL2Graph的兩大主流技術是語義解析方法(Semantic Parsing)和信息提取方法(Information Retrieval)。語義解析方法將自然語言轉化為圖查詢語句,在知識圖譜中執行後獲得匹配的子圖;而信息提取方法直接將自然語言與知識圖譜中的子圖匹配。兩者的區別可用下圖表示:

信息提取方法

信息提取方法分為召回和打分排序兩個階段。知識圖譜的子圖數量與知識圖譜本身的規模呈指數增長關系,因此在召回階段必須限制召回的子圖數量,一般會采用錨定話題實體(Topic Entity)限制目標實體,即答案到話題實體的跳數(Hop)的方法得到有限個候選子圖。如果跳數限制為1,則得到的子圖為一個三元組,能用一個三元組回答的問句被稱為簡單問句(Simple Question)。

在打分排序階段,將所有候選子圖與問句進行相似度匹配打分。對於簡單問句,實體、關系和屬性均可被編碼為三元組的分佈式表示,與問句的分佈式表示拼接後通過神經網絡模型計算出相似度。此外,實體的類型、關聯實體、外部常識信息等也可以被加入編碼,提高模型的泛化性和匹配效果。

由於子圖數量正比於圖結點度數的跳數次方,因此對於跳數大於1的非簡單問句,一般采用分階段召回-排序的策略,每個階段召回一跳的候選三元組,排序後隻保留得分topK的候選集,進入下一跳的召回-排序。鍵-值記憶網絡、強化學習等方法被用於每個階段的排序-打分策略。這種分階段策略和基於Beam Search的方法使信息提取在多跳問題上也能獲得不錯的可擴展性(Scalability),為其賦予瞭一定的推理能力。

信息提取方法直接將問句與子圖匹配,省去瞭執行查詢語句的過程,這是它的一個優點,也是一個局限。首先,信息提取方法要求每個問句都包含一個話題實體(例句:科比的職業生涯中,單場得分最高是多少分? 對應的話題實體是科比 – 籃球運動員),對於沒有話題實體的問句,信息提取方法就無能為力(例句:哪些人既當過NBA球員又當過NBA教練?)。其次,信息提取方法隻適用於一跳或多跳的事實類問題,即可以用一個或一條鏈狀的三元組“回答”的問題,對於復雜問句,比如條件篩選類、邏輯比較類問句,信息提取方法無法回答。

語義解析方法

語義解析方法將問句與結構化查詢語句(Structured Query)相匹配,知識圖譜常用的結構化查詢語句為SparQL(查詢圖RDF數據庫)、Cypher(查詢Neo4J圖數據庫)等。

上圖所示的Cypher語句表達的含義是“列出和Tom Hanks合作過的演員的所有作品”,我們可以看到語義解析方法可以表達這類帶有條件篩選、邏輯推理復雜問句,其表達能力要強於信息提取方法。

早期的語義解析方法將問句進行組合范疇語法(combinatory categorical grammar, 簡稱CCG)解析,並將解析到的語法樹直接映射為無事實查詢圖(ungrounded graph, 即不含實體、關系、實體類型信息的查詢圖框架)。查詢圖框架補充瞭事實類信息後得到的查詢圖可以映射為SparQL查詢語句。由於事實類信息的補充方法不止一種,一般將候選的查詢圖與問句進行相似度匹配-排序。

語義解析方法處理多跳復雜查詢圖時,也會面臨信息提取方法一樣的組合爆炸問題,分階段構建查詢圖加Beam Search的策略自然也可以用於解決這一問題。比較成功的有Bao等人提出的STAGG方法和Hu等人提出的State-transition Framework (STF)等方法,它們的基本思路都是將查詢圖構建過程拆解為若幹種原子操作,將查詢圖構建問題轉化為尋找最優原子操作組合的問題。圖構建的每一步的選擇空間都有限,並使用深度學習模型,以原始問句和每一步涉及的子圖片段的分佈式表示作為輸入,通過相似度匹配打分,學習選擇的策略,同時用Beam Search限制體系的整體復雜度。

上圖展示瞭分步語義解析方法拆解問句"Who first voiced Meg in Family Guy?"的步驟,包括瞭話題實體錨定,推理鏈拓展和限制、聚合添加三類原子操作。其中用瞭實體鏈接模型對話題實體錨定步驟打分,並用瞭一個交互式的匹配模型對推理鏈拓展步驟打分。

知識圖譜問答機器人

知識圖譜問答機器人是對NL2Graph技術的工程化應用,除瞭對NL2Graph技術的落地外,我們針對工程和業務場景的復雜性,探索出瞭一套方法論。

實體識別 – 子圖匹配模塊

作為在線問答的第一個模塊,實體識別模塊負責識別用戶問句中的實體。這裡的實體既包括圖譜中的文本類實體,如人名、產品名等;也包括圖譜中的數值類屬性。對於數值類屬性,利用圖譜內置的單位歸一化規則和業務泛化規則,將其轉化為可計算的歸一化數值,便於後續的結構化查詢模塊使用。值得一題的是,經過簡單的配置,業務泛化規則可以支持將“預算20萬左右,推薦個SUV”,“我老爸已經退休瞭,還能買XX保險嗎?”這類問句中的“左右”,“退休”等模糊性和常識性文本轉化為數值片段,用於後續計算。這也體現瞭知識圖譜擅長計算性和邏輯性問答的特點。

子圖匹配模塊將用戶問句匹配到一個知識圖譜的子圖。雖然分步構建查詢圖的語義解析方法所生成的查詢圖,它的復雜度能夠滿足實際場景的需求,但是查詢圖的標註是一個難點。

實踐中,我們借鑒瞭語義解析方法中分步構建查詢子圖的思路。第一步,我們復用FAQ問答機器人的意圖匹配模型,將問句匹配到查詢子圖框架,這裡的框架隻包括本體的實體類型、屬性類型節點和關系邊,是一個“概念查詢子圖”。限制最大跳數以後,這種概念查詢子圖的數量有限,可以枚舉並訓練匹配模型。這裡,由於標註查詢圖的成本比較高,且由於我們積累瞭大量相似問法的行業語料,我們使用“問句 – 相似問句”,而非“問句 – 查詢子圖”的匹配模型。

一般來說,雙塔模型和交互式模型都可以用作子圖匹配模型,交互式模型效果略好但是有更大的在線計算量,實踐中雙塔模型可以滿足大部分垂直領域知識圖譜的子圖匹配需求。

第二步,我們將實體識別模塊識別到的文本類和數值類實體映射為查詢子圖的“限制”和“聚合”,利用啟發式方法拼接到概念查詢子圖上,完成完整的查詢子圖的構建。

結構化查詢 – 答案合成模塊

由於采用瞭語義解析方法作為子圖匹配模塊的技術選型,我們需要一個結構化查詢模塊將查詢子圖映射成真正的圖譜查詢語句,從而在圖譜中查詢到的就是真正的子圖。

從NL2Graph的角度來講,獲得知識圖譜子圖就已經完成任務瞭,但是對於問答機器人,我們還需將子圖合成為自然語言答案。自然語言生成模型貌似是答案生成模塊一個很美好的技術選型,但在實踐中,我們發現在垂直領域中,客戶對答案的需求更強調以下幾點:

  1. 答案可解釋,可控
  2. 答案可以快速地被業務規則幹預
  3. 除瞭純文本,還需要富文本、選項卡、氣泡、反問列表等表現形式

綜上考慮,我們在實踐中使用一種DSL來描述結構化的子圖到純文本和富文本答案的映射規則,並打算讓業務人員來編寫這種DSL以應對紛繁易變的業務規則。但是,結構化子圖本身就是一種知識圖譜,用一種DSL來描述它本來就比較困難,且不易理解(試想用自然語言來準確描述如圖3中的知識圖譜的拓撲結構,需要多少文本)。不過,圖譜構建時的圖-表格雙模式在這裡又幫瞭我們,我們將查詢到的子圖映射回數據表格,並用表名、列名直觀易懂地引用結構化數據。此外,我們還在描述語言中基於平穩退化的原則,設計瞭表達算術、格式化文本和邏輯分支的語法,在不提高使用難度的情況下增加這種語言的表達能力,以滿足不同水平的使用需求。

知識圖譜構建 – 關系抽取任務

最後我們聊一下知識圖譜的構建。各行業的數據,尤其是非結構化的文本數據,蘊含瞭大量知識,將它們轉化為三元組存入知識圖譜是圖譜構建的主要任務。

實體抽取、關系抽取和事件抽取是知識圖譜構建的核心子任務。追一參加瞭2020語言與智能技術競賽的關系抽取任務,並獲得瞭第一名的成績。該比賽的數據集DuIE2.0包含瞭43個簡單知識類型和5個復雜知識類型,其中的復雜知識類型已經屬於事件抽取范疇,因此我們的方案其實覆蓋瞭知識圖譜構建的全部流程。

數據建模

復雜知識類型是包含復合屬性結點(CVT)的復雜元組,即N-Ary問題。以下面的文本為例:

5月6日下午三點,金像獎獲獎名單公佈,周冬雨憑借電影**《少年的你》中“陳念”一角獲得金像獎最佳女主角**

這個“獲獎”知識中,所獲獎項、獲獎作品、獲獎時間、獲獎人都是其屬性。對此,我們設計瞭一種用多個簡單三元組表達一個復雜的N-Ary元組的方式,該方式可以將復雜元組的信息無損地表達為若幹個簡單三元組,舉例來說,“王雪純是87版《紅樓夢》中晴雯的配音者, 而趙薇是《新紅樓》中晴雯的配音”,這個句子中王雪純為紅樓夢中的晴雯配音可以表達為:

模型設計

從模型設計上,為瞭支持復雜元組的抽取,我們設計瞭一套基於Pointer Network的網絡。第一步先做主語預測,然後用把主語信息加入問句,對賓語進行謂語標簽的預測。這樣每個token都是多標簽,理論上可以解決實體重疊和關系重疊。但是賓語和謂語的聯合預測帶來瞭輸出稀疏的問題,輸出層標簽絕大多數都是0,少數是1. 這就使網絡訓練難度上升。

為瞭解決輸出稀疏問題,我們將模型改為三段式框架,將抽取轉化為2個序列標註任務和1個分類任務,三個任務共享預訓練模型初始化的編碼層,進行多任務訓練。在使用時進行主語識別,然後將識別到的主語拼接在問句前作為補充信息進行賓語的識別,最後再將賓語拼在頭部對謂語進行分類。

隨後我們在這一框架下,對模型進行瞭一系列優化。首先我們選用表達能力強的roberta-wwm-large編碼層;其次,我們采用瞭層級學習率(Discrimitive Learning Rate)的方案,通過調小接近輸入層的學習率,避免下遊任務對預訓時學到知識的災難性遺忘;我們還嘗試瞭對抗樣本、Talking-heads Attention等方法提高模型效果;最後,在初步實驗中,我們發現預測結果的precision大大高於recall,且原因是訓練集中大量由遠程監督生成的false negative的標簽,基於此,我們采用瞭PU Learning的方案,即使用ensemble + vote 的方法生成高質量三元組,訓練時忽略這些未標註且ensemble投票大於2的三元組,避免false negative的監督信號降低模型效果。

最終,在加入ensemble和後處理後,我們的模型在任務中獲得瞭0.8235的F1 score,以下是我們所有方案對模型效果的提升

4. 結語

追一科技是國內最早將深度學習用於自然語言處理場景,並進行落地實用的公司之一。我們一直致力於用自然語言處理技術帶來更多的可能性。NL2Doc、NL2SQL以及NL2Graph技術是以自然語言對不同文本知識結構進行查詢的代表性技術,我們在這一領域將會持續投入,探索更多的可能性。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

返回顶部