張康林*,戴一成
(公安部第三研究所,上海)
在如今這樣一個數據驅動的世界中,海量數據的存儲和使用對于各種組織和企業來說至關重要,其中所涉及的關鍵技術是使用數據庫并結合對應的結構化查詢語言((structured query language,SQL)進行有關數據的查詢,其作為與數據庫交互的標準語言,扮演著重要角色。然而,了解數據庫模式以及編寫SQL語句需要相應的技術能力,對于非專業的數據庫用戶來說具有一定的門檻。
隨著自然語言處理(natural language processing,NLP)和人工智能技術的快速發展,尤其是2023 年開始語言大模型的廣泛使用,如何運用自然語言訪問對應數據庫,生成對應的SQL 腳本并輸出相應結果的需求日益迫切,該需求的目的是希望通過自然語言與數據庫進行交互,以簡化數據庫操作的過程,使更多的人能夠輕松地與數據庫進行溝通和操作。基于自然語言處理的SQL 語句生成已成為一個重要的研究方向。
目前,自然語言轉SQL 語句(Text-to-SQL)的國內外相關研究已取得一定進展。Giordani A 等人[1]基于規則和啟發式方法進行SQL 語句的生成及查詢,然而,由于自然語言的復雜性和多義性,基于規則的方法往往無法覆蓋所有情況,并且需要大量的人工努力來創建和維護規則。Warren DHD 等人[2]基于模板的方法使用預定義的查詢模板,其中包含了常見的查詢結構和語法,這些模板與自然語言查詢進行匹配,并將查詢參數插入到模板中以生成SQL 語句,盡管基于模板的方法相對簡單,但它們通常只適用于特定領域和查詢類型,并且對于復雜的查詢往往無法提供良好的支持。隨著后續機器學習和深度學習的快速發展,基于機器學習和深度學習的方法在自然語言轉SQL 方面取得了顯著進展,這些方法使用大規模的自然語言和SQL 查詢數據進行訓練,并構建模型來學習自然語言和SQL 之間的映射關系。
其中,基于神經網絡的模型如序列到序列(Seq2Seq)模型和注意力機制(Attention)模型被廣泛應用于該領域[3-6],這些模型可以自動從自然語言查詢生成對應的SQL 語句,具有更好的泛化能力和適應性。而當預訓練語言模型(如BERT、GPT 等)在自然語言處理任務中取得了顯著的突破后,研究者們開始探索如何將預訓練語言模型應用于自然語言轉SQL 任務中[7-8],通過微調預訓練模型,并引入特定的SQL 解析器和生成器,在自然語言轉SQL 任務中取得了更好的性能。
由于基于預訓練模型實現SQL 語句生成的最新研究較少,且基于國產預訓練模型完成SQL 語句生成的研究缺乏,所以本研究將使用ChatGLM-6B 國產預訓練大模型學習自然語言和SQL 語句之間的映射關系,實現自然語言到SQL 的轉換。旨在減少普通用戶學習和使用SQL 的成本、提高數據庫操作的效率和準確性、降低錯誤的產生率、促進數據庫的普及和應用,進一步推動數據驅動決策和應用的發展。
隨著大模型被廣泛使用以及算力的不斷發展,國內外開發出了一系列語言大模型,其中由清華大學提出的通用語言模型(General Language Model,GLM)[9]正在被國內各個組織和企業廣泛使用。
截至2023 年,預訓練語言大模型主要分為三種:一是以GPT 大模型為代表的自回歸模型;二是以BERT 大模型為代表的自編碼模型;三是以T5 大模型為代表的編碼-解碼模型。三種類型的大模型在各自的領域上都能取得較好的效果,但上述三種預訓練模型還無法在自然語言理解、條件文本生成以及非條件文本生成三個任務上都取得較好的表現,而GLM 大模型實現了統一。
GLM 預訓練框架通過以下四點實現了巧妙融合:
(1) 擁有自編碼思想,在輸入文本中,隨機刪除連續的tokens。
(2) 擁有自回歸思想,順序重建連續tokens,在使用自回歸方式預測缺失tokens 時,模型既可以訪問corrupted 文本,又可以訪問之前已經被預測的spans。
(3) span shuffling 結合了二維位置編碼技術。
(4) 通過改變缺失spans 的數量和長度,自回歸空格填充任務可以為條件生成以及無條件生成任務預訓練語言模型。
ChatGLM 是基于GLM 框架構建的對話語言模型,開源,同時支持中英雙語。其中的ChatGLM-6B 具有62 億個參數,使用了和ChatGPT 相似的技術,針對中文問答和對話進行了優化。經過約1T 標識符的中英雙語訓練,輔以監督微調、反饋自助、人類反饋強化學習等技術的加持,62 億參數的 ChatGLM-6B 在對話生成方面,已獲得相當不錯的效果。
由于目前很多大模型需要強大的算力支持,但在計算資源只有單卡的環境下,ChatGLM-6B 也能夠進行部署,進行微調,并最終取得不錯的效果,這也是本次研究選擇該模型的重要原因之一。
此次所有實驗均在系統win10、64GB 內存、Inter酷睿i9-10980XE CPU、NVIDIA GeForce RTX 3090的PC 機上通過Python3.8 版本完成。
為了保證模型后續能夠在不同類型的數據庫上順利遷移并成功使用,本次研究需要獲取三部分信息形成模型所需要學習的數據,分別是:
(1) 數據庫的連接信息,見表1。本次研究只針對Mysql 數據庫。

表1 數據庫的連接信息
(2) 數據庫中所有表的表結構信息,見表2。

表2 所需的數據庫表信息
(3) 基于內部數據分析人員工作3 年所積累的SQL 語句,開始對其一一收集,為后續模型需要的訓練集和測試集做鋪墊。為保障數據集的質量,收集過程中考慮了如下兩個方面:一是保障收集的SQL 查詢語句包含大部分SQL 關鍵字,比如SELECT、DISTINCT 、WHERE、GROUP BY、INTERSECT、EXCEPT、UNIONALL、UNION、IN、NOT IN、OR、AND、ORDER BY、LIMIT、LEFT JOIN、RIGHT JOIN、JOIN、EXISTS、LIKE 、HAVING 以及嵌套查詢;二是收集的SQL 查詢語句需要保證在相對應的環境下運行成功,以免語句錯誤,從而導致模型的準確性較低。最終共收集510條SQL 查詢語句。
首先為構建高質量的訓練集和測試集,考慮到自然語言的豐富表達方式,所以對于每一條SQL 查詢語句,需要整理出相對應的2 種中文表達方式,便于模型能夠學習到更加豐富的語義。此次整理全部通過人工標注的方式對510 條SQL 查詢語句給予兩種對應的中文表達,相對應的SQL 查詢語句為目標集。部分樣例見表3。

表3 SQL 數據集示例
然后針對訓練好的模型,為方便模型讀取所連接的數據庫的所有表信息,需要對收集的前兩種數據結構進行重新構建,最終形成config.ymal 文件,便于使用python 中的yaml 模塊進行快速解析。整體的結構樣例見圖1。

圖1 表結構信息重建部分樣例
本次研究基于paddlepaddle 深度學習框架和ChatGLM 語言大模型構建自然語言轉SQL 模型,構建過程如下:
(1) 對預處理完畢的數據集按照8:2 的比例劃分訓練集和測試集。
(2) 使用ChatGLM-6b 作為嵌入層模型,對訓練集進行分詞并向量化,其中人工整理的中文表達對應的向量作為模型的輸入,SQL 語句對應的向量作為模型的目標輸出。
(3) 開始進行模型的訓練,ChatGLM-6b 選為需要微調的預訓練模型,其中迭代次數設置為50,優化器為Adam,評估指標為F1 指數,學習率范圍[0.01,0.03,0.05,0.1,0.3,0.5,0.7],使用網格搜索法進行確定,且最終確定的學習率為0.03,訓練集上的F1 指數為91.3%。
(4) 模型評估階段,使用測試集對訓練過程中保存的最優模型進行評估,以確定其在未見過的數據上的性能,且測試集上的F1 指數為89.8%。
為了方便用戶快速簡單地使用Text-to-SQL 功能和服務,本次研究將提供web 前端供用戶進行輸入數據、點擊按鈕與應用程序進行實時的信息交流,使用了Python 中用于構建交互式界面的Gradio 庫,該庫可以快速構建、共享和部署機器學習模型界面化工具,它提供了一個簡單的接口,開發人員能夠在幾行代碼中創建具有輸入字段和輸出預測的用戶界面。
本研究通過對數據庫連接信息、數據庫表結構信息、SQL 查詢語句收集,人工整理SQL 查詢語句中文表達,配置文件的構建,Text-to-SQL 模型的訓練和測試以及web 界面的設計等一系列流程,完成了此次基于自然語言處理的SQL 語句生成研究,并能夠基本滿足用戶的查詢需求,大大減少用戶學習和使用SQL 的成本。
最后,本研究僅支持MySQL 數據庫并且在復雜的子查詢上效果較差,下一步將針對上述問題,豐富支持的數據庫類型并提升模型在復雜的子查詢上效果,為用戶提供更佳的使用體驗。