导语
这是目前使用GPT-4在Text-to-SQL任务上达到SOTA性能的一篇论文。
- 会议:Arxiv 2023
- 链接:arxiv.org/abs/2304.11…
1 简介
数据库的自然语言查询接口旨在使最终用户更容易访问关系数据库中的数据,例如Text-to-SQL任务极大地促进了非专业用户访问数据库进行查询的能力。当前,大语言模型LLM与精心设计和微调的模型相比,在常用的基准测试(例如Spider)上落后。表1显示了两个最新的llm (CodeX和GPT4)在Spider数据集开发集上的性能。尽管其表现强劲,但与现有方法相比仍落后,特别是在中等和复杂的查询。本文研究的问题是这些llm在哪里失败,以及它们面临的一些问题是否可以得到缓解,以推动性能达到或超过微调的SOTA模型。
与使用预训练或微调的传统方法相比,Prompt有几个优点。主要的好处是llm可以执行预测任务,而不需要大量特定于任务的训练数据。从头开始训练大型语言模型或对其进行微调是一个资源密集型的过程,通常需要大量的训练样本和机器资源,而这些可能是不可用的。此外,在几个基准数据集上,Few-shot Prompt已被证明优于以前最先进的方法,并且即使在有限的训练示例中也可以达到很高的准确性。最近有研究表明,llm的性能可以在更复杂的任务上得到改善,其中任务被分解成多个步骤,中间结果用于生成最终答案。但是,与代数表达式不同的是,每个步骤的输出直接提供给下一步,由于语言的声明性结构和查询子句之间的复杂关系,中断复杂的SQL查询可能是一项更艰巨的任务。
本文提出了一种基于Few-shot Prompt的新方法,将自然语言文本到SQL(称为文本到SQL)的任务分解为多个步骤。以前使用llm进行Text-to-SQL的工作仅在Zero-shot设置中进行评估。然而,对于大多数任务,零射提示只提供了llm潜在能力的下Few-shot提示方法。本文在Spider上进行了实验并取得了新的SOTA表现。
2 相关工作
略
3 Few-shot错误分析
为了更好地理解llm在少数镜头设置下的失败,本文在Spider数据集的训练集中随机抽样了来自不同数据库的500个查询,排除了提示中使用的所有数据库。手动检查这些错误,并将它们分为六类,如图1所示,下面将进行讨论。
- 模式链接:包括模型无法识别问题中提到的列名、表名或实体的实例。在某些情况下,查询需要聚合函数,但选择了匹配的列名。
- JOIN:包括需要JOIN的查询,但模型无法识别连接表所需的所有表或正确的外键。
- GROUP BY:这种情况包括SQL语句需要GROUP BY子句,但是模型没有认识到分组的需要,或者使用了错误的列对结果进行分组。
- 嵌套和集合查询:对于这个类别,gold query使用嵌套或集合操作,但模型不能识别嵌套结构,或者无法检测正确的嵌套或集合操作。
- 无效SQL:一小部分生成的SQL语句有语法错误,无法执行。
- 其他:这一类包括不属于上述任何一类的情况。
4 方法
尽管few-shot模型在zero-shot的基础上有所改进,但在更复杂的查询上仍然存在问题,如§3所述。
应对这些挑战的方法是将问题分解为更小的子问题,解决每个子问题,并使用这些解决方案来构建原始问题的解决方案。类似的方法(例如,思维链提示和最小到最多提示)已被用于提高数学单词问题。在这些领域中,任务具有一个步骤直接进入下一个步骤的过程结构,而在大多数情况下,SQL查询是声明性的,可能的步骤及其边界不太清楚。然而,编写SQL查询的思想过程可以分解为(1)检测与查询相关的数据库表和列,(2)识别更复杂查询的一般查询结构(例如分组、嵌套、多重连接、集合操作等),(3)如果可以识别,则制定任何过程子组件,(4)根据子问题的解决方案编写最终查询。
基于这个思维过程,我们提出的分解文本到SQL任务的方法由四个模块组成(如图2所示):(1)模式链接,(2)查询分类和分解,(3)SQL生成,(4)自校正,这些将在下面的小节中详细解释。虽然这些模块可以使用文献中的技术来实现,但我们都使用提示技术来实现它们,以表明llm能够解决所有问题。
4.1 模式链接模块
模式链接负责在自然语言查询中识别对数据库模式和条件值的引用,作者为模式链接设计了一个基于提示符的模块。提示符包括从Spider数据集的训练集中随机选择的10个样本。按照思维链模板,提示以Kojima et al.建议的“Let's think step by step”开始。对于问题中每次提到的列名,将从给定的数据库模式中选择相应的列及其表。还从问题中提取可能的实体和单元格值。图3给出了一个示例。
4.2 分类分解模块
查询分类和分解模块。该模块将每个查询分为三类:简单查询、非嵌套复杂查询和嵌套复杂查询。简单类包括单表查询,无需连接或嵌套即可回答。非嵌套类包括需要连接但不需要子查询的查询,嵌套类中的查询可以需要连接、子查询和设置操作。类标签对于我们的查询生成模块很重要,它对每个查询类使用不同的提示。除了类标签之外,查询分类和分解还检测非嵌套查询和嵌套查询要连接的表集,以及可能为嵌套查询检测到的任何子查询。图4显示了给定给模型的示例输入和模型生成的输出。
4.3 SQL生成模块
查询生成由三个模块组成,每个模块面向不同的类。
- 简单类中的问题,没有中间步骤的简单提示。
- 非嵌套复杂类包括需要连接的查询。本文使用一种中间表示来弥合查询和SQL语句之间的差距,即NatSQL。
- 嵌套的复杂类是最复杂的类型,在生成最终答案之前需要几个中间步骤。这个类可以包含的查询不仅需要使用嵌套和set操作(如EXCEPT、UNION和INTERSECT)的子查询,还需要多个表连接,与前一个类相同。为了将问题进一步分解为多个步骤,我们为这个类设计的提示是这样设计的:LLM应该首先解决子查询,然后使用它们来生成最终答案。
4.4 自校正模块
生成的SQL查询有时可能缺少或冗余关键字,如DESC、DISTINCT和聚合函数。为了解决这个问题,本文提出了一个自我纠正模块,在这个模块中,模型被指示纠正这些小错误。
5 实验
实验结果如下图所示:
6 总结
提示使大型语言模型能够在不同领域的大量NLP任务上取得令人印象深刻的性能,而不需要大型训练集。然而,Text-to-SQL任务的提示方法的性能不如微调模型。在本研究中,作者开发了一种使用提示来解决问题的分解方法。实验结果表明,所提出方法可以有效地弥合两种范式之间的差距,并在具有挑战性的Spider数据集上提供与最先进方法相当的结果。