我用Transformer修复代码bug
来源:机器之心 本文约3900字,建议阅读7分钟
本文介绍了一种预训练模型transformer进行自动debug的方法。
论文标题:
DeepDebug: Fixing Python Bugs Using Stack Traces, Backtranslation, and Code Skeletons
论文链接:
https://arxiv.org/pdf/2105.09352.pdf
引言
模型
数据
用于预训练的原始 python 代码; 用于训练神经 bug 创建和 bug 修补程序的 commit 数据; 从原始代码中提取的方法,其中插入了神经 bug 以训练更强大的 bug 修补程序; 通过可执行测试的方法。
预训练
commit 的数据
合成 bug
将点访问器替换为方括号访问器; 将截断链接的函数调用; 删除返回行; 将返回值封装在元组和字典等对象中然后忘记封装对象; 将 IndexError 等精确错误替换为 ValueError 等不同的错误; 误命名变量诸如 self.result 而不是 self._result; 错误地按引用复制而不是按值复制。研究者几乎应用了以前文献中已报道的所有启发式 bug。
可执行测试的方法
追踪法:除了使用测试对不正确的编辑进行分类之外,还以三种不同的方式将来自测试的信息整合到训练中:将错误消息附加到 buggy 方法中,另外附加了栈追踪,并进一步使用测试框架 Pytest 提供了故障处的所有局部变量值; 收集通过测试法:为了以训练规模收集可执行的测试,从用于预训练的 20 万个库开始,过滤到包含测试和 setup.py 或 requirements.txt 文件的 3.5 万个库。对于这些库中的每一个,都在唯一的容器中执行 Pytest,最终从 1 万个库中收集通过的测试; 合成 bug 测试法:在过滤通过可执行测试的函数并插入神经 bug 之后,重新运行测试以收集 Pytest 追踪,并滤除仍通过测试并因此实际上不是 buggy 的已编辑函数。
实验及结果
反向翻译数据
添加框架
Pytest 栈追踪
编辑:于腾凯
校对:龚力
评论