论文阅读-Automated Repair of Programs from Large Language Models

文章主旨:研究了Codex自动生成的程序中的错误,并探讨了现有的程序修复(APR)工具以及新发布的Codex-e是否能够修复自动生成的有缺陷的程序。

现在基于大语言模型,输入自然语言,生成代码的应用非常普遍。但是生成的代码正确率很低,文章以GPT-3模型的后代-Codex模型,为例,试图利用自动化程序修复(APR)技术来修复Codex产生的代码错误。

自动化修复技术接受一个有缺陷的程序和一个正确性规范,通过稍稍修改程序使其满足给定的规范来生成一个固定的程序。典型的修复工具通过推理程序语义与给定的规范来生成补丁。例如,基于语义的修复工具(如SemFix、Angelix)通过使用符号执行和基于搜索的修复工具(如Gen-Prog、TBar)在预定义的补丁中搜索正确的补丁。

本文实验方向

本文探讨了两个方向来修复语言模型生成的代码的错误

1.现有的APR技术(TBar和Recoder)

2.研究探讨了使用Codex-e作为自动化程序修复工具的可能性。

「利用OpenAI最近发布的Codex编辑模式(这个新功能可以使现有的程序内容发生改变。)」

设计了三种构建Codex-e编辑指令的策略:
- Codex-e 𝑏𝑢𝑔:告知Codex-e存在程序中的错误并请求其修复。
- Codex-e 𝑙𝑖𝑛𝑒:利用现有的自动程序修复技术,通过统计故障定位(Ochiai)获取可能修复行的序列,作为修复提示提供给Codex-e。
- Codex-e 𝑠𝑡𝑚:直接使用可疑语句而不是可疑行号作为指令,进一步探究Codex-e的响应。

文章关键内容概述

RQ1: WHAT MISTAKES DO AUTO-GENERATED CODE USUALLY MAKE?

  • 1. 先前关于基于搜索的自动化程序修复技术的研究表明,自动生成的修补程序很可能表现出某些反模式,这些反模式会导致生成无意义的修补程序。
    2. 直觉上,像Codex这样的大型语言模型自动生成的代码也可能包含反模式。
    3. 因此,分析了Codex生成的代码是否犯了LMDefects中的相同常见错误。
    4. 对于Codex要解决的LMDefects中的编程任务,首先运行五个自动生成的解决方案在公共测试上,然后将那些通过公共测试的解决方案提交到LeetCode在线判定平台进行私有测试验证。
    5. 如果Codex生成的五个自动解决方案𝑆都不能通过所有的测试(公共和私有测试),则认为𝑆是未解决的解决方案。
    6. 如果没有一个未解决的解决方案𝑆对一个编程任务,则认为该编程任务已解决。
    7. Codex在简单和中等难度级别上分别产生37个和5个解决问题的编程任务,研究剩余71个未解决的编程任务中355个导致编译错误或测试失败的未解决问题𝑆的错误。
    8. 对于Codex生成的每个未解决的解决方案𝑆𝑏𝑢𝑔𝑔𝑦,我们首先参考其他相同编程任务的解决方案来获取修复提示,然后通过对现有代码进行最少的修改来构建修复错误的简单修补程序。
    9. 我们的目标是构建每个未解决问题𝑆的“基准修补程序”𝑆𝑓𝑖𝑥𝑒𝑑,以获得𝑆𝑏𝑢𝑔𝑔𝑦和𝑆𝑓𝑖𝑥𝑒𝑑之间的“差异”。
    10. 这个“差异”代表了Codex自动生成的程序中的错误或错误。
    11. 根据这个“差异”,我们手动将每个未解决的解决方案归类到以下类别中:对齐算法:使用的算法与任务描述中给出的要求不一致。
    12. 表2展示了未解决解决方案的缺陷分类,以及每个缺陷的示例(“示例”列)和编程任务的难度级别(“简单”和“中等”列),以解释每个缺陷。
    13. 为了更容易比较缺陷类型,我们基于Codeflaws中使用的类别(一个包含编程竞赛参与者错误提交的基准)导出缺陷分类。
    14. 与Codeflaws的缺陷分类相比,我们意识到自动生成的代码的错误类型与Codeflaws中的错误类型重叠。
    15. 特别是,Codeflaws和我们的数据集都包含需要多块或单块修复的缺陷。
    16. 此外,对于单块修复,两个数据集都具有类似的选择突变运算符(例如,运算符突变和变量突变)。
    17. 这表明Codex犯了与人类参与者类似的多块或单块修复缺陷。
    18.我们认为这是可以预料的,因为Codex是用很多可能存在错误的人类编写的程序进行训练的。
    19. 表2显示Codex大多数的错误是语法错误和与算法相关的错误。
    20. 实际上,当编程任务的难度从“简单”增加到“中等”时,语法错误和与算法相关的错误数量增加,这表明与较低难度级别的较低难度问题相比,Codex解决更难的编程任务的可能性较小。

