NL2SQL(Natural Language to SQL)是一項(xiàng)將用戶(hù)的自然語(yǔ)句轉(zhuǎn)為可執(zhí)行 SQL 語(yǔ)句的技術(shù),有很大的實(shí)際應(yīng)用價(jià)值,對(duì)改善用戶(hù)與數(shù)據(jù)庫(kù)之間的交互方式有很大意義。在本文中,追一科技介紹了 NL2SQL 的價(jià)值,及其過(guò)去、現(xiàn)在與未來(lái),希望能有更多關(guān)于 NL2SQL 的落地場(chǎng)景研究。在 AI、區(qū)塊鏈、IoT、AR 等高新技術(shù)飛速發(fā)展的當(dāng)下,這一寶庫(kù)似乎被大家遺忘在了角落。數(shù)據(jù)庫(kù)存儲(chǔ)了大量的個(gè)人或者企業(yè)的生產(chǎn)運(yùn)營(yíng)數(shù)據(jù),我們每天都會(huì)和數(shù)據(jù)庫(kù)產(chǎn)生或多或少的交互。通常,查詢(xún)數(shù)據(jù)庫(kù)中的數(shù)據(jù)需要通過(guò)像 SQL 這樣的程序式查詢(xún)語(yǔ)言來(lái)進(jìn)行交互,這就需要懂 SQL 語(yǔ)言的專(zhuān)業(yè)技術(shù)人員來(lái)執(zhí)行這一操作。為了讓非專(zhuān)業(yè)用戶(hù)也可以按需查詢(xún)數(shù)據(jù)庫(kù),當(dāng)前流行的技術(shù)方案設(shè)計(jì)了基于條件篩選的專(zhuān)門(mén)界面,用戶(hù)可以通過(guò)點(diǎn)選不同的條件來(lái)查詢(xún)數(shù)據(jù)庫(kù),比如下面這個(gè)篩選汽車(chē)的界面。然而,在這個(gè)界面上操作,極大地限制了數(shù)據(jù)庫(kù)查詢(xún)的使用場(chǎng)景和查詢(xún)界限。同時(shí),即使對(duì)于精通數(shù)據(jù)庫(kù)程序語(yǔ)言的專(zhuān)業(yè)人士,經(jīng)常構(gòu)思 SQL 語(yǔ)句、維護(hù)這樣一個(gè)查詢(xún)界面也是一項(xiàng)重復(fù)度較高的工作。在 CUI(Conversation User Interface)的大背景下,如何通過(guò)自由地查詢(xún)數(shù)據(jù)庫(kù)中的目標(biāo)數(shù)據(jù)成為了新興的研究熱點(diǎn)。Natural Language to SQL (NL2SQL) 就是這樣的一項(xiàng)技術(shù),它可以將用戶(hù)的自然語(yǔ)句轉(zhuǎn)為可以執(zhí)行的 SQL 語(yǔ)句。Nothing is better than an example. 針對(duì)上圖這樣的數(shù)據(jù)庫(kù)表格,用戶(hù)可能會(huì)想知道「寶馬的車(chē)總共賣(mài)了多少輛?」,其相應(yīng)的 SQL 表達(dá)式是「SELECT SUM(銷(xiāo)量) FROM TABLE WHERE 品牌==」寶馬」;」。而 NL2SQL 做的,就是結(jié)合用戶(hù)想要查詢(xún)的表格,將用戶(hù)的問(wèn)句轉(zhuǎn)化為相應(yīng)的 SQL 語(yǔ)句,從而得到答案「8」。表格數(shù)據(jù)是信息在經(jīng)過(guò)人為整理、歸納后的一種高效的結(jié)構(gòu)化表達(dá)形式,信息的價(jià)值、密度和質(zhì)量高于普通的文字文本。用很多文字才能描述清楚的信息,可能一張表格就夠了。在行業(yè)研報(bào)、業(yè)績(jī)報(bào)告、新聞公告、使用說(shuō)明書(shū)等各種書(shū)面信息載體上,尤其是金融、快消等行業(yè)的各種報(bào)告中,充斥著許多表格形式的。而當(dāng)用戶(hù)去查詢(xún)表格中的內(nèi)容時(shí),需要肉眼去從表格中篩選滿(mǎn)足條件的數(shù)據(jù),準(zhǔn)確率和效率都較低。通過(guò) NL2SQL,用戶(hù)在查詢(xún)這些表格的內(nèi)容時(shí),可以直接通過(guò)自然語(yǔ)言與表格進(jìn)行交互,并得到結(jié)果,用戶(hù)體驗(yàn)會(huì)很自然。比如下面這張出自某房地產(chǎn)行業(yè)研報(bào)的表格:針對(duì)這張表格,用戶(hù)可能會(huì)想問(wèn)「哪些城市的全月銷(xiāo)量同比超過(guò)了 50% 或者當(dāng)日環(huán)比大于 25%?相應(yīng)的房產(chǎn)類(lèi)型和銷(xiāo)售面積情況如何?」這樣的問(wèn)題。通過(guò) NL2SQL 模型,可以直接得到相應(yīng)的 SQL 語(yǔ)句「select 城市, 類(lèi)型, 全月數(shù)值 (萬(wàn)平) from table where 全月同比 (%) > 50 or 當(dāng)日環(huán)比 (%) > 25」,并進(jìn)一步返回執(zhí)行該 SQL 語(yǔ)句后的結(jié)果,如下表所示:如今,在很多日常應(yīng)用場(chǎng)景中,用戶(hù)都會(huì)和數(shù)據(jù)庫(kù)進(jìn)行交互,比如訂餐、訂票、查天氣、查報(bào)表等等,絕大部分的解決方案也是通過(guò)輸入條件和點(diǎn)選條件來(lái)進(jìn)行查詢(xún)。即使部分場(chǎng)景已經(jīng)進(jìn)行了技術(shù)升級(jí),可以通過(guò)對(duì)話(huà)機(jī)器人的方式來(lái)進(jìn)行交互,但其背后仍然預(yù)設(shè)了不同的條件入口,需要模型通過(guò)一系列的實(shí)體識(shí)別、槽值提取等流程來(lái)填充預(yù)先規(guī)定好的 SQL 模板。對(duì)于這樣的方案,不僅查詢(xún)的信息和篩選的條件會(huì)局限于預(yù)先設(shè)好的字段,這些功能模塊的開(kāi)發(fā)和維護(hù)也需要大量的人力資源。而如果使用 NL2SQL 的技術(shù)方案,用戶(hù)與數(shù)據(jù)庫(kù)之間的距離可以進(jìn)一步縮短,用戶(hù)可以更自由地查詢(xún)更多信息、表達(dá)自己更豐富的查詢(xún)意圖,還可以減輕目前技術(shù)方案的繁瑣,解放程序員。NL2SQL 不僅可以獨(dú)當(dāng)一面,降低人機(jī)交互的距離和門(mén)檻,也可以與其它技術(shù)相輔相成。比如,現(xiàn)今的機(jī)器閱讀理解技術(shù)已經(jīng)可以在 SQUAD 1.0、SQUAD 2.0 等數(shù)據(jù)集上超越人類(lèi)水平,還可以在其它各種形式的數(shù)據(jù)集上尋找答案,比如多段落、多文檔、抽取式答案、生成式答案等形式。但目前機(jī)器閱讀理解技術(shù)還不能對(duì)文章中出現(xiàn)的表格進(jìn)行解讀,如果用戶(hù)想要的答案存在于文章中的表格內(nèi),那么現(xiàn)有的模型就都束手無(wú)策了。然而表格數(shù)據(jù)在真實(shí)場(chǎng)景中存在很多,且表格中的數(shù)據(jù)很有價(jià)值,用戶(hù)也會(huì)經(jīng)常針對(duì)其中的數(shù)據(jù)進(jìn)行提問(wèn)。比如下圖中的這一真實(shí)場(chǎng)景,用戶(hù)如果想問(wèn)「在哪些年里平均溢價(jià)率高于 20%」這樣的問(wèn)題,依靠現(xiàn)有的機(jī)器閱讀理解技術(shù),在文本中是找不到答案的。而 NL2SQL 可以很好地彌補(bǔ)現(xiàn)有技術(shù)的不足,完善非結(jié)構(gòu)化文本問(wèn)答在真實(shí)落地場(chǎng)景中的應(yīng)用,更充分地發(fā)掘此類(lèi)結(jié)構(gòu)化數(shù)據(jù)的價(jià)值。研報(bào)部分來(lái)源于東吳證券《房地產(chǎn)行業(yè) 2019 年度策略》存儲(chǔ)在 Excel 中的表格數(shù)據(jù)也可以被利用起來(lái)。設(shè)想一下這樣的場(chǎng)景,財(cái)務(wù)人員將日常的財(cái)務(wù)數(shù)據(jù)存儲(chǔ)在 Excel 中,日積月累產(chǎn)生了大量的 Excel 文件。財(cái)務(wù)人員需要了解其中的數(shù)據(jù)時(shí),首先要從層層深入的文件夾、密密麻麻的 Excel 中找到正確的文件,然后打開(kāi) Excel 文件去密集的單元格中找到想要的答案。在這個(gè)過(guò)程中找錯(cuò)文件是常事,效率十分低下。如果利用 NL2SQL 技術(shù),這一場(chǎng)景就會(huì)非常的優(yōu)雅高效:首先定位預(yù)處理存入數(shù)據(jù)庫(kù)的表格,再執(zhí)行查詢(xún)邏輯,最后將結(jié)果直接返回。我們可以期待,NL2SQL 將改變傳統(tǒng)的人與表格之間的交互方式,作為不可或缺的功能來(lái)改善人與機(jī)器之間的交流,讓這場(chǎng) CUI 升級(jí)革命可以走進(jìn)更多的場(chǎng)景、行業(yè),惠及更廣泛的群體。早在上世紀(jì)中后期,人們就已經(jīng)在嘗試開(kāi)發(fā)通過(guò)自然語(yǔ)言直接訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)中存儲(chǔ)數(shù)據(jù)的界面了(NLIDB,Natural Language Interfaces to Databases),其中最知名的是二十世紀(jì)六十年代的 LUNAR 系統(tǒng),它通過(guò)對(duì)問(wèn)句的句式語(yǔ)法分析,來(lái)回答關(guān)于從阿波羅任務(wù)中帶回的月巖的地質(zhì)學(xué)分析問(wèn)題。再比如二十世紀(jì)七十年代初的 LADDER 系統(tǒng),它已經(jīng)支持通過(guò)一定的語(yǔ)義語(yǔ)言從數(shù)據(jù)庫(kù)提取信息。但這種系統(tǒng)對(duì)自然語(yǔ)言問(wèn)題的解析并不依賴(lài)于句子成分,這要求每一個(gè)具有特定知識(shí)的數(shù)據(jù)庫(kù)都需要特定的語(yǔ)義語(yǔ)法,所以該方法在普適性上不夠完善。受限于當(dāng)時(shí)技術(shù)發(fā)展,NLIDB 面臨很大的挑戰(zhàn),系統(tǒng)語(yǔ)言的支持上限以及對(duì)于語(yǔ)言的理解上限不明確、語(yǔ)言上邏輯和含義的歧義、生僻詞的出現(xiàn)等,以及替代品的發(fā)展(如 Excel 表格這種存儲(chǔ)表格新形式的出現(xiàn)),這些都極大限制了這個(gè)領(lǐng)域的發(fā)展。直到 2015 年 AI 的復(fù)蘇和自然語(yǔ)言處理的創(chuàng)新,人們才慢慢把關(guān)注拉回了 NLIDB。如何利用自然語(yǔ)言更自然更自由地與數(shù)據(jù)庫(kù)交互成為了新興的研究熱點(diǎn)。那 NL2SQL 在學(xué)術(shù)中的定位是怎么樣的呢?NL2SQL 這一任務(wù)的本質(zhì),是將用戶(hù)的自然語(yǔ)言語(yǔ)句轉(zhuǎn)化為計(jì)算機(jī)可以理解并執(zhí)行的規(guī)范語(yǔ)義表示 (formal meaning representation),是語(yǔ)義分析 (Semantic Parsing) 領(lǐng)域的一個(gè)子任務(wù)。NL2SQL 是由自然語(yǔ)言生成 SQL,那么自然也有 NL2Bash、NL2Python、NL2Java 等類(lèi)似的研究。下面是來(lái)自 NL2Bash Dataset 的一條數(shù)據(jù):NL: Search for the string ‘git’ in all the files under current directory tree without traversing into ‘.git’ folder and excluding files that have ‘git’ in their names.Bash: find . -not -name '.git' -not -path '*.git*' -not –name '*git*' | xargs -I {} grep git {}雖然生成的程序語(yǔ)言不同,但核心任務(wù)與 NL2SQL 相同,都是需要計(jì)算機(jī)理解自然語(yǔ)言語(yǔ)句,并生成準(zhǔn)確表達(dá)語(yǔ)句語(yǔ)義的可執(zhí)行程序式語(yǔ)言。廣義來(lái)說(shuō),KBQA 也與 NL2SQL 技術(shù)有著千絲萬(wàn)縷的聯(lián)系,其背后的做法也是將用戶(hù)的自然語(yǔ)言轉(zhuǎn)化為邏輯形式,只不過(guò)不同點(diǎn)在于前者轉(zhuǎn)化的邏輯形式是 SPARQL,而不是 SQL。將生成的查詢(xún)語(yǔ)句在知識(shí)圖譜執(zhí)行,直接得到用戶(hù)的答案,進(jìn)而提升算法引擎的用戶(hù)體驗(yàn)。目前,NL2SQL 方向已經(jīng)有 WikiSQL、Spider、WikiTableQuestions、ATIS 等諸多公開(kāi)數(shù)據(jù)集。不同數(shù)據(jù)集都有各自的特點(diǎn),這里簡(jiǎn)單介紹一下這四個(gè)數(shù)據(jù)集。WikiSQL 是 Salesforce 在 2017 年提出的大型標(biāo)注 NL2SQL 數(shù)據(jù)集,也是目前規(guī)模最大的 NL2SQL 數(shù)據(jù)集。它包含了 24,241 張表、80,645 條自然語(yǔ)言問(wèn)句及相應(yīng)的 SQL 語(yǔ)句。下圖是其中的一條數(shù)據(jù)樣例,包括一個(gè) table、一條 SQL 語(yǔ)句及該條 SQL 語(yǔ)句所對(duì)應(yīng)的自然語(yǔ)言語(yǔ)句。該數(shù)據(jù)集自提出之后,已經(jīng)有 18 次公開(kāi)提交。由于 SQL 的形式較為簡(jiǎn)單,該數(shù)據(jù)集不涉及高級(jí)用法,Question 所對(duì)應(yīng)的正確表格已經(jīng)給定,不需要聯(lián)合多張表格,這些簡(jiǎn)化使得強(qiáng)監(jiān)督模型已經(jīng)可以在 WikiSQL 上達(dá)到執(zhí)行 91.8% 的執(zhí)行準(zhǔn)確率。Spider 是耶魯大學(xué) 2018 年新提出的一個(gè)較大規(guī)模的 NL2SQL 數(shù)據(jù)集。該數(shù)據(jù)集包含了 10,181 條自然語(yǔ)言問(wèn)句、分布在 200 個(gè)獨(dú)立數(shù)據(jù)庫(kù)中的 5,693 條 SQL,內(nèi)容覆蓋了 138 個(gè)不同的領(lǐng)域。雖然在數(shù)據(jù)數(shù)量上不如 WikiSQL,但 Spider 引入了更多的 SQL 用法,例如 Group By、Order By、Having,甚至需要 Join 不同表,這更貼近真實(shí)場(chǎng)景,也帶來(lái)了更高的難度。因此目前在該榜單上只有 8 次提交,在不考慮條件判斷中 value 的情況下,準(zhǔn)確率最高只有 54.7,可見(jiàn)這個(gè)數(shù)據(jù)集的難度非常大。上圖是該數(shù)據(jù)集中的一條樣例。在這個(gè)以 College 為主題的數(shù)據(jù)庫(kù)中,用戶(hù)詢(xún)問(wèn)「講師的工資高于平均工資水平的部門(mén)以及相應(yīng)的預(yù)算是什么?」,模型需要根據(jù)用戶(hù)的問(wèn)題和已知的數(shù)據(jù)庫(kù)中各種表格、字段及其之間錯(cuò)綜復(fù)雜的關(guān)系來(lái)生成正確的 SQL。WikiTableQuestions 是斯坦福大學(xué)于 2015 年提出的一個(gè)針對(duì)維基百科中那些半結(jié)構(gòu)化表格問(wèn)答的數(shù)據(jù)集,包含了 22,033 條真實(shí)問(wèn)句以及 2,108 張表格。由于數(shù)據(jù)的來(lái)源是維基百科,因此表格中的數(shù)據(jù)是真實(shí)且沒(méi)有經(jīng)過(guò)歸一化的,一個(gè) cell 內(nèi)可能包含多個(gè)實(shí)體或含義,比如「Beijing, China」或「200 km」;同時(shí),為了很好地泛化到其它領(lǐng)域的數(shù)據(jù),該數(shù)據(jù)集測(cè)試集中的表格主題和實(shí)體之間的關(guān)系都是在訓(xùn)練集中沒(méi)有見(jiàn)到過(guò)的。下圖是該數(shù)據(jù)集中的一條示例,數(shù)據(jù)闡述的方式展現(xiàn)出作者想要體現(xiàn)的問(wèn)答元素。The Air Travel Information System (ATIS) 是一個(gè)年代較為久遠(yuǎn)的經(jīng)典數(shù)據(jù)集,由德克薩斯儀器公司在 1990 年提出。該數(shù)據(jù)集獲取自關(guān)系型數(shù)據(jù)庫(kù) Official Airline Guide (OAG, 1990),包含 27 張表以及不到 2,000 次的問(wèn)詢(xún),每次問(wèn)詢(xún)平均 7 輪,93% 的情況下需要聯(lián)合 3 張以上的表才能得到答案,問(wèn)詢(xún)的內(nèi)容涵蓋了航班、費(fèi)用、城市、地面服務(wù)等信息。下圖是取自該數(shù)據(jù)集的一條樣例,可以看出比之前介紹的數(shù)據(jù)集更有難度。圖片來(lái)自于 http://www./anthology/H90-1021在深度學(xué)習(xí)端到端解決方案流行之前,這一領(lǐng)域的解決方案主要是通過(guò)高質(zhì)量的語(yǔ)法樹(shù)和詞典來(lái)構(gòu)建語(yǔ)義解析器,再將自然語(yǔ)言語(yǔ)句轉(zhuǎn)化為相應(yīng)的 SQL。圖片來(lái)自于 Natural Language Interfaces to Databases(https:///pdf/cmp-lg/9503016.pdf)現(xiàn)在的解決方案則主要是端到端與 SQL 特征規(guī)則相結(jié)合。以在 WikiSQL 數(shù)據(jù)集上的 SOTA 模型 SQLova 為例:首先使用 BERT 對(duì) Question 和 SQL 表格進(jìn)行編碼和特征提取,然后根據(jù)數(shù)據(jù)集中 SQL 語(yǔ)句的句法特征,將預(yù)測(cè)生成 SQL 語(yǔ)句的任務(wù)解耦為 6 個(gè)子任務(wù),分別是 Select-Column、Select-Aggregation、Where-Number、Where-Column、Where-Operation 以及 Where-Value,不同子任務(wù)之間存在一定的依賴(lài)關(guān)系,最終使用提取到的特征依次進(jìn)行 6 個(gè)任務(wù)的預(yù)測(cè)。圖片來(lái)自于 SQLNet(https:///pdf/1711.04436.pdf)WikiSQL 數(shù)據(jù)集雖然是目前規(guī)模最大的有監(jiān)督數(shù)據(jù)集,但其數(shù)據(jù)形式和難度過(guò)于簡(jiǎn)單:對(duì)于 SQL 語(yǔ)句,條件的表達(dá)只支持最基礎(chǔ)的>、<、=,條件之間的關(guān)系只有 and,不支持聚組、排序、嵌套等其它眾多常用的 SQL 語(yǔ)法,不需要聯(lián)合多表查詢(xún)答案,真實(shí)答案所在表格已知等,所以在這個(gè)數(shù)據(jù)集上,SQL 執(zhí)行結(jié)果的準(zhǔn)確率目前已經(jīng)達(dá)到了 91.8%。圖片來(lái)自于 WikiSQL(https://github.com/salesforce/WikiSQL)但存在一個(gè)問(wèn)題,這樣的數(shù)據(jù)集并不符合真實(shí)的應(yīng)用場(chǎng)景。在真實(shí)場(chǎng)景中,用戶(hù)問(wèn)題中的值很可能不是數(shù)據(jù)表中所出現(xiàn)的,需要一定的泛化才可以匹配到;真實(shí)的表之間存在錯(cuò)綜復(fù)雜的鍵關(guān)聯(lián)關(guān)系,想要得到真實(shí)答案,通常需要聯(lián)合多張表進(jìn)行查詢(xún);每張表都有不同的意義,并且每張表中列的意義也各不不同,甚至可能相同名字的列在不同的表格中所代表的含義也是不同的;真實(shí)場(chǎng)景中,用戶(hù)的問(wèn)題表達(dá)會(huì)很豐富,會(huì)使用各種各樣的條件來(lái)篩選數(shù)據(jù)。諸如此類(lèi)的實(shí)際因素還有很多。因此,WikiSQL 數(shù)據(jù)集起到的作用很大程度上是拋磚引玉,而不具備實(shí)際應(yīng)用場(chǎng)景落地的價(jià)值。相比之下,Spider 等數(shù)據(jù)集更貼近真實(shí)應(yīng)用場(chǎng)景:涉及到查詢(xún)語(yǔ)句嵌套、多表聯(lián)合查詢(xún),并且支持幾乎所有 SQL 語(yǔ)法的用法,用戶(hù)問(wèn)句的表達(dá)方式和語(yǔ)義信息也更豐富。但即使作者們考慮到數(shù)據(jù)集的難度,貼心地將數(shù)據(jù)集按照難度分為簡(jiǎn)單、中等和困難,該數(shù)據(jù)集的難度也依然讓人望而生畏,目前各項(xiàng)指標(biāo)也都很低。如何更好地結(jié)合數(shù)據(jù)庫(kù)信息來(lái)理解并表達(dá)用戶(hù)語(yǔ)句的語(yǔ)義、如何編碼及表達(dá)數(shù)據(jù)庫(kù)的信息、如何生成復(fù)雜卻有必要的 SQL 語(yǔ)句,此類(lèi)挑戰(zhàn)還有很多需要解決,它們都是非常值得探索的方向。現(xiàn)在很多 NLP 子任務(wù)的指標(biāo)已經(jīng)刷得讓人無(wú)路可走了,低垂的果實(shí)被摘得七零八落。而 NL2SQL 以及其它的語(yǔ)義分析任務(wù),因?yàn)楦鞣N各樣的原因,現(xiàn)在還沒(méi)有引起大家足夠的關(guān)注,但它們有著相比于其它任務(wù)更高的實(shí)際應(yīng)用價(jià)值。如果可以落地真實(shí)場(chǎng)景,這將極大地改變現(xiàn)有的用戶(hù)和數(shù)據(jù)庫(kù)之間的交互方式,人們可以自由地和數(shù)據(jù)庫(kù)進(jìn)行交互,充分挖掘數(shù)據(jù)的價(jià)值,也減輕程序員的負(fù)擔(dān)。學(xué)界和工業(yè)界也越來(lái)越關(guān)注這方面的研究,追一科技 6 月份將發(fā)起首屆中文 NL2SQL 挑戰(zhàn)賽,期待 NL2SQL 在不遠(yuǎn)的將來(lái)會(huì)迎來(lái)屬于自己的春天,學(xué)術(shù)應(yīng)用兩開(kāi)花。  WikiSQL:https://github.com/salesforce/WikiSQL Spider:https://yale-lily./spider ATIS:https://www./siddhadev/ms-cntk-atis WikiTableQuestions:https://github.com/ppasupat/WikiTableQuestions
SQLova:https://github.com/naver/sqlova SQLNet:https://github.com/xiaojunxu/SQLNet SyntaxSQL:https://github.com/taoyds/syntaxsql
Text2SQL 資源匯總:https://github.com/jkkummerfeld/text2sql-data NLIDB 背景:http:///2017/12/natural-language-interfaces-to-databases-nlidb/ ACL Semantic Parsing Tutorial:https://github.com/allenai/acl2018-semantic-parsing-tutorial
|