设计重新排序方案来提高性能。
在本研究中,当存在多个预测结果时,遵循第一种方法,选 择 在 执 行 时 没 有 遇 到 错 误 的 预 测
中 具 有 最 频 繁 执 行 结 果 的 代 码 , 并 对 其 应 用 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.)
尽管大型语言模型在生成批评性反馈方面取得了一些进展,以避免生成有害的输出并在自然语
言和推理任务中提高性能,但先前的研究尚未在代码生成任务中验证了反馈的有效性。然而,
研究表明大型语言模型可以生成描述问题解决方案的文本和代码。基于这一启示,提出了一种
新方法,即通 过 解 释 生 成 的 代 码 来 教 模 型 进 行 自 我 调 试 , 而 不 是 教 它 预 测 错 误 消 息 。这种