谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码

这篇具有很好参考价值的文章主要介绍了谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码

文 | 智商掉了一地

你有没有想过,让一台计算机诊断和修复自己生成的错误代码?一篇最新的研究论文介绍了一种名为 Self-Debugging 的技术,通过在生成的代码中添加自解释的信息,让计算机像一个可以自己修复代码的程序员一样调试自己的 BUG。

随着大型语言模型(LLMs)在代码生成领域的不断发展,取得了令人瞩目的性能。然而在面对复杂的编程任务时,一次性生成正确的解决方案变得越来越具有挑战性。为了解决这一问题,先前的研究提出了一些代码修复方法来改善代码生成性能。而在本篇论文中,作者提出了一种名为 Self-Debugging 的方法,通过少量示范来教大型语言模型调试它所生成的代码。

该研究表明,Self-Debugging 方法可以教大型语言模型进行橡皮鸭调试,即在没有任何关于代码正确性或错误信息的反馈的情况下,通过自然语言解释生成的代码来识别其错误,这种方法对于提升代码生成性能具有潜在的巨大价值。

为了验证 Self-Debugging 方法的有效性,作者在多个代码生成基准测试上进行了实验,包括文本到 SQL 生成、C++ 到 Python 翻译和文本到 Python 生成。该方法不仅在提升预测准确性方面表现出色,同时还在样本效率上获得了显著的改进,通过利用反馈信息和重用失败的预测,能在样本效率上具有优势,并且在与生成超过 10 倍候选代码的基线模型相比时,能够取得匹敌甚至超越的表现。

综上所述,这篇文章提出的 Self-Debugging 方法为解决复杂编程任务中代码生成困难的问题提供了一种新颖且有效的解决方案。这一研究将为解决复杂编程任务中代码生成的难题带来了新的可能性,对推动大型语言模型在代码生成领域的应用和发展提供了有力支持。

论文题目
Teaching Large Language Models to Self-Debug

论文链接
https://arxiv.org/abs/2304.05128


背景探索

近期的大型语言模型在生成代码方面有了显著的改进,但生成正确的代码仍然具有挑战性。研究表明从模型中采样多个程序时,选择最佳候选程序的准确性更高。即使对于人类程序员来说,第一次编写的代码并不总是正确的,他们通常会检查代码并根据执行结果更改来解决实现错误。因此,该研究提出了一种名为 Self-Debugging 的方法,通过执行生成的代码并基于代码和执行结果生成反馈信息,来引导模型进行调试

不同于需要额外模型训练的方法,Self-Debugging 通过代码解释来指导模型识别实现错误,类似于人类程序员通过逐行向橡皮鸭解释代码行来提高调试效率的方法。图 1 展示了 Self-Debugging 的完整过程。

在每一步调试中,模型首先生成新的代码,然后执行该代码并解释,代码解释和执行结果构成了反馈信息,然后将反馈信息发送回模型以执行更多的调试步骤。当单元测试不可用时,反馈可以完全基于代码解释。

谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码
▲图1 使用大型语言模型进行迭代调试的 Self-Debugging

生成代码的 Prompt 技术

Few-shot prompting

Few-shot prompting 是一种通过几个输入-输出演示来指导语言模型完成任务的方法。以文本到 SQL 生成为例,few-shot 提示在感兴趣的问题前面加上(question, SQL)对的列表,这样当模型被要求预测给定提示后的后续 token 时,它会按照提示的格式生成 SQL 查询语句。图 2 展示了一个示例的提示。此外,这种方法还可以在提示中添加指令来提供高级任务描述

谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码
▲图2 文本到 SQL 生成的示例

基于执行的代码选择

先前的研究表明,对于大型语言模型,在解码过程中生成多个预测结果可以显著提高性能,特别是在代码生成任务中,可以利用代码执行结果来选择最终的预测结果。有以下两种方法:

  • 使用执行结果的多数投票来选择最终的预测结果;

  • 设计重新排序方案来提高性能。

