在软件工程自动化的浪潮中,大型语言模型(LLMs)正逐渐成为编程助手的核心技术,它们通过自动化编码过程,显著提升了开发效率。尽管如此,软件工程的范畴远不止编码,它还包括了软件维护(例如错误修复)和软件演化(如功能添加)等更为复杂的程序改进任务,这要求深入分析和调试来定位并修复问题。
SWE-agent是一种先进的软件工程师智能体,它利用如GPT-4这样的大型语言模型自动化解决GitHub上的实际问题。 SWE-bench包含来自GitHub的2,294个真实问题案例。在 SWE-bench 上,SWE-agent 解决了 12.29% 的问题,在整个测试集上实现了最先进的性能。
1. 初始化阶段
a. 创建实例:初始化一个Agent和一个SWEEnv实例。Agent充当智能编程助手,而SWEEnv提供模拟的软件开发环境。
b. 设置工作目录:在系统中创建名为traj_dir的目录,该目录用于存储整个交互过程中生成的所有轨迹数据。
c. 过滤实例:对每个实例进行检查,以确定是否有任何实例不符合条件应该被跳过。
d. 环境重置与信息获取:对选定的实例进行环境重置,恢复到该实例的初始状态,并获取初始信息,如问题描述(issue)和初始观察结果(observation)。
2. 执行阶段
a. 参数设置与模型初始化:为Agent配置适当的参数并初始化其内部模型,使其准备好处理接下来的任务。
b. 交互循环:
i. 基于状态和观察生成响应:Agent根据当前的文件状态(state)和观察结果(observation)生成对应的思考(THOUGHT)和行动(ACTION)。
ii. 执行命令与环境交互:SWEEnv根据Agent提出的行动执行相应的命令,结果将被更新到观察结果中。
iii. 保存轨迹:在每次交互后,保存包含Agent的行动、观察结果和响应的行为轨迹。
iv. 问题解决与更改提交:当Agent的行动中包含“submit”命令时,意味着问题已解决,Agent准备提交更改。SWEEnv将保存修补程序(patch)并标记该问题为已完成(done = True),交互循环随之结束。
3. 保存阶段
a. 结果保存:保存Agent在整个交互过程中生成的预测结果(predictions)。
b. 轨迹保存:保存整个交互过程中Agent的行为轨迹(trajectory)。
ACI通过提供一组简洁的命令和反馈格式,使得LLM更有效地浏览代码仓库、查看、编辑和执行代码文件。
1. Linter集成
a. 特性描述:在Agent与SWEEnv进行交互时,SWEEnv执行Action中的命令需要先进行代码语法检查,确保提交的代码没有语法错误。
b. 示例:如果Agent尝试使用`edit`命令修改文件,但代码不符合语法规则,系统将不允许执行该命令。例如,如果尝试编辑一个Python文件,添加了如下代码而没有正确缩进,系统将拒绝执行并要求修正缩进。
2. 文件编辑器
a. 特性描述:文件编辑器不仅支持基本的文件浏览,还提供了高效的滚动和搜索功能。限制每次显示的代码行数为100行,旨在提高浏览效率且减少信息过载。
b. 示例:使用`open`命令打开一个文件,然后使用`scroll_down`和`scroll_up`命令浏览文件的不同部分。
3. 全目录字符串搜索
a. 特性描述:引入了字符串搜索命令,能够简洁地列出所有包含搜索字符串的文件名,减少混淆。
b. 示例:使用`search_dir`命令在整个目录中搜索包含特定字符串的文件。如搜索包含"function"的文件。
4. 命令执行反馈
a. 特性描述:当命令执行成功但无输出时,系统提供明确的反馈,增强交互明确性。
b. 示例:如果Agent执行了一个命令,比如ls,但没有文件输出,系统会返回一个反馈消息:
1. 原始提示词
2. 中文提示词(翻译)
4.2 示例分析
1. 环境设置:系统通过提供特殊接口的说明,初始化了编程环境,其中包括文件编辑器的使用和命令格式的要求。
2. 问题描述:用户接收到一个关于TimeDelta字段序列化精度的问题,需要解决输出结果与预期不符的情况。
3. 环境熟悉:通过ls -F命令,列出了当前目录下的文件,以便了解项目的文件结构。
4. 依赖安装:查看setup.py文件,了解如何本地安装依赖,并成功执行了安装命令pip install -e .[dev]。
5. 问题复现:创建了reproduce.py文件,并在其中复制了问题描述中提供的代码,用于复现问题。
6. 问题诊断:运行reproduce.py,确认问题复现成功,输出结果与问题描述一致。
7. 代码审查:根据问题描述,定位到fields.py文件的1474行,并尝试理解相关代码逻辑。
8. 问题修复:识别到代码中的潜在问题,并尝试通过编辑fields.py文件来解决精度问题,但初次尝试由于缩进错误导致语法错误。
9. 修复验证:修正了编辑命令的格式,再次尝试修复,并验证通过运行reproduce.py确认问题已解决。
10. 清理工作:删除了不再需要的reproduce.py文件。
11. 更改提交:使用submit命令将更改提交到代码库。