十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SWE-agent 架构深度解析:从 CLI 入口、SWEEnv 环境到 Agent 主循环

SWE-agent 架构深度解析:从 CLI 入口、SWEEnv 环境到 Agent 主循环 SWE-agent 架构深度解析从 CLI 入口、SWEEnv 环境到 Agent 主循环【免费下载链接】SWE-agentSWE-agent takes a GitHub issue and tries to automatically fix it, using your LM of choice. It can also be employed for offensive cybersecurity or competitive coding challenges. [NeurIPS 2024]项目地址: https://gitcode.com/GitHub_Trending/sw/SWE-agentSWE-agent 是一个把大语言模型LM变成软件工程 Agent的开源框架给它一个 GitHub issue它会自动在隔离的容器环境里浏览代码、执行命令、编辑文件并最终产出补丁。本文以官方架构文档为主体结合仓库源码逐层拆解 SWE-agent 的总体架构——从sweagent命令行入口、基于 SWE-ReX 的环境管理层SWEEnv、Agent 主循环与模型交互到历史压缩HistoryProcessor、动作解析Parser与 ACI 自定义工具帮助读者建立完整的系统认知并为后续阅读安装指南、使用指南与配置参考打下基础。架构总览官方架构文档用一张带编号的架构图编号 111概括了 SWE-agent 运行时的全部核心组件与数据流整个系统可以归纳为三个层次入口层sweagent命令行可执行程序图中编号 1负责解析用户指令并初始化后续对象环境层SWEEnv类编号 2管理 Agent 的工作现场它是 SWE-ReX 元素安装为自定义工具编号 9供该会话使用智能层Agent类编号 6通过 YAML 配置驱动其核心方法是forward()——向模型发起提示并执行模型输出的动作。模型交互时历史记录所有提示、动作与输出会先经过HistoryProcessor编号 7压缩以充分利用模型上下文窗口模型输出编号 8再由Agent通过 parser 解释提取动作并经SWEEnv编号 10在 shell 会话中执行。SWEEnv持有 SWE-ReX 的 deployment 类后者与运行在 Docker 容器内的服务器通信编号 11。CLI 入口与子命令分发SWE-agent包的中心入口是sweagent命令行可执行程序。从源码看入口文件 sweagent/main.py 只是简单地把控制权交给sweagent.run.run.main而 sweagent/run/run.py 则定义了完整的命令分发逻辑运行类子命令sweagent run别名r在单个问题陈述例如一个 GitHub issue上运行 Agentsweagent run-batch别名b在一批问题陈述例如 SWE-bench 基准上运行辅助类子命令merge-preds合并多个预测文件inspect别名i在终端查看器里打开单个轨迹文件inspector别名I用 Web 界面查看轨迹run-replay回放轨迹或演示文件可用于在制作演示时补全环境输出traj-to-demo把轨迹文件转换为易于编辑的演示文件run-api作为 GUI 的后端运行 Agentremove-unfinished别名ru清理未完成的轨迹quick-stats别名qs从轨迹目录计算快速统计shell别名sh进入交互式 shell。分发逻辑采用延迟导入deferred import策略main()先解析顶层命令再按命令动态导入对应模块如sweagent.run.run_single、sweagent.run.run_batch避免不必要的启动耗时。每条子命令都支持--help查看用法。SWEEnv基于 SWE-ReX 的环境管理从配置对象到环境实例SWEEnv类定义在 sweagent/environment/swe_env.py其职责是代表求解任务所在的环境。它通过EnvironmentConfigPydantic 模型来配置关键字段包括deployment部署选项默认是DockerDeploymentConfig(imagepython:3.11, python_standalone_dir/root)即默认使用python:3.11镜像的本地 Docker 容器repo仓库选项RepoConfig指定要克隆进容器的代码库与基础提交post_startup_commands在 Agent 启动前、其他所有设置完成后执行的命令列表与 Agent 共享同一个 shell每个命令以字符串形式传递post_startup_command_timeout上述命令的超时时间默认 500 秒对每条命令分别生效name环境名称默认main。官方推荐通过类方法SWEEnv.from_config(config)创建实例——它会深拷贝配置以避免多实例间共享状态再调用get_deployment(config.deployment)得到具体的 SWE-ReX 部署对象。生命周期与核心操作SWEEnv的生命周期由以下方法驱动start()初始化部署并重置环境到干净状态随后逐条执行post_startup_commandsreset()回到干净状态——先cd /再把仓库复制进容器_copy_repo最后把仓库重置到基础提交_reset_repository通过git reset类命令清理修改hard_reset()完全关闭并重启整个部署close()关闭 SWE-ReX 部署并触发on_close钩子。日常执行命令的核心方法是communicate(input, timeout25, check..., error_msg...)它把命令以BashAction形式交给 deployment 的 runtime 在会话中执行check参数控制退出码处理策略ignore默认不提取退出码、更稳定、warn非零退出码时记错误日志、raise非零退出码时关闭环境并抛异常。此外还有read_file/write_file读写容器内文件、set_env_variables设置环境变量如启动时设置的LANG、LC_ALL、PIP_PROGRESS_BAR、PAGER、execute_command以子进程方式执行独立于会话的命令。SWEEnv还支持通过add_hook(EnvHook)在环境生命周期各阶段如部署启动、仓库复制、环境启动、关闭注入自定义功能例如把 SWE-agent 连接到新的 GUI 界面。Agent模型驱动的主循环Agent 的类型与配置Agent类见 sweagent/agent/agents.py是整个系统的智能层负责驱动模型与环境的交互。根据配置中的type字段框架支持三种 AgentDefaultAgenttype: default标准 Agent包含完整的 forward/step/run 循环RetryAgenttype: retry多轮尝试的包装器——按retry_loop配置反复让子 Agent 尝试并用评审模型reviewer从多次尝试中挑选最佳结果受cost_limit总预算约束ShellAgenttype: shell交互式 shell 会话用的变体定义在 sweagent/agent/extra/shell_agent.py。DefaultAgentConfig的核心字段包括templates几乎所有的消息模板均为 Jinja2 模板、toolsToolConfig含工具命令与解析函数、history_processors历史压缩处理器列表默认使用DefaultHistoryProcessor、model模型配置、max_requeries默认 3模型输出发生格式错误、动作被拦截或 bash 语法错误后的最大重查次数。Agent.from_config()会深拷贝配置以保证模型实例完全独立然后通过get_model()创建模型、ToolHandler(config.tools)创建工具处理器。forward()提示模型并执行动作官方文档特别强调Agent最重要的方法是forward()——prompts the model and executes its action。从源码看实际链路是run()外层循环调用step()step()以经过 HistoryProcessor 处理后的self.messages为参数调用forward_with_handling()forward_with_handling()在max_requeries次循环内调用forward()并捕获各类异常格式错误FormatError、被拦截动作_BlockedActionError、bash 语法错误BashIncorrectSyntaxError等触发重查超时、上下文窗口超限、成本超限、环境错误等触发自动提交——即尽力从环境中提取model.patch作为补丁提交forward()内部调用model.query(history)向 LM 发起查询得到输出后用self.tools.parse_actions(output)解析出thought与action再交给handle_action()执行先检查动作是否在黑名单blocklist中再通过self._env.communicate()在 shell 会话中运行命令超时由tools.config.execution_timeout控制并把结果写入 observation。step()完成额外的簿记工作把动作与观测追加进历史、把步骤写入 trajectory、更新info提交补丁、退出状态、被编辑文件、模型统计等。整个动作-观测循环持续到模型输出submit命令或退出信号为止最终把轨迹.traj文件包含 history、environment 状态、model stats保存到输出目录。提示模板与观测裁剪TemplateConfig定义了大量可定制模板例如next_step_template默认Observation: {{observation}}、next_step_truncated_observation_template当观测超过max_observation_length默认 100,000 字符时截断并提示模型改用更紧凑的命令、next_step_no_output_template输出为空时使用对应 ACI 设计中的Your command ran successfully and did not produce any output反馈、shell_check_error_templatebash 语法错误提示、command_cancelled_timeout_template命令超时取消提示等。HistoryProcessor上下文窗口的守门员为了在有限的上下文窗口内装下尽可能多的高价值信息Agent会把完整历史先交给一串HistoryProcessor处理见 sweagent/agent/history_processors.py。仓库内置了以下处理器按type字段区分defaultDefaultHistoryProcessor原样返回历史是默认配置last_n_observationsLastNObservations——只保留最近 n 条观测更早的观测被替换为Old environment output: (n lines omitted)占位可统计被省略的文本行数与图片数还支持polling配合缓存每隔若干步才更新裁剪边界从而在 n 到 npolling 之间浮动以及按 tagsremove_output/keep_output强制删除或保留某些观测。官方文档指出这正是原论文中用于裁剪只保留最近 5 条观测的经典实现closed_windowClosedWindowHistoryProcessor——配合窗口化文件查看器把同一文件的旧窗口压缩为Outdated window with {n} lines omitted...只保留每个文件的最新窗口tag_tool_call_observationsTagToolCallObservations——给特定工具调用的观测打上 tags默认keep_output便于与其他处理器协同cache_controlCacheControlHistoryProcessor——为 Anthropic Claude 添加手动缓存控制标记默认给最近 2 条 user/tool 消息加 cache_control多轮对话场景通常设为 2并发重采样时建议设为 1remove_regexRemoveRegex——用正则移除历史中的任意内容默认移除diff.../diff片段支持keep_last保留最近 n 条不动image_parsingImageParsingHistoryProcessor——把 markdown 内嵌的 base64 图片转换为多模态格式支持 png/jpeg/webp用于多模态问题陈述。Agent.messages属性会按顺序串联执行所有配置的处理器for processor in self.history_processors: messages processor(messages)。Parser从模型输出到可执行动作模型输出的自由文本必须被可靠地解释为具体动作这由 sweagent/tools/parsing.py 中的解析器完成。Agent初始化时根据模型类型选择解析函数对普通模型使用ThoughtActionParser——从输出中分别提取思考thought与动作action例如 bash 命令两部分对HumanModel人类介入模式使用ActionOnlyParser——只提取动作在函数调用function calling配置下还会额外读取模型输出的tool_calls与tool_call_ids把动作按 tool 消息写入历史。解析失败会抛出FormatError由forward_with_handling捕获后根据format_error_template重查模型重查过程会把错误提示临时追加到历史不会污染正式历史但会记录在轨迹中。ACIAgent-Computer Interface 与自定义工具架构图中编号 9 的自定义工具正是 SWE-agent 的核心设计思想——Agent-Computer Interface (ACI)。ACI 本质上是一组让 Agent 与计算机环境交互的工具与交互格式。与好的提示工程显著影响模型效果同理好的 ACI 设计能大幅提升 Agent 表现。SWE-agent 在 ACI 设计中沉淀了若干被证明极其有效的特性编辑即 lint执行编辑命令时立即运行 linter代码语法不正确则不允许编辑通过专用文件查看器替代直接cat每轮只展示约 100 行并提供上下滚动与文件内搜索命令配套的专用文件编辑器支持滚动与搜索整目录字符串搜索命令只简洁地列出命中的文件每个有至少一个匹配的文件一行不给模型展示过多上下文以免混淆空输出反馈命令无输出时返回Your command ran successfully and did not produce any output.避免模型把空输出误解为失败。这些工具以ToolConfig的形式在 sweagent/tools/tools.py 中定义由ToolHandler在Agent.setup()阶段通过self.tools.install(self._env)安装进容器内的 shell 会话。仓库tools/目录下提供了大量可组合的 ACI 工具包如edit_anthropic、windowed、windowed_edit_replace、filemap、search、submit等每个工具包都有独立的config.yaml可以像插件一样挂载进 Agent 配置。一次完整运行的数据流对应架构图编号把以上模块串起来一次典型运行的数据流是用户执行sweagent run --config ...入口 1SWEEnv初始化 SWE-ReX Deployment——本地 Docker 或远程Modal/AWS容器2→3/4容器内启动 bash 会话5SWE-ReX 安装 ACI 自定义工具9SWEEnv.start()执行启动后命令并克隆/重置仓库Agent.setup()安装工具、注入系统模板、实例模板与演示demonstrations到历史Agent.step()→forward_with_handling()→forward()历史经 HistoryProcessor 压缩7后发给模型8parser 解析出 thought/actionhandle_action()经SWEEnv.communicate()10在 shell 会话执行动作观测写回历史循环直至提交补丁或退出SWEEnv通过其持有的 SWE-ReX deployment 与容器内运行的服务器保持通信11全程轨迹实时落盘。小结SWE-agent 的架构可以概括为一句话CLI 入口负责编排SWEEnv 通过 SWE-ReX 封装出可复用的隔离环境Agent 负责模型驱动的主循环HistoryProcessor 与 Parser 保证上下文高效、动作可靠ACI 则让环境对模型友好可操作。理解这条链路后读者可以进一步深入环境配置参考、Agent 配置参考与工具配置参考或直接动手阅读sweagent/目录下的源码环境实现、Agent 实现、历史处理器把架构知识转化为实际调优能力。【免费下载链接】SWE-agentSWE-agent takes a GitHub issue and tries to automatically fix it, using your LM of choice. It can also be employed for offensive cybersecurity or competitive coding challenges. [NeurIPS 2024]项目地址: https://gitcode.com/GitHub_Trending/sw/SWE-agent创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表