SELF-DEBUGGING:教会LLM自我调试的新方法

释放双眼,带上耳机,听听看~!
本文介绍了一种名为SELF-DEBUGGING的新方法,可以教会LLM自我调试,提高代码生成的能力和样本效率。该方法类似于小黄鸭调试法,通过自然语言解释代码来提高调试效率。

零、前言

📌本文为稀土掘金技术社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究!

📕欢迎访问

个人博客:conqueror712.github.io/

知乎:www.zhihu.com/people/soeu…

Bilibili:space.bilibili.com/57089326

掘金:juejin.cn/user/129787…

注意,本文不涉及太多复杂的公式与数学推导,初学者或者像笔者一样数学不好的读者可以放心阅读!

论文链接:arxiv.org/abs/2304.05…

一、概述

LLM在代码生成方面取得了令人瞩目的成果。

然而,对于复杂的编程任务,一次性生成正确的解决方案变得具有挑战性,一些先前的工作设计了程序修复方法来提高代码生成性能。

本文提出了SELF-DEBUGGING,它通过few-shot教会LLM调试其预测的程序。

特别是,本文证明SELF-DEBUGGING可以教会LLM执行小黄鸭调试法

小黄鸭调试法: 小黄鸭调试法最初是来自《务实的程序员》中的一则故事。 这个故事描述了一个程序员在遇到错误的时候如何向一只橡皮鸭子逐行向它解释他的代码。跟一个没有生命的物体谈论你的代码中的错误可能听起来很傻,但它在程序员中非常流行,因为它很有效。在小黄鸭调试法中,你不仅仅是逐行向橡皮鸭子解释代码,你还要告诉鸭子你到底想做什么,以及你对代码的目标。简单说就是,说着说着就悟了。 SELF-DEBUGGING:教会LLM自我调试的新方法

二、Self-Debugging初探

虽然LLM已经展示了比之前的深度神经网络显著的提升,但是对于许多编程任务来说,用一次尝试生成正确的代码还是比较困难的,LLM可能会受自身生成幻觉的影响(一句话概括幻觉就是:错了但是自我感觉良好),导致生成的代码中含有很多bug。这一现象表示就目前来看,LLM还不能完全代替底层程序员,不过,接下来的工作可能会带来一些改变(笑)。

即使对于人类程序员,第一次编写的代码并不总是准确的。人们通常会使用断点技术或者print大法进行debug,而不是直接放弃错误的代码。

以前提出了深度学习技术来修复预测的代码,当时在各种编码任务上展示了显著的性能提升。然而,这些方法需要对代码修复模型进行额外的训练,需要一些额外的开销。

虽然一些最近的工作表明,LLM具有在某些自然语言和推理领域生成反馈信息的潜力,用来批判和完善其输出,但之前的工作表明,这样的LLM在缺乏外部反馈时,尚不能纠正代码。本文提出的SELF-DEBUGGING就是来解决这个问题的。

具体来说,SELF-DEBUGGING直接指导模型执行代码(而不需要额外的模型训练),然后根据代码和其执行结果生成反馈信息(反馈信息解释了代码错误及其修复方法),SELF-DEBUGGING通过这段解释教会了模型识别代码实现的错误。

这种调试过程类似于人类程序员的小黄鸭调试法,即通过逐行用自然语言向橡皮鸭子解释代码,显著提高调试效率并且无需别人指导,都是由模型自己完成的。

同时,SELF-DEBUGGING提高了样本效率(也就是利用率),并且可以匹配或超过采样超过10倍预测的基线模型(能省一大笔钱)。不仅如此,除了提高从头开始生成代码的能力外,教LLM进行自我调试而无需人类指导是增强编码能力减少采样成本的另一种有前途的途径。

SELF-DEBUGGING:教会LLM自我调试的新方法

SELF-DEBUGGING的完整过程示意图(可以看出是一个迭代的过程):在每个调试步骤中,模型首先生成新代码,然后执行代码并解释代码。代码解释 + 执行结果 = 反馈信息,将反馈信息发送回模型以执行更多的调试步骤。另外,当没有单元测试可用时,反馈信息也可以纯粹基于代码解释。

🍟注:如果只是想简单了解一下的读者,到这里就可以去休息啦,比如享受一杯咖啡什么的,接下来我们将做更加详细的介绍。

三、你好啊!小黄鸭

3.1 Few-shot prompting

Few-shot prompting旨在使用几个输入输出演示来指导语言模型解决任务。

以文本到SQL生成为例,few-shot prompting在问题前面加上一个(问题, SQL)对的列表,这样当模型被要求预测给定提示的后续标记时,它将遵循提示格式生成SQL查询。

如图所示是一个文本转SQL生成的示例。Problem description包含数据库模式,模型需要预测的SQL查询。提示包括每个表中一行的内容。 SELF-DEBUGGING:教会LLM自我调试的新方法

除了输入输出演示,我们还可以选择在提示中添加指令来提供高级任务描述。

下图展示的SELF-DEBUGGING提示的前两步中,两个提示都以要求模型生成解释的指令开头:

SELF-DEBUGGING:教会LLM自我调试的新方法 如图,SELF-DEBUGGING提示文本转SQL生成的示例。模型需要预测代码、解释和反馈。为了清晰起见,图中省略了数据库的详细信息。

