ps:才开始学习,有问题很正常,QAQ,主要是自用当笔记本
1.Introduction
在zero-shot和few-shot下的大模型已经有了足够好的结果,但这些模型在常用的基准测试(比如spider上)仍然落后于设计良好的经过微调的模型,如下图:
微调相比于从头开始或微调一个模型,不需要消耗过多的资源,此外在一些基准测试数据集上,few-shot已经展现出较好性能,在训练例子有限的情况下也能有很高准确率。最新结果表明,LLM在使用如:chain-of-thought、least-to-most、decomposed prompting techniques等技术后在更复杂的任务中的性能可以得到改善。
本文的贡献在于:
(1)通过任务分解提高了基于LLM的text-to-SQL的模型性能
(2)引入适应任务复杂性的自适应提示策略
(3)在提示上下文中解决schema links挑战
(4)使用LLM进行自修正
2.Related Work
seq-to-seq模型在text2sql任务中显示出了巨大潜力,核心思想是结合给定的自然语言问题和schema并理由解码器来预测目标的SQL。
具体的略
3.Few-shot错误分析
随机在spider数据集的训练集中的不同数据库中抽取了500个查询,来解释LLM在少数情况下的失败之处。本文手动检查了这些失败,并将其分为六种。
1.Scheme-linking:模型未能识别问题中的列名、表名、实体名
2.JOIN:无法正确识别表或者外键
3.GROUP-BY:没有意识到需要group by或者使用了错误的列
4.Queries with nesting and set operations:set操作和嵌套操作问题
5.Invalid SQL:语法错误SQL
6.Miscellaneous:其余情况,包括缺少谓词,where,多余distinct等,还包括缺少where子句,查询具有冗余的聚合函数。
4.Methodology
编写SQL查询的思维过程可以分解为(1)检测与查询相关数据库的表和列;(2)识别更复杂的一般查询结构(嵌套,多重连接等);(3)如果2中的能够被识别出来,则为其构建程序性子组件(4)根据自问题的解决方法编写最终查询。
根据上述思维过程,本文提出的text2sql任务分解为四个模块组成:
如上图四个模块为:(1) schema linking, (2) query classification and decomposition, (3) SQL generation, (4) self-correction
4.1 schema linking
这一步负责找到自然语言查询中对schema和column的引用,本文设计了如下提示词:
整个提示词的设置应从“Let's think step by step”开始,感觉也正是这句prompt控制大模型有了中间过程,从而提高了分析的正确性。同时,这些并不是AI生成的,包括table描述在内的,全部都是要喂给大模型的prompt,即整个A.3一起喂给大模型。
4.2 Classification & Decomposition Module
解决的问题:随着查询中连接数的增加,连接未能正确生成的概率会增加。此外,一些查询具有程序性组件,例如不相关的子查询,这些子查询需要独立生成并与主查询合并。
实现特点:将查询分为三类——简单查询、非嵌套复杂查询、嵌套复杂查询。其中简单查询指不使用嵌套或链接的情况下应答这些查询;非嵌套复杂查询值指需要连接但不需要子查询的查询;嵌套复杂查询可以包含连接、子查询和集合操作。根据上述三类查询本模块给出了不同的提示词。除此之外本模块还要检测所有查询的表集,包括子查询、嵌套查询等等。
其中某些例子:
这些包括表描述,同样也是一起喂给大模型的。
4.3 SQL Generation Module
需要按照4.2分好的类型来分别处理。
简单类别:遵循< Qj,Sj,Aj >的格式,其中Qj是英文查询文本,Sj是schema links,Aj是SQL给出的查询文本。
非嵌套复杂类别:遵循格式 < Qj,Sj,Ij,Aj > ,其中 Sj 和 Ij 分别表示第j个示例的schema links和中间表示。其中中间表示使用NatSQL,删去了集合运算符。
嵌套复杂类别:提示符遵循 < Qj,Sj,< Qj1,Aj1,... ,Qjk,Ajk > ,Ij,Aj > 的格式,其中,Qji 和 Aji 分别表示第 i 个子问题和第 i 个子查询。和前面一样,Qj 和 Aj 分别用英语和 SQL 表示查询,Sj 给出schema links,Ij 是中间表示(也是NatSQL)。
整个A.5也是直接喂给大模型的。只不过简单、中等、困难是分开喂的。
4.5 Self-correction Module
生成的SQL查询有时候可能缺少或多余关键字,虽然经验表明这种情况不多,但仍需解决。
本模块提供了两种不同的提示自我修正模块:通用的和温和的。其中通用的会要求模型识别并纠正“BUGGY SQL”;温和的并不假定SQL有错误,而是要求检查模型的任何潜在问题,并提供一些关于要检查子句的事例。实验表明通用的在codeX中更有效,温和的在GPT-4中更有效。
其中的通用的自我修正模块会假定所有的都是“BUGGY SQL”,而温和的在prompt中给出了修复SQL的一些建议
5.Experiments
现在的DIN-SQL的性能明显还是有落后的,因此如下实验分析可以看,但现在很多属于落后信息了。
5.1 Models
使用的模型是CodeX家族和GPT-4
5.2 Hyperparameter
所有模型都通过 OpenAI API 访问。使用贪婪解码生成输出,temperature设置为零。自我纠错模块的最大 tokens 数量设置为 350,其他所有模块的最大 tokens 数量设置为 600。自我纠错模块的停止符序列设置为 “#;\n \n”,其他所有模块的停止符序列设置为 “Q:”。
5.3 Dataset
spider和BIRD
5.4 Metrics
spider的精确集匹配精度(EM)和执行精度(EX), BIRD 的有效效率评分(VES)和执行精度(EX)
5.5 Results
略
5.6 Ablation study
如图中实验表明,所有模块缺一不可。
Schema links模块可以帮助所有查询类,使得对困难类的改进更少。但它可能产生冗余的连接。
分类模块对于困难的和额外困难的查询效果更好,但在简单查询上不如简单的few-shot。
6. Conclusion
提示使大型语言模型能够在不同领域的大量 NLP 任务中取得令人印象深刻的性能,而不需要大量的训练集。在我们的研究之前,对于文本到 SQL 的任务,使用 LLM 的提示方法的有效性低于针对该任务进行微调的模型的有效性。为了弥补这一差距,我们设计了一种分解技术来解决造成这一差距的一些挑战。我们在 Spider 和 BIRD 两个具有挑战性的数据集上进行的大量实验表明,我们的方法显著提高了跨所有查询类的提示性能,产生了与最先进的微调方法相当甚至更好的结果。
7.Limitations
略
论文地址:https://arxiv.org/abs/2304.11015
代码地址:https://github.com/MohammadrezaPourreza/Few-shot-NL2SQL-with-prompting/blob/main/DIN-SQL.py