论文:DIN-SQL:Decomposed In-Context Learning of Text-to-SQL with Self-Correction

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

  • 33
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值