大语言模型实战

大型语言模型SQL任务实战


当前Text2SQL技术引起了自然语言处理和数据库社区的广泛关注,该技术有望实现将自然语言中的语义转换为SQL查询,为直接使用自然语言调用数据库系统提供实际应用。这一领域的主要挑战在于,如何有效地对自然语言表达的含义进行编码和解码,以及在这两种形式之间进行准确的语义转换。本章将对公开数据集及模型方法进行介绍,最后结合DeepSeek Coder进行模型微调,并测试效果。

 

5.1 公开数据集

高质量的语料库对于学习和评估Text2SQL任务至关重要。下面将对英文及中文公开数据集进行介绍。

 

1. 英文公开数据集

当前公开的英文数据集较为丰富,数据类型也众多,相关数据的主要分布情况如表5-1所示。

 

 

(1)Spider

Spider数据集是一个用于跨领域文本到SQL解析任务的大规模基准数据集,其设计旨在推动该领域的研究和发展。Spider包含10181个自然语言问题和5693个唯一的165SQL查询,涵盖来自138个不同领域的200个数据库。Spider数据集的复杂性很高,因为它包含了跨越多个数据库、多个领域的自然语言问题和SQL查询。数据样例如下:

 

其中,相关字段说明如下。

·db_id:当前问题的数据库名称。

·query:对应的SQL查询语句。

·query_toks:SQL查询语句的分词结果。

·question:自然语言查询语句。

·question_toks:查询语句的分词结果。

·sql:用于后续解析的SQL结构。

为了更全面地评估模型的性能,Spider数据集中的SQL查询被划分为4个不同难度级别:简单、中等、困难和额外困难。这种分级能够对模型在不同难度级别上的表现进行更深入的了解。Spider数据集为研究人员提供了一个全面而有挑战性的平台,促使他们在文本到SQL解析任务上进行深入研究和创新。


(2)WikiSQL

WikiSQL数据集是一个包含80654个手工制作的自然语言问题和SQL查询对的大规模集合,同时还包括从维基百科上提取的相应SQL表格,总计26521个表格数据。为了增加数据的多样性,对于每个选定的表使用SQL模板和规则生成了6个不同的SQL查询。随后,通过在亚马逊Mechanical Turk上使用模板,利用众包的方式为每个SQL查询注释了一个简单的自然语言问题。数据样例如下:

 

其中,相关字段说明如下。

·phase:数据集收集的阶段,此数据集在两个阶段收集。

·question:由工作者编写的自然语言问题。

·table_id:与此问题相关的表的ID。

·sql:与问题对应的SQL查询。该字段包含以下字段:

■conds:一个三元组列表(column_index,operator_index,condition)。

◆column_index:正在使用的条件列的数字索引,可以从表中找到实际的列。

◆operator_index:正在使用的条件运算符的数字索引,可以从lib/query.py的

Query.cond_ops中找到实际的运算符。

◆condition:条件的比较值,可以是字符串或浮点数类型。

■sel:被选择的列的数字索引,可以从表中找到实际的列。

■agg:正在使用的聚合运算符的数字索引,可以从lib/query.py的Query.agg_ops中找到实际的运算符。

相较于其他数据集,WikiSQL数据集包含的实例和表格更为庞大。此外,WikiSQL数据集具有更高的挑战性,因为它涵盖了大量的表格,要求文本到SQL解析不仅能够适应新的查询,还能够适应新的表格架构。通过引入WikiSQL数据集,研究者得以更全面地探索文本到SQL解析任务,促进了该领域的深入研究和技术创新。


(3)SQUALL

SQUALL数据集是WikiSQL的扩展,旨在通过提供手工制作的注释,包括SQL查询以及与NL问题标记对齐的相应SQL片段,进一步丰富WikiTableQuestions的训练集。

SQUALL数据集共包含15620个实例,其中有9030个实例用于训练,2246个实例用于验证,以及4344个实例用于测试。数据样例如下:

 

该数据集的注释不仅提供了SQL查询,还提供了与自然语言问题对齐的SQL片段,从而为模型提供了更加详细和精确的训练信息。


(4)ATIS

ATIS(Airline Travel Information System)数据集是一个经典的自然语言到SQL 解析任务的基准数据集。该数据集包含用户在航空公司旅行查询系统上询问航班信息的问题,以及一个包含有关城市、机场、航班等信息的关系数据库的集合。在ATIS数据集中,SQL查询在使用IN子句执行时效率较低。为此,在之后的研究中对这些SQL查询进行了修改,同时保持了SQL查询的输出不变。该数据集共包含5418个自然语言表达,每个表达都对应一个可执行的SQL查询。其中,4473个样本用于训练,497个样本用于开发,而448个样本用于测试。

 

