😺 无代理
😽新闻 | 🐈设置 | 🙀定位 | 😼修复 | 🧶对比 | 🐈⬛成果 | 📝引用 | 😻致谢
😽 新闻
- 2024年7月1日:我们刚刚发布了OpenAutoCoder-Agentless 1.0!Agentless目前是SWE-bench lite上最好的开源方法,修复了82个问题(27.3%),平均每个问题的成本为0.34美元。
😺 关于
Agentless是一种无代理的方法,用于自动解决软件开发问题。为了解决每个问题,Agentless遵循一个简单的两阶段过程:定位和修复。
- 🙀 定位:Agentless采用分层过程,首先将故障定位到特定文件,然后定位到相关的类或函数,最后定位到精细的编辑位置
- 😼 修复:Agentless利用编辑位置生成多个简单diff格式的候选补丁,执行测试过滤,并对所有剩余补丁重新排序以选择一个提交
🐈 设置
首先创建环境
git clone https://github.com/OpenAutoCoder/Agentless.git
cd Agentless
conda create -n agentless python=3.11
conda activate agentless
pip install -r requirements.txt
export PYTHONPATH=$PYTHONPATH:$(pwd)
⏬ 开发者设置
# 为了贡献,请安装pre-commit钩子。
pre-commit install # 这允许更标准化的代码风格
然后导出你的OpenAI API密钥
export OPENAI_API_KEY={在此处填入密钥}
现在你已经准备好在SWE-bench的问题上运行Agentless了!我们现在逐步介绍如何运行Agentless的示例。
[!注意]
要重现完整的SWE-bench lite实验并按照我们论文中描述的确切设置进行操作,请参阅此README
🙀 定位
[!提示]
对于定位,你可以使用
--target_id
来指定你想要定位的特定bug。例如
--target_id=django__django-11039
在定位中,目标是找到源代码中需要编辑以修复问题的位置。 Agentless使用3阶段定位步骤,首先定位到特定文件,然后定位到相关代码元素,最后定位到精细的编辑位置。
[!提示]
由于对于基准测试中的每个问题,我们都需要检出存储库并处理文件,你可能想通过下载预处理的数据来节省一些时间:swebench_lite_repo_structure.zip
下载后,请解压并导出位置,如下所示
export PROJECT_FILE_LOC={你保存的文件夹}
运行以下命令生成编辑位置:
mkdir results # 我们将在这里保存结果
python agentless/fl/localize.py --file_level --related_level --fine_grain_line_level \
--output_folder results/location --top_n 3 \
--compress \
--context_window=10
这将把所有定位的位置保存在results/location/loc_outputs.jsonl
中,日志保存在results/location/localize.log
中
⏬ `loc_outputs.jsonl`的结构 :: 点击展开 ::
instance_id
:问题的任务IDfound_files
:模型定位的文件列表additional_artifact_loc_file
:文件级定位期间模型的原始输出file_traj
:文件级定位期间模型的轨迹(例如,token数量)found_related_locs
:模型定位的相关代码元素列表additional_artifact_loc_related
:相关代码级定位期间模型的原始输出related_loc_traj
:相关代码级定位期间模型的轨迹found_edit_locs
:模型定位的编辑位置列表additional_artifact_loc_edit_location
:编辑位置级定位期间模型的原始输出edit_loc_traj
:编辑位置级定位期间模型的轨迹
🙀 单独的定位步骤 :: 点击执行单独的定位步骤 ::
定位到文件
我们首先从定位到特定文件开始
mkdir results # 我们将在这里保存结果
python agentless/fl/localize.py --file_level --output_folder results/file_level
这个命令将文件级定位保存在results/file_level/loc_outputs.jsonl
中,你还可以查看results/file_level/localize.log
获取详细日志
定位到相关元素
接下来,我们在我们定位的每个文件中定位到相关元素
python agentless/fl/localize.py --related_level \
--output_folder results/related_level \
--start_file results/file_level/loc_outputs.jsonl \
--top_n 3 --compress
这里的--start_file
指的是先前的文件级定位。--top_n
参数表示我们要考虑的文件数量。
与前一阶段类似,这个命令将相关元素定位保存在results/related_level/loc_outputs.jsonl
中,日志保存在results/related_level/localize.log
中
定位到编辑位置
最后,我们取上一步的相关元素,定位到我们希望LLM生成补丁的编辑位置
python agentless/fl/localize.py --fine_grain_line_level \
--output_folder results/edit_location \
--start_file results/related_level/loc_outputs.jsonl \
--top_n 3 --context_window=10
这里的--start_file
指的是先前的相关元素定位。--context_window
表示我们提供给LLM的前后行数。
Agentless将执行修复的最终编辑位置保存在results/edit_location/loc_outputs.jsonl
中,日志保存在results/edit_location/localize.log
中
多次采样编辑位置并合并
对于最后一步定位到编辑位置的步骤,我们还可以进行采样以获得多组编辑位置。
python agentless/fl/localize.py --fine_grain_line_level \
--output_folder results/edit_location_samples \
--start_file results/related_level/loc_outputs.jsonl \
--top_n 3 --context_window=10 --temperature 0.8 \
--num_samples 4
这个命令将以0.8的温度进行采样,生成4组编辑位置。然后我们可以将它们合并在一起,形成一个更大的编辑位置列表。
运行以下命令进行合并:
python agentless/fl/localize.py --merge \
--output_folder results/edit_location_samples_merged \
--start_file results/edit_location_samples/loc_outputs.jsonl \
--num_samples 4
这将对样本进行成对合并(即,样本0和1将被合并,样本2和3将被合并)。此外,它还会将所有样本合并在一起。
合并后的位置文件可以在results/edit_location_samples_merged/loc_merged_{st_id}-{en_id}_outputs.jsonl
中找到,其中st_id
和en_id
表示正在合并的样本。所有样本合并在一起的位置文件可以在results/edit_location_samples_merged/loc_all_merged_outputs.jsonl
中找到。此外,我们还在文件夹中包含了每个单独样本的位置,以保证完整性。
😼 修复
使用之前的编辑位置(即found_edit_locs
),我们现在执行修复。
Agentless为每个问题生成多个补丁(可通过参数控制),然后执行多数投票来选择最终提交的补丁
运行以下命令生成补丁:
python agentless/repair/repair.py --loc_file results/location/loc_outputs.jsonl \
--output_folder results/repair \
--loc_interval --top_n=3 --context_window=10 \
--max_samples 10 --cot --diff_format \
--gen_and_process
这个命令生成10个样本(1个贪婪和9个通过温度采样),如--max_samples 10
所定义。--context_window
表示我们为每个定位的编辑位置提供给模型进行修复的前后代码行数。修复结果保存在results/repair/output.jsonl
中,其中包含每个样本的原始输出以及任何轨迹信息(例如,token数量)。完整的日志也保存在results/repair/repair.log
中
[!注意]
我们还执行后处理以为每个修复样本生成完整的git-diff补丁。
你可以在
results/repair/output_{i}_processed.jsonl
中找到单个补丁,其中i
是样本编号。
最后,我们执行多数投票来选择最终的补丁来解决每个问题。运行以下命令:
python agentless/repair/rerank.py --patch_folder results/repair --num_samples 10 --deduplicate --plausible
在这种情况下,我们使用--num_samples 10
从之前生成的10个样本中选择,--deduplicate
对每个补丁应用规范化以进行更好的投票,--plausible
选择可以通过先前回归测试的补丁(警告:此功能尚未实现)
这个命令将生成all_preds.jsonl
,其中包含每个instance_id的最终选定补丁,然后你可以直接使用你喜欢的方式测试SWE-bench进行评估!
🧶 对比
下图显示了Agentless与SWE-bench lite上最佳开源基于代理的方法之间的对比图
🐈⬛ 成果
你可以在我们的v0.1.0发布中下载Agentless的完整成果:
- 🐈⬛ agentless_logs:原始日志和轨迹信息
- 🐈⬛ swebench_lite_repo_structure:每个SWE-Bench-lite问题的预处理结构信息
- 🐈⬛ 20240630_agentless_gpt4o:我们论文中使用的Agentless评估运行
你还可以查看classification/
文件夹,获取我们对SWE-bench-lite的手动分类以及我们筛选的SWE-bench-lite-S问题。
📝 引用
@article{agentless,
author = {Xia, Chunqiu Steven and Deng, Yinlin and Dunn, Soren and Zhang, Lingming},
title = {Agentless: Demystifying LLM-based Software Engineering Agents},
year = {2024},
journal = {arXiv preprint},
}
[!注意]
前两位作者对这项工作贡献相等,作者顺序通过Nigiri确定
😻 致谢
- SWE-bench
- [Aider](https://github.com/paul-ga