但是如何对SQL语句进行判断和调试呢?由于在SQL场景中,单元测试不可用,因此如何判断生成的SQL语句是否正确极具挑战性。如下图所示,Self-Debug在解决这类问题时会分为三步:

  • 第一步是提示LLMs来总结当前需求并推断出该需求所要返回的查询值类型,在这里则需要返回当前SQL查询所涉及的表列数;
  • 第二步执行SQL查询并将返回的表再送入模型中以进行代码解释。代码解释会对每个SQL子句进行分析和描述,返回表中包含的列数以及SQL查询的高级含义。
  • 第三步,模型将推断得到的SQL解释和问题描述进行比较,来判断当前生成SQL查询的正确性。

反馈信息通常是一句简单的指示语句,例如使用“So the SQL prediction above is wrong. Please fix the SQL”来指示错误,使用“So the SQL prediction above is correct”来表示正确,当模型判断SQL生成正确或者达到最大调试轮数时,Self-Debug过程终止。

3.2 基于执行的代码选择

大概意思就是,我有很多个答案,我会选择执行正确,并且被执行的概率尽可能大的那一份,进行Self-Debugging;当然,如果存在单元测试,那么就多了一条规则,即要能够通过单测。

四、Self-Debugging架构

Self-Debugging无需微调,给定问题描述,模型要做以下几件事:

  1. 首先预测候选程序
  2. 然后推断程序的正确性并生成反馈信息以进行后续调试步骤;
  3. 当反馈信息指出预测是正确的,或达到最大允许的调试轮数时,调试过程终止。

现有的工作表明,语言模型可以被训练成理解人类反馈的代码,并根据指令进行更正。然而,目前尚不清楚语言模型是否可以在没有人类帮助的情况下自行进行调试。接下来,我们将讨论可以通过代码执行和少量提示自动获取和生成的不同类型的反馈信息。

4.1 自动反馈的简单形式

最简单的自动反馈形式是一句话,只表明代码的正确性而没有更详细的信息。例如,在文本到SQL生成中,少量提示为所有正确的SQL查询提供反馈信息“上面的SQL预测是正确的!”,对于错误的预测则为“上面的SQL预测是错误的。请修复SQL。”

4.2 基于单元测试的SELF-DEBUGGING

对于包含单元测试的代码生成任务,除了利用代码执行检查代码正确性外,我们还可以在反馈信息中写明执行结果,这为调试提供了更丰富的信息,毕竟运行时的报错和执行结果也有助于人类程序员更有效地进行调试。下面是一个代码翻译的例子:

SELF-DEBUGGING:教会LLM自我调试的新方法 可以看到,第一版的Python代码直接使用了除法/,而Python是自带高精度的,所以这并不正确,修改成整除//才是正确的。

4.3 通过代码解释进行SELF-DEBUGGING

倘若没有单元测试,模型的自我调试依然可以进行,这种调试过程类似于小黄鸭调试法,通过描述代码实现并将其与问题描述进行比较,人类程序员通常能够在没有额外指导的情况下识别出错误。事实上模型也可以:

SELF-DEBUGGING:教会LLM自我调试的新方法

五、消融实验

本文介绍了一种新的文本到SQL生成模型,并通过实验验证了其在Spider基准测试中的优越性。作者发现,在不同表之间指定主键和外键关系可以提高生成性能。自我调试进一步提高了预测准确性,并且在难度较高的问题上表现更加显著。作者还展示了自我调试在不同样本数量下的效果,并提供了一个例子来说明自我调试如何修复一个额外困难问题的预测SQL查询。

本文使用code-davinci-002进行实验,并将最大调试轮数设置为10。作者首先选取了一些专门针对代码生成任务微调的文本模型,例如Graphix-T5和LEVER,由于Spider数据集中包含了超过10K样本的训练数据,作者首先将这些模型在Spider上进行了微调。此外,对于基于提示的方法,作者选取MBR-Exec和Coder Reviewer参与对比实验,这些方法也仅需提示而无需任何额外的训练,实验对比结果如下表所示。

  • 表格1:在Spider开发集上进行文本到SQL生成的准确率。
  • 表格2:在TransCoder数据集上的准确率,作者评估了C++到Python的翻译任务。
  • 表格3:在MBPP数据集上进行文本到Python生成的准确率。

SELF-DEBUGGING:教会LLM自我调试的新方法

此外,作者对本文方法在不同初始样本数量时的性能进行了消融实验,如下图(a)所示,Self-Debug在8个初始样本时就可以达到82.5%的生成准确率,证明Self-Debug可以在提升生成准确率的同时提升样本效率。在图(b)中,作者测试了本文方法在不同难度任务上的性能对比,可以看到Self-Debug在Extra hard问题上的性能提升更加明显,提升精度可以达到9%。

SELF-DEBUGGING:教会LLM自我调试的新方法

六、结论与尾声

本文提出了SELF-DEBUGGING,一种能够使LLM自我调试生成的代码的方法。实验结果表明,SELF-DEBUGGING能够显著提高模型在代码生成任务中的性能,并且能够提高样本效率

这种方法可以教授模型进行自我诊断和修正生成的文本,从而避免了模型在生成文本时出现的逻辑错误、语法错误或不连贯的问题。未来的工作可以进一步提高模型的代码解释能力和调试性能。

FIN

SELF-DEBUGGING:教会LLM自我调试的新方法

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

DALL-E 3 创造的T恤艺术品

2023-11-20 10:28:14

AI教程

ChatGPT与图对话:多模态能力初体验

2023-11-20 10:38:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索