呂劍清,王先兵*,陳剛,張華,王明剛
(1.空天信息安全與可信計算教育部重點實驗室(武漢大學),武漢 430072;2.武漢大學 計算機學院,武漢 430072;3.遵義鋁業股份有限公司,貴州 遵義 563100)
自然語言查詢轉SQL(Structured Query Language)語句(Text-to-SQL)任務就是將自然語言描述轉化成對應的SQL查詢語句。隨著工業自動化水平和信息化水平不斷發展,工業生產領域早已積累了大量的生產數據。但工業領域與傳統商業領域不同,工業領域產生的數據可解釋性差且比較分散,這就使得目前工業生產領域所產生的大部分數據還停留在數據倉庫層面,僅僅只是將歷史數據保存起來,并沒有有效發揮這些數據的價值。利用Text-to-SQL 模型,工廠管理人員不再需要去了解具體數據庫配置信息和數據表信息等底層存儲細節,僅僅需要通過自然語言的交互方式便可獲取想要的數據。
Text-to-SQL 任務的歷史悠久,自20 世紀70 年代以來,自然語言數據庫接口任務就開始受到人們關注[1-5],受限于當時的技術發展,這些方法無法適用于復雜多變的自然語言查詢場景,只能應用在簡單的單表查詢任務中。直到近幾年,隨著語義分析高級神經方法的發展以及大規模、跨領域的Text-to-SQL 數據集WikiSQL[6]和Spider[7]的發布,它才漸漸回歸人們的視線。
目前Text-to-SQL 任務主要分為單表查詢和多表查詢兩種場景。單表查詢由于其事先明確了SQL 查詢所對應的表格以及自然語言查詢問句對應的SQL 語句結構,早在2019年英文單表查詢數據集WikiSQL 和中文單表查詢數據集TableQA 上最優模型[8-9]的準確率就已經達到了普通人類水平,因此當前研究人員的目標在于多表查詢的Text-to-SQL 任務。在真實的查詢場景中,用戶查詢的數據往往包含了數據庫中的多個表,SQL 語句的復雜程度也大大提升,因此Yu等[7]發布了大規模、跨領域的英文多表查詢數據集Spider,研究人員提出了很多新穎的處理策略和模型使得Spider 數據集任務的準確率得到了顯著提升[10-15]。相較之下中文多表Text-to-SQL 任務的研究相對較少,雖然目前已經發布了中文多表查詢數據集Cspider[16]和DuSQL[17],但當前Text-to-SQL任務相關的研究都聚焦于英文數據集,中文多表查詢任務在推出數據集后仍有待研究。本文借鑒英文的模型和處理方法并結合實際查詢需求對模型進行微調后,構建了新的模型用于處理中文工業數據集查詢任務。
本文使用基于鋁冶煉行業的工業生產數據集,在對英文模型進行遷移的過程中,主要存在以下幾點問題:
1)自然語言查詢的描述與數據庫中表名和列名等數據庫對象信息的描述不一致,即數據庫中表名和列名一般為縮略語等簡略化表達形式,例如自然語言問句中的“出鋁量”,在數據庫中的對應列名描述為“AlCnt”。
2)SQL 語句的列名未明顯出現在問句中,而是包含在該列所存儲的數據中,很常見的一類就是記錄時間信息的列。
3)目前英文模型在識別自然語言問句的where 子句中列名對應的value 值時使用的方法難以應用于大型的工業數據表。文獻[18]通過基于變換器的雙向編碼器表示技術(Bidirectional Encoder Representation from Transformers,
BERT)計算出自然語言問句與數據庫表中該列存儲的所有數據的注意力分數,這種方法適用于Spider 這種單表數據量小的數據集,但實際工業數據集中大部分數據表都存儲上萬條數據,所以實際工業數據集的value 識別需要尋求其他解決方法。
英文模型識別自然語言問句關鍵信息時所用的是指針網絡(pointer network)[19],pointer network 最后的輸出結果會指向輸入序列,即輸出只能從輸入序列中選擇,導致最終英文模型遷移后會產生前兩類問題。根據文獻[15],Spider 任務中50%的錯誤都是由這兩類問題導致。針對這兩個問題,本文模型選擇在數據庫模式標記的過程中添加元數據。第一類問題本文選擇將工廠元數據信息添加到具體的數據使用中,通過元數據對自然語言中的描述進行規范化。第二類問題主要分為兩種情況:1)時間短語的識別,90%以上的工業報表都包含存儲時間信息的列,同時由于時間短語的表達形式多種多樣,本文使用BERT+雙向長短期記憶(Bidirectional Long Short-Term Memory,BiLSTM)+條件隨機場(Condition Random Field,CRF)模型提取自然語言問句中的時間實體。2)時間短語以外的情況,本文將自然語言中能暗含對應列名的序列稱為標簽項。例如“武漢”這個標簽項暗含了它對應的列名“city”,即生成的SQL 語句中會存在“city=‘武漢’”。這種情況在工業查詢中也經常存在,例如氧化鋁生產中“鍋爐煤耗”這個標簽項暗含了對應的列名“tagname”。但是不同于時間短語,這種標簽項的數量是有限的,數據倉庫設計等工業元數據中會記錄表格中的標簽項信息,本文通過N元語言(N-Gram)模型即可標記出自然語言中的標簽項和對應的列實體。
針對value 問題,本文發現中文自然語言查詢中value 經常出現在對應column 相近的位置,根據這一特性本文使用基于相對位置的注意力機制來識別問句中的value。針對實際工業數據集中SQL 語句的結構問題,本文從SQLNet[20]所用到的sketch 中得到靈感,同時不同于SQLNet 僅僅只有一種標準形式,在詳細分析工業自然語言問句的特征后將問句進行分類,每種類別設置不同的標準形式,這幾個類別足以涵括絕大部分查詢場景。
本文主要研究中文Text-to-SQL 的工業應用,直接將英文的主流模型遷移到中文工業Text-to-SQL 任務后得到的SQL語句精確匹配率都不高。本文在分析錯誤原因后發現當前主流模型難以處理列名描述不一致和列名未明顯出現在問句中等問題,然后針對這些問題構建了新的模型。本文模型在關鍵信息標記過程中添加元數據信息解決以上兩個問題,然后結合中文問句中value 值的特性,改用相對位置的注意力機制識別where 子句的value值,最后在處理SQL 語句結構時結合了工業自然語言問句自身的特點,對問句進行分類后通過槽填充的方式提高SQL 語句結構預測的準確率。
由于缺乏工業領域的標準數據集,本文根據工廠業務人員的實際需求通過人工擴充的方式獲取用于訓練和測試的Text-to-SQL 數據集,這些問句囊括絕大部分的查詢場景。本次實驗的自然語言問句共2 836條,測試集問句350 條。為了驗證最終的精確匹配率,本文為測試集中的350 條問句設計了準確的SQL 語句,即Gold SQL。數據庫方面使用部分氧化鋁和電解鋁的數據表,共包含數據表格27 個。
本文總結了工業數據集和其他Text-to-SQL 數據集的統計數據,結果如表1所示。其 中:ATIS[21]、GeoQuery[22]和Spider 均為英文數據集;Cspider 和DuSQL 均為中文數據集且Cspider 是對Spider 進行中文翻譯后得到的。表1中,Q 表示自然語言查詢的數量,DB 表示該數據集中包含的數據庫數量,Domain 代表數據集涉及的領域數量,Table/DB 表示平均每個數據庫中數據表的數量。

