1. 项目概述:一个能自我进化的GUI操作智能体
如果你正在研究或开发能够操作电脑图形界面(GUI)的智能体,那么你很可能已经体会过其中的痛苦:训练数据获取成本极高、模型泛化能力差、面对新软件或新版本时束手无策。传统的智能体要么依赖海量人工标注的演示数据,要么需要工程师为每个新任务编写复杂的规则和提示词,这种模式既不可扩展,也难以适应快速变化的软件生态。
SEAgent(Self-Evolving Agent)正是为了解决这个核心痛点而诞生的。它不是一个静态的、训练完就固化的模型,而是一个具备自我进化能力的计算机使用智能体。其核心思想是模仿人类的学习过程:通过自主探索、从成功与失败的经验中学习,并不断优化自己的行为策略。简单来说,SEAgent能够自己“玩”软件,在尝试完成任务的过程中,自己判断做得好不好,然后基于这些反馈来改进自己,从而实现从零经验到熟练工的自动化成长。这个项目开源了实现这一愿景的全套代码、训练好的模型以及评估基准,为构建下一代自主智能体提供了一个极具潜力的框架。
2. 核心架构与设计思路拆解
SEAgent的整个系统设计精巧,环环相扣,其核心在于构建了一个**“探索-评估-学习”** 的闭环。我们可以将其拆解为三个核心组件:执行者(Actor)、世界状态模型(World State Model)和课程生成器(Curriculum Generator)。
2.1 三大核心组件解析
执行者(Actor Model):这是直接与GUI环境交互的“手和眼”。它接收当前的屏幕截图(可能辅以可访问性树信息),理解任务指令(例如“在VSCode中创建一个新的Python文件并写入‘Hello World’”),然后输出一系列操作指令,如点击、输入、滚动等。项目初期使用了UI-TARS-7B-DPO作为基础的执行者模型,因为它已经在多模态理解和GUI操作上有了不错的基础。
世界状态模型(World State Model):这是整个系统的“大脑”和“裁判”。它的核心职责是状态理解与成功判断。给定任务描述、一系列中间状态的屏幕截图以及执行者采取的动作序列,世界状态模型需要判断:当前这个动作序列是否正在有效地推进任务完成?最终任务成功了吗?这个模型的准确性直接决定了智能体能否从经验中学到正确的东西。SEAgent团队专门训练并开源了这个关键的7B模型。
课程生成器(Curriculum Generator):这是系统的“教练”。它负责规划学习路径,解决“从哪开始学”的问题。一开始就让智能体去完成复杂任务(如“配置一个完整的Web服务器”)几乎注定会失败。课程生成器会从简单的任务开始(如“打开记事本”),随着智能体能力的提升,逐步生成更复杂、更具挑战性的任务,形成一个循序渐进的学习课程表。
2.2 自我进化的闭环流程
这三个组件如何协同工作,实现“自我进化”呢?整个过程可以概括为以下四个阶段,构成了一个完整的迭代循环:
任务生成(Curriculum Generation):课程生成器针对目标软件(如VSCode),生成一批适合当前智能体能力水平的任务指令,例如“在VSCode中打开资源管理器侧边栏”。
轨迹采样(Trajectory Sampling):执行者模型在真实的GUI环境(如OSWorld模拟器)中尝试执行这些任务。它会像用户一样操作软件,并记录下整个交互过程,包括每一步的屏幕截图、执行的动作,形成一个“轨迹”。
轨迹评判(Trajectory Judgement):采集到的大量轨迹被送入世界状态模型进行评判。模型会为每条轨迹打上“成功”或“失败”的标签,并为成功的轨迹标注出哪些是关键的、正确的步骤。这一步相当于自动生成了高质量的“演示数据”。
模型训练(Model Training):利用上一步生成的带评判结果的数据,对执行者模型进行再训练。
- 监督微调(SFT):使用成功的轨迹数据,让模型模仿正确的操作。
- 强化学习(RL):使用成功和失败的轨迹数据,通过GRPO等算法,让模型学习到“怎样做能获得高回报(成功)”,从而优化其决策策略。
完成一次迭代后,执行者模型变得更“聪明”了,课程生成器便可以生成更难的任务,开启新一轮的进化循环。这种设计使得智能体能够脱离对固定数据集的依赖,在自主探索中实现能力的持续增长。
3. 环境搭建与核心工具链部署
要复现或基于SEAgent进行实验,第一步是搭建一个稳定、可复现的环境。项目主要依赖Python 3.11,并使用了Conda进行环境管理,这是保证依赖隔离的最佳实践。
3.1 基础环境配置
按照项目提供的setup.sh脚本是最快捷的方式。但理解每一步的作用至关重要,这能帮助你在遇到问题时进行排查。
# 1. 创建并激活Conda环境 conda create -n seagent python=3.11 -y conda activate seagent # 2. 执行环境安装脚本 bash setup.shsetup.sh脚本内部通常会处理以下几类依赖:
- 深度学习框架:如PyTorch,需要与你的CUDA版本匹配。
- 推理加速:vLLM,用于高效部署和服务大型语言模型,这是后续模型服务化的关键。
- GUI自动化与评估:OSWorld,这是一个多领域、真实的计算机任务评估环境,提供了软件操作的模拟界面。
- 强化学习训练框架:项目提到了基于R1-V和OpenRLHF,这些是专门用于对齐和RLHF训练的代码库。
- 项目自身代码:安装
src目录下的SEAgent核心模块。
注意:在实际操作中,
setup.sh可能会因为网络或系统环境问题执行失败。一个可靠的备选方案是手动安装。首先使用pip install torch安装与CUDA匹配的PyTorch,然后根据requirements.txt(如果项目提供)或setup.py来安装其他依赖。重点关注vLLM和OSWorld的安装,它们的依赖可能比较复杂。
3.2 核心模型服务化部署
SEAgent的运行严重依赖模型服务。你需要将Actor模型和World State Model部署为独立的API服务,供不同的脚本调用。
部署世界状态模型(World State Model): 这个模型作为“裁判”,需要处理多张图片(轨迹中的多步状态),对算力要求较高,建议使用多卡并行。
# 使用4张GPU卡并行服务世界状态模型,服务端口为8001 CUDA_VISIBLE_DEVICES=4,5,6,7 vllm serve “Zery/CUA_World_State_Model” \ --served-model-name gui_judge \ --port 8001 \ --tensor-parallel-size 4--tensor-parallel-size 4:指定模型在4张GPU上进行张量并行,以加速推理并容纳更大模型。--served-model-name gui_judge:为该服务端点命名,后续脚本将通过这个名称来访问。
部署执行者模型(Actor Model,如UI-TARS):
# 使用单卡服务UI-TARS初始模型,服务端口为8002 CUDA_VISIBLE_DEVICES=0 python -m vllm.entrypoints.openai.api_server \ --model bytedance-research/UI-TARS-7B-DPO \ --served-model-name ui-tars \ --port 8002 \ --limit-mm-per-prompt image=5 \ -tp 1--limit-mm-per-prompt image=5:这是一个关键参数,它告诉vLLM服务端,每个请求最多可能包含5张图片。这对于处理包含多步屏幕截图轨迹的请求是必须的,否则服务可能无法正确解析输入。
部署课程生成模型(如Qwen): 课程生成通常需要更强的推理能力,因此项目示例使用了Qwen2.5-72B这样的大模型。
CUDA_VISIBLE_DEVICES=0,1,2,3 vllm serve “Qwen/Qwen2.5-72B-Instruct” \ --served-model-name qwen72b \ --port 8003 \ --tensor-parallel-size 4实操心得:在实际部署中,务必确保端口不冲突,并记录下每个服务运行的机器IP地址和端口号。后续所有脚本中的
YOUR.IP.ADDRESS都需要替换为实际地址。可以使用netstat -tulnp | grep <端口号>来检查端口是否被正确监听。另外,vLLM服务启动后,可以通过简单的curl命令测试服务是否正常:curl http://localhost:8001/v1/models。
4. 自我进化全流程实操详解
环境和服务就绪后,我们就可以启动SEAgent的自我进化循环了。这个过程是项目最核心的部分,理解每一步的输入输出和意图,是进行定制化开发或调试的基础。
4.1 阶段零:初始化课程生成
在智能体没有任何经验之前,我们需要为它生成第一堂课的“教材”。这就是课程生成器的任务。
cd OSWorld python task_buffer/task_buffer_update_from_qwen.py \ --judge_model gui_judge \ # 使用已部署的世界状态模型进行辅助判断 --phase -1 \ # “-1”代表初始阶段 --software vscode \ # 指定目标软件 --base_result_dir results_en_phase_qwen # 输出目录这个脚本的工作流程是:
- 课程生成模型(Qwen)基于对软件(如VSCode)的通用知识,构思一批可能的基础任务。
- 为了确保生成的任务是合理且可执行的,脚本会调用
gui_judge(世界状态模型)对任务描述进行初步的可行性评估。 - 最终生成一个任务列表文件,例如
task_buffer_qwen_vscode_phase0.json。这个文件包含了任务ID、自然语言描述等信息,作为后续探索的起点。
4.2 阶段一:探索与轨迹收集
有了任务列表,就可以让执行者模型去尝试执行了。这个过程是在OSWorld模拟器中进行的。
export VLLM_BASE_URL=“http://192.168.1.100:8002/v1” # 设置为你的Actor模型服务地址 for software in vscode; do python run_multienv_uitars_new_traj_evolve.py \ --headless \ # 无头模式,不显示GUI,适合服务器运行 --observation_type screenshot_a11y_tree \ # 观察类型:截图+可访问性树,提供更丰富的环境信息 --model ui_tars_7b_dpo \ # 使用的Actor模型名称,需与服务名对应 --test_all_meta_path ./task_buffer/task_buffer_qwen_${software}_phase0.json \ # 输入的任务列表 --result_dir ./results_en_phase0/7b_new_traj_multi_env=8_${software}_new_fix_nimg=1_maxtraj=15_t=0.0_r0 \ # 轨迹输出目录 --num_envs 8 \ # 并行环境数,大幅提升数据收集效率 --max_tokens 1000 \ # 模型每次响应的最大token数 --temperature 1.0 \ # 采样温度,1.0通常能平衡创造性和稳定性 --max_trajectory_length 15 \ # 每条轨迹的最大步数,防止智能体陷入死循环 --software ${software} done--num_envs 8:这是提升效率的关键。它会并行启动8个独立的OSWorld环境,同时让智能体尝试8个不同的任务,使得数据收集速度几乎线性提升。--max_trajectory_length 15:这是一个重要的安全阀。GUI任务可能陷入死循环(例如不断点击同一个无效按钮)。设置最大步数可以强制终止此类任务,节省资源。- 运行后,在
result_dir目录下,你会得到许多.json文件,每个文件记录了一条完整的交互轨迹,包含多步的截图、动作、模型思考过程。
4.3 阶段二:轨迹评判与数据生成
收集到的轨迹质量参差不齐,接下来就需要“裁判”世界状态模型上场,进行筛选和标注。
# 假设已部署世界状态模型在 8001 端口,服务名为 gui_judge bash judge_full_process.sh这个脚本内部会做以下几件事:
- 读取轨迹:遍历上一步生成的所有轨迹文件。
- 调用评判:将每条轨迹(任务描述、多步截图、动作序列)发送给
gui_judge模型。 - 获取评判结果:模型会返回该轨迹是否成功,以及可能的关键步骤分析。
- 数据分类:根据评判结果,轨迹被分为“成功”(positive)和“失败”(negative)两类。
随后,使用gen_sft.py脚本,将成功的轨迹转换成标准的监督微调(SFT)数据格式,失败的轨迹则可以用于构造强化学习(RL)中的对比数据。
python gen_sft.py \ --positive_data_path ./judged_results/7b_positive_vscode_phase0.json \ --output_path ./training_data/sft_phase0.json生成的sft_phase0.json文件,其格式通常为一条条的多轮对话,包含用户指令(任务)、系统回复(动作序列)以及可能的中间思考过程,可以直接用于训练。
4.4 阶段三:模型训练与进化
有了高质量的训练数据,就可以对执行者模型进行迭代升级了。项目提供了两种训练方式:
1. 监督微调(SFT): 使用成功轨迹数据,让模型模仿专家行为。这相当于让模型“熟读优秀作业”。
bash sft.shSft.sh脚本内部会加载基础模型(如UI-TARS-7B-DPO)和生成的SFT数据,进行标准的因果语言模型训练,目标是最大化模型生成正确动作序列的概率。
2. 强化学习(RL): 使用GRPO(Group Relative Policy Optimization)算法,这是项目推荐的方式。RL不仅利用成功数据,也利用失败数据,让模型学习到“为什么这样做是好的,那样做是坏的”。
cd src/r1-v bash run_grpo_gui_8_7b.shRL训练过程更加复杂,它需要在环境中进行采样、计算奖励(由世界状态模型或规则提供)、并更新策略模型。run_grpo_gui_8_7b.sh脚本封装了使用R1-V框架进行GRPO训练的完整流程。
完成一次训练后,你就得到了一个进化后的SEAgent模型(v1.0)。你可以用这个新模型替换掉之前部署的Actor模型,然后回到阶段一,让课程生成器生成更难的任务(--phase 1),开始新一轮的进化循环。如此往复,智能体的能力便能持续增长。
5. 模型评估与效果验证
训练出的模型效果如何?SEAgent项目提供了两个主要的评估基准:OSWorld和AgentRewardBench,它们从不同角度衡量智能体的能力。
5.1 在OSWorld上进行端到端评估
OSWorld是一个综合性的计算机任务基准,包含大量跨软件的真实任务。评估SEAgent在OSWorld上的表现,是检验其通用操作能力的最直接方式。
部署好训练好的SEAgent模型(例如SEAgent-1.0-7B)后,使用以下命令进行评估:
# 部署评估模型 vllm serve Zery/SEAgent-1.0-7B \ --served-model-name “ui-tars-1.0-7b” \ --port 8000 \ --tensor-parallel-size 2 & # 设置模型访问地址 export UI_TARS_1_0_URL=“http://192.168.1.100:8000/v1” model_name=“ui-tars-1.0-7b” # 运行评估脚本 python run_multienv_uitars_1_0.py \ --headless \ --observation_type screenshot \ --model ${model_name} \ --result_dir ./results_en_test_1_0/all_l15_h5/${model_name} \ --num_envs 8 \ --sleep_after_execution 2.0 \ # 每个动作执行后等待2秒,确保环境状态稳定 --max_tokens 1000 \ --top_p 0.9 \ --temperature 1.0 \ --max_trajectory_length 15 \ --history_n 1 # 观察历史步数,1表示只看当前状态评估完成后,脚本会生成详细的评估结果,包括每个任务的完成情况(成功/失败)、耗时、步骤数等。你需要关注的核心指标是任务成功率。对比进化前后的模型在同一批任务上的成功率,可以直观地看到自我进化带来的性能提升。
5.2 评估世界状态模型的评判准确性
世界状态模型是自我进化循环的“质量守门员”,它的评判必须准确。AgentRewardBench是一个专门用于评估轨迹评判模型(Reward Model)的基准。SEAgent团队也在此基准上测试了他们的世界状态模型。
评估步骤相对复杂,因为需要适配模型的多图输入格式:
- 克隆并安装AgentRewardBench仓库。
- 修改代码:替换原仓库中的
run_judge.py等文件为SEAgent项目提供的版本。这些修改主要是为了将AgentRewardBench原本的单图输入提示词,适配为SEAgent世界状态模型需要的多图轨迹输入提示词。 - 运行评估脚本:
bash run_judge.sh - 分析结果:脚本会输出世界状态模型在AgentRewardBench测试集上的准确率、F1分数等指标。高准确率意味着该模型能够可靠地区分成功和失败的轨迹,为后续的SFT/RL训练提供了高质量的数据标签。
注意事项:OSWorld的评估是在线的,需要模型在模拟环境中实时交互,耗时较长。而AgentRewardBench的评估是离线的,只需对已有的轨迹数据进行打分,速度较快。通常,在每次进化循环后,进行OSWorld抽样评估;而对世界状态模型的评估,则在模型训练完成后进行一次全面测试即可。
6. 常见问题与实战调试技巧
在实际复现和实验过程中,你几乎一定会遇到各种问题。以下是我在实践过程中总结的一些典型问题及其解决方案。
6.1 环境与依赖问题
问题:setup.sh执行失败,尤其是安装OSWorld或vLLM时。
- 排查思路:首先检查Python版本是否为3.11。然后,尝试分开安装核心依赖。
- 解决方案:
- 手动安装PyTorch:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118(根据你的CUDA版本调整)。 - 单独安装vLLM:
pip install vllm。如果失败,可能是由于Ninja编译问题,尝试先安装ninja:pip install ninja,或者使用预编译的wheel。 - OSWorld可能对系统图形库有要求。在无头服务器上,确保安装了
xvfb:sudo apt-get install xvfb。在运行OSWorld脚本时,使用xvfb-run -a python your_script.py来启动虚拟显示缓冲区。
- 手动安装PyTorch:
问题:vLLM服务启动成功,但客户端脚本连接超时或报错。
- 排查思路:检查网络连通性、防火墙设置以及服务是否真的在监听。
- 解决方案:
- 在服务器本地测试:
curl http://localhost:8001/v1/models。如果失败,检查vLLM日志。 - 如果本地成功但远程失败,检查服务器防火墙是否开放了对应端口(如8001)。对于云服务器,还需要检查安全组规则。
- 确保客户端脚本中设置的
VLLM_BASE_URL或UI_TARS_1_0_URL的IP地址和端口完全正确。
- 在服务器本地测试:
6.2 模型推理与交互问题
问题:Actor模型在OSWorld中执行动作混乱,或很快失败。
- 排查思路:这可能是模型能力问题,也可能是环境观察信息不足或参数设置不当。
- 解决方案:
- 调整观察类型:尝试将
--observation_type从screenshot改为screenshot_a11y_tree。可访问性树(A11y Tree)提供了UI元素的层级和属性信息,能极大帮助模型定位。 - 调整推理参数:降低
--temperature(如从1.0降至0.2)可以减少输出的随机性,使动作更确定。增加--max_tokens确保模型有足够的空间输出完整的动作序列。 - 检查动作解析:OSWorld有自己定义的动作空间(如
click(x, y),type(“text”))。确保模型输出的动作字符串能被环境正确解析。可以打印出模型输出的原始文本来检查。
- 调整观察类型:尝试将
问题:世界状态模型评判速度慢,或内存溢出(OOM)。
- 排查思路:轨迹可能过长,包含太多图片,导致输入token数爆炸。
- 解决方案:
- 轨迹截断:在评判前,对过长的轨迹进行采样,例如只取开始、中间关键几步和结束时的截图,而不是每一步都评判。
- 调整vLLM参数:启动vLLM服务时,可以增加
--gpu-memory-utilization 0.9来提高GPU内存使用率,或使用--max-model-len限制最大序列长度,但需注意后者可能截断输入。 - 硬件升级:世界状态模型处理多图本身开销大,考虑使用内存更大的GPU或增加
--tensor-parallel-size。
6.3 训练与数据问题
问题:SFT/RL训练后,模型性能没有提升,甚至下降。
- 排查思路:训练数据质量是根本。可能是世界状态模型评判不准,产生了噪声标签;也可能是课程任务太难或太简单。
- 解决方案:
- 可视化检查数据:务必使用项目提供的
visualize_data.py脚本,随机查看一些被标记为“成功”的轨迹。肉眼确认这些轨迹是否真的完成了任务。如果发现很多误判,就需要重新审视或微调世界状态模型。 - 分析课程难度:查看课程生成器在初始阶段(phase -1)生成的任务。如果任务过于复杂,智能体无法产生任何成功轨迹,学习就无法开始。可以考虑人工设计一批简单的种子任务,引导进化循环启动。
- 控制训练步数:避免过拟合。在SFT时,监控验证集上的损失,早停(early stopping)是防止模型遗忘基础能力的有效手段。
- 可视化检查数据:务必使用项目提供的
问题:自我进化循环无法持续,后期任务成功率停滞。
- 排查思路:这可能是遇到了“能力天花板”,或者进化过程中出现了“遗忘”或“退化”。
- 解决方案:
- 混合数据训练:在每一轮新的训练中,不仅使用本轮新生成的数据,也混合一部分之前轮次的高质量数据。这有助于保留已学会的技能,防止灾难性遗忘。
- 引入课程难度评估:让世界状态模型或另一个小模型来评估生成任务的难度,确保课程进度平滑,避免难度跳跃过大。
- 探索策略多样化:在轨迹采样阶段,可以引入一些随机探索(如
--temperature调高),或者使用多个不同策略的Actor模型进行探索,以增加数据的多样性。
SEAgent为我们展示了构建自进化智能体的一个强大范式。从我的实践来看,最大的挑战并非代码本身,而是如何设计一个稳定、高效的自治循环。这个循环中的每一个环节——任务生成、轨迹执行、成功评判、模型更新——都需要精心调优。世界状态模型的准确性是这个循环的基石,它的质量直接决定了进化是走向“智能”还是“智障”。此外,计算资源的管理也至关重要,并行化数据收集(num_envs)是提升迭代速度的关键。这个项目更像是一个强大的实验框架,它提供了所有必要的工具,而要真正训练出一个在特定领域(如办公自动化、软件测试)表现卓越的智能体,还需要研究者投入大量的精力进行领域适配、循环调优和评估设计。