面向复杂查询请求的SQL自动生成模型
2021-11-22彭敦陆
余 波,彭敦陆
(上海理工大学 光电信息与计算机工程学院,上海 200093)
1 引 言
数据库中存储了海量的高价值数据,用户可以通过执行SQL与结构化数据直接进行交互,也可以通过设计好的交互界面进行交互.但SQL的使用难度限制了非技术用户,交互界面的设计也限制了使用的范围.通过自然语言直接与结构化数据进行交互,可以充分利用结构化数据的价值,为用户带来体验和效率的提升,该任务在现实生活中具有许多重要的潜在应用,例如问题解答[1]和导航控制[2].在一些应用场景,如基于关系数据库智能问答系统,Text2SQL,即将自然语言描述的文本问题自动转换成恰当的SQL语句是基于关系数据库智能问答系统的核心,这也是本文的专注的任务.
尽管Text2SQL的研究非常有意义,由于数据标注依赖于高度专业知识,并且要求注释者掌握SQL语法,因而目前只有少量的Text2SQL公共数据集用于模型训练.WikiSQL[3]是一个大规模的Text2SQL数据集,其中包括80,654个文本和SQL人工注释对.
图1是该数据集的SQL语句模式,其要完成的预测任务属于固定模式,不需要预测SQL语句中的所有内容,即只预测关键内容(图1中的标有“$”的部分),这种方法称为基于草图的方法.表1是利用该数据集完成一个Text2SQL任务的简单示例.
表1 WikiSQL示例
图1 WikiSQL的草图
基于草图的Text2SQL的第1项工作是SQLNet[4],它将Text2SQL任务转换为6个子任务.这些子任务可预测需要填充的草图中标有“$”的部分.对于WikiSQL数据集,基于草图的后续研究也使用类似的任务划分,例如TypeSQL[5],MQAN[6],SQLova[7],X-SQL[8]等.SQLova和X-SQL引入了预训练的模型BERT[9],它们效果更好并基本达到WikiSQL数据集的极限.
对于WikiSQL数据集,尽管一些模型(例如:SQLova,X-SQL)几乎已达到极限,但这并不能证明单表Text2SQL任务已被完全解决.与实际应用场景相比,WikiSQL有很多简化,表2是追一科技AI竞赛的TableQA数据集和WikiSQL数据集的比较.从表2中可见,在TableQA数据集中,select和where字句数量更多,where条件操作符更加复杂,value的形式多样.尽管WikiSQL和TableQA都属于单表Text2SQL数据集,但与WikiSQL相比,TableQA更复杂,也更符合实际需求,这使得对WikiSQL的Text2SQL方法(例如SQLova,X-SQL)用于TableQA及类似数据集上难以取得令人满意的成绩.
表2 数据集对比表
早期的工作采用注意力和复制机制的序列到序列方法,近几年的工作重点是将SQL语法合并到神经模型中.语言表示建模的最新进展证明了从大型外部数据源进行迁移学习的价值.对于WikiSQL,SQLova模型的工作展示了这种预训练技术对当前技术的显著改进.鉴于这种趋势,我们提出了2-SQL模型,这是一种改进的基于预训练深度学习模型.与原有提取where字句中值的解决思路不同,在2-SQL模型提出了一个全新的范式:将抽取式任务转化为一个语义匹配问题.其优点在于准确地提取where子句中多个值,而不只是准确地提取一个值.模型在Where子句中通过枚举运算符与值,生成一系列的候选组合,简化了运算符的选择.
2 相关工作
WikiSQL数据集虽然是目前规模最大的有监督数据集,但其数据形式过于简单,且难度较低.对于SQL语句,条件的表达只支持最基础的>、<、=,条件之间的关系只有and,不支持聚组、排序、嵌套等其它众多常用的SQL语法,不需要联合多表查询答案,真实答案所在表格已知等诸多问题的简化.所以,在这个数据集上,SQL执行结果的准确率目前已经达到了91.8%.但是,这样的数据集并不符合真实的应用场景,因为在真实的场景中,用户问题中的值很可能不是数据表中所出现的,需要一定的泛化才可以匹配到.另外,真实的表之间存在错综复杂的键关联关系,想要得到真实答案,通常需要联合多张表进行查询.再者,每一张表都有不同的意义,并且每张表中列的意义也都不同,甚至可能相同名字的列,在不同的表格中所代表的含义是不同的.总之,真实场景中,用户的问题表达会很丰富,会使用各种各样的条件来筛选数据,诸如此类的实际因素还有很多.由此可见,与实际应相比,WikiSQL数据集起到的作用十分有限.
庞大的数据集使人们能够采用深层神经网络技术来完成这项任务,并且最近引起了广泛关注.尽管对神经语义解析器的早期研究没有对输出空间进行语法特定的约束,但许多模型通过使用SQL语法限制输出空间,可以在WikiSQL上获得出色的性能效果.Victor Zhong[3]等人提出的初始模型独立地生成了目标SQL查询的两个组成部分,select子句和where子句,其性能优于提出的序列到序列基线模型.SQLNet引入了序列到集合的模型,进一步简化了生成任务,在该模型中,仅根据序列到序列结构生成条件值,造成模型对SQL条件的顺序不敏感.TypeSQL带有自然语言标记的附加“类型”信息,使用了从序列到集合的结构.Coarse2Fine首先生成粗略的中间输出,然后通过解码完整的where子句来优化结果.Pointer-SQL[10]提出了一种序列到序列模型,该模型使用基于注意力的复制机制和基于值的损失函数.Seq2seq[11]在输入自然语言的自动注释之后使用了一个序列到序列的模型.MQAN提出了一个多任务问答网络,该网络可以使用注意力机制来学习多种自然语言处理任务.Wenlu Wang等人提出可执行的指导解码,其中在解码期间将部分非可执行SQL查询候选对象从输出候选对象中删除.SQLova使用BERT作为编码器,然后获得查询语句的语义表示.基于查询语句的语义表示,提出了3种变体模型:SHALLOW层,DECODER层和NL2SQL层,并获得了新的结果.NL2SQL层的结构类似于SQLNet.X-SQL使用MTDNN[12]初始化BERT,并提出了一个更简单的Text2SQL模型.它使用[XLS]代替[CLS]标签,并获得更好的下文语义表示.根据WikiSQL数据集的特征,X-SQL在没有where子句的示例中使用[EMPTY].另外,X-SQL将列选择作为排名任务,使用Kullback-Leibler(KL)作为优化目标,从而提高了列选择的准确性.X-SQL在WikiSQL数据集上取得了最先进的结果.
以往的Text2Sql算法大多数基于列提取where字句的值,当数据集出现where字句中含有多个值,会导致无法准确提取值的情况,因此不能很好的解决复杂的TableQA数据集生成SQL的问题.而我们提出的2-SQL模型可以有效地提高此类样本的SQL生成精度.
3 问题定义
通过充分利用SQL查询语句特定的语法,将SQL生成结果定义为图2的结构,将序列生成转化为多个分类问题,只需要对带“$”的部分进行填充即可获得标准的SQL查询语句S.其中,SELECT和WHERE代表SQL关键字,我们假定每个SQL语句必须包含SELECT和WHERE.$WOP代表连接操作,关系集为[“”,“AND”,“OR”],“”表示where子句中只有一个关系表达式;$COLUMN表示数据库的列名.我们将select子句的列命名为选择列,where子句的列命名为条件列.$AGG表示聚合函数,操作集为[“”,“AVG”,“ MAX”,“MIN”,“COUNT”,“ SUM”],“”表示无操作;$OP表示条件操作,操作集为[“>”,“ <”,“ ==”,“!=”];$VALUE表示条件列的值,并且值必须是数据库的内容;(…)*代表至少有一个.
图2 TableQA的草图
4 方法和模型
为解决自然语言生成SQL查询语句的问题,本文的模型将分为两个模块,MODULE1负责S-NUM、S-COL、S-AGG、W-CONN-OP和W-COL子模块的生成,MODULE2接受MODULE1输出的W-COL,负责W-COL-VAL和W-COL-OP子模块的生成.
本文的整体模型2-SQL的架构如图3所示.由图可见模型包括3个部分:编码器、列表示层和相关子模块层.编码器使用BERT-wwm-ext[13],由于中文单词比汉字具有更多的连贯性和语义信息,训练BERT时,Google的BERT将汉字符视为掩码,而BERT-wwm-ext则将中文单词视为掩码.BERT-wwm-ext通过使用整个单词掩码策略,可以更好地学习中文单词向量表示.相关研究显示,与Google的BERT相比,BERT-wwm-ext对中文NLP任务的效果更好.此外,BERT-wwm-ext的训练语料库比原始维基数据更大,单词量增加540万.选择列和条件列是基于草图的Text2SQL任务的瓶颈.
图3 整体模型
模型采用使用X-SQL中的“内容增强层”作为列语义表示.整个2-SQL模型包含7个子模型,分别为S-NUM,S-COL,S-AGG,W-CONN-OP,W-COL,W-COL-VAL,W-COL-OP子模块.
S-NUM:预测所选列的数量.
S-COL:预测SQL语句查询表的哪一列.
S-AGG:预测对S-COL子任务使用什么聚合函数操作,有avg、min、max、count、sum.
W-CONN-OP:预测where字句中各条件之间的并列关系,可以是 and 或者 or.
W-COL:预测where字句的条件列.
W-COL-OP:预测where字句中条件列的操作符,有>、<、==、!=.
W-COL-VAL:预测where字句中的值.
4.1 编 码
现有的在大型未标记的语言语料库上进行预训练的单词表示,例如GloVe[14],在WikiSQL中已显示出优异的结果.多个团队开发了上下文的词表示法,例如ELMO[15]和BERT在许多NLP任务中表现出优异的性能.与英文单词相比,中文单词包含更多的语义信息.我们使用BERT-wwm-ext作为BERT的初始权重,[SEP]在查询语句和列名之间进行分隔.每个输入中包含查询语句以及列名,查询语句输入T1…TL(L是查询语句中词的数量),列名输入Th1,1…ThNh,MNh,,编码如下:
[CLS],T1,T2…TL[SEP],Th1,1,Th1,2,…[SEP],…[SEP],ThNh,1,…,ThNh,MNh[SEP]
其中,Thj,k,是第j个表头的第k个令牌,Mj是第j个表头的令牌的总数,Nh是表头的总数.每个令牌都由令牌嵌入,类型嵌入和位置嵌入组成.[CLS]和[SEP]是用于分类和上下文分离的特殊标记.将自然语言查询与整个表的所有列名放在一起进行编码,用来表示问题与表两者信息之间存在交互.
X-SQL和SQLova都使用BERT编码,但与SQLova相比,X-SQL在BERT编码后没有用复杂的结构,但是可以更好地生成SQL语句.另外,本文认为BERT编码后,添加复杂结构会削弱整个模型的性能.BERT可以满足多任务表示学习需求,因此与X-SQL类似,本文在使用BERT编码器之后,不再使用复杂的结构.
4.2 列名特征向量
输入序列由BERT编码获得语义向量W,标记为W=h[cls],hq1,…,hqn,h[sep],hc11,…,h[sep],hc21,…,h[sep].
语义向量W的维数为d,输入序列包含一个查询序列和多个表头序列,每个序列通过[SEP]标签连接.h[cls]是特殊令牌[CLS]的表示,hqi是查询语句中第i个令牌的表示,hcmi是第m列中第i个令牌的表示,n是查询的长度,m是数据库中的列数.与X-SQL相似,模型使用全局信息h[cls]通过注意力机制来增强每一列的语义表示.
将第i列中的令牌数表示为ni,编码器通过计算上下文增强模式编码器输出hci来汇总各列:
(1)
αit=softmax(Sit)
(2)
(3)
其中,U,V∈Rm×d,Sit计算h[cls]与第i列中的第t个令牌之间的相似性.这里,使用简单的点乘函数,虽然序列编码器的输出中已经捕获了一定程度的上下文,但这种影响是有限的,因为自注意力往往只集中在某些区域.另一方面,[CLS]中捕获的全局上下文信息足够多样化,因此可用于补充顺序编码器中的模式表示.αit是第i列中第t个令牌的关注权重.
4.3 子模块输出
输出层由序列编码器输出h[cls],hq1,…,hqn,上下文增强模式编码器输出hc1,…,hcn,该任务拆分成两个部分,MODULE1(见图4)负责S-NUM,S-COL、S-AGG、W-CONN-OP和W-COL子模块的生成,MODULE2接受MODULE1输出的W-COL,负责W-COL-VAL、W-COL-OP子模块的生成.
4.3.1 MODULE1
通过将h[cls]和hci归一化可获得最终的列表示向量rci.
(4)
此计算是针对每个子任务分别完成的,以使列表示向量与每个子任务所关注的自然语言问题更好地保持一致.2-SQL中使用BERT语义表示和列表示来预测图2中带“$”的部分.模型将TableQA数据集上的Text2SQL任务的MODULE1分为多个子任务,每个子任务负责预测SQL语句的不同部分,子任务之间的依赖关系如图4所示.
图4 MODULE1神经网络结构
子任务S-NUM预测所选列的数目,预测集为[1,2].子任务W-CONN-OP预测条件列的数量和条件列之间的关系,预测集为[“”,“and-1”,“or-1”,“and-2”,“or-2”,“and-3”,“or-3”].S-NUM是二分类问题,W-CONN-OP是七分类问题.两个子任务使用全局信息h[cls]作为输入.S-NUM和W-CONN-OP的分类公式如下所示.
pS-NUM=softmax(WS-NUMh[cls])
(5)
pW-CONN-OP=softmax(WW-CONN-OPh[cls])
(6)
其中,pS-NUM和pW-CONN-OP分别表示S-NUM和W-CONN-OP的输出概率.WS-NUM和WW-CONN-OP可学习的参数.WS-NUM∈R1×d,WW-CONN-OP∈R7×d.注:S-NUM和W-CONN-OP只依赖于h[cls].
S-COL,预测select语句的列.将select语句选择列Ci的概率建模为:
pS-COL(Ci)=softmax(WS-COLrci)
(7)
这里,pS-COL(Ci)表示在S-COL子任务中数据表的第i列被选择的概率.WS-COL是可学习的参数.WS-COL∈R1×d.注,S-COL只依赖于rci.
S-AGG,预测select语句所选列的聚合函数.S-AGG的目标集是[“”,“avg”,“max”,“min”,“count”,“sum”],这是一个六分类问题.聚合函数的概率计算为:
pS-AGG=softmax(WS-AGGrci)
(8)
这里,pS-AGG表示在S-AGG子任务中选择数据表第i列后聚合函数被选择的概率.WS-AGG是可学习的参数.WS-AGG∈R6×d.注,S-AGG只依赖于rci.
W-COL预测where子句中的条件列.将where字句选择列Ci的概率建模为:
pW-COL(Ci)=softmax(WC-COLrci)
(9)
其中,pW-COL(Ci)表示在W-COL子任务中数据表的第i列被选择的概率.WC-COL是可学习的参数.WC-COL∈R1×d.注,W-COL只依赖于rci.
4.3.2 MODULE2
X-SQL算法是基于列语义向量提取where子句中的值,但TableQA数据集where子句中含有多个值,其无法准确的提取目标值.2-SQL模型将提取where字句中值的方式改进为范式转变的模式,MODULE2通过接受MODULE1中W-COL输出的where字句的所选列进行预测,通过枚举运算符与值,生成一系列的候选组合,将提取值任务转换为语义匹配问题.一个自然语句问题会对应多候选样本,转化成多个二分类问题.
在TableQA数据集中,数据表的每列标记为TEXT或者REAL类型.在抽取where字句的value值时,TEXT类型的列选取的value生成自数据表;REAL类型的列选取的value利用正则表达式从自然语言问句抽取.MODULE2的输入数据格式,见图5.
图5 MODULE2输入数据格式
W-COL-VAL和W-COL-OP子任务分别预测where字句中的value和操作符,MODULE2对一个自然语句问句中where字句的多个候选样本进行二分类,预测集为[0,1].子任务W-COL-OP预测where字句中列的操作符,预测集为[“”,“>”,“<”,“==”,“!=”].MODULE2分类如式(10)所示.
p=sigmoid(Wh[cls])
(10)
这里p表示候选样本的输出概率.W是可学习的参数,W∈R1×d.
4.4 训练
在训练的过程中,其目标函数是所有子任务损失函数的总和,通过最小化目标函数值的方式来进行参数更新.
子任务采用传统标准的交叉熵损失函数,由于已知子句中各部分预测的真实结果,因此各子任务之间互不影响,可并行训练.交叉熵损失函数公式如下所示:
(11)
这里,N为样本总数.M为类别的数量.yic为指示变量(0或1),如果该类别和样本i的类别相同就是1,否则是0.pic为对于观测样本i属于类别的预测概率.
5 实验结果与分析
与真正的单表SQL生成场景相比,WikiSQL数据集做了很多简化.SQLova模型团队认为其提出的模型已经超过了WikiSQL上的人类水平.与SQLova相比,X-SQL模型达到了更好的性能.可以认为,WikiSQL上的SQL生成任务基本解决了.因此,本文的实验不再基于WikiSQL,而是针对更复杂的TableQA.
TableQA数据集包含45918个“query-SQL”对.与WikiSQL相比,SQL语句更加复杂,包括图2中复杂SQL的所有模式.TableQA所选列的数目可以多于一列,包含更多的条件,并添加“或”逻辑关系,查询是多种多样的,数据库的内容可能不会出现在相应的查询中.TableQA是追一科技在人工智能竞赛中建立的.追一科技承诺开放所有数据,但至今,只有训练和验证数据,测试数据尚未开放.我们将验证数据分为两部分:一部分用于参数调整,另一部分用于测试.训练数据、验证数据和测试数据的数量分别为41522、2198和2198.
实验使用两个指标来评估SQL生成的准确性:逻辑形式精度(LF)和执行精度(X).逻辑形式精度(LF),直接将生成的SQL语句与基本事实进行比较,并检查它们是否匹配;执行精度(X),执行生成的SQL语句和基本事实来得到SQL查询结果,并检查它们的结果是否匹配.
表3显示了每个子任务的准确性.2-SQL模型提取where字句中值的方式改进为范式转变的模式,通过枚举运算符与值,生成一系列的候选组合,将提取值任务转换为多分类问题.实验结果表明,W-COL-VAL子模块比以往的模型提高了0.9%逻辑形式精度,W-COL-OP子模块比以往的模型提高了0.8%逻辑形式精度.表4给出了几种模型在TableQA验证数据集和测试数据集的逻辑形式精度(LF)和执行精度(X).
表3 模型的子任务在TableQA测试集的表现(S-NUM为null,表示模型无该子任务)
表4 各种模型在TableQA的表现
通过在数据库中执行SQL语句所返回的答案和预测值进行对比评估,我们的模型在TableQA数据集上都明显优于以前的模型.2-SQL比以往的模型提高了6.8%的逻辑形式精度,3.8%的执行精度.
6 总 结
本文提出了2-SQL来完成更复杂的单表SQL生成任务,并将提取where子句中值的方式转换为语义匹配问题.使用了TableQA作为实验数据,与WikiSQL相比,TableQA更复杂,更符合实际应用.2-SQL模型是一个多任务联合学习框架,模型不仅通过联合学习提高多个子任务的精度,而且在提取where子句中值时,通过枚举运算符与值,生成一系列的候选组合,将提取值任务转换为语义匹配问题.这种基于匹配的抽取框架的功能尚未得到充分利用.将来,可以采用更多形式的匹配模型来实例化所提出的框架.