表1 Text-to-SQL數據集的比較Tab.1 Comparison of Text-to-SQL datasets
圖1 為Spider 數據集和本文數據集中數據庫表格的樣例,其中數據表mill 來源于Spider 數據集,數據表fact_pot_dailymeasure 來源于本文構建的鋁冶煉數據集。可以看出工業數據集中列名和表名的描述都不會與自然語言描述一致,例如“PotNo”表示電解槽槽號。對比兩張數據表可以看出Spider、CSpider 和DuSQL 三個數據集中存儲的數據都屬于主數據,在企業中是用來定義業務對象的、具有持續性和穩定性的數據,而工業生產中常用的是會隨著時間遷移數據量越來越多的業務數據。
圖2 中給出了一些鋁冶煉自然語言查詢的示例,可以看出工業需求的自然語言查詢更加注重業務數據而不是實體之間的關系。業務數據具有鮮明的動態時空特性,使得90%以上的工業自然語言查詢問句中都包含時間實體,因此模型遷移過程中必須要對時間實體進行準確識別。相較于數據含義簡單明了的Spider 數據集,本文的鋁冶煉數據集是面向行業的數據集,符合實際工業應用中SQL 查詢的分布。
本文模型使用命名實體識別(Named Entity Recognition,NER)來提取自然語言問句中的時間表達式,NER 旨在定位文本中的命名實體并分類為預先定義的類別,例如文獻[23]中用來識別醫學時間短語。時間實體識別板塊如圖3 所示,識別文本中的時間實體采用BERT+BiLSTM+CRF 模型。首先,使用Google BERT 的Chinese_L-12_H-768_A-12 模型作為特征表示層,相對于只輸出靜態詞向量的Word2vec,BERT采用先進的Transformer 模型,使得每個詞都可以捕獲到文本雙向關系;然后,將特征表示層的輸出加入BiLSTM 中學習單詞的上下文語義表示;最后經過CRF 對BiLSTM 層的輸出進行優化,充分考慮序列前后的標簽信息以獲取全局最優的標簽輸出。
Schema Link[11]的目標就是實現問句中表述的內容與數據庫的表名和列名等數據庫模式信息的映射,然后將得到的列名和表名的標記信息同自然語言問句和數據表結構信息一同作為神經網絡的輸入,以提高模型的準確率。
首先針對自然語言問句于數據表的表名和列名描述不一致的問題,通過在Schema Link 的過程中引入包含技術元數據的數據字典實現列名的映射,之后根據標記的列名來標記問句中涉及的表名。對于column 未明確出現在問句中的問題,這類問題出現的原因在于某些標簽項能隱性說明它所對應的column,除了2.1 節提到的時間序列因其本身表述方式多種多樣的特點需要單獨處理外,其他情況可以根據數據字典、數據倉庫設計等元數據完成映射。圖4 是鋁冶煉數據集的一個例子,自然語言問句為“氧化鋁廠2020 年9 月3 號葉濾精液中苛性化氧化鋁的化驗量?”,其中“葉濾精液”是列名為tagname 的標簽項。在沒有其他外部信息輸入的情況下當前主流模型難以直接通過“葉濾精液”這個標簽項找到對應的column,但工廠元數據中會存儲這些有限的標簽項信息,因此“葉濾精液”這類標簽項可以通過技術元數據的數據倉庫設計構建標簽項與其對應列名之間的映射關系來找到對應的列名。
如圖3 所示,本文使用N-Gram 模型實現Schema Link。N-Gram 模型主要用于評估一個句子是否合理和評估兩個字符串之間的差異,后者可以用于進行模式匹配(又稱字符串查找)。首先枚舉出問句中1 到6 所有的字符串組合(gram),然后按照長度降序的方式與元數據中的數據字典進行匹配,如果一個gram 被認定為列名,則移除與之重疊的全部gram。通過以上方法識別問句中所有的列名實體,然后通過列名可以確認對應的表名。特別地,氧化鋁的化驗表中存在不同表中有相同的列項的情況,由于不同的表存儲的是不同標簽項上的化驗信息,因此通過元數據和識別出來的標簽項確定對應的表名。
針對where 子句中value 的識別,目前的方法大多基于數據庫內容(database content)[18],這種方法在Spider 這類每個數據表內容不夠多的數據集上有良好的效果,但是實際工業應用中每張數據表的數據量遠比Spider 上多,所以在實際應用中需要考慮新的處理方法。本研究著眼于實際的工業查詢任務,使用了一種基于相對位置的注意力[24]模型來實現value 值的識別。
自注意力(self-attention)[25]模型的結構如圖5 所示。對于self-attention,Q(Query)、K(Key)、V(value)3 個矩陣均來自同一輸入。首先計算Q與K之間的點乘;然后為了防止其結果過大,除以一個尺度標度再通過Softmax 函數將其結果歸一化為一個概率分布;最后再乘以矩陣V就得到權重求和向量,這個向量可以很好地考慮問句的上下文信息。
相對位置的模型在self-attention 的基礎上,引入了兩個與相對位置相關的向量,兩個向量采用da維向量的表示形式。具體公式如下:
其中權重系數aij通過Softmax 計算得到:
兼容函數eij計算方法使用Scaled dot product:
zi是每個輸入序列xi通過加權求和得到的輸出元素,也就是說,如果xi是attention 的目標詞,那么在計算xj對xi的注意力特征時,需要額外考慮xj對xi的兩個與位置相關的向量。
本文將最大相對位置裁剪為最大絕對值k,即假設序列中兩個元素的距離超過預先設定的k,則判定兩元素之間的位置信息就沒有意義,裁剪最大距離還能使得模型可以推廣到訓練期間沒見到過的序列長度。本文設置k=4,并且最終只需關注與column 最相關的即為對應的value。
在對鋁生產行業進行實際考察后,總結了實際工業需求的自然語言輸入問題的四個特點:
1)查詢的目標更多注重于業務數據而不是實體之間的關系或知識,即物品的產量、材料的消耗、機器的運行狀態以及產品的質量檢測結果等。
2)查詢的數據經常包含聚合操作,例如最值問題和平均值問題。
3)查詢問句中的實體描述一般都較為規范,即所查詢的屬性一定是數據庫中原本就有的屬性。
4)工業應用中查詢的數據很大部分屬于生產業務數據,所以問句中一般都會包含有時間信息,如“昨天”“2021 年1月1 日”。由于時間信息的表達方式多種多樣,但是在數據庫中時間字段的存儲格式均是統一的,因此需要將問句中的時間段和時間點都進行規范化。
根據以上特點將自然語言問句分為以下幾個類別:
1)一般查詢類問題。
該類問題主要是查詢某個時間或時間段的一個或多個屬性值。例如“2021 年3 月20 日槽號為2 835 的電解槽的出鋁量,鋁水平?”。可以看到這類問題的查詢可以分為槽號、出鋁量、鋁水平三個關鍵主體,其中有確定value 值的2 835判定為查詢條件,問句中找不到對應value 的判定為查詢目標,所以查詢的主體表就應該是包含有電解槽每日出鋁信息的數據表。
2)最值問題。
該類問題主要是以最值為查詢條件得到一個或多個查詢目標。例如“2020 年9 月23 號出鋁量最大的電解槽槽號?”。
3)時間段最值問題。
該類問題主要是查詢目標在一段時間內的最值。例如“氧化鋁廠2021 年1 月1 號到1 月30 號最大實產氧化鋁量?”。
4)均值問題。
該類問題主要是查詢某個時間或時間段的屬性均值。例如“今天電解一區電解槽的平均工作電壓?”“氧化鋁廠1月15 號到2 月15 號平均每天的鍋爐煤耗?”。
分類方法使用BERT 中文預訓練模型,對BERT 的最后一層進行微調后即可用于本文的分類任務中。重載其中的DataProcessor 類并在主函數中添加該類,對輸入數據進行預處理后即可用于訓練和測試,BERT 的標志位CLS 接Softmax用于輸出分類結果。
按照文獻[7]的標準,實驗通過精確匹配率對模型進行評估,即自然語言問句生成的SQL 語句與事先準備的Gold SQL 完全一致的百分比,其中各子句中列名出現的順序不影響準確率的計算。除了測試模型在工業數據集上的表現外,本研究還評估當前主流模型在不添加元數據信息的情形下在工業數據集上的表現。由于英文模型不涉及value 的識別,所以評判標準是不考慮where 子句中value 值的SQL 語句精確匹配率。
精確匹配率的計算公式如下:
其中:N表示自然語言問句的數量;PSQL、GSQL分別代表預測的SQL 語句、標準的SQL 語句;Accqm代表查詢匹配的準確率。
本文把測試集的350 條問句進行人工英文翻譯后,再將列名進行人工泛化,使得問句中的列與數據庫中的表示一致,最后在英文工業測試集上使用目前Spider 數據集各階段的主流模型進行對比實驗。由于Spider 的實驗結果不考慮value,因此對比實驗也不考慮value,時間實體也可以不進行處理。實驗結果如表2 所示。