2. 中文公开数据集

当然,也有众多面向中文场景的Text2SQL任务的数据集,相关内容如表5-2所示。

 

 

(1)追一NL2SQL

2020年之前公开的Text2SQL数据集中有一份高质量的中文数据集,是由比赛主办方追一科技提供的。该数据集使用金融以及通用领域的表格数据作为数据源,提供在此基础上人工标注的自然语言和SQL语句的匹配对。该数据集共包含49867条有标注的训练集数据,10000条无标注数据作为测试集。该数据集主要由3个文件组成,以训练集为例,包括train.json、train.tables.json及train.db。数据样例如下:

 

其中,相关字段说明如下。

·table_id:表示查询表格对应的ID编号。

·question:表示真实用户查询问题。

·sql:表示SQL的组成形式。

·sel:表示查询目标在header字段中的序号。

·agg:表示聚合类型。

·cond_con_op:表示查询条件间的连接形式。

·conds:表示查询的限制条件情况,主要由3个元素组成,分别为查询属性序号、操作符和值。

SQL的表达字典说明如下:

 


(2)阿里汽车与银行数据

该数据集是由阿里巴巴在SDCUP中所提供的,共包含16228条有标注的训练集数据,1530条无标注数据作为测试集。模型训练所需基本字段与NL2SQL数据集基本相同。研究人员采用了一种模式依赖的预训练目标,将期望的归纳偏差引入表格预训练的学习表示中。这意味着研究人员通过在预训练阶段引入特定模式的信息,能够使模型更好地捕捉和理解表格数据的结构和关系。为了减轻噪声的影响,研究人员进一步引入了一种基于模式的课程学习方法,该方法以一种由易到难的方式有序地从预训练数据中学习。数据样例如下:

 


(3)恒生金融数据

该数据集由恒生电子股份有限公司提供,共包含78520条有标注的训练集数据, 28137条无标注数据作为测试集。

该数据集在CCKS2022金融NL2SQL评测中发布,比赛要求选手根据提供的训练集数据(3966条)训练NL2SQL模型并对验证集(1000条)中的问题进行SQL结构预测,采用准确率(Accuracy)评测模型性能。除标注数据外,还包括数据库基础信息(db_info.json)、数据库表(.sql文件和.sqlite文件)、领域知识(fin_kb.json)等数据。


(4)蚂蚁基金数据

该数据集是对线上真实用户问法归纳总结后得到的,来源于支小宝金融领域多轮对话数据,特点如下:

1)强金融属性:比如基金经理、基金、行业、重仓等是多对多关系。

2)属性值和基金之间也是多对多关系。

3)每只基金有众多不同的维度。

4)具有一个或多个相同属性不能唯一确定某一只基金。

该数据集共包含78520条有标注的训练集数据,28137条无标注数据作为测试集。该数据集由waic_nl2sql_train.jsonl、waic_nl2sql_test.jsonl、fundTable.xlsx三个文件组成,其关键字段与NL2SQL数据集相同,此处不再介绍。数据样例如下:

 

 

操作符和关键词字典如下:

 


(5)DuSQL

DuSQL是2020年语言与智能技术竞赛提供的大规模开放领域的复杂中文Text-to-SQL 数据集,语法覆盖了orderBy、groupBy、having、嵌套SQL、join等几乎所有SQL语法。数据样例如下:

 

数据的基础格式与前文所提及的Spider基本一致,在该数据集构建的过程中,首先分析了用户在真实场景中使用SQL查询语句的分布,并考虑了其中大量的数据表中行/列运算的情况。接着在数据构造过程中,DuSQL通过定义的SQL语法自动生成SQL查询语句和对应的伪语言问题描述,并通过众包方式将伪语言问题描述改写为自然语言问题。


(6)CHASE

CHASE是2021年由微软亚洲研究院和北京航空航天大学、西安交通大学联合提出的首个大规模上下文依赖的Text-to-SQL中文数据集。

与之前的跨领域上下文依赖数据集相比,CHASE增强了上下文依赖的特点并增加了对话过程中SQL的复杂程度。CHASE可以分为两部分:CHASE-C和CHASE-T。在CHASEC中,12名学生作为标注者进行问题序列的建立以及相应SQL语句的标注,还提供了查询意图推荐方法来保证多样性。在CHASE-T中,类似于CSpider,直接将SParC中的交互查询数据集翻译为中文数据集并减小中英文之间的偏差。相比以往的数据集,CHASE大幅增加了hard类型的数据规模,减少了上下文独立样本的数据量,弥补了Text2SQL多轮交互任务中文数据集的空白。