展 昭,李雙遠(yuǎn)
(1.吉林化工學(xué)院 信息與控制工程學(xué)院,吉林 吉林 132022;2.吉林化工學(xué)院 信息化建設(shè)辦公室,吉林 吉林 132022)
隨著社會(huì)的高速發(fā)展,信息的高速流通,人們之間交流越來(lái)越密切,生活也越來(lái)越方便,海量數(shù)據(jù)隨之產(chǎn)生。針對(duì)互聯(lián)網(wǎng)上海量的數(shù)字化數(shù)據(jù),為了方便管理和運(yùn)維,我們一般利用傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)這些數(shù)據(jù)。如何通過(guò)自然語(yǔ)言從這些關(guān)系型數(shù)據(jù)庫(kù)中查詢所需的信息,已經(jīng)成為了自然語(yǔ)言處理領(lǐng)域中最熱門(mén)的研究方向之一。當(dāng)前流行的技術(shù)方案設(shè)計(jì)了基于條件篩選的專門(mén)界面,用戶可以通過(guò)點(diǎn)選不同的條件來(lái)查詢數(shù)據(jù)庫(kù)。
然而,在這個(gè)界面上操作,極大地限制了數(shù)據(jù)庫(kù)查詢的使用場(chǎng)景和查詢界限。同時(shí),即使對(duì)于精通數(shù)據(jù)庫(kù)程序語(yǔ)言的專業(yè)人士,經(jīng)常構(gòu)思 SQL 語(yǔ)句、維護(hù)這樣一個(gè)查詢界面也是一項(xiàng)重復(fù)度較高的工作。如何通過(guò)自然語(yǔ)言從這些關(guān)系型數(shù)據(jù)庫(kù)中查詢所需的信息,也就是如何將人類的自然語(yǔ)言查詢描述轉(zhuǎn)化為可執(zhí)行的數(shù)據(jù)庫(kù)查詢語(yǔ)句SQL,已經(jīng)成為了自然語(yǔ)言處理領(lǐng)域中最熱門(mén)的研究方向之一。
早在1990年,德克薩斯儀器公司就提出了第一個(gè) NL2SQL 數(shù)據(jù)集 ATIS[1],該數(shù)據(jù)集是針對(duì)航空領(lǐng)域的數(shù)據(jù)集,之后提出的Scholar[2],Academic,IMDB[3],Yelp,Advising[4],Restaurants[5]都是為單個(gè)領(lǐng)域設(shè)計(jì)的數(shù)據(jù)集,只對(duì)于特定領(lǐng)域起作用,泛用性不強(qiáng)。
于是,在2017年,Victor Zhong等研究人員基于維基百科,提出了目前規(guī)模最大的NL2SQL數(shù)據(jù)集 WikiSQL[6],它包含了24 241張表,80 645條自然語(yǔ)言問(wèn)句及相應(yīng)的SQL語(yǔ)句,是一個(gè)跨領(lǐng)域的數(shù)據(jù)集。該大型數(shù)據(jù)集一經(jīng)發(fā)布就受到了學(xué)術(shù)界的廣泛關(guān)注。因?yàn)樗蚰P偷脑O(shè)計(jì)提出了新的挑戰(zhàn),需要模型更好地構(gòu)建自然語(yǔ)言問(wèn)句和SQL之間的映射關(guān)系,更好地利用表格中的屬性,更注重解碼過(guò)程。
盡管WikiSQL數(shù)據(jù)集提供了大量的人工標(biāo)注的樣本,但是數(shù)據(jù)集中的SQL語(yǔ)句比較簡(jiǎn)單,和實(shí)際應(yīng)用上復(fù)雜的SQL語(yǔ)句不太相符,不能很好地滿足復(fù)雜SQL生成的需求。因此,Yu等人發(fā)布了Spider[7]數(shù)據(jù)集,數(shù)據(jù)集中包含大量復(fù)雜的SQL語(yǔ)句,比如表連接操作JOIN、分組操作GROUP BY和HAVING、嵌套查詢等復(fù)雜語(yǔ)句。隨著Spider數(shù)據(jù)集的公開(kāi)發(fā)布,出現(xiàn)了對(duì)復(fù)雜NL2SQL任務(wù)的一系列研究工作。
中文領(lǐng)域的自然語(yǔ)言轉(zhuǎn)換為結(jié)構(gòu)化查詢語(yǔ)言(NL2SQL)的發(fā)展相對(duì)較緩慢,這主要有兩方面的原因:一方面,中文語(yǔ)法和語(yǔ)義較為復(fù)雜,相比英文更具挑戰(zhàn)性,處理難度更大;另一方面,與英文NL2SQL數(shù)據(jù)集相比,中文的NL2SQL數(shù)據(jù)集數(shù)量較少,導(dǎo)致模型訓(xùn)練時(shí)泛化能力受限,影響最終的模型效果。
于龍等人[8]提出了基于狀態(tài)轉(zhuǎn)換圖的語(yǔ)法和詞法分析方法,實(shí)現(xiàn)了自然語(yǔ)言問(wèn)題向SQL的轉(zhuǎn)換,并能根據(jù)查詢結(jié)果生成回答。孟小峰等人[9]從語(yǔ)法和語(yǔ)義角度分析自然語(yǔ)言問(wèn)題,將其轉(zhuǎn)化為語(yǔ)義依存樹(shù)表示,再進(jìn)一步轉(zhuǎn)換為相應(yīng)的SQL查詢。郝亮等人[10]將語(yǔ)義依存樹(shù)作為自然語(yǔ)言問(wèn)題轉(zhuǎn)換至SQL的中間步驟。他們?cè)贜ivre算法的基礎(chǔ)上構(gòu)建了語(yǔ)義依存樹(shù)生成模型,解決了數(shù)據(jù)庫(kù)語(yǔ)義歧義問(wèn)題,并提出了將語(yǔ)義依存樹(shù)劃分為集合塊的方法,進(jìn)而將其轉(zhuǎn)化為SQL語(yǔ)句。楊鶴標(biāo)等人[11]運(yùn)用單詞提取技術(shù)將自然語(yǔ)言問(wèn)題轉(zhuǎn)換為語(yǔ)義依存樹(shù),將語(yǔ)義關(guān)系劃分為獨(dú)立的集合塊,然后通過(guò)遍歷集合塊生成與原始自然語(yǔ)言等價(jià)的SQL查詢語(yǔ)句。
基于NL2SQL的智能搜索系統(tǒng)主要由NL2SQL模型和智能搜索模塊兩部分組成。NL2SQL模型是主要的核心算法,將NL2SQL任務(wù)看作一個(gè)機(jī)器翻譯工作,采用seq2seq[12]的模型框架,通過(guò)在基線模型seq2seq加入異構(gòu)圖構(gòu)造、基于相對(duì)位置編碼的自注意力機(jī)制,還有樹(shù)形編碼結(jié)構(gòu)等優(yōu)化,提高了SQL生成的準(zhǔn)確率。智能搜索模塊主要是通過(guò)使用Vue作為前端框架,SpringBoot作為后端框架,首先獲取用戶輸入的搜索信息,然后傳入后端,交給NL2SQL模型進(jìn)行處理,生成出的結(jié)果保存到數(shù)據(jù)庫(kù),并且返回到前端界面進(jìn)行顯示。
實(shí)驗(yàn)所使用的數(shù)據(jù)集為西湖大學(xué)在2019年發(fā)布的中文多表跨領(lǐng)域SQL數(shù)據(jù)集CSpider[13],該數(shù)據(jù)集是基于目前英文NL2SQL領(lǐng)域廣泛使用的多表跨領(lǐng)域數(shù)據(jù)集Spider,由人工翻譯及校驗(yàn)得到的。為了確保與實(shí)際工程場(chǎng)景一致,在處理數(shù)據(jù)集的過(guò)程中,保留了英文數(shù)據(jù)庫(kù)模式項(xiàng),僅僅是對(duì)自然語(yǔ)言問(wèn)句進(jìn)行了翻譯。經(jīng)過(guò)這一處理,極大地增加了跨語(yǔ)言的難度,但是這也使得面向CSpider數(shù)據(jù)集的優(yōu)化模型更加具有實(shí)用性,實(shí)驗(yàn)結(jié)果更加有說(shuō)服力。
CSpider數(shù)據(jù)集一共包含10 181個(gè)問(wèn)題和5 693個(gè)復(fù)雜的SQL查詢,這些查詢涉及200個(gè)數(shù)據(jù)庫(kù),覆蓋138個(gè)不同的領(lǐng)域。CSpider涉及了所有SQL語(yǔ)句中的關(guān)鍵字和復(fù)雜結(jié)構(gòu),并且復(fù)雜結(jié)構(gòu)占總數(shù)據(jù)量比例較高,符合實(shí)際中用戶的需求。
模型總體架構(gòu)如圖1所示:模型使用encoder- decoder框架,主要包括四大模塊:1)語(yǔ)義關(guān)系關(guān)聯(lián),首先使用分詞工具對(duì)中文問(wèn)句進(jìn)行分詞,然后為了解決跨語(yǔ)言問(wèn)題,以及中文近義詞、口語(yǔ)化的詞不能進(jìn)行關(guān)聯(lián)的問(wèn)題,本文引入了知識(shí)圖譜ConceptNet,使用知識(shí)圖譜對(duì)分好的詞進(jìn)行轉(zhuǎn)化,使之能夠與模式項(xiàng)進(jìn)行更好的關(guān)聯(lián)。2)異構(gòu)圖構(gòu)建,將問(wèn)題詞、數(shù)據(jù)庫(kù)模式項(xiàng)構(gòu)建為一個(gè)異構(gòu)圖,更好地建立了問(wèn)題詞與數(shù)據(jù)庫(kù)模式項(xiàng)之間的關(guān)聯(lián);3)編碼器,采用相對(duì)位置注意力機(jī)制[14],將問(wèn)題詞和數(shù)據(jù)庫(kù)模式項(xiàng)構(gòu)建的異構(gòu)圖編碼為向量表示;4)解碼器,采用抽象語(yǔ)法樹(shù)(AST)[15]的解碼器將高維隱層向量解碼成SQL語(yǔ)句。
圖1 模型總體架構(gòu)
(1)語(yǔ)義關(guān)系關(guān)聯(lián)
對(duì)于英文文本,各單詞之間有空格作為分隔符,但中文文本的詞之間沒(méi)有分隔符,計(jì)算機(jī)難以理解一長(zhǎng)串沒(méi)有分隔符的文本。因此中文語(yǔ)料需要進(jìn)行分詞操作。目前準(zhǔn)確率較高的常用中文分詞工具有Jieba、哈工大語(yǔ)言技術(shù)平臺(tái)等,本文使用Jieba分詞工具對(duì)語(yǔ)料進(jìn)行分詞。分詞后,使用知識(shí)圖譜ConceptNet對(duì)分好的詞進(jìn)行轉(zhuǎn)化。ConceptNet總共包含34種關(guān)系類型,我們選擇可信度大于1的關(guān)系作為有效關(guān)系。有效關(guān)系如表1所示。
表1 ConceptNet中7種有效關(guān)系類型
我們使用這些有效的關(guān)系類型來(lái)標(biāo)記自然語(yǔ)言問(wèn)題詞和數(shù)據(jù)庫(kù)模式項(xiàng)之間的關(guān)系。表2列出的7種關(guān)系中,同義關(guān)系的相關(guān)性最強(qiáng),而其他關(guān)系都是基于語(yǔ)義和常識(shí)判斷的,其相關(guān)性弱于同義關(guān)系。因此,我們用兩種不同類型的關(guān)系標(biāo)簽來(lái)標(biāo)記同義關(guān)系和其他關(guān)系,并在注意力機(jī)制中賦予不同的權(quán)重。這樣,模型就可以對(duì)不同的鏈接關(guān)系給予不同的關(guān)注,提高生成SQL語(yǔ)句時(shí)選擇正確表名或列名的概率。“Synonym”在語(yǔ)義關(guān)系中表示為“S”標(biāo)簽,“RelatedTo”“IsA”“PartOf”“HasA”“UsedFor”“SimilarTo”在語(yǔ)義關(guān)系中表示為“R”標(biāo)簽。
(2)異構(gòu)圖構(gòu)建
異構(gòu)圖G=
表2 異構(gòu)圖邊規(guī)則
(3)編碼器
首先將初始向量表示cinit,tinit和qinit傳入ELECTRA[16]預(yù)訓(xùn)練模型,cinit,tinit和qinit是相互獨(dú)立的,沒(méi)有任何已知在ε中持有的關(guān)系信息。其中,cinit代表異構(gòu)圖中列名的詞向量表示,tinit代表異構(gòu)圖中表的詞向量表示,qinit代表問(wèn)句的詞向量表示。然后將這三個(gè)向量表示連接成一個(gè)向量X作為輸入,如式(1)所示。
(1)
通過(guò)這種方式,就把自然語(yǔ)言問(wèn)句里面的詞語(yǔ)和數(shù)據(jù)庫(kù)模式項(xiàng)里的表名、列名連接起來(lái),形成最終的向量表示。為了編碼模型能夠?qū)W習(xí)到邊的特征,編碼器將異構(gòu)圖的每一條邊初始化為一個(gè)向量表示。然后使用關(guān)系感知的自注意力機(jī)制對(duì)輸入進(jìn)行編碼,使模型能夠同時(shí)學(xué)習(xí)自然語(yǔ)言問(wèn)句和數(shù)據(jù)庫(kù)模式項(xiàng)之間的關(guān)系。
(4)解碼器
解碼器為了有效地約束搜索空間,設(shè)計(jì)了一個(gè)上下文無(wú)關(guān)的SemQL語(yǔ)法,作為NL問(wèn)題和SQL之間的中間代表,它本質(zhì)上是一個(gè)抽象的語(yǔ)法樹(shù)(AST)。SemQL恢復(fù)了SQL的樹(shù)狀性質(zhì)。首先以深度優(yōu)先搜索遍歷的方法將SQL生成為一棵抽象語(yǔ)法樹(shù)。然后通過(guò)長(zhǎng)短期記憶(Long Short-Term Memory,LSTM)LSTM[17]網(wǎng)絡(luò)輸出一連串的動(dòng)作,動(dòng)作包括以下兩種:生成的節(jié)點(diǎn)不是葉子節(jié)點(diǎn)時(shí),就將這個(gè)節(jié)點(diǎn)擴(kuò)展成一條語(yǔ)法規(guī)則;生成的節(jié)點(diǎn)是葉子節(jié)點(diǎn)時(shí),就從數(shù)據(jù)庫(kù)模式項(xiàng)里選擇一個(gè)列名或者表名。
樹(shù)形解碼器的LSTM使用如式(2)所示的方法更新?tīng)顟B(tài):
(mt,ht)=f([at-1‖hpt‖apt‖nft],mt-1,ht-1) ,
(2)
式中:mt是長(zhǎng)短期記憶網(wǎng)絡(luò)的核狀態(tài);ht是長(zhǎng)短期記憶網(wǎng)絡(luò)在t時(shí)刻的輸出;at-1是上個(gè)動(dòng)作的嵌入表示;pt是抽象語(yǔ)法樹(shù)中當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn);nft是抽象語(yǔ)法樹(shù)當(dāng)前節(jié)點(diǎn)類型的嵌入表示。
將節(jié)點(diǎn)擴(kuò)展成一條語(yǔ)法規(guī)則的計(jì)算方式如式(3)所示:
Pr(at=ExtendRule[R]|a (3) 其中:σ(·)是Softmax函數(shù);g(·)為多層感知機(jī)層。 從數(shù)據(jù)庫(kù)模式項(xiàng)里選擇一個(gè)列名的計(jì)算方法如式(4)所示,選擇表名的計(jì)算方式和選擇列名類似。 (4) 對(duì)于編碼器,雙向LSTM每個(gè)隱層維度的大小設(shè)置為128,并且使用遞歸dropout方法,設(shè)置其比率為 0.2。我們?cè)陔p向 LSTM 之上堆疊了8個(gè)關(guān)系感知自注意力層。其中,設(shè)置并且使用比率為0.1的dropout。對(duì)于解碼器,我們使用集束搜索策略并且設(shè)置集束的大小K=30,隱性狀態(tài)、動(dòng)作嵌入和節(jié)點(diǎn)類型嵌入的尺寸分別設(shè)置為512、128和128。ELECTRA預(yù)訓(xùn)練語(yǔ)言模型和解碼器的學(xué)習(xí)率分別設(shè)置為3e-6和0.000 186。該模型在RTX3090顯卡上訓(xùn)練了600輪,批次大小設(shè)置為16,采用梯度累積策略,其中梯度累積參數(shù)設(shè)置為5。 基于NL2SQL的智能搜索系統(tǒng)在功能設(shè)計(jì)上總體包含三個(gè)功能模塊,分別為用戶登錄注冊(cè)、智能搜索模塊、個(gè)人中心模塊。具體如圖2所示。 圖2 系統(tǒng)總體設(shè)計(jì)圖 1)用戶登錄注冊(cè)模塊。 包括用戶登錄和用戶注冊(cè)功能,實(shí)現(xiàn)對(duì)用戶的身份進(jìn)行驗(yàn)證,輸入賬號(hào)如沒(méi)有注冊(cè),則會(huì)跳轉(zhuǎn)到注冊(cè)界面。在注冊(cè)界面用戶填寫(xiě)相關(guān)注冊(cè)信息,如注冊(cè)賬號(hào)已經(jīng)存在,則該賬號(hào)不能注冊(cè)。 2)個(gè)人信息維護(hù)模塊。 包括個(gè)人信息維護(hù)功能,實(shí)現(xiàn)對(duì)用戶個(gè)人信息的存儲(chǔ)維護(hù),實(shí)現(xiàn)用戶對(duì)于用戶名、密碼、頭像、年齡等基本信息的增刪改查。 3)智能搜索模塊。 包括SQL智能搜索功能和Excel智能搜索功能,其中SQL智能搜索是用戶直接輸入你想要搜索的內(nèi)容,系統(tǒng)會(huì)根據(jù)你的問(wèn)題生成SQL查詢語(yǔ)句,并且執(zhí)行,生成查詢結(jié)果。Excel智能搜索需要用戶提前提交自己想要搜索的Excel表格,然后輸入你對(duì)于表格想要搜索的信息,系統(tǒng)會(huì)根據(jù)你的問(wèn)題和表格信息生成SQL語(yǔ)句,并執(zhí)行,生成最終結(jié)果。 數(shù)據(jù)庫(kù)的數(shù)據(jù)表主要包括用戶信息表、搜索信息表、SQL信息表、結(jié)果信息表。 1)用戶信息表 用戶信息表主要是保存用戶相關(guān)信息,包括用戶編號(hào)、用戶名稱、用戶密碼、用戶性別、用戶年齡、用戶職業(yè)、創(chuàng)建時(shí)間、更新時(shí)間。詳見(jiàn)表3。 表3 用戶信息表 2)搜索信息表 搜索信息表主要是保存用戶搜索的歷史信息,包括搜索內(nèi)容編號(hào)、搜索內(nèi)容、用戶編號(hào)、刪除標(biāo)志、創(chuàng)建時(shí)間、更新時(shí)間。詳見(jiàn)表4。 表4 搜索信息表 3)SQL信息表 SQL信息表主要是保存生成的SQL語(yǔ)句信息,包括SQL語(yǔ)句編號(hào)、生成的SQL語(yǔ)句、搜索內(nèi)容編號(hào)、刪除標(biāo)志、創(chuàng)建時(shí)間、更新時(shí)間。詳見(jiàn)表5。 表5 SQL信息表 4)結(jié)果信息表 結(jié)果信息表主要是保存搜索結(jié)果。包括搜索結(jié)果編號(hào)、搜索結(jié)果、SQL語(yǔ)句編號(hào)、刪除標(biāo)志、創(chuàng)建時(shí)間、更新時(shí)間。詳見(jiàn)表6。 表6 結(jié)果信息表 為了檢測(cè)智能搜索系統(tǒng)性能穩(wěn)定性,以及系統(tǒng)在負(fù)載增加和變化時(shí)的魯棒性。本文使用Apache Jmeter 進(jìn)行系統(tǒng)壓力測(cè)試。服務(wù)器處理器為AMD Ryzen 7 5800H with Radeon Graphics 3.20 GHz,內(nèi)存大小為32 GB,顯卡為GeForce RTX 3080。系統(tǒng)版本為Windows11專業(yè)版,瀏覽器為Google Chrome。利用Jmeter并發(fā)3 000個(gè)請(qǐng)求,測(cè)試結(jié)果如表7所示。由此可以看出,平均響應(yīng)時(shí)間為1 762 ms,異常為0%,吞吐量為395.2 qps,以上各項(xiàng)指標(biāo)說(shuō)明了該系統(tǒng)的性能穩(wěn)定性和魯棒性完全滿足應(yīng)用要求。 表7 系統(tǒng)壓力測(cè)試表格 智能搜索系統(tǒng)主要功能是通過(guò)NL2SQL模型,使用異構(gòu)圖結(jié)構(gòu)關(guān)聯(lián)自然語(yǔ)言問(wèn)句和數(shù)據(jù)庫(kù)模式項(xiàng),使用ELECTRA預(yù)訓(xùn)練數(shù)據(jù)和基于關(guān)系敏感型注意力的編碼器來(lái)獲取語(yǔ)義更加豐富的編碼向量,使用抽象語(yǔ)法樹(shù)的解碼器來(lái)遞歸輸出生成的SQL序列。轉(zhuǎn)變了傳統(tǒng)的搜索模式,使得像表格、數(shù)據(jù)庫(kù)等結(jié)構(gòu)化數(shù)據(jù)能夠更加方便地進(jìn)行檢索,大大提高了用戶搜索數(shù)據(jù)的靈活性,降低了程序員的工作壓力。預(yù)計(jì)這種搜索系統(tǒng)將會(huì)是未來(lái)主流的搜索方式。3.3 參數(shù)設(shè)置
4 智能搜索模塊系統(tǒng)設(shè)計(jì)
4.1 系統(tǒng)功能設(shè)計(jì)
4.2 系統(tǒng)數(shù)據(jù)庫(kù)設(shè)計(jì)
5 系統(tǒng)測(cè)試
6 結(jié) 論