在本研究中,当存在多个预测结果时,遵循第一种方法,选择在执行时没有遇到错误的预测中具有最频繁执行结果的代码,并对其应用 Self-Debugging。一些代码生成任务伴随着单元测试,以指定程序的执行行为。在问题描述中给出单元测试时,执行基于多数投票的选择之前,会先过滤掉未通过单元测试的程序。

Self-Debugging 框架

图 1 展示了 Self-Debugging 迭代调试框架,使用未经微调的预训练大型语言模型。在给定问题描述后,模型首先预测候选程序,然后推断程序的正确性,并生成反馈信息以进行后续的调试步骤。当反馈信息表明预测结果是正确的,或者达到了允许的最大调试轮数时,调试过程终止。

现有的研究表明,语言模型可以通过训练来理解人类对代码的反馈,并根据指令进行修正。然而,目前尚不清楚语言模型是否能够在没有人类辅助的情况下自行进行调试。在接下来的讨论中,将探讨如何利用代码执行和 few-shot 提示来生成不同类型的自动获取和生成的反馈信息

通过简单反馈进行 Self-Debugging

最简单的自动反馈形式是一句话,仅指示代码的正确性,没有更详细的信息。例如,在文本到 SQL 生成任务中, few-shot 提示会依据正确或错误结果为所有 SQL 查询提供反馈信息:

  • “上面的SQL预测是正确的!”

  • “上面的 SQL 预测是错误的,请修正 SQL。”

使用单元测试进行 Self-Debugging(UT)

对于包含单元测试的代码生成任务,除了通过代码执行来检查代码的正确性外,还可以在反馈信息中呈现单元测试的执行结果,从而为调试提供更丰富的信息。图 5 的示例包含了代码翻译任务的单元测试反馈信息。通过检查运行时错误消息和未通过的单元测试的执行结果,可以帮助人类程序员更有效地进行调试。实验结果表明,利用单元测试可以显著提高调试性能。

通过代码解释进行 Self-Debugging(Expl.)

尽管大型语言模型在生成批评性反馈方面取得了一些进展,以避免生成有害的输出并在自然语言和推理任务中提高性能,但先前的研究尚未在代码生成任务中验证了反馈的有效性。然而,研究表明大型语言模型可以生成描述问题解决方案的文本和代码。基于这一启示,提出了一种新方法,即通过解释生成的代码来教模型进行自我调试,而不是教它预测错误消息。这种调试过程类似于程序员通过向橡皮鸭逐行解释代码来进行调试。研究验证了即使在没有单元测试的情况下,大型语言模型也可以从这种调试方法中获益

应用

文本到 SQL 生成

在文本到 SQL 生成任务中,使用 Self-Debugging 方法旨在评估大型语言模型的性能,如图 3 所示。由于缺乏单元测试,模型更难推断预测的 SQL 查询的正确性。

谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码
▲图3 用于生成文本到 SQL 的 Self-Debugging 提示示例

调试过程包括三个步骤:

  1. 首先,模型通过提示对问题进行总结,并推断问题所需的返回类型,即对应 SQL 查询表的列数。

  2. 其次,模型执行 SQL 查询并将返回的表格添加到输入中,以进行代码解释。生成的 SQL 解释包括对每个子句的详细描述、包含在返回表格中的列数以及完整 SQL 查询的高层含义。如果返回表格超过两行,只有前两行包含在提示中。

  3. 最后,模型将推断的 SQL 解释和问题描述进行比较,并预测当前 SQL 查询的正确性。Self-Debugging 过程在第三步中认为 SQL 查询是正确的,或者达到最大的调试轮数时终止。

这种方法使得模型能够通过对生成的 SQL 查询进行解释和比较,从而自我调试并预测 SQL 查询的正确性。可以有望提高模型在文本到 SQL 生成任务中的性能,并弥补缺乏单元测试的限制。

代码翻译

