1.文章贡献
(1)通过任务分解提高基于LLM的文本到SQL模型的性能,
(2)引入针对任务复杂性量身定制的自适应提示策略,
(3)解决提示背景下的模式链接挑战,
(4)使用LLM进行自校正。
2.方法论
作者提出了一种新的方法来提高大型语言模型(LLMs)在文本到SQL(text-to-SQL)任务上的性能。这个方法论的核心思想是将复杂的文本到SQL任务分解为更小的子任务,并通过解决这些子任务来构建最终的SQL查询。
详细步骤:
1. 模式链接(Schema Linking)
模式链接模块的目的是识别自然语言查询中对数据库模式的引用,包括列名、表名或实体。这一步对于跨域泛化和复杂查询的合成至关重要。
- 实现方式:作者设计了一个基于提示的模块,通过包含来自Spider数据集训练集的样本,使用“让我们逐步思考”的链式思考模板。
- 输出:对于每个问题中提到的列名,从给定的数据库模式中选择相应的列和表。还从问题中提取可能的实体和单元值。
2. 查询分类和分解(Classification & Decomposition)
这个模块对查询进行分类,并将其分解为更小的子问题。分类基于是否需要连接(JOIN)、是否包含嵌套查询等。
- 分类:将查询分为三类:简单(不需要连接或嵌套)、非嵌套复杂(需要连接但不需要嵌套子查询)、嵌套复杂(可能包含连接、子查询和集合操作)。
- 分解:对于非嵌套复杂和嵌套复杂的查询,模块会检测需要连接的表、可能的子查询等。
3. SQL生成(SQL Generation)
针对不同类别的查询,使用不同的提示生成SQL查询。
- 简单类:使用简单的少次提示,无需中间步骤。
- 非嵌套复杂类:使用中间表示(如NatSQL)来桥接自然语言查询和SQL语句之间的差距。
- 嵌套复杂类:通过解决子查询并使用它们生成最终答案,进一步分解问题。
4. 自我修正(Self-correction)
生成的SQL查询可能存在小错误,如缺少或多余的关键字。自我修正模块旨在修正这些小错误。
- 通用提示:将错误代码提供给模型,并要求其修正。
- 温和提示:不假设SQL查询存在错误,而是要求模型检查潜在问题,并提供一些检查条款的提示。
实现提示
作者使用了特定的提示来引导LLMs完成各个子任务。这些提示包括:
- 零次提示:直接对模型进行任务描述,不提供示例。
- 少次提示:提供少量示例来引导模型理解任务。
- 模式链接提示:引导模型识别和链接数据库模式。
- 分类和分解提示:引导模型对查询进行分类,并识别需要连接的表或子查询。
- SQL生成提示:根据查询类别提供不同的提示,帮助模型生成SQL。
- 自我修正提示:提供错误或潜在错误的SQL代码,引导模型进行修正。
3.实验
我们的方法的新SOTA为85.3,我们的上下文学习方法至少比许多经过深度微调的模型好5%。