Change2Task: From Repository Changes to Executable Coding Agent Tasks and Environments
该论文介绍了 Change2Task,这是一个能够将合并后的拉取请求自动转换为经过验证且可执行的代码智能体任务的系统,它通过重构历史仓库状态并在现代代码库上进行验证,从而在显著增加训练数据供应量的同时,与现有基准相比降低了设置成本并提高了任务恢复率。
原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
想象一个计算机正在学习成为软件工程师的世界。这些“编程智能体”(coding agents)就像数字学徒,它们不仅仅是写下一行代码就停止,而是能够打开一个项目、阅读文件、修复漏洞、运行测试,并在失败时重试。但问题在于,为了变得真正精通,这些学徒需要在真实的现实问题上进行练习。它们需要一个庞大的“练习题”库,在那里它们可以尝试修复一个损坏的功能或添加一个新功能,然后得到一个清晰的“通过”或“失败”的评分。
问题在于,创建这些练习题非常困难且昂贵。通常情况下,为了制作一个测试,你必须为每一个问题构建一个完美的、隔离的计算机环境(就像一个数字沙盒)。如果你想制作 1,000 个不同的编程挑战,你可能需要构建 1,000 个不同的沙盒,这会占用大量的存储空间和时间。这就像是为了教某人烹饪,竟然为每一道想要学习的菜谱都建造一个全新的、配备齐全的厨房一样。这项工作量如此巨大,以至于我们很快就会用完练习题,而智能体也无法获得它们变得专业所需的训练。
这就是名为 Change2Task 的新想法所发挥作用的地方。把它想象成一台神奇的代码时光机。它不再为每道菜谱构建一个新厨房,而是观察一个真实软件项目的历史——就像一份记录了过去人类开发者每一次修复漏洞或添加功能的巨大日志。它查看那些旧的、真实的经历,并问道:“我们能否在软件的当前版本上,重新创造出这个完全相同的挑战?”
该系统运作起来就像一个聪明的编辑。它找到一个“已合并的拉取请求”(merged pull request,这只是一个关于已被接受并添加到代码中的变更的专业术语)并尝试对其进行逆向工程。它要求计算机“撤销”那个变更以创建一个损坏的状态,然后设定一个目标,让编程智能体再次修复它。但神奇之处在于,它并不是从零开始,而是在一个已经运行着的现代、健康的软件版本上进行操作。如果代码自原始修复以来发生了很大变化,Change2Task 会使用三种不同的策略将旧的修复映射到新代码上:
- 补丁反转(Patch Reversal): 如果代码变化不大,它只需将旧的修复向后翻转。
- 代码映射(Code Mapping): 如果代码位置发生了移动,它会找到旧代码的新位置并进行替换。
- 智能体重构(Agent Reconstruction): 如果代码完全不同,它会使用一个聪明的 AI 智能体来设法在新的环境中重新创造出这个问题。
研究人员在五种常见的编程任务类型上测试了它:修复漏洞、添加新功能、编写新测试、更新旧工具(API)以及修补安全漏洞。他们从公共软件项目中提取了 1,130 个真实的变更。该系统成功地将其中 900 个转化为了可运行、经验证的练习任务。这是一个大约 80% 的成功率。
真正令人兴奋的是它节省了多少成本。通过复用同一个现代化的“厨房”(软件环境)来处理多个不同的练习问题,他们减少了 58.4% 的环境搭建时间,并降低了 71.2% 的存储空间需求。事实上,他们创造的经验证的任务比之前那种仅仅尝试直接复制旧修复的方法多出了 29.2%。
团队还检查了这些重建的任务是否公平。他们让不同的 AI 编程智能体分别在原始的历史版本和新的现代版本上解决这些问题。结果几乎是完全一致的:智能体在两个版本上获得相同“通过”或“失败”评分的情况高达 98%。这证明了这些新任务不仅仅是随机的猜测;它们是对真实开发者工作的忠实重现。
简而言之,Change2Task 不仅仅是找到了更多的练习题;它还找到了一种让现有的练习题变得可复用且高效的方法。它将软件开发的历史变成了一种可再生的资源,用于训练下一代 AI 编程师,证明了我们不需要为每一节课都建造一个新世界——我们只需要知道如何用全新的眼光去看待旧世界。
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。