首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >微软 & 麻省理工 | 实验结果表明:代码自修复能力仅存在GPT-4!GPT-3.5不具备该能力

微软 & 麻省理工 | 实验结果表明:代码自修复能力仅存在GPT-4!GPT-3.5不具备该能力

作者头像
ShuYini
发布2023-09-14 16:29:24
发布2023-09-14 16:29:24
6790
举报

大型语言模型(LLMs)在代码生成方面展现出了卓越的能力,但在具有挑战性的编程任务上仍然存在困难,目前使用大模型实现代码自我修复是一个比较流行的研究方法。今天给大家分享的这篇文章,作者探讨了GPT自修复在代码生成中的应用,具体研究了GPT-3.5和GPT-4在调试和修复其自动生成的代码中的效果,在此过程中,作者引入了一种名为"pass@t"的评估策略,通过对比实验发现,自我修复的有效性仅在GPT-4中可见,GPT-3.5不具备代码自修复能力

Paper:https://arxiv.org/pdf/2306.09896.pdf

背景介绍

 大型语言模型(LLM)已经被证明能够从自然语言规范中生成代码片段,但当面对复杂的编码任务时仍然存在一定的挑战,例如在编码竞赛、软件工程面试中。最新的研究工作试图利用大模型的自我修复来提高LLM在复杂编码任务场景下的性能。下图是一个典型的自我修复方法工作流。

其中:

  • 首先,用户需要给定一个规范,该规范包含文本提示和一组单元测试示例;
  • 然后,代码生成模型根据文本提示实现代码生成,并利用单元测试示例对生成代码进行测试,如果测试失败,则将错误信息和问题代码给到反馈模型,该模型会输出代码运行失败的原因解释。
  • 最后,将错误原因解释反馈给代码生成模型,进而实现代码自修复。

从表面上看,这是一个非常有吸引力的想法。它可以使系统克服解码过程中由于采样不准确而导致的错误;在修复阶段轻松合并来自符号系统(例如编译器、静态分析工具和执行引擎)的反馈;并模仿人类软件工程师编写代码的试错方式。然而,在此过程中,代码自修复的有效性不仅取决于模型生成代码的能力,而且还取决于它识别代码与任务规范有关的错误的能力。截至目前,并没有对此过程做更加细致的研究。

基于以上背景,本文作者研究了GPT-3.5和GPT-4在解决竞赛级代码生成任务时自我修复的有效性,提出一种名为pass@t的评估策略,根据从模型中采样的Token总数来权衡获得正确代码(相对于给定单元测试)的可能性。与传统的pass@k指标相比,本文评估策略能够准确地将通过自我修复获得的性能与模型在生成反馈和执行修复时所做的任何额外工作进行比较。

代码自修复过程

按照上图代码自修复流程,其主要分为四个步骤:代码生成代码执行反馈生成代码自修复等。

「代码生成」给定一个规范

ψ

,代码模型

M_P

首先生成

n_p

个样本(符合独立同分布,i.d.d),每个样本用

p_i

表示,总体可表示为:

「代码执行」结合单元测试样例,对

n_p

个生成的代码样本进行回归测试。如果有样本通过了测试,那么就会停止。如果没有通过测试,将会收集测试返回的消息

\{e_i\}i

,这些错误消息要么包含编译/运行时错误信息,要么包含程序输出与预期输出不同的示例输入。

「反馈生成」由于执行测试遇到的错误消息等级非常高,提供的修复信息提示也相对比较少。因此,作为中间步骤,本文使用反馈模型来对出现的问题进行更详细的解释。在此过程中,每个错误程序代码

p_i

生成的

n_f

个反馈字符串为:

\{f_{ij}\}j

「代码修复」对于每个初始程序

p_i

和反馈

\{f_{ij}\}j

,通过代码修复模型生成

n_r

个候选修复程序代码。

「修复树」根据上面四个过程,作者将生成的代码、反馈生成的错误字符、修复的程序代码组成的树,成为修复树,如下图所示。该树源于规范ψ,然后分支成初始程序

p_i

,每个初始程序分支成反馈

f_{ij}

,然后修复

r_{ijk}

pass@t评估

由于代码自修复需要调用多个模型,并且每个模型的调用时间并不相同。因此,在这种情况下,pass@k主要是指在k个样本中获得正确程序代码的可能性,而不是比较和评估自我修复的各种超参数选择的合适度量。相反,本文将通过率作为从模型中采样的Token总数的函数来度量,本文称之为pass@t

具体地,假设有一个数据集

D=\{ψ_{d}\}_{d}

和一组选定的超参数

(M_P,M_F,n_p,n_f,n_r)

。假设

T_{d}^{i} \sim M(ψ_d)

表示一棵修复树,它是对任务

ψ_d

进行采样得到的,令

size(T_{d}^{i})

表示修复树中程序代码token和反馈token的总数;并且

T_{d}^{i}|= ψ_d

为真当且仅当

T_{d}^{i}

至少有一个叶程序满足规范

ψ_d

中的单元测试。然后,这种超参数选择的pass@t指标被定义为您期望使用这种超参数选择生成的令牌数量的预期通过率:

实验过程中,作者绘制了这两个变量的估计值。为了获得这些数据,首先为每个任务规范生成一个非常大的修复树,其中:

N_p ≥ n_p

初始程序样本;

N_f≥n_f

每个错误代码反馈字符串;

N_r ≥ n_r

每个反馈字符串的修复候选。给定

(n_p,n_f,n_r)

的设置,然后我们从这个冻结数据集中对

N_t

个不同的修复树进行子采样(带替换)。最后,计算这

N_t

棵树的通过率和树大小的样本均值和标准差。以这种方式估计pass@t大大降低了计算成本,因为可以重用相同的初始数据集来计算

n_p

n_f

n_r

的所有各种选择的估计。

实验结果

基于APPS数据集和本文pass@t评估方法。GPT-3.5及GPT-4的代码自修复结果分别如下图所示。其中左侧子图中每个点的颜色表示初始样本的数量

n_p

,而其形状表示反馈修复样本的数量

n_{fr}

。在右侧图中,显示了沿轴具有两个超参数的热图。

通过上图对比可以发现,GPT-3.5自我修复的通过率低于或等于基线,其代码自修复的能力有限,而GPT-4自我修复的通过率明显优于基线,其具备代码自修复能力。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-27 21:19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AINLPer 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景介绍
  • 代码自修复过程
  • pass@t评估
  • 实验结果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档