Meta联合伊利诺伊大学和卡内基梅隆大学,让软件智能体在没有任何人类指导的沙盒中通过自我博弈实现了超越人类数据的进化。
研究者通过SSR框架,在完全隔绝人类标注数据的环境中,通过自主制造Bug、编写测试与修复代码的左右互搏,打破了依赖人类开发痕迹的训练天花板。
摆脱人类数据依赖实现自我进化
当前基于大语言模型的软件工程智能体虽然提升了开发效率,但它们的发展被一道隐形围墙挡住了。
这些智能体的训练极其依赖人类积累的数据,比如GitHub上的Issue描述、代码合并请求以及成对的测试用例。
这种依赖造成了一个逻辑上的死循环。
智能体只能学习人类已经解决的问题和已经写好的测试,它们主要是在回放和优化人类的开发痕迹,难以产生超越人类的超级智能。
这些经过人工清洗的数据集不仅昂贵,难以规模化扩展,且往往包含不可靠的训练信号。
为了解决这一核心痛点,研究团队提出了一种全新的训练范式。
这种范式被称为Self-play SWE-RL(简称SSR)。
SSR的核心理念非常直观且具有颠覆性,它不再需要任何带有人类标签的Issue或现成的测试套件。
它只需要一个最基础的输入,一个包含源代码和依赖环境的Docker沙盒。
在AlphaZero通过自我博弈在围棋领域达到超人类水平的启发下,研究人员思考软件工程领域是否也能实现类似的突破。
Absolute Zero曾展示了在完全没有任何外部数据的情况下,仅通过Python解释器进行自我博弈的可能性。
虽然这种方法能学会Python的语法细节,但无法习得现实世界代码库中蕴含的庞大知识。
SSR选择了介于两者之间的道路。它不从零开始发明语言,而是基于现实世界的代码库进行自我博弈。
SSR将同一个大语言模型分饰两角,展开了一场左右互搏的游戏。
一方是Bug注入者,负责制造问题并编写测试。
另一方是Bug修复者,负责解决问题。
通过这种不断的攻防演练,智能体在处理未见过的现实世界软件问题时,表现出了超越人类数据基线的卓越能力。
这种方法的一个关键设计原则是最小化对代码库的先验知识要求。这使得该方法可以广泛应用于各种不同类型的软件项目。
研究团队仅假设可以访问包含源代码和已安装依赖项的Docker镜像。这一设计摒弃了对特定测试解析器、现有测试套件、特定测试运行命令或编程语言框架的依赖。
Bug注入智能体必须完全通过环境交互来发现如何运行测试。
它需要自己创建测试解析器,并理解测试套件的结构。这种极简的假设确保了SSR可以被应用于任意代码库,只需极少的设置开销。
在实际操作中,每个输入到SSR系统的仅仅是一个预构建的Docker镜像。系统不需要知道这是一个Python项目还是Java项目,也不需要知道使用的是pytest还是unittest。
智能体像一个刚接手项目的新员工,完全靠自己去探索和搞清楚这一切。
这种能力本身就是迈向通用软件智能体的关键一步。
传统的训练方法需要人类精心准备数据,告诉模型什么是错的,什么是对的。
SSR则将这一过程内化为模型自身的探索。模型在探索中学会了代码库的结构,学会了如何破坏代码,更学会了如何验证代码的正确性。
构建代码沙盒中的双重博弈机制
在SSR的架构中,Bug不仅仅是一段错误的代码,它被定义为一个严密的Bug工件。
这个工件包含了一整套用于验证Bug存在和修复所需的文件集合。了解这个工件的构成,是理解整个自我博弈机制的关键。
