王悦林
摘要:人工智能领域近年发展十分迅猛,其中自然语言处理(NLP)领域从2016年起进入高速发展期,以BERT为代表的各种新模型层出不穷,解决了文本数据分析和信息提取的问题。其中有一个子领域,即NL2SQL领域,是解决如何用自然语言问句进行数据库查询的问题。具体方案是通过语义解析,将自然语言问句翻译成SQL,再送到数据库中进行查询,大大降低了数据查询的难度,提升了交互友好度和查询效率。本文探讨具体的技术解决方案。
正文
NL2SQL领域目前的数据集英文以WikiSQL和Spider为主,中文有追一科技提供的竞赛数据集。WikiSQL数据集支持单表、单列、多Where子句查询,现有模型可以较好地支持。而耶鲁大学提供的Spider数据集要求支持Group By、Order By、Having,还需要Join不同表,这更贴近于真实场景,也带来了更大的难度。追一科技的竞赛数据集的难度介于两者之间,要求支持多列查询,支持多Where子句间不同操作符操作。本文以追一科技数据集的难度为准,探讨解决方案。
1.主流模型
目前業内的三大技术解决方案依次是SQLnet,SQLova和X-SQL,其中X-SQL在WikiSQL数据集上测试效果最好,但仍然满足不了追一科技数据集的要求。我们主要参考后两个模型,提出我们的解决方案。
2.方案思路
解决此问题有两大思路,增强学习和解耦任务。增强学习是端到端的解决方案,比较先进,但实际应用尚不成熟,达不到准确率的要求。因此解耦任务的思路成为首选。解耦的思路是将任务拆解为8个子任务,分别是
Select-Number:选择几列
Select-Column:选择哪一列
Select-Aggregation:使用什么聚合函数
Where-Number:有几个条件
Where-Column:筛选条件是针对哪几列
Where-Operator:各个条件的操作符
Where-Value:各个条件的条件值
Where-Operator:各个条件之间的关系。
为了将整体准确度提升到80%以上,需要8个子任务的平均准确度达到97.5%,这对方案提出了非常高的要求。
整体解决方案分为三部分:语义解析模块、执行引导模块和SQL增强模块。以下分别加以说明。
3.语义解析模块
语义解析模块是整个解决方案最重要的部分,共分为三个层次:编码层、语义增强层和输出层。
编码层采用2019年7月由Facebook公司推出的RoBERTa作为基础预训练模型。和2018年10月谷歌公司推出的BERT相比,此模型在CoLA和SST-2两项任务中分别领先16个百分点和3个百分点。而这两个任务是评判文本语义解析能力的重要指标。RoBERTa已经有支持中文的版本。
我们也考虑了其它的可能性,例如MT-DNN,XLnet,ERNIE2.0和DistilBERT,经过对可行性的分析和对性能的比较,最终选用RoBERTa。
语义增强层的思路是将问题的文本表示和组成数据列的token的文本表示进行融合,将融合后的结果结合注意力机制,然后进行数学相加,最后再加上问题的文本表示,以得到数据列的文本表示。
其中将问题与token进行融合的时候,加入两个多维训练参数(m*d),以构成神经网络层。那么数学上,两个多维表示如何变成一个注意力参数的呢?问题和token都是((m*d)*(d*1)),点积后成为(m*1)向量,再次转制和点积后成为(1*1)向量,即一个注意力参数。
最后再次加上问题的文本表示,是为了增强问题表示的比重,将问题和toke比重由1:1改为2:1,以增强最终效果。此处问题权重设为0.5。
到此已经增加了一层神经网络层。在输出层为所有的子任务还要再增加一层神经网络层,以Where Number子任务为例进行说明。这个子任务是二分类模型,可选值为1或2,而是否有Where子句由empty column指定。此子任务增加一层MLP层。其余子任务由不同的公式加上神经网络参数计算。所有输出层的损失函数都是交叉熵损失函数。
这些子任务并不是每个独立进行训练,在每一个batch size里,所有子任务按顺序依次正向传播,然后计算损失函数,按照梯度下降原理,进行整体反向传播,更新参数,使整体损失函数值最低。
4.执行引导模块
执行引导模块参考arxiv.org/abs/1807.03100直接进行增强,可有效提升执行准确率2%左右。
SQL增强模块
SQL增强模块在把生成的SQL送到数据库之前,进行调整如下:
●对于表中的类别型列数据,需要将生成的列值与数据库里的此列的类别值进行相似度匹配,以替换成正确值。例如解析后的Where Value为“黄蜂”,而数据库里的数据为“大黄蜂”,则修改为“大黄蜂”。
●如果两个Where子句的列名相同,要检查两个Where Value是否相同,相同的话将其中一个替换为相似度最高的另一个值。
●如果Where Value里包含中文“和”字,则拆成两个值
●如果问题中有中文“或”字,或者两个Where子句的列名相同,则两个Where子句的关系为“or”,其它情况均为“and”。
5.总结
以上是整体设计及方案的关键点。综合以上方案,可以有效提升SQL转化的准确度,取得较好效果。
参考文献:
[1] Matthew E Peters,Mark Neumann,Mohit Iyyer,Matt Gardner,Christopher Clark,Kenton Lee,and Luke Zettlemoyer.2018.Deep contextualized word representations.arXiv preprint arXiv:1802.05365.
[2] Jason Phang,Thibault Fevry,and Samuel R Bowman.2018. Sentence encoders on stilts:Supplementary training on intermediate labeled-data tasks.arXiv preprint arXiv:1811.01088.
[3] Alec Radford,Karthik Narasimhan,Tim Salimans,and Ilya Sutskever.2018.Improving language understanding by generative pre-training.
[4] Pranav Rajpurkar,Jian Zhang,Konstantin Lopyrev,and Percy Liang.2016.Squad:100,000+ questions for machine comprehension of text.pages 2383–2392.
[5] Aarne Talman and Stergios Chatzikyriakidis.2018.Testing the generalization power of neural network models across nli benchmarks.arXiv preprint arXiv:1810.09774.
(作者单位:联想集团)