RQ2: HOW EFFECTIVE ARE APR TOOLS IN FIXING THE CODE PRODUCED BY CODEX?

  • 1. Codex的错误与人类编写的解决方案有一些相似之处。
    2. 研究现有APR工具修复Codex生成代码的有效性。
    3. 现有APR工具通常生成小修补(通常是一行或几行修复),因此排除无法编译的程序或需要更改整个算法的程序。
    4. 知道可以自动修复编译错误的技术,但本研究仅评估修复编码错误的工具,将修复编译错误工具的评估留作后续工作。
    5. 对Codex模型未解决的解决方案(排除产生语法错误和算法相关错误的解决方案)运行TBar和Recoder,以评估它们生成修补程序的能力。
    6. 在修补程序验证阶段,自动生成的修补程序被归类为以下几种:可能的修补程序、正确的修补程序。
    7. TBar在容易和中等难度的任务上分别产生12个和8个可能的修补程序,但只正确修复了4个容易和2个中等难度的修补程序。
    8. 与TBar相比,Recoder产生更多可能的修补程序(分别在容易和中等难度任务上产生10个和12个),以及更多正确的修补程序(分别为6个和4个)。
    9. 如果比较所有生成修补程序中正确修补程序的百分比,Recoder仍然优于TBar。
    10. 测试用例在修补程序生成中起着重要作用。
    11. 限制公共测试用例的数量是阻止APR工具生成更多正确修补程序的原因之一。
    12. Table 3显示了TBar和Recoder分别生成的修补程序数量和正确修复的编程任务数量。
    13. Table 4显示了使用不同APR工具正确修复的解决方案数量(仅考虑单块错误)。
    14. Recoder修复了八个编程任务,而TBar只修复了五个任务。
    15. TBar将容易级别任务上解决的程序数量从37增加到40(Recoder进一步通过修复另外两个容易级别任务增加这个数字),而Recoder将中等级别任务上解决的程序数量从5增加到9。
    16. 结合这两个工具,APR工具帮助Codex修复了5个和4个容易级别和中等级别的任务。
    17. 进一步分析两个APR工具修复的缺陷类型。
    18. Table 4显示了每个缺陷类别可以正确修复的解决方案数量,其中“TBar”和“Recoder”列显示了相应工具产生的修补程序数量。
    19. 对于每个类别,修补工具可能不会通过最小化程序更改来修复错误。

RQ3: CAN CODEX EDIT MODE FIX PROGRAM BUGS?

  • 1. OpenAI最近发布了Codex编辑模式的更新,这个新功能可以使现有的程序内容发生改变。
    2. Codex编辑模式通过输入程序和一个自然语言指令来输出一个经过编辑的程序。
    3. 研究探讨了使用Codex-e作为自动化程序修复工具的可能性。
    4. 为了减少自然语言描述对Codex-e的影响,去除了每个未解决方案中的任务描述。
    5. 设计了三种构建Codex-e编辑指令的策略:
    - Codex-e 𝑏𝑢𝑔:告知Codex-e存在程序中的错误并请求其修复。
    - Codex-e 𝑙𝑖𝑛𝑒:利用现有的自动程序修复技术,通过统计故障定位(Ochiai)获取可能修复行的序列,作为修复提示提供给Codex-e。
    - Codex-e 𝑠𝑡𝑚:直接使用可疑语句而不是可疑行号作为指令,进一步探究Codex-e的响应。
    6. 对于每个未解决的解决方案,选择了最可疑的十句话,并要求Codex-e为每句话生成五个可能的编辑。
    7. 与常规Codex模式下的初始解决方案生成类似,设置了温度参数0.8以增加找到正确编辑的可能性。
    8. 表5展示了三种策略的结果,其中列Codex-e 𝑏𝑢𝑔、Codex-e 𝑙𝑖𝑛𝑒和Codex-e 𝑠𝑡𝑚分别显示了使用相应编辑指令的正确补丁数量。
    9. 使用"Fix bug in the program"作为指令时,Codex-e 𝑏𝑢𝑔成功产生了15个正确的补丁。
    10. 当给出错误的行号作为指令时,Codex-e 𝑙𝑖𝑛𝑒只修复了六个需要单块修复的解决方案和一个需要多块修复的解决方案。
    11. Codex-e 𝑠𝑡𝑚使用程序文本(如"i -= 2;")作为指令,成功修复了16个有错误的解决方案,效果最好。
    12. Codex-e 𝑠𝑡𝑚的有效性归功于其使用可能更有助于引导像Codex这样的语言模型匹配相关语句。 