表2 不同模型的精確匹配率 單位:%Tab.2 Exact match accuracies of different models unit:%
其中SyntaxSQLNet[10]、IRNet[11]和RAT-SQL[15]為Spider數據集任務各階段表現最好的基礎模型。從表2 中可以看出,Spider 數據集任務的主流模型在遷移到實際的工業數據集時準確率都偏低。根據文獻[7]中所述,Spider 是面向多領域的大規模數據集,并且為了提高模型的泛用性,測試集中30%的問句是訓練集中從未見過的;但是從實驗結果可以看出這些模型直接用到實際的工業問句中效果并不好,主要原因在于工業數據庫的表結構信息遠比Spider 數據集復雜,同時工業數據庫中存儲的數據可解釋性差,在沒有元數據的情況下機器難以理解自然語言查詢問句的語義。另外由于表結構的差異,測試集中大量問句的列名沒有明顯出現在問句中,經統計本文構建的測試集中這類問句有126條,占全部測試集的40%,導致Spider 任務的模型找不到正確的列名或者根本沒有識別出標簽項處存在列名。對比本文模型的結果可以看出修改后的模型在處理工業自然語言查詢問題時的有效性,同時也說明本文在遷移過程中提出的修改方法和處理策略具有一定理論意義和研究價值。
對模型進行消融實驗查看各個模塊在模型中起到的作用。首先如果不使用元數據且不對原問句進行人工同義化處理,依靠現在模型的方法根本不能識別問句中任意一個列實體;然后評估添加部分元數據消除表述不一致的問題后模型的準確率;最后添加完整的元數據信息對比顯示元數據在處理列名不會明顯出現在問句中的效果。消融實驗在本文構建的測試集上進行且會考慮value。表3 顯示了消融實驗的結果。

