Command Palette
Search for a command to run...
SWE-agent:智能体-计算机接口实现自动化软件工程
SWE-agent:智能体-计算机接口实现自动化软件工程
John Yang Carlos E. Jimenez Alexander Wettig Kilian Lieret Shunyu Yao Karthik Narasimhan Ofir Press
摘要
语言模型(LM)智能体正越来越多地被用于自动化数字环境中的复杂任务。正如人类在软件工程等复杂任务中受益于集成开发环境等强大软件应用,我们假设LM智能体代表了一类具有自身需求和能力的新终端用户,并会从为其所使用的软件专门构建的接口中获益。我们研究了接口设计如何影响语言模型智能体的性能。基于这一探索,我们引入了SWE-agent:一个使LM智能体能够自主使用计算机解决软件工程任务的系统。SWE-agent定制的智能体-计算机接口(ACI)显著增强了智能体创建和编辑代码文件、浏览整个代码仓库以及执行测试和其他程序的能力。我们在SWE-bench和HumanEvalFix上评估了SWE-agent,分别以12.5%和87.7%的pass@1率在这两个基准上达到了最先进的性能,远超先前使用非交互式LM取得的最先进成果。最后,我们提供了关于ACI设计如何影响智能体行为和性能的见解。
一句话总结
普林斯顿大学研究人员提出了SWE-agent,一个为语言模型agent提供自定义agent-计算机接口的系统,使其能自主执行软件工程任务,通过增强代码编辑、仓库导航和测试执行,在SWE-bench上实现了12.5%的pass@1成功率,在HumanEvalFix上实现了87.7%,达到当前最优水平。
核心贡献
- 提出了SWE-agent,一个为语言模型agent配备自定义agent-计算机接口(ACI)的系统,用于自主、端到端的软件工程任务。
- ACI显著增强了agent创建和编辑代码、浏览仓库和运行测试的能力,在SWE-bench上达到12.5%的pass@1成功率,在HumanEvalFix上达到87.7%,远超以往非交互式语言模型。
- 分析表明,在ACI中精心设计以LM为中心的交互组件会对agent的行为和下游任务表现产生显著影响。
引言
语言模型agent在执行反馈的配合下,近期在代码生成方面表现出色,但将其扩展到完整的软件工程任务仍充满挑战。人类依赖IDE等复杂界面,而现有语言模型agent通常通过原始Linux shell操作,这使它们难以进行简单的编辑,无法获得错误指导,也缺乏防范常见错误的保护措施。作者提出了SWE-agent,一个围绕agent-计算机接口(ACI)构建的系统,该接口在语言模型与计算机之间进行协调。通过提供一组用于查看、搜索和编辑文件的、防护良好的少量操作,以及每轮简洁的反馈,ACI显著提高了可靠性。SWE-agent使用GPT-4 Turbo在SWE-bench基准上实现了12.47%的问题解决率,远超此前非交互式检索增强方法的3.8%,并表明针对语言模型优势精心设计的接口可以在不改变模型权重的情况下提升性能。
方法
作者提出了Agent-计算机接口(ACI),一个专门设计的框架,旨在使大语言模型能够充当有效的软件工程agent。与为人类设计的传统图形用户界面不同,ACI针对语言模型的能力和局限性进行了定制。例如,当前模型缺乏直接操作基于GUI的应用程序所需的视觉理解能力,并且由于固定的记忆和计算成本,它们对分散注意力的上下文高度敏感。为了解决这些差异,作者对操作、文档和环境反馈进行了塑造,以补充模型的能力。
参考下面的框架图:
ACI框架为语言模型agent提供了与计算机交互的基本功能,类似于集成开发环境如何提高人类生产力。该系统通过让模型在每一步生成一个思考和一个命令,随后将命令执行的环境反馈纳入其中来运作。这个迭代过程建立在Linux shell之上,可以访问常用工具,同时遵循特定的设计原则。操作保持简单易懂,避免使用包含大量选项的复杂命令。此外,操作被整合为紧凑高效的动作,确保在单步中取得有意义的进展。环境反馈被设计为信息丰富但简洁,提供关于当前状态的实质性信息,而不包含不必要的细节。还集成了防护措施,例如自动代码语法检查器,以减少错误传播并加速从错误中恢复。
SWE-agent的ACI实现包含几个主要模块:搜索与导航、文件查看、文件编辑和上下文管理。对于搜索和导航,作者引入了专用命令来定位文件名和文件或目录中的字符串。这些命令输出经过总结的结果,并抑制冗长输出,每次查询最多返回50个结果,以鼓励高效和具体的搜索。
文件查看器模块允许agent通过每次显示最多100行的窗口与代码文件交互。agent可以使用滚动命令浏览该窗口,或跳转到特定行。界面显示完整文件路径、总行数、省略的行和行号,以便精确定位代码。
对于文件编辑,系统提供了一个与文件查看器配合使用的编辑命令。agent可以通过提供起始行、结束行和替换文本来替换特定的行范围。执行后,文件查看器会自动显示更新后的内容。为防止格式错误,编辑功能中集成了代码检查器。如果检查器检测到错误,它会通过相关的错误片段提醒agent,丢弃无效的编辑,并提示agent重试。
上下文管理通过信息丰富的提示、错误消息和历史处理器来处理。系统指示agent在每一步生成一个思考和一个操作。格式错误的生成会触发特定的错误响应,这些响应在首次出现后即被省略以节省上下文。为保持相关性并减少不必要的上下文,最后五次之前的观察结果会被折叠成一行。这种方法保留了有关计划和操作历史的基本信息,同时允许更多的交互循环,并防止显示过时的文件信息。
实验
在SWE-bench和HumanEvalFix上的评估表明,搭载GPT-4 Turbo的SWE-agent显著优于检索增强生成和仅shell的基线,证明了精心设计的agent-计算机接口的价值。消融实验表明,高效的搜索和紧凑的多行编辑至关重要,而代码检查等防护措施有助于agent从错误编辑中恢复。行为分析指出,agent遵循先复现和定位,再进行编辑-执行循环的步骤,在成功时能迅速完成,而大多数失败源于不正确的实现或级联的编辑错误。
搭载GPT-4 Turbo的SWE-agent在SWE-bench上取得了最高的问题解决率,解决了18.00%的Lite子集实例,但成本显著高于检索增强生成。采用对LM友好的界面带来了相比仅shell的agent 64%的相对提升,而编辑仍是一个关键挑战:超过一半的未解决实例是由不正确或过于具体的实现引起的。搭载GPT-4 Turbo的SWE-agent解决了18.00%的SWE-bench Lite问题,相比仅shell agent的11.00%有64%的相对提升。与Lite上的RAG相比,SWE-agent的问题解决率高出6.7倍,但每个实例的成本高出8-13倍。在失败分析中,52.0%的未解决轨迹是由于不正确或过于具体的实现,而级联的失败编辑占另外23.4%。
SWE-agent与GPT-4 Turbo配合,在HumanEvalFix基准的Python、JavaScript和Java上取得了主导性的pass@1率,平均约88.3%。在每种语言中,它比次优模型WaveCoder-DS-6.7B高出约30个百分点,而单独的GPT-4仅达到47%-50%的范围。SWE-agent搭载GPT-4 Turbo在三种语言中均创下最高pass@1率:87.7%(Python)、89.7%(JavaScript)和87.9%(Java)。与次优模型的差距在Python和Java中超过30个百分点,在JavaScript中更大。未使用agent框架的GPT-4得分在47%至50%之间,而最强的67亿参数模型(WaveCoder-DS-6.7B)在Python上最高达57.9%。
消融SWE-agent界面显示,带代码检查的专用编辑操作是最关键的组件,其缺失导致已解决任务下降幅度最大。总结式搜索方法是有益的,而迭代搜索的表现出人意料地不如完全不带搜索工具。文件查看器窗口大小和上下文管理也影响性能,100行和仅保留最近五次观察结果分别为最优配置。迭代搜索产生了12.0%的已解决任务,低于无搜索条件下的15.7%。移除编辑操作导致性能下降最严重,解决率从18.0%下降到10.3%。100行的文件查看器窗口成功率最高;将其减少到30行或显示整个文件,性能分别降至14.3%和12.7%。仅使用最近五次观察结果效果最好;完整历史记录使成功率降至15.0%,省略演示降至16.3%。
评估涵盖了SWE-agent在SWE-bench Lite上进行仓库级问题解决的表现,以及在HumanEvalFix上进行跨语言错误修复的表现,以及界面的消融实验。agent对LM友好的界面和专用的编辑及代码检查功能相比仅shell的基线有显著提升,而编辑失败仍然是未解决实例中的主要障碍。由agent驱动的GPT-4 Turbo在HumanEvalFix的各语言中取得了主导性的pass@1分数,远超独立模型,消融实验表明编辑操作是最关键的组件,而最优的上下文管理(100行查看器和有限历史)进一步提高了成功率。