论文地址 https://arxiv.org/abs/2307.07306
代码 https://github.com/bigbigwatermalon/C3SQL
本文提出了一种基于ChatGPT的零样本文本到SQL方法,称为C3,其在Spider的保留测试集上实现了82.3%的执行准确率,并成为Spider挑战赛中最先进的零样本文本到SQL方法。C3由三个关键组成部分组成:清晰提示(CP)、提示校准(CH)和一致输出(CO),分别对应模型输入、模型偏差和模型输出。它为零样本文本到SQL提供了系统化的处理。我们进行了大量实验来验证我们提出的方法的有效性和效率。我们的代码可在https://github.com/bigbigwatermalon/C3SQL 上获得。
Text-to-SQL旨在将自然语言问题转换为可执行的SQL查询,可用于为关系数据库提供用户友好的界面。它可以在数据管理的各个方面带来好处,例如数据库的可访问性、网站设计的灵活性等。
传统的Text-to-SQL方法(Li等,2023a)通常使用大量训练数据对解码器-编码器模型进行微调,以实现适当的Text-to-SQL性能。这些基于微调的方法需要一个包含大量文本-SQL对的训练集。然而,在实践中,获取文本-SQL对是非常昂贵的。此外,这种微调范式可能导致对训练集的过度拟合,降低模型的可传递性。
为了解决这些问题,少样本或零样本Text-to-SQL方法是自然的选择。然而,基于解码器-编码器模型的方法无法实现适当的性能(Gu等,2023)。最近,大型语言模型(LLMs)的新兴能力使得少样本(Pourreza和Rafiei,2023)或零样本(Liu等,2023)Text-to-SQL成为可能。少样本Text-to-SQL方法(Pourreza和Rafiei,2023)通过少样本内上下文学习优于基于微调的方法;然而,它对每个查询需要超过10,000个标记,这在实际的Text-to-SQL任务中是昂贵且不可行的。相比之下,零样本Text-to-SQL方法(Liu等,2023)可以节省标记;然而,其性能不及基于微调的方法。
为了解决这些问题,本文提出了一种新颖的基于ChatGPT的零样本Text-to-SQL方法,称为C3,每个查询仅使用约1,000个标记,并且在性能上优于基于微调的方法。C3由三个关键组成部分组成:清晰提示(CP)、提示校准(CH)和一致输出(CO),分别对应模型输入、模型偏差和模型输出。具体而言,CP是一种新颖的零样本Text-to-SQL提示范式,通过采用适当的输入来改善零样本Text-to-SQL性能。此外,CH旨在减轻ChatGPT生成SQL查询时的偏见,通过校准模型偏差来改善零样本Text-to-SQL性能。此外,CO旨在保持生成的SQL查询的一致性,通过克服大型语言模型输出中固有的随机性和不确定性来改善零样本Text-to-SQL性能。
我们在广泛使用的Spider数据集上评估了我们提出的C3方法,其中C3在Spider的保留测试集上实现了82.3%的执行准确率,并成为最先进的零样本Text-to-SQL方法。它比最先进的基于微调方法在保留测试集上提高了。
现有的文本到SQL方法可以分为几个类别:
基于规则的方法、微调方法和基于ICL的方法。基于规则的文本到SQL方法(Zelle和Mooney,1996;Saha等,2016)使用精心设计的模板来生成SQL查询,在特定情况下取得了良好的性能。然而,这些方法严重依赖于手动规则设计,使它们难以应用于其他领域,限制了其可扩展性和通用性。
为了解决这些限制,研究人员探索了基于双向LSTM(Guo等,2019)和CNN(Choi等,2021)的Seq2Seq模型。这些模型提供了更好的灵活性和有效性,但在无缝集成数据库结构信息方面面临挑战。为了解决这些约束,研究人员利用图神经网络,将数据库模式视为图形,更好地整合结构信息(Wang等,2020;Cao等,2021)。此外,对预训练语言模型(如T5)进行微调表现出更好的性能(Raffel等,2020;Scholak等,2021;Li等,2023a)。然而,微调方法通常需要大量特定于目标任务的标记训练数据,并且往往会因对训练数据的过度拟合而受到影响。
大型语言模型(LLM)的出现给文本到SQL任务留下了深刻的印象,并指向了新的方向。像GPT模型这样的LLMs在许多NLP下游任务中的零样本或少样本设置下优于微调模型,这归功于上下文学习(ICL)的能力(Brown等,2020)。ICL中提示的设计深刻影响着LLM的输出质量(Min等,2022;Liu等,2022;Wei等,2022)。一些工作(Rajkumar等,2022;Liu等,2023)对LLMs的ICL在文本到SQL任务中的表现进行了评估。然而,它们中没有一个优于当前的微调方法。
尽管标准提示原则在原理上只提供了LLMs能力的下限(Wei等,2022),但设计良好的LLMs提示具有实现更好性能的潜力。最近,使用GPT-4的少样本范式在文本到SQL任务上取得了最先进的性能(Pourreza和Rafiei,2023)。但是,这种方法需要一些手工示范和大量标记,这在时间和资源上是耗费的。
在我们的工作中,我们展示了ChatGPT在提供适当的指示时可以有效地生成SQL查询,而无需任何示范。我们展示了它作为一个熟练的零样本SQL编写器的能力。
给定自然语言问题Q和数据库模式S,数据库模式S = {T,C,R}包括多个表T,列C和外键关系R。文本到SQL解析问题旨在生成与问题对应的SQL查询Y。
最近的研究将文本到SQL解析任务定为了一个生成任务(Sun等,2023;Liu等,2023),利用适当的提示P来指导大型语言模型M。这个模型估计SQL查询Y上的概率分布,并允许我们逐标记地生成查询。SQL查询Y的生成过程可以如下表示:
这里,Y< i是SQL查询Y的前缀,而PM(Yi|·)是给定前缀Y
最近的研究表明,大型语言模型(LLMs)可以在给定上下文中从少量示例中学习,这被称为上下文学习(Sun等,2023;Min等,2022;Pourreza和Rafiei,2023)。这些研究表明,上下文学习有效地使LLMs能够执行一系列复杂任务。然而,包括额外的示例往往会增加与使用OpenAI API相关的手动成本和标记成本。因此,在这项研究中,我们特别关注零样本提示设置。
在本节中,我们提出了基于ChatGPT的能够实现正确的零样本文本到SQL性能的C3方法。C3方法的框架如图1所示。C3由三个关键组件组成:清晰提示(CP)、提示校准(CH)和一致性输出(CO),它们分别对应模型输入、模型偏差和模型输出。每个组件的细节如下介绍。
清晰提示(CP)组件旨在为文本到SQL解析提供有效的提示。它包括两个部分:清晰布局和清晰上下文。
清晰布局 在文本到SQL中,广泛使用的提示布局样式可以分为两种类型。我们分别将它们表示为复杂布局和清晰布局。每种类型的详细信息如下介绍。
类型1:复杂布局:这种提示布局直接将说明、问题和上下文(数据库模式)串联在一起,看起来很混乱。示例见图2a。
类型2:清晰布局:这种布局通过采用锐利的符号将说明、上下文(数据库模式)和问题分开,看起来清晰。示例见图2b。
直观地,清晰布局将更容易被ChatGPT理解,并实现更好的性能。实验表明,清晰布局在执行精度方面优于复杂布局7.0%,验证了这种直觉(实验设置详见第5.3节)。因此,本文采用清晰布局来构建我们的提示模板。我们还提供了一个有趣的材料,询问ChatGPT本身清晰布局是否重要(请参阅附录A)。然而,我们的实验结果表明,直接使用图2b中提供的说明会导致生成的SQL中存在冗余列。为解决这个问题,我们通过添加一个子句改进了说明部分,并且不选择在查询中未明确请求的额外列。
此外,图2b提供的上下文需要细化。我们将在接下来的部分进行细化。
表格召回我们设计了一个零-shot提示,指导ChatGPT使用三个步骤来回忆表格。首先,表格应根据其与问题的相关性进行排名。其次,模型应检查是否考虑了所有表格。最后,输出格式被指定为列表。为了确保表格召回的稳定性,我们采用了一种自洽的方法。具体来说,模型生成了十组检索结果,每组包含前四个表格。最终结果是通过选择在这十组中出现最频繁的一组来确定的。完整的提示显示在附录B.1中。
• 列召回基于表格召回的结果,我们进一步检索候选表格内的列。我们还设计了一个零-shot提示,并指示ChatGPT通过两个步骤来回忆列。首先,根据问题的相关性对每个候选表格内的所有列进行排名。然后,指定输出格式为字典。在提示中,我们还强调,与问题词或外键更匹配的列应放在前面,以帮助更准确的回忆结果。同样,我们采用自洽方法。具体来说,对于每个表格,我们一次生成十组召回列。然后,我们从每组中选择出现最频繁的五列作为最终结果。完整的提示显示在附录B.2中。
除了召回的表格和列,我们还将召回表格的外键信息添加到上下文部分,以指定用于JOIN操作的列。
结合清晰布局和清晰上下文,我们提出了清晰提示,如图2c所示。
4.2 模型偏差的校准
通过分析生成的SQL查询中出现的错误,我们发现某些错误是由ChatGPT固有的某些偏差引起的。如图3所示,ChatGPT倾向于提供额外的列和额外的执行结果。本文将它们归结为以下两种偏差。
• 偏差1:ChatGPT在输出中倾向于保守,通常选择与问题相关但不一定需要的列。此外,我们发现在涉及数量问题时,这种倾向尤为明显。例如,在图3(左侧)的第一个问题中,ChatGPT选择了Year和COUNT()在SELECT子句中。然而,Spider数据集中的正确SQL仅选择了Year,因为COUNT()仅用于排序目的。
偏差2:ChatGPT倾向于在编写SQL查询时使用LEFT JOIN、OR和IN,但常常无法正确使用它们。这种偏差通常导致执行结果中出现额外的值。可以在图3(右侧)中找到这种偏差的一些例子。
为了校准这两种偏差,我们提出了一种插件校准策略,称为提示校准(CH)。CH通过使用包含历史对话的上下文提示将先验知识融入到ChatGPT中。在历史对话中,我们最初将ChatGPT视为一个出色的SQL写手,并引导它遵循我们提出的去偏提示。
提示1:针对第一种偏差,我们设计了一个提示,引导ChatGPT仅选择必要的列。这个提示如图1右上方所示。它强调了在仅用于排序目的时不应在SELECT子句中包括COUNT(*)之类的项目。
提示2:针对第二种偏差,我们设计了一个提示,防止ChatGPT误用SQL关键字。如图1右上方所示,我们直接要求ChatGPT避免使用LEFT JOIN、IN和OR,而是使用JOIN和INTERSECT。我们还指导ChatGPT在适当时使用DISTINCT或LIMIT,以避免重复的执行结果。
通过结合这两个提示,ChatGPT可以生成与期望输出更加接近的SQL查询。如图3所示,使用我们的CH提示可以有效校准模型偏差。CH提示的更多示例可以在附录C.3中找到。
使用CP和CH方法,ChatGPT能够生成更高质量的SQL。然而,由于大型语言模型固有的随机性,ChatGPT的输出是不稳定的(Lin等,2022)。为了了解ChatGPT的不确定输出对结果的影响,我们分析了在不同提示下,在30次独立实验中,开发集上正确计数的分布,如图4所示。在这个图中,ChatGPT-SQL是文献中提出的方法(Liu等,2023);此外,CP和CP + CH分别表示我们提出的清晰提示和清晰提示方法的组合。无论使用何种方法,只有不到65%的SQL语句可以一致地写成正确的。这意味着通过增强输出的一致性,模型有很大的潜力来正确地撰写大多数查询。
为了增强一致性,我们从先前工作中提出的自一致性概念中汲取灵感。自一致性方法受到的启发是,对于复杂推理问题,存在多种不同的推理路径可以得出唯一正确的答案。它首先采样多个不同的推理路径,然后选择最一致的答案,显著提高输出的质量。文本到SQL的问题类似于推理问题,在这类问题中,有多种方法可以编写SQL查询以表示相同的含义,如图5所示。因此,我们将执行为基础的自一致性应用到了文本到SQL中。
具体来说,我们首先采样多个推理路径以生成多样化的SQL答案。然后,将这些SQL查询在数据库上执行并收集执行结果。在清除所有结果中的错误后,我们通过对这些执行结果进行投票机制来确定最一致的SQL作为最终SQL。例如,在图5中,我们根据执行结果对SQL查询进行分类,并用不同颜色表示它们。然后我们比较这些类别以确定哪一个包含更多的SQL查询,并从该类别中选择一个SQL作为最终SQL。这种方法允许我们利用从多条路径中得出的集体知识,在生成SQL查询时获得更可靠和弹性的结果。
数据集我们在Spider数据集上进行实验。Spider(Yu等,2018年)是一个大规模、复杂和跨领域的文本到SQL数据集。它包括10,181个问题和5,693个唯一的复杂SQL查询,涵盖了200个数据库,包括138个不同的领域。它被划分为8659个训练样本(跨146个数据库)、1034个评估样本(跨20个数据库)和2147个测试样本(跨34个数据库)。每个数据集中使用的数据库之间没有重叠。同时,根据其难度级别,这些样本被分为四类:简单、中等、困难和额外。
评估指标最常用的评估指标是精确匹配(EM)和执行准确度(EX)。对于EM,它考虑模型预测的SQL查询的每个部分(去除值后),只有当所有部分与标准SQL查询中的相应部分匹配时,才被视为正确预测。对于EX,它通过比较在相同数据库中预测的SQL和标准SQL的执行结果来评估预测的SQL查询的正确性。在我们的实验中,我们只使用EX作为评估指标(Zhong等,2020年),因为我们认为SQL可以以多种方式编写以生成相同的结果。此外,ChatGPT有自己的SQL查询编写风格。因此,在我们的实验中直接比较结果更有意义。
实现我们使用OpenAI ChatGPT API:GPT-3.5-Turbo-0301作为我们的实验模型。我们使用ChatGPT在给定问题的相关性上进行两步回表和回列。然后,我们使用我们的CP和CH方法构建输入提示。最后,我们利用ChatGPT一次生成20个SQL查询,并使用我们的CO方法选择最一致的SQL作为最终结果。
基线我们在Spider数据集上进行实验,并将我们的方法与以下基线进行比较:
ChatGPT-SQL(Liu等,2023年)引入了一种简单的零-shot方法,评估了ChatGPT在Text2SQL任务上的能力。
RATSQL(Wang等,2020年)提出了一种统一的框架,利用关系感知自注意力来编码数据库模式和查询的关系结构。
PICARD(Scholak等,2021年)引入了一种增量解析方法,具有约束解码,它在每个生成步骤中检查和过滤出不可接受的令牌。
Graphix(Li等,2023b年)设计了一个Graphix层,基于预训练的T5模型来编码语义和结构信息的组合。
SC-Promp(Gu等,2023年)将Text2SQL任务分解为两个子任务,分别预测结构和内容,通过更少的训练样本实现了高性能。
RESDSQL(Li等,2023a年)提出了一个排名增强的编码和骨架感知解码框架,将模式链接和骨架解析分离。这是基于fine-tuning的最佳方法。
DIN-SQL(Pourreza和Rafiei,2023年)将文本到SQL任务分解为更小的子任务,并为每个子任务设计不同的提示,以指导GPT-4完成每个子任务并获得最终的SQL。在撰写本文时,它是最先进的。
总体性能在表1中,我们报告了我们的方法和基线方法在Spider数据集上的表现。可以观察到,我们的方法在测试集的执行准确度方面优于所有传统的基于fine-tuning的方法。我们的方法还在开发集上比ChatGPT-SQL的零-shot设置提高了9.5%。在撰写本文时,我们的模型在Spider排行榜上排名第二。与top-1方法的few-shot设置相比,我们的方法侧重于零-shot设置。我们的方法仅使用DIN-SQL令牌数量的约10%;
此外,与DIN-SQL中使用的GPT-4相比,GPT-3.5引擎的成本也显著较低。因此,我们的方法更符合预算。
5.3 清晰提示的影响
在本节中,我们从实验角度分别研究提示布局和内容对Text-to-SQL性能的影响。结果是在五次运行中在开发集上获得的平均执行准确度。
清晰布局
我们首先探讨了清晰提示布局的影响,通过比较清晰布局(参见第4.1节中的类型2)和复杂布局(参见第4.1节中的类型1)的性能。结果记录在表2中。从这个表中,我们可以看到清晰布局的性能比复杂布局提高了7.0%。这表明清晰的提示布局对基于ChatGPT的零-shot Text-to-SQL很重要。我们认为这是因为清晰的布局使ChatGPT更好地理解提示,而复杂的布局可能会模糊信息。因此,清晰的布局可以帮助ChatGPT更好地遵循我们的指示,并充分利用提示中提供的信息。
清晰内容
为了研究我们提出的清晰提示内容的影响,我们对(1)回表和回列以及(2)指定外键进行了消融研究。结果记录在表3中。从这个表中,我们可以看到,当删除回表和回列的操作时,C3的性能下降了2.3%;此外,当删除指定外键的操作时,C3的性能下降了2.6%。这表明,回表和回列的操作以及指定外键的操作,提供了清晰的提示内容,对于C3是必要的。我们进一步使用ROC曲线下面积(AUC)来评估表和列的回忆性能。如第4.1节所述,我们仅保留数据库中的前4个表,并为每个保留的表保留前5列,以形成排名模式序列。结果记录在表4中,显示回表和回列的AUC分别为0.9588和0.9833。
5.4 模型偏差校准的影响
为了探索我们提出的校准方法 - 使用提示(CH)的影响,我们对其进行了消融研究。实验结果如表3所示。从这个表中,我们可以看到,当删除校准时,执行准确度下降了1.5%。这证实了模型偏差的校准对于基于ChatGPT的Text-to-SQL是必要的。
在本节中,我们讨论自一致性的影响。我们首先进行实验,展示ChatGPT在Text-to-SQL任务上的潜力。
我们进行了k个独立实验,并记录准确度的变化。结果如图6所示。对于每个问题,如果ChatGPT在k次实验中生成一个或多个正确的SQL,我们认为ChatGPT可以为该问题生成准确的SQL。可以观察到,当使用ChatGPT-SQL时,当k = 30时,准确度可以达到大约85.7%。然而,当k = 1时,准确度仅为72.3%,导致了13.4%的差距。这个差距显示了ChatGPT的巨大潜力。当使用我们的两个提示时,虽然差距相对较小,曲线较平缓,但差距仍然明显。然而,我们可以发现,k的轻微增加可以导致准确度的大幅提高。这是由于ChatGPT的不稳定性,它可能不会每次生成正确的答案。因此,如第4.3节所示,使用自一致性可以利用多个答案获取最一致的答案,并减轻这种不稳定性。在实验中,我们将参数n设置为20,在GPT-3.5 API调用函数中,以便一次生成二十个SQL查询。在这些SQL查询中,我们根据它们的执行结果对它们进行聚类,并从最大的聚类中选择一个SQL查询作为最终SQL。自一致性的消融研究记录在表3中,我们可以看到自一致性使性能提高了1.3%,因此对于维护稳定的性能是必要的。
5.6 错误分析
为了清晰地展示我们提出的方法的有效性,我们对开发集上的ChatGPT-SQL和我们的C3方法进行了错误分析。我们采用了文献中提出的错误分类方法(Pourreza and Rafiei, 2023)。具体来说,我们手动检查了生成的SQL答案中发生的错误,并将它们分为六类,如图7所示。
首先,我们可以看到,通过使用我们的C3方法,错误的总数比ChatGPT-SQL减少了约34%。最值得注意的减少发生在Schema-linking类别中,其中包含三个子类别。在这些子类别中,子类别Extra-columns主要是由Bias 1引起的(参见第4.2节)。我们可以看到,属于这个子类别的错误比例减少了11%。这表明CH在校准模型偏差方面的显著有效性。
其次,在Nested类别的子类别Set op中,显示了对INTERSECT和EXCEPT等操作的误用,而Other类别中的子类别Distinct则表示重复的执行结果。属于这些子类别的错误大部分是由Bias 2引起的(参见第4.2节)。尽管这些类别的比例有所变化,但这些类别的实际错误数量减少了。这表明CH可以有效地校准Bias 2。
最后,在Schema-linking和Join类别中,我们可以看到选择错误表和列的错误显著减少,这归功于在我们提出的CP中的表和列的回忆以及指定外键的操作。对于其他类别,错误数量也减少了,这归功于CO方法,因为它提高了稳定性并在每次实验中保持了高性能。错误的整体减少归因于C3方法的综合效果。
6 结论
本文提出了一种基于ChatGPT的全新的零-shot文本到SQL方法,称为C3,它实现了最先进的零-shot文本到SQL性能。C3从模型输入、模型偏差和模型输出的角度对基于GPT的文本到SQL进行了系统处理。它有可能在基于GPT的文本到SQL研究中开辟新的趋势。
7 致谢
我们感谢Yu Mi和Yilin Li在实验中提供的宝贵帮助。