表3 消融實驗的結果 單位:%Tab.3 Results of ablation experiment unit:%
從表3 可以看出,添加部分元數據后雖然可以映射到大部分的列名,但對于問句中僅存在標簽項的情況,列實體沒有被識別出來,準確率只有39.4%,對比英文模型準確率提高了3%,說明單一領域的Text-to-SQL 問題針對查詢問句的特征設計分類模型效果更好。在添加用于映射標簽項的元數據之后本文模型的準確率提高了20%以上,說明引入元數據可以有效地處理列名未出現在問句中的問題。對比表2中本文模型的準確率可以看出本文模型在考慮where 子句value 時精確匹配率降低了8%,原因在于value 標記錯誤和匹配錯誤。消融結果表明針對數據解釋性差且分散的工業數據集任務,利用存儲著數據庫配置信息和數據表信息的元數據能讓工業Text-to-SQL 任務的準確率得到顯著的提升。
在對比分析了測試集預測的SQL 語句和用于參照的Gold SQL后,主要發現以下3 類錯誤:
1)value 匹配錯誤。主要原因在于工業自然語言問句中where 子句涉及的列實體較多且這些列實體所存儲的數據類型相似,難以找到合適的特征區分這些value 導致列實體的匹配出現錯誤。
2)from 子句的表名匹配錯誤。主要原因在于工業數據庫中不同表中經常含有相同的字段名,導致在聯合查詢中會出現表名識別錯誤的情況。未來的工作中將嘗試使用全局信息重排序的方法來解決這類問題。
3)SQL 語句的結構錯誤。主要有兩方面:一方面問句分類產生錯誤;另一方面在于本文的模型難以處理嵌套查詢這類SQL 語句結構非常復雜的自然語言查詢問題,這也是當前國內外Text-to-SQL 任務面臨的最大挑戰,將在未來的工作中嘗試解決這類問題。
本文主要研究中文Text-to-SQL 的工業應用,針對英文模型遷移到中文工業Text-to-SQL 任務過程中遇到的問題提出了一套完整的解決方案。首先針對自然語言查詢的描述與數據庫中表名和列名等數據庫對象信息的描述不一致的問題,將工廠元數據信息融入到具體的數據使用中,通過元數據對自然語言中的描述進行規范化。其次針對列名未明顯出現在文句中的問題:一方面通過BERT+BiLSTM+CRF 命名實體識別模型完成時間實體的識別;另一方面通過元數據中的數據倉庫設計完成時間實體以外的標簽項的映射,從而得出對應列名的標記。再次針對工業數據表中數據存儲量過大難以直接套用英文模型的問題,利用中文問句中value 和column 位置特性選擇使用相對位置的注意力模型,這樣僅需問句和數據庫模式信息即可完成value 的識別。最后對自然語言問句的查詢特征進行歸納后使用添加問句分類模板槽填充的方式進一步提高SQL 語句結構預測的準確率。
本文根據實際需求構建了一個中文的工業Text-to-SQL數據集,并在該數據集上評估了目前Spider 任務的主流模型以及本文改進后的模型的效果。實驗結果表明修改后的模型能有效處理工業自然語言查詢問題,同時也表明本文在遷移過程中提出的修改方法和處理策略具有一定的理論意義和研究價值。對于嵌套查詢這種非常復雜的SQL 語句,Spider 任務上的模型和本文的模型都沒能得到很好的結果。在未來的工作中,將考慮構建嚴格的語法結構并通過遞歸的方式來處理嵌套查詢這類復雜SQL 語句的查詢問題,從而進一步提高中文工業Text-to-SQL 任務的準確率。