Text2SQL,是自然语言处理语义解析领域的子任务,核心目标是打破人与结构化数据之间的壁垒,让普通用户可以通过自然语言描述完成复杂数据库的查询工作,得到想要的结果。
例如有如下表格,用户根据表格提问:
“周杰伦和林俊杰最近的演唱会是什么时候?”
Text2SQL模型自动将问题转换为可执行的SQL语言:
“SELECT 近期演唱会 FROM singer WHERE 姓名 = 周杰伦 OR 姓名 = 林俊杰”
并返回查询结果:“北京-01.08”和“上海-04.28”。
姓名 | 年龄 | 国籍 | 唱片公司 | 代表作 | 近期演唱会 |
周杰伦 | 41 | 中国 | 杰威尔音乐 | 七里香、枫 | 北京-01.08 |
林俊杰 | 39 | 新加坡 | JFJ Productions | 江南、小酒窝 | 上海-04.28 |
赵雷 | 34 | 中国 | 独立唱作人 | 成都、南方姑娘 | 成都-02.05 |
崔健 | 59 | 中国 | 索尼中国 | 一无所有 | 北京-06.06 |
Austin Mahone | 24 | 美国 | Chase | Send it | 纽约-07.12 |
Taylor Swift | 31 | 美国 | 环球唱片 | Love Story | 纽约-10.05 |
Text2SQL是笔者在硕士期间主要的研究方向之一,本文是对该方向的综述,将尽可能完整地介绍Text2SQL各方面内容。相信阅读本文后,即使第一次听说Text2SQL的读者也能对它有一个清晰的认识,甚至产生兴趣。
本文将从以下几个章节介绍Text2SQL。
1、背景 2、数据集 3、热门榜单 4、解决方案 5、应用方向 6、资料包(https://github.com/yechens/NL2SQL)
一、背景
如文章开篇所述,数据库中往往蕴含了大量有价值的信息,以往用户想要查询数据库需要先学习结构化查询语言SQL。SQL是一种强大又灵活的编程语言,普通用户学习SQL有一定的技术门槛,而且对于一些复杂的查询条件(如嵌套、跨表等),手工编写SQL很容易出错。
如果能够通过机器学习、深度学习等技术,将我们想要查询的目标从自然语言(NL)直接“翻译”成SQL,可以显著降低技术门槛,同时又提升数据库的查询效率。
鉴于此,学术界在上世纪末提出了语义解析新分支——Text to SQL(Text2SQL)。相比于文本分类、实体识别等NLP浅层任务,Text2SQL难度更高涉及的技术面更广。
二、数据集
关于Text2SQL任务,经过多年研究国内外的专家学者们提出了众多数据集。总的来看,数据集经历了从单领域/单轮、跨领域/单轮、最终到跨领域/多轮的发展历程,难度逐级提升。
Text2SQL数据集
最早期的数据集例如ATIS、GeoQuery等出现在20世纪90年代,任务内容是针对单领域、单表、单轮的自然语言(NL)到SQL的转换工作。数据集规模较小,场景单一应用十分有限。
直至2017年出现了第一份大规模手工标注数据集WikiSQL,包含80,657个query-SQL对和26,521个数据库。WikiSQL的局限性在于每一个问题只关联一张表格,而且涉及的SQL语法十分有限,仅包含“>, <, ==, !=”操作,同时每一个query基本只有1个查询条件。
总的来说,WikiSQL任务相对简单,是最适合入门的数据集。
2019年追一科技发布了第一份中文Text2SQL数据集TableQA,相比WikiSQL增加了查询条件数量(0-4个),人工翻译的query有一定的语义泛化性,例如可能存在实体省略现象。
另一份代表性数据集是耶鲁大学2018年公开的跨领域复杂SQL解析数据集Spider,刷新了该方向的任务难度。主要体现在:(1)涵盖了几乎所有的SQL语法,例如“ORDER BY”,“HAVING”,“JOIN”,“INTERSECT”等;(2)同一个query可能和多张table关联,跨表查询十分普遍;(3)train、dev、test中的数据库均来自不同领域,对模型的泛化性提出了挑战。
以上数据集还只涉及单轮对话。紧接着2019年,耶鲁大学继续发布了2个跨领域多轮对话版本的Text2SQL数据集Sparc和CoSQL。每一轮对话平均有4-5个子问题组成,第i个问题需要考虑0~i-1轮对话的上下文信息,任务难度再次提升。
三、热门榜单
随着数据集的公布,国内外的科研机构和大厂也发布了一些有意思的榜单供大家刷榜。比较知名的如追一科技在阿里天池举办的首届中文NL2SQL挑战赛(已结束),榜单第一的国防科大团队取得了0.92的SQL完全匹配准确率。
NL2SQL中文挑战赛
百度在今年上半年基于DuSQL数据集同样举办了中文SQL解析比赛(已结束),虽然难度很高(对齐Spider),榜首成绩仍然超过了0.76。
DuSQL
业内认可度最高的比赛是耶鲁大学举办的Text-to-SQL语义解析挑战赛Spider。类似于NLP阅读理解领域的SQuAD和CV图像识别领域的ImageNet,Spider同样属于长期开放的榜单,吸引了上交大、浙大、微软研究院、Allen实验室等机构参赛。
由于Spider属于单轮Text2SQL中难度最大的数据集,迄今排行榜第一的SQL准确率只有69.7%。
Spider
财大力大的耶鲁大学还同时发布了和SParc、CoSQL同名的公开榜单。多轮Text2SQL任务难度更高,榜单上的队伍数量至今还比较少。但“多轮”有更实际的落地价值,未来可能是人机交互系统的重要组成部分,相信今后会有更多的关注与研究热点。
Sparc
CoSQL
四、解决方案
从技术角度考虑,Text2SQL任务的核心目标是「对query和数据库模式进行联合编码,并从编码特征中解析出完整的SQL序列」。其中数据库模式包含表名、列名、列中的单元值以及不同列之间蕴含的关系信息(如主键、外键)等。
如何充分有效编码、解决query和column之间的链接问题、精确解码、实现语义泛化是Text2SQL任务的主要难题。
针对这些特点,本章将从4个角度介绍当前Text2SQL的主流解决方案。
4.1 端到端的Multi-task架构
对于简单类型的Text2SQL数据集,例如WikiSQL、TableQA等,共享编码器+多任务解码是一种比较有效可控的神经网络方法。
其中共享编码器部分一般是使用词向量或语言模型对query、table和column进行联合编码,例如将输入序列拼接为“[CLS] query [SEP] column1 [SEP] column2 [SEP] .... [SEP]”这样的长序列。
解码器部分根据SQL语言的组成特点设计不同的子网络分别解码。
TableQA排名第一的模型M-SQL[6],将SQL序列拆分为上图所示的8个子片段,在解码器中设计了8个神经网络分别解码对应片段的输出,最后通过简单的规则拼接为完整的SQL。
M-SQL模型结构
Multi-task的优点在于针对不同片段可以设计有效的损失函数,在训练过程中各个子任务的准确率可以实时监控。
再结合一些人工规则,能够生成高质量的SQL,便于在实际中落地。在IEEE上发表的M-SQL各个子任务的准确率都超过了90%,总体准确率超过92%。
对此方法感兴趣的读者可以进一步阅读X-SQL[3]、M-SQL[6]模型的原论文。
4.2 抽象语法树SQL解码
这种方法将SQL结构视作一棵抽象语法树(AST),树中的各个结点是SQL的关键字(SELECT、WHERE、COUNT、AND...)或者table和column的候选值。生成SQL的过程相当于从树的root结点对语法树做一次DST搜索。
Abstract Syntax Tree
以开始节点“SELECT”为例。“SELECT”节点往下可能包含3个叶子节点:
“Column”、“AGG”、“Distinct”,分别代表“选取某一列”、“在列前增加聚合操作”、“对列进行去重操作”。
从“SELECT”节点向下搜索相当于是一个3分类任务,根据真实路径和搜索路径依次计算各个节点的交叉熵并求和,作为总损失。
抽象语法树的思想避免了设计各种各样的子网络,对于涉及跨表查询、嵌套查询的复杂数据集有很好的效果。Spider排行榜排名靠前的RAT-SQL、IRNet等模型都借鉴了该思想。
至于编码器部分,可以单独优化或直接使用4.1节介绍的方法。
当然,AST的应用远不止于此。除了解析SQL,AST还可以生成各种各样的目标序列,例如Text2Java、Text2Python甚至Text2note(音符)等等。
具体可以参考CMU的这篇论文:“A Syntactic Neural Model for General-Purpose Code Generation”。论文中作者从文本生成了对应的Python语言。
4.3 训练文本和表格联合编码的预训练语言模型
本节的思路是针对模型的编码器部分进行改进。
将预训练语言模型应用于各种NLP下游任务已经是一种通用的方法。但是以往的语言模型如BERT、ERNIE等一般是在通用的文本场景中使用MLM等任务训练得到,和下游基于表格和文本的Text2SQL任务场景明显不一致。
为了获得具有文本和表格联合编码能力的语言模型,耶鲁大学的Yu等人[5]提出了一种适用于表格语义解析的语法增强预训练方法。
论文的核心思想是先用语法规则得到一批人工合成的query-SQL语料,然后基于此(主要针对query、column)设计了新的训练目标:MLM、SSP。具体内容可以参考引用[5]。
最终训练得到的语言模型GRAPPA可以捕捉text和table之间的关联信息,获得更好的初始化表示。同时,这种训练方式得到的新模型可以直接替换已有Text2SQL模型中的BERT/word2vec编码器。
论文实验证明了GRAPPA方法的有效性。最终,GRAPPA+RAT-SQL组合获得了Spider榜单第一(69.7%)。
4.4 从强化学习角度考虑Text2SQL
2019年初Google大脑的研究员提出了一种基于弱监督的强化学习Text2SQL解决方案:MAPO。模型的输入部分由query、table、SQL执行结果组成,不存在真实的有标注SQL语句。由于只包含SQL执行结果,相比于标注的SQL序列信息量很低,是一种弱监督的学习方法。
强化学习使用回报函数对模型生成的SQL语句进行评估,如果生成SQL的执行结果和真实结果相同,表明模型预测正确获得“1分”,否则判为错误“得0分”。这种反馈方式和MAPO关于标注SQL语句不存在的假设非常匹配。
强化学习中其他的必备要素,如生成SQL的决策网络,作者采用了基于语法的神经网络神经符号机(neural symbolic machine)。Action部分,作者使用预测SQL的逻辑形式;对应环境是数据库引擎。
为了加速模型收敛,作者在论文中还使用了非常多的技巧,例如将高得分的样本保存在内存中多次采样避免遗忘,以帮助模型更好地学习。
强化学习和Text2SQL任务如何有效结合还是一个很新颖的课题,MAPO虽然在WikiSQL上的准确率不高,却提供了一种可能的思路。
五、应用方向
“在创业阶段,比技术更重要的是寻找落地场景”——何帆《变量》。
一项技术无论新旧,无论多么酷炫,如果不能落地转变为产品或为产品赋能,是没有意义的。
结合自身的实际经历,笔者抛砖引玉,总结了几种Text2SQL技术比较有价值的应用场景:
(1)数据库查询系统
企业中往往包含了众多结构化的表格。如果引入Text2SQL技术,普通的业务或财务人员不需要学习SQL,就可以直接通过自然语言与数据库交互,得到想要的结果。例如企业数据库报表查询系统。
(2)问答系统/问答机器人
Text2SQL作为问答系统的重要模块之一,在涉及结构化表格场景发挥重要作用。例如,下图是笔者实习时接触到的公安局破案机器人真实案例,通过我们的系统可以将民警的提问端到端转换为SQL,并自动查询结果。
(3)数据信息增强
给定一个搜索目标或实体,我们可以通过Text2SQL方法从海量数据库中得到实体相关联的信息,丰富实体内容。