在实验中,TransCoder 数据集包含了不同编程语言中的平行函数以及单元测试的测试集。根据先前研究的方法,将 Self-Debugging 应用于将 C++ 代码翻译成 Python 代码的任务,并且使用了相同的测试集,包含 560 个问题和每个问题 10 个单元测试,问题描述包括了 C++ 代码和所有单元测试,如图 4 所示。

谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码
▲图4 TransCoder 数据集中的一个示例。问题描述包含 C++ 程序和单元测试,并且需要该模型来预测 Python 程序。

由于单元测试的可用性,研究人员只在预测的 Python 代码未通过所有单元测试时才应用 Self-Debugging 技术,这样模型就不需要预测反馈信息。如图 5 所示,他们迭代地应用 Self-Debugging 技术,直到预测的代码通过了所有单元测试,或模型达到了预设的最大调试轮数。

谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码
▲图5 用于代码翻译的 Self-Debugging 提示的示例。左侧是模型预测,右侧包含基于代码执行的输入 C++ 代码和反馈消息。

文本到 Python 生成

在问题描述中包含了部分单元测试,MBPP 数据集包含了 500 个 Python 问题的文本描述,每个问题都包含3个单元测试。作者在提示中包含问题描述中的第一个单元测试,并将剩余的2个单元测试保留以进行完整的评估。与代码翻译类似,可以在反馈信息中利用单元测试的执行结果,但主要的区别在于,即使预测的 Python 代码通过了给定的单元测试,模型仍然需要推断代码的正确性。

实验

这里对实验部分将不再赘述,作者在所有 Self-Debugging 的实验中,使用贪婪解码来生成代码解释、反馈信息和新的程序,并将最大调试轮数设置为 10。实验证明,成功的调试过程通常在 3 轮内结束。

谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码
▲表1 用于文本到 SQL 生成的 Spider 数据集的准确性
谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码
▲表2 TransCoder 数据集的准确性。其中所有非调试的方法都使用贪婪解码,而 Self-Debugging 方法则用 Codex 预测进行调试
谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码
▲表3 用于文本到 Python 生成的 MBPP 数据集的准确性

在表格 1、2 和 3 中,作者展示了 Self-Debugging 与现有方法的比较结果:

  • 由于没有可用的单元测试,仅有简单的反馈并不能改善性能,因为模型无法仅通过少量的示例区分正确和错误的 SQL 查询,并且不能对初始预测的 SQL 查询进行有意义的修改。

  • 简单的反馈利用了执行结果来推断代码的正确性,即使执行信息没有在反馈信息中呈现给模型。因此简单的反馈仍然改进了模型的预测性能。

  • 对于所有任务,模型从更丰富的反馈信号中受益。尤其是代码解释使得模型可以在没有单元测试的情况下进行 Self-Debugging

在消融实验中,作者主要指出以下几点:

文本到 SQL 生成

谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码
▲图6 Spider 开发集的消融研究。(a)使用不同数量的初始样本进行准确度。(b)不同难度等级问题的细分精度。
  • 通常情况下,一个调试轮次已经足够。这些结果强调了利用大型语言模型解释代码进行调试的优势

  • 在图 6b 中进一步展示了不同难度级别问题上的准确性细分情况,其中每个问题的难度在数据集中根据目标 SQL 查询的复杂性进行了注释。在不同难度级别的问题上,Self-Debugging 对于较难的问题改进更加显著

  • 解决难题的能力:特别是在额外困难问题上,Self-Debugging 将准确性提高了 9%。图 7 展示了一个额外困难问题中,Self-Debugging 修复了预测的 SQL 查询的例子。

谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码
▲图7 Spider 基准测试中的一个例子

代码翻译

谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码
▲图8 TransCoder 消融研究
  • 图 8a 展示了不同调试轮次上的准确性,图 8b 展示了不同初始样本数量上的准确性。

  • 将单元测试执行和代码解释结合起来可以提高调试性能,在图 9 和图 10 中展示了这些例子。

  • 如图 8b 所示,单独利用代码解释而不进行 Self-Debugging 也可以在不同数量的样本上提供一致的性能提升。

谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码
▲图9 通过单元测试反馈进行 Self-Debugging 修复了代码翻译错误,而简单的反馈方法则未能成功
谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码
▲图10 带有代码解释的翻译会正确地检查字符串的末尾

文本到 Python 生成

谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码
▲图11 在 MBPP 上的一个例子,Self-Debugging 后的预测与初始代码有很大差异
  • 发现在初始预测代码与正确解之间差距较大时,代码解释的作用较小,此时模型更倾向于生成新的程序而不是依赖于初始预测中的代码片段。在图 11 中展示了一个例子,其中 Self-Debugging 后的预测代码与初始代码差异很大。

小结

本文介绍了 Self-Debugging 技术,它使得大型语言模型能够自行调试所生成的代码,该方法使模型能够进行橡皮鸭子调试,从而使模型能够在没有人类指导的情况下识别和修复错误。在多个代码生成领域,它实现了最先进的性能,并且显著提高了样本效率。

在文本到 SQL 生成任务中,由于该任务没有指定单元测试,利用代码解释进行 Self-Debugging 以及在最困难的问题上可以始终有好效果。对于代码翻译和文本到 Python 生成任务,在有单元测试可用的情况下,Self-Debugging 准确性提高了多达 12%。

本工作强调了通过教大型语言模型迭代来自己调试预测的方法,从而改进其编码性能的潜力,而非要求模型从零开始生成正确的代码。Self-Debugging 指导模型理解代码、识别错误,并根据错误信息修复错误。

未来的研究方向可以包括进一步提高模型在调试过程中的能力。例如:

  • 探索让模型更好地描述代码的高级语义含义和实现细节,从而提高其代码解释能力。

  • 考虑在模型的反馈中包含更多的调试信息(例如潜在错误的描述),以提供更加丰富的指导。

相信这些改进将进一步推动大型语言模型在编码任务中的性能提升,并在实际应用中发挥更大的潜力。若是有朝一日,用大模型的问答工具准确地辅助我们写代码,少了焦头烂额 Debug 的内耗时刻,岂不美哉?

谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码

卖萌屋作者:智商掉了一地

北理工计算机硕士在读,近期沉迷于跟 ChatGPT 唠嗑,对一切新颖的 NLP 应用充满好奇,正在努力成为兴趣广泛的斜杠青年~

作品推荐

  1. 我是粉红猪佩奇,我要把粉色吹风机写进 IJCAI 论文!

  2. AI取代人类,可以自动生成prompt了

  3. ICLR 2023 最高分论文被锤抄袭??

  4. AI讲话总爱“结巴”?这篇NeurIPS论文找到了病因,结巴率已接近人类!

  5. 如何提升大规模Transformer的训练效果?Primer给出答案

  6. Yoshua Bengio:我的一生

谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码后台回复关键词【入群

加入卖萌屋NLP、CV、搜推广与求职讨论群文章来源地址https://www.toymoban.com/news/detail-418338.html

