簡介
Text-to-SQL系統能夠將自然語言描述轉化成對應的SQL查詢語句,這項技術能夠有效地輔助人們對海量的資料庫進行查詢。因此,該項研究引起了工業界和學術界的廣泛關注。其中,WikiSQL、Spider等大規模標註資料集進一步指出了該技術目前面臨的挑戰:泛化性(跨領域)、複雜性(SQL語法)、正確性(問題和表格的對齊關係),也促進了一系列後續演算法的研究與系統的開發。
任務介紹
在現實生活中,有許許多多的資料庫,儲存著各行各業的資訊,比如學校的選課資訊、成績資訊,公司的賬務資訊、人員流動。SQL是一種資料庫查詢語言,具有極大的靈活性和強大的功能,然而對於普通人來說,SQL學習門檻比較高。即使對於計算機從業者來說,想要針對不同的資料庫和應用場景,編寫大量的並保證正確率的SQL語句,也比較麻煩。如果我們能夠有一個工具,自動地把我們的描述轉化為SQL查詢語句,再交給計算機去執行,就能方便地對資料庫進行查詢,那就大大提高了我們的生活和工作效率。
Text-to-SQL就是這樣一項轉化自然語言描述為SQL查詢語句的技術。舉個例子:當我們詢問智慧助手 “賈樟柯導演是在哪出生的啊?”,Text-to-SQL模型就會先根據問句解析出SQL語句“SELECT birth_city FROM director WHERE name ="賈樟柯"”,再對資料庫執行該命令,最後向使用者返回查詢結果“山西省汾陽市”。
目前這個研究問題引起了學術界和工業界的廣泛關注,有著很多的比賽和標註資料集,其中比較有名的,包括有關機票訂閱的ATIS資料集、有關地理資訊查詢的GeoQuery、基於維基百科的WikiSQL以及目前最複雜的多領域資料集Spider。在中文Text-to-SQL任務方面,西湖大學日前公佈了CSpider資料集,追一科技在天池資料平臺舉行了第一屆中文text2sql挑戰賽。
在這裡,我們給出Text-to-SQL任務一個相對正式的定義:在給定關係型資料庫(或表)的前提下,由使用者的提問生成相應的SQL查詢語句。下圖是一個具體的例項,問題為:有哪些系的教員平均工資高於總體平均值,請返回這些系的名字以及他們的平均工資值。可以看到該問題對應的SQL語句是很複雜的,並且有巢狀關係。
圖1 Spider資料集的樣例
相關資料集介紹
早期資料集:ATIS&GeoQuery
ATIS來源於機票訂閱系統,由使用者提問生成SQL語句,是一個單一領域且上下文相關的資料集。GeoQuery來源於美國的地理,包括880條的提問與SQL語句,是一個單一領域且上下文無關的資料集。
WikiSQL
ATIS&GeoQuery這兩個資料集存在著資料規模小(SQL不足千句),標註簡單等問題。於是,2017年,VictorZhong等研究人員基於維基百科,標註了80654的訓練資料,涵蓋了26521個資料庫,取名為WikiSQL。這個大型資料集一經推出,便引起學術界的廣泛關注。因為它對模型的設計提出了新的挑戰,需要模型更好的建構Text和SQL之間的對映關係,更好的利用表格中的屬性,更加關注解碼的過程。在後續工作中產生了一系列優秀的模型,其中的代表工作:seq2sql、SQLNet、TypeSQL,我們將在主流工作一章進行詳細的介紹。
專案連結:https://github.com/salesforce/WikiSQL
Spider
但是WikiSQL也存在著問題,它的每個問題只涉及一個表格,而且也僅支援比較簡單的SQL操作,這個不是很符合我們日常生活中的場景。現實生活中存在著醫療、票務、學校、交通等各個領域的資料庫,而且每個資料庫又有數十甚至上百個表格,表格之間又有著複雜的主外來鍵聯絡。
於是,2018年,耶魯大學的研究人員推出了Spider資料集,這也是目前最複雜的Text-to-SQL資料集。它有以下幾個特點:1)領域比較豐富,擁有來自138個領域的200多個資料庫,每個資料庫平均對應5.1個表格,並且訓練集、測試集中出現的資料庫不重合。2)SQL語句更為複雜,包含orderBy、union、except、groupBy、intersect、limit、having 關鍵字,以及巢狀查詢等。作者根據SQL語句的複雜程度(關鍵字個數、巢狀程度)分為了4種難度,值得注意的是,WikiSQL在這個劃分下只有EASY難度。Spider相比WikiSQL,對模型的跨領域、生成複雜SQL的能力提出了新的要求,目前的最佳模型也只有60%左右的準確度。
挑戰賽連結:https://yale-lily.github.io/spider
下面是Hard和Extra Hard的例項:
圖2 Spider資料集中Hard以及Extra Hard難度的樣例
中文CSpider
西湖大學在EMNLP2019上提出了一箇中文text-to-sql的資料集CSpider,主要是選擇Spider作為源資料集進行了問題的翻譯,並利用SyntaxSQLNet作為基線系統進行了測試,同時探索了在中文上產生的一些額外的挑戰,包括中文問題對英文資料庫的對應問題(question-to-DBmapping)、中文的分詞問題以及一些其他的語言現象。
挑戰賽連結:https://taolusi.github.io/CSpider-explorer/
Sparc
耶魯大學的研究團隊後續又推出了SParC,即Spider的上下文相關版本。資料庫基於Spider,模擬了使用者進行資料庫查詢的過程:使用者通過若干條相關的提問最後達到一個最終查詢目的。
圖3 Sparc資料集中的樣例
挑戰賽連結:https://yale-lily.github.io/sparc
不同資料集對比如下圖所示(平均含表格指每個資料庫平均包含多少個表格)
表1 資料集資訊統計
評價方法
Text-to-SQL的評價方法主要包含兩種,一個是精確匹配率(exact match ),另一個是執行正確率(executionaccuracy)。精確匹配指預測得到的SQL與正確的SQL語句在SELECT、WHERE等模組達到字串完全匹配,即整句匹配;執行正確是指,執行預測得到的SQL語句,資料庫能夠返回正確答案。目前WikiSQL支援exactmatch和execution accuracy,Spider僅支援exact match。
模型介紹
在深度學習的研究背景下,很多研究人員將Text-to-SQL看作一個類似神經機器翻譯的任務,主要採取seq2seq的模型框架。基線模型seq2seq在加入Attention、Copying等機制後,能夠在ATIS、GeoQuery資料集上達到84%的精確匹配,但是在WikiSQL上只能達到23.3%的精確匹配,37.0%的執行正確率;在Spider上則只能達到5~6%的精確匹配。
究其原因,可以從編碼和解碼兩個角度來看。首先編碼方面,自然語言問句與資料庫之間需要形成很好的對齊或對映關係,即問題中到底涉及了哪些表格中的哪些實體詞,以及問句中的詞語觸發了哪些選擇條件、聚類操作等;另一方面在解碼部分,SQL作為一種形式定義的程式語言,本身對語法的要求更嚴格(關鍵字順序固定)以及語義的界限更清晰,失之毫釐差之千里。普通的seq2seq框架並不具備建模這些資訊的能力。
於是,主流模型的改進與後續工作主要圍繞著以下幾個方面展開:通過更強的表示(BERT、XLNet)、更好的結構(GNN)來顯式地加強Encoder端的對齊關係及利用結構資訊;通過樹形結構解碼、填槽類解碼來減小搜尋解空間,以增加SQL語句的正確性;通過中間表示等技術提高SQL語言的抽象性;通過定義新的對齊特徵,利用重排序技術,對beamsearch得到的多條候選結果進行正確答案的挑選;以及非常有效的資料增強方法。
Pointer Network
傳統的seq2seq模型的解碼器部分所使用的單詞表是固定的,即在生成序列中都是從固定的單詞表中進行選取。但Text-to-SQL不同於一般的seq2seq任務,它的生成序列中可能出現:a)問句中的單詞;b) SQL關鍵字;c)對應資料庫中的表名、列名。
Pointer Network很好地解決了這一問題,其輸出所用到的詞表是隨輸入而變化的。具體做法是利用注意力機制,直接從輸入序列中選取單詞作為輸出。
在Text-to-SQL任務中,可以考慮把使用者的提問以及目標SQL語句可能出現的其他詞作為輸入序列 (列名單詞序列;SQL的關鍵字表;問題的單詞序列),利用PointerNetwork直接從輸入序列中選取單詞作為輸出。在解碼器的每一步,與編碼器的每一個隱層狀態計算注意力分數,取最大值作為當前的輸出以及下一步的輸入。
Seq2SQL
Pointer Network雖然一定程度上解決了問題,但是它並沒有利用到SQL語句固有的語法結構。Seq2SQL將生成的SQL語句分為三個部分:聚合操作:(SUM、COUNT、MIN、MAX等)、SELECT:選取列、WHERE:查詢條件。每一部分使用不同的方法進行計算。
SELECT與聚合操作,均採用了注意力機制進行分類。WHERE子句可以利用前面介紹的Pointer Network進行訓練,但是對於很多查詢來說,WHERE子句的寫法並不是唯一的,例如:
SELECT name FROM insurance WHERE age > 18 AND gender ="male";
SELECT name FROM insurance WHERE gender = "male"AND age > 18;
這可能導致原本正確的輸出被判斷為錯誤的。於是作者提出利用強化學習基於查詢結果來進行優化。在解碼器部分,對可能的輸出進行取樣,產生若干個SQL語句,每一句表示為y=[y1, y2 ... yT],用打分函式對每一句進行打分:
SQLNet
圖4 根據SQL Sketch,將Seq2Seq形式的序列生成轉化為Seq2SET形式的槽值填充
為了解決Seq2SQL使用強化學習效果不明顯的問題,SQLNet將SQL語句分成了SELECT和WHERE兩個部分,每個部分設定了幾個槽位,只需向槽位中填入相應的符號即可。
SELECT子句部分與Seq2SQL類似,不同地方在於WHERE子句,它使用了一種sequence-to-set(由序列生成集合)機制,用於選取目標SQL語句中的WHERE子句可能出現的列。對於表中的每一列給出一個概率。之後計算出WHERE子句中的條件個數k,然後選取概率最高的前k個列。最後通過注意力機制進行分類得到操作符和條件值。
TypeSQL
圖5 TypeSQL示意圖:顯式地賦予每個單詞型別
該模型基於SQLNet,使用模版填充的方法生成SQL語句。為了更好地建模文字中出現的罕見實體和數字,TypeSQL顯式地賦予每個單詞型別。
型別識別過程:將問句分割n-gram (n取2到6),並搜尋資料庫表、列。對於匹配成功的部分賦值column型別賦予數字、日期四種型別:INTEGER、FLOAT、DATE、YEAR。對於命名實體,通過搜尋FREEBASE,確定5種型別:PERSON,PLACE,COUNTREY,ORGANIZATION,SPORT。這五種型別包括了大部分實體型別。當可以訪問資料庫內容時,進一步將匹配到的實體標記為具體列名(而不只是column型別)
SQLNet為模版中的每一種成分設定了單獨的模型;TypeSQL對此進行了改進,對於相似的成分,例如SELECT_COL 和COND_COL以及#COND(條件數),這些資訊間有依賴關係,通過合併為單一模型,可以更好建模。TypeSQL使用3個獨立模型來預測模版填充值:
MODEL_COL:SELECT_COL,#COND,COND_COL
MODEL_AGG:AGG
MODEL_OPVAL:OP, COND_VAL
SyntaxSQLNet
相比於之前decoder輸出一段線性的文字,SyntaxSQLNet將解碼的過程引入了結構性資訊,即解碼的物件為SQL語句構成的樹結構。通過該技術,模型的精確匹配率提高了14.8%。
圖6 SyntaxSQLNet利用SQL的樹結構進行解碼
SyntaxSQLNet將SQL語句的預測分解為9個模組,每個模組對應了SQL語句中的一種成分。解碼時由預定義的SQL文法確定這9個模組的呼叫順序,從而引入結構資訊。樹的生成順序為深度優先。分解出的9個模組有:
IUEN模組:預測INTERCEPT、UNION、EXCEPT、NONE(巢狀查詢相關)
KW模組:預測WHERE、GROUP BY、ORDER BY、SELECT關鍵字
COL模組:預測列名
OP模組:預測>、<、=、LIKE等運算子
AGG模組:預測MAX、MIN、SUM等聚合函式
Root/Terminal模組:預測子查詢或終結符
Module模組:預測子查詢或終結符
AND/OR模組:預測條件表示式間的關係
DESC/ASC/LIMIT模組:預測與ORDERBY相關聯的關鍵字
HAVING模組:預測與GROUPBY相關的Having從句
該工作同時提供了一種針對text2sql任務的資料增強方法,生成跨領域、更多樣的訓練資料。通過該技術,模型的精確匹配率提高了7.5%。
具體做法為:對SPIDER中的每條資料,將值和列名資訊除去,得到一個模板;對處理後的SQL模版進行聚類,通過規則去除比較簡單的模板,並依據模板出現的頻率,挑選50個複雜SQL模板;人工核對SQL-問句對,確保SQL模板中每個槽在問句中都有對應型別的資訊。
得到一一對應的模板後,應用於WikiSQL資料庫:首先隨機挑選10個模板,然後從庫中選擇相同型別的列,最後用列名和值填充SQL模板和問句模板。通過該方法,作者最終在18000的WikiSQL資料庫上得到了新的98000組訓練資料,同時在訓練的時候也利用了WikiSQL資料集原有的訓練資料。
IRNet
與SyntaxSQLNet類似,IRNet定義了一系列的CFG文法,將SQL轉發為語法樹結構。可以將其看作一種自然語言與SQL語句間的中間表示(作者稱之為SemQL),整個parsing的過程也是針對SemQL進行的。如圖所示:
圖7 IRNet利用定義的CFG將SQL轉化為更抽象的SemQL
作者另一部分的改進主要在schemelinking,即如何找到問題中所提到的表格與列。他將問題中可能出現的實體分為3類:表格名、列名、表中的值。根據3類實體的不同,具體做法分為:a)表格名和列名:以n-gram的形式列舉問題中的span,然後和表格名、列名進行匹配。可以看到下圖中的Question中對應的單詞有的被標成了Column或者Table。b) 表中的值:將問題中以引號為開頭結尾的span,送給ConceptNet進行查詢,再將返回結果中的 ‘is a type of’/'related terms'關係的詞與列名進行匹配。
圖8 IRNet的模型結構
Global-GNN
為了更好的利用關係型資料庫的結構資訊,BenBogin等研究人員提出使用圖網路來建模表格名和列名。如下圖所示:圓圈加粗的結點代表表格,不加粗的結點代表列名;雙向邊代表表格和列名的從屬關係;紅虛邊和藍虛邊代表主外來鍵關係。橙色節點代表與問題有關的結果,淡色為無關。
圖9 左:模型輸入樣例(問題、表名、列名、主外來鍵關係)
右:用於建模表格結構資訊的GNN(包括兩類節點,三類邊)
除此之外,該團隊還提出了一種基於全域性資訊重排序的做法。首先先看下面這個例子,我們不知道name到底指向的是singer還是song,但是我們可以觀察到nation只在singer中出現,所以應該是singer.name。這樣做globalreasoning,就能減小歧義性。
圖10 根據全域性資訊,我們可以通過country來確定第一個name為singer.name而不是song.name(name和nation同屬於一個實體)
圖11 GlobalGNN的工作流程
RAT-SQL
該工作可以看作圖網路GNN的後續工作,作者在Table、Column、Question三者之間定義了更多的邊(共33種),是目前榜單上的最強模型。
圖12 RAT-SQL的樣例:引入了Question節點
Global-GNN只建模了Table和Column的聯絡,RAT-SQL在此基礎上又在圖中加入Question的節點,而且利用字串匹配的方法豐富了邊的型別。
表2 RAT SQL新定義的邊關係
總結
目前,SQL生成任務因其實用的應用場景,引起了學術界和工業界的廣泛關注。目前大家的做法也是百花齊放:中間表示、樹形解碼、圖網路建模Quetion和資料庫間的關係、重排序、資料增強。但目前的模型,還不能很好解決複雜的操作,例如IRNet在Hard和ExtraHard的準確率也僅為48.1%和25.3%。期待後面能有更加有效、簡潔、優雅的工作出現。
表3 模型效果比較(Acc ex: 執行結果;Acc em: SQL完全匹配;Acc qu: SQL無序匹配)
參考文獻
[1] Seq2sql: Generating structured queries fromnatural language using reinforcement learning (Victor Zhong, Caiming Xiong,Richard Socher. CoRR2017)
[2] Towards Complex Text-to-SQL in Cross-DomainDatabase with Intermediate Representation (Jiaqi Guo, Zecheng Zhan, Yan Gao,Yan Xiao, Jian-Guang Lou, Ting Liu, and Dongmei Zhang. ACL2019)
[3] SParC: Cross-Domain Semantic Parsing in Context(Tao Yu, Rui Zhang, Michihiro Yasunaga, Yi Chern Tan, Xi Victoria Lin, Suyi Li,Heyang Er, Irene Li, Bo Pang, Tao Chen, Emily Ji, Shreya Dixit, David Proctor,Sungrok Shim, Jonathan Kraft, Vincent Zhang, Caiming Xiong, Richard Socher,Dragomir Radev. ACL2019)
[4] Pointer Networks (OriolVinyals, Meire Fortunato, Navdeep Jaitly. NIPS2015)
[5] SQLNet: Generating Structured Queries FromNatural Language Without Reinforcement Learning (Xiaojun Xu, Chang Liu, DawnSong. ICLR2018)
[6] TypeSQL: Knowledge-based Type-Aware NeuralText-to-SQL Generation (Tao Yu, Zifan Li, Zilin Zhang, Rui Zhang, DragomirRadev. NAACL2018)
[7] SyntaxSQLNet: Syntax Tree Networks for Complexand Cross-DomainT ext-to-SQL Task. (Tao Yu, Michihiro Yasunaga, Kai Yang, RuiZhang, Dongxu Wang, Zifan Li, and Dragomir Radev. EMNLP2018)
[8] Global Reasoning over Database Structures forText-to-SQL Parsing (Ben Bogin, Matt Gardner, Jonathan Berant. EMNLP2019)
[9] RAT-SQL: Relation-Aware Schema Encoding andLinking for Text-to-SQL Parsers (Bailin Wang, Richard Shin, Xiaodong Liu,Oleksandr Polozov, Matthew Richardson. Submitted to ACL2020)
[10] A Pilot Study for Chinese SQL Semantic Parsing(Qingkai Min , Yuefeng Shi and Yue Zhang EMNLP2019)