实验结果表明:

- Codex生成的程序与人类程序员生成的程序有共同的缺陷类别;
- 现有的APR技术(TBar和Recoder)在修复自动生成的程序中的bug表现不佳;
- 在适当的指令(来自故障定位的信息)下,Codex-e在代码编辑生成方面显示出初步的潜力,通过修复45%更多的错误程序,其表现优于TBar和Recoder。

这项研究的影响包括:

- 通过传统软件工程技术(例如,AST信息、故障定位)增强语言模型;
- 突显了APR技术的局限性,尤其是基于模式的approach;
- 建议APR研究的未来方向(例如,灵活的故障定位形式)。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/671726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

golang 中间件使用

1、自定义中间件函数 func CustomMiddleware() gin.HandlerFunc {return func(c *gin.Context) {// 在请求之前执行的逻辑fmt.Println("执行自定义中间件 - 请求之前")// 调用链中的下一个处理程序c.Next()// 在请求之后执行的逻辑fmt.Println("执行自定义中间…

立足智能存取解决方案|HEGERLS智能托盘四向车储存制动能量 实现能源回收

对于商业配送和工业生产的企业而言,如何能高效率、低成本进行低分拣、运输、码垛、入库,用以提升仓库空间的利用效率,是现在大多企业急需要解决的行业痛点。对此,为了解决上述痛点,近年来,物流仓储集成商、…

常用TS总结

基本用法 普通 const num: number 10const isStop: boolean falseconst title: string 常用TS总结const curName: null nullconst curType: undefined undefinedconst birthday: Date new Date() 对象 // typetype LoginParams {account: string}// interfaceinterfac…

docker常用10条容器操作命令

Docker 中一些常用的容器操作命令,我们可以根据需要使用这些命令来管理和操作 Docker 容器。我们这次以Hell-world这个镜像为例来说明: 1. docker pull hello-world #拉取hell-world镜像 2. docker images # 查看本地拉取的镜像 3. docker run hello…

Maven:项目无法产生Maven Dependencies且无法update project报cannot nest错误

找自己出错项目的.classpath文件&#xff0c;打开&#xff0c;ctrlf&#xff0c;找是否有以下文件&#xff0c;如果没有在末尾加进去&#xff0c;再refresh项目即可&#xff1a; <classpathentry kind"con" path"org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINE…

【python】绘制爱心图案

以下是一个简单的Python代码示例&#xff0c;它使用turtle模块绘制一个代表爱和情人节的心形图案。 首先&#xff0c;请确保计算机上安装了Python和turtle模块。然后&#xff0c;将以下代码保存到一个.py文件中&#xff0c;运行它就可以看到爱心图案的绘制过程。 import turt…

20240203在Ubuntu20.04.6下配置stable-diffusion-webui.git

20240203在Ubuntu20.04.6下配置stable-diffusion-webui.git 2024/2/3 11:55 【结论&#xff1a;在Ubuntu20.04.6下&#xff0c;生成512x512分辨率的图像&#xff0c;大概需要11秒钟&#xff01;】 前提条件&#xff0c;可以通过技术手段上外网&#xff01;^_首先你要有一张NVID…

2024清洁能源、环境与智慧城市国际研讨会(ISCEESC2024)

2024清洁能源、环境与智慧城市国际研讨会(ISCEESC2024) 会议简介 2024年清洁能源、环境与智慧城市国际研讨会&#xff08;ISCEESC2024&#xff09;将在中国丽江举行。本次会议主要围绕清洁能源、环境和智慧城市等研究领域&#xff0c;旨在为该研究领域的专家学者提供一个国际…

用云手机打造tiktok账号需要注意些什么?

随着tiktok平台的火热&#xff0c;越来越多的商家开始尝试更高效的tiktok运营方法。其中&#xff0c;tiktok云手机作为一种新科技引起了很多人的注意&#xff0c;那么用云手机运营tiktok需要注意些什么&#xff1f;下文将对此进行详细解析。 1. 不是所有的云手机都适合做tiktok…

【分享】如何运用数字I/O来保护继电器

1.简述 在开关系统中&#xff0c;短路或者是开路的情况下&#xff0c;由于存在着额外的电流或者是电压&#xff0c;继电器往往会过载。所有的继电器都有一个最大的承载电流和热切换功率&#xff0c;如果超出了这个范围&#xff0c;会增加继电器焊接在一起的风险&#xff0c;从…

项目02《游戏-10-开发》Unity3D

【完成本集功能后共享1-10集整套代码】 基于 项目02《游戏-09-开发》Unity3D &#xff0c; 任务&#xff1a;传送至其他场景&#xff0c; 首先在场景中加入传送门&#xff0c; 设置人物标签&#xff0c; using UnityEngine; using UnityEngine.SceneManagement; u…

代码随想录算法训练营第三十七天|1049. 最后一块石头的重量 II ,494. 目标和 , 474.一和零

1049. 最后一块石头的重量 II 视频讲解&#xff1a;https://www.bilibili.com/video/BV14M411C7oV https://programmercarl.com/1049.%E6%9C%80%E5%90%8E%E4%B8%80%E5%9D%97%E7%9F%B3%E5%A4%B4%E7%9A%84%E9%87%8D%E9%87%8FII.html 本题其实就是尽量让石头分成重量相同的两堆&a…

2024-02-05(Hive)

1.Hive中抽样表数据 对表进行随机抽样是非常有必要的。 大数据体系下&#xff0c;在真正的企业环境中&#xff0c;很容易出现很大的表&#xff0c;比如体积达到TB级别的。 对这种表一个简单的SELECT * 都会非常的慢&#xff0c;哪怕LIMIT 10想要看10条数据&#xff0c;也会走…

树莓派4b连接WQ9201外置无线网卡命令行配置详解

树莓派4B连接WQ9201无线网卡 接线方式 蓝色的线来连接树莓派和WQ9201demo板&#xff0c;USB接树莓派的USB接口&#xff0c;microUSB一端接demo板靠近天线部分的microUSB口。 驱动和固件准备 驱动直接放在树莓派系统的任意目录&#xff0c;目前配置则是将驱动放在树莓派的主目…

使用PaddleNLP识别垃圾邮件:用BERT做中文邮件内容分类,验证集准确率高达99.6%以上(附公开数据集)

使用PaddleNLP识别垃圾邮件:用BERT做中文邮件内容分类,验证集准确率高达99.6%以上(附公开数据集)。 要使用PaddleNLP和BERT来识别垃圾邮件并做中文邮件内容分类,可以按照以下步骤进行操作: 安装PaddlePaddle和PaddleNLP:首先,确保在你的环境中已经安装了PaddlePaddle和…

《Git 简易速速上手小册》第1章:Git 基础(2024 最新版)

文章目录 1.1 Git 简介&#xff1a;版本控制的演变1.1.1 基础知识讲解1.1.2 重点案例&#xff1a;协作开发流程优化案例&#xff1a;功能开发与分支策略 1.1.3 拓展案例 1&#xff1a;代码审查与合并1.1.4 拓展案例 2&#xff1a;冲突解决 1.2 安装和配置 Git&#xff1a;首次设…

代码随想录算法训练营第41天 | 343.整数拆分 96.不同的二叉搜索树

整数拆分 dp数组的含义&#xff1a;dp[i] 表示将 i 拆分所能得到的最大乘积。递推公式&#xff1a;dp[i] max(dp[i], max(j * (i - j), j * dp[i - j]))。我们对 j 从1开始遍历&#xff0c;检验不同的拆分方式能产生的最大乘积。对于拆分方式的选择&#xff0c;要么拆成 j 和 …

关联语句join与合并语句union

前言 在当今数据驱动的世界中&#xff0c;数据库操作是数据分析和处理的关键步骤之一。JOIN语句作为关系型数据库中连接表的重要工具&#xff0c;为我们提供了强大的数据整合能力。本博客将深入探讨各种JOIN语句的用法和应用场景&#xff0c;帮助读者更好地理解如何通过连接操作…

Win32 SDK Gui编程系列之--ListView自绘OwnerDraw(续)

通过所有者绘制的列表视图(2) 所有者绘制列表视图的基础已在前一页中说明。本页将展示如何在所有者绘制列表视图中显示数据库表数据。 1、访问日志 正如在另一个页面中所述,本网站的访问日志目前是通过SQLite3数据库管理的。 以下是上述程序执行的结果。为…

【MATLAB】使用随机森林在回归预测任务中进行特征选择(深度学习的数据集处理)

1.随机森林在神经网络的应用 当使用随机森林进行特征选择时&#xff0c;算法能够为每个特征提供一个重要性得分&#xff0c;从而帮助识别对目标变量预测最具影响力的特征。这有助于简化模型并提高其泛化能力&#xff0c;减少过拟合的风险&#xff0c;并且可以加快模型训练和推理…