到了这里,关于谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 阿里首提前向训练框架:让大模型深度思考,可快速定制专属模型

    大语言模型(LLM)是当前自然语言处理领域最核心的技术,以 GPT-4 为代表的大语言模型展现出了类人的学习能力。其中,情境学习(In-context Learning)是大语言模型最神秘的能力之一。如下图所示,在这种情境学习的范式下,大模型无需更新任何参数,仅依赖几个示例样本(demonstrations)就可以学习新任务,执行新样本的预测。

    2024年02月11日
    浏览(47)
  • 使用 AutoGPTQ 和 transformers 让大语言模型更轻量化

    大语言模型在理解和生成人类水平的文字方面所展现出的非凡能力,正在许多领域带来应用上的革新。然而,在消费级硬件上训练和部署大语言模型的需求也变得越来越难以满足。 🤗 Hugging Face 的核心使命是 让优秀的机器学习普惠化 ,而这正包括了尽可能地让所有人都能够

    2024年02月11日
    浏览(38)
  • 通过搜索引擎让大模型获取实时数据-实现类似 perplexity 的效果

    汇报一下这周末的工作,主要是开发了一门课程:通过搜索引擎让大模型获取实时数据,第一次开发一门课程,难免会有很多不熟悉和做的不好的地方。 已经训练好的大模型有气数据的局限性,比如 GPT-4,只有 2023年4月之前的数据。关于最新发生的一些事情,它无法回答。

    2024年04月23日
    浏览(65)
  • 12秒内AI在手机上完成作画!谷歌提出扩散模型推理加速新方法

    本文源自:量子位 只需12秒,只凭手机自己的算力,就能拿Stable Diffusion生成一张图像。 而且是完成了20次迭代的那种。 要知道,现在的扩散模型基本都超过了10亿参数,想要快速生成一张图片,要么基于云计算,要么就是要本地硬件够强大了。 而随着大模型应用逐渐普及开

    2024年02月01日
    浏览(51)
  • 几种技巧让大模型(ChatGPT、文心一言)帮你提高写代码效率!

    自从大模型推出来之后,似乎没有什么工作是大模型不能做的。特别是在文本生成、文案写作、代码提示、代码生成、代码改错等方面都表现出不错的能力。下面我将介绍运用大模型写代码的几种方式,帮助程序员写出更好的代码!(大模型包括但不限于 ChatGPT、文心一言【

    2024年02月08日
    浏览(91)
  • 不真实、难解释?让大模型更安全,3位前沿学者告诉我们能做什么

    在上月举行的“2022大模型创新论坛 · 模型技术安全与治理峰会”上,加州伯克利分校助理教授 Jacob Steinhardt、Anthropic 联合创始人 Chris Olah、 纽约大学终身副教授Samuel Bowman 阐述了他们对模型安全这一领域的前沿解读。 如果你正在从事这一领域研究,欢迎扫码申请加入我们的

    2023年04月18日
    浏览(43)
  • Vscode使用cmake进行debug的配置教学(教你学会写json配置)

    目前csdn上很多的cmake配置,无论是用插件还是写json,都不太方便,经常配置不成功。 比如想要运行slambook里的一些代码,用传统的配置方案都是建立在工作区就在本文件夹创建。 这样的缺点有: 每次切换工作区都要重新配置,麻烦 每次增加外部连接库都要用pkg去find路径,

    2024年02月06日
    浏览(44)
  • 让大模型分析csdn文章质量 —— 提取csdn博客评论在文心一言分析评论区内容

    大家好,我是yma16,本文分享关于 让大模型分析csdn文章质量 —— 提取csdn博客评论在开源大模型分析评论区内容。 vue3系列相关文章: vue3 + fastapi 实现选择目录所有文件自定义上传到服务器 前端vue2、vue3去掉url路由“ # ”号——nginx配置 csdn新星计划vue3+ts+antd赛道——利用i

    2024年02月08日
    浏览(70)
  • 谷歌将发布全新搜索引擎,你期待吗?

    Google一身自带AI属性的新搜索最首要的目标并非急于取代传统搜索引擎,或者说彻底打败ChatGPT,而是能够用全新的产品说服用户,变得与竞争对手同样“强大、能力出众以及顺应AI潮流”。 对于Google而言,搜索就是命脉。Google每年的收入有八成来自广告业务,而广告收入的八

    2024年02月05日
    浏览(57)
  • Unity项目发布谷歌AAB+PAD

    一切的根源都在谷歌商店。 谷歌商店一直对上架的应用和游戏有严格的要求。最早期的时候,谷歌商店要求apk容量限制在50mb内,后来随着应用的普遍容量增大,谷歌商店把apk的容量限制放宽到100mb。 但对于游戏来说,100mb的容量明显不够用。于是谷歌在早期提出了apk+obb(Opa

    2023年04月24日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包