Mini-SWE-Agent 快速入门 Tutorial
简单介绍Mini-SWE-Agent的架构以及如何根据你的任务进行修改
SWE-Benchmark是一个由Github上的Issue和解答构成的数据集。SWE-Agent是自动解决Issue的智能体框架。该框架里包含了很多丰富的功能,包括详细的轨迹记录以及工具调用等。Mini-SWE-Agent是SWE-Agent的简化版,没有工具调用。后面简称MSA。MSA作为Agent的一切行为基本都通过Bash指令来完成。今年可能要基于MSA来做一些科研工作。所以这段时间仔细看了一下这个框架,在这里做一个总结
Agent
MSA的源码在这里,在src/minisweagent文件夹中,agents文件夹里是智能体的代码示例。一个智能体的代码主要是通过循环构成。循环的每一步需要根据之前的上下文(每一次对话的信息,每一次操作,以及每一次操作的结果)来查询LLM,LLM给出行为,然后环境(在environments文件夹下)执行LLM给出的行为,并且反馈一个结果。然后结果将会继续被写进上下文中。循环再次开始。在这个循环中,上下文是由不同的Prompt构成的,这些Prompt被定义在了config文件夹里的.yaml文件中。根据Agent的行为以及你的任务,你需要自己定义自己的Prompt,以及该prompt里有哪些参数。在Agent的代码里,你还需要定义一些异常,用来决定何时停止或者需要处理哪些情况,例如格式不对等。刚刚提到的配置文件其实还包含了更多的内容,比如执行环境的信息,模型的信息,因此这个配置文件其实是任务驱动的。
因此在你自己的任务上,你需要先考虑你的Agent流程有哪些?流程决定了你一次循环中能做的事情,以及不同事情之间是否存在分支关系等。接着,你需要实现你设计的流程的代码。其实这个设计思路跟LangGraph是一致的。LangGraph是MSA哪个更简单我不好说,感觉LangGraph对于非计算机专业的用户来说更友好一些似乎。不过MSA以及SWE-Benchmark已经定义了一个清晰的评估Agent的流程,包括其他的各种框架代码,所以从科研的角度上来看,我觉得MSA更适合你快速迭代你的原型。
在流程的代码实现完毕后,你就需要仔细考虑你的Prompt该如何设计了。设计完后你需要将不同Prompt的模板填到配置文件中。然后,在启动任务的时候,加载你的Agent和配置文件,就可以了。
Environment
Environment这个概念其实就是你Agent的指令被执行的地方。主要取决于你的数据集是怎么运行的。如果在本地,那你的环境就是local,如果在docker,那你的环境就是相应的container。在local启动的话,指明一个路径,所有的指令就都会在那个路径执行。请注意,MSA里的Bash指令并不是在同一个session下执行的。也就是说,如果你从工作目录去了文件夹A,那么你下条指令执行的时候,仍然在工作目录而不是A。这是因为维护同一个session在工程上有很多困难。在Docker里也是一样的,只不过执行bash的方式从简单的subprocess变成了container里执行。
swerex似乎是一个有意思的插件,他似乎提供了更合理的环境框架,来适应更加广泛的场景。但是对于Docker以及多线程来说,我暂时没有发现他的优势。反而在环境准备上存在一些麻烦的地方。因为在Docker环境里需要安装swerex,为了保持环境不变,你大概率需要重新安装一个Python。虽然这些都有自动化的python代码帮忙,但是我在执行的过程中还是存在一些配置出错的情况。最重要的是,我暂时没理解swerex的docker和我自己的docker有什么差异,以及并行跑实验时的效率是否差异很大。
models
Agent通过query方法查询模型获得回应。models文件夹里就是定义了各种模型,以及如何从模型的回复中提取你想要的信息,例如costs,时间戳等等信息。这部分几乎不用了解太多,因为你做实验需要用的模型他都支持。需要提一嘴的是,在Agent的代码里,你需要将各种参数填到Prompt中,因此你可能需要从Agent里获取各种模块的一些信息。比如获取模型一共消耗的token,模型目前调用的次数等。
当你需要在Agent里使用自己的模型时,可能需要做一些额外的配置。主要是两种情况,一种是国内苦逼的用户可能没法获得openai/gemini官方的key,另一种是自己本地部署的模型。在.yaml的配置文件中需要这样设置
model:
litellm_model_registry: model_registry.json
model_name: gemini-3-flash-preview
model_kwargs:
custom_llm_provider: openai
api_base: https://api-slb.packyapi.com/v1
api_key:
drop_params: true
temperature: 0.0
model_name不需要加上provider的名字。custom_llm_provider一般写openai或者ollama就行了,而不是写你服务提供商的名字。api_base和api_key就是字面意思。另外,如果你还需要计算costs的话,就设置model_registry.json。其实你设置在litellm的包路径下面也可以,但是这样侵入性比较强,可以自己设置一个文件来注册。我这里就是这样的方式。如果你不想用litellm的话,可能就需要自己研究一下怎么计算costs了。上面这个例子里,model_registry.json的设置可以按照下面来
{
"gemini-3-flash-preview": {
"cache_read_input_token_cost": 5e-08,
"input_cost_per_audio_token": 1e-06,
"input_cost_per_token": 5e-07,
"litellm_provider": "openai",
"max_audio_length_hours": 8.4,
"max_audio_per_prompt": 1,
"max_images_per_prompt": 3000,
"max_input_tokens": 1048576,
"max_output_tokens": 65535,
"max_pdf_size_mb": 30,
"max_tokens": 65535,
"max_video_length": 1,
"max_videos_per_prompt": 10,
"mode": "chat",
"output_cost_per_reasoning_token": 3e-06,
"output_cost_per_token": 3e-06
}
}
其实主要是设置一下input_cost_per_token和output_cost_per_token,然后litellm_provider还是openai。
run
run文件夹里是一些启动MSA的示例代码。其中mini很适合大家了解基本的运行流程。对于并行,可以查看run/extra/swebench.py。整个mini中,Agent会和人交互。交互的代码主要依赖了typer, rich, prompt_toolkit这三个库来构建的,代码写的不错。