SEAgent:基于自我进化闭环的GUI操作智能体构建与实践
2026/4/27 22:02:50 网站建设 项目流程

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 自我进化的闭环流程

这三个组件如何协同工作,实现“自我进化”呢?整个过程可以概括为以下四个阶段,构成了一个完整的迭代循环:

  1. 任务生成(Curriculum Generation):课程生成器针对目标软件(如VSCode),生成一批适合当前智能体能力水平的任务指令,例如“在VSCode中打开资源管理器侧边栏”。

  2. 轨迹采样(Trajectory Sampling):执行者模型在真实的GUI环境(如OSWorld模拟器)中尝试执行这些任务。它会像用户一样操作软件,并记录下整个交互过程,包括每一步的屏幕截图、执行的动作,形成一个“轨迹”。

  3. 轨迹评判(Trajectory Judgement):采集到的大量轨迹被送入世界状态模型进行评判。模型会为每条轨迹打上“成功”或“失败”的标签,并为成功的轨迹标注出哪些是关键的、正确的步骤。这一步相当于自动生成了高质量的“演示数据”。

  4. 模型训练(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.sh

setup.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 # 输出目录

这个脚本的工作流程是:

  1. 课程生成模型(Qwen)基于对软件(如VSCode)的通用知识,构思一批可能的基础任务。
  2. 为了确保生成的任务是合理且可执行的,脚本会调用gui_judge(世界状态模型)对任务描述进行初步的可行性评估。
  3. 最终生成一个任务列表文件,例如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

这个脚本内部会做以下几件事:

  1. 读取轨迹:遍历上一步生成的所有轨迹文件。
  2. 调用评判:将每条轨迹(任务描述、多步截图、动作序列)发送给gui_judge模型。
  3. 获取评判结果:模型会返回该轨迹是否成功,以及可能的关键步骤分析。
  4. 数据分类:根据评判结果,轨迹被分为“成功”(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.sh

Sft.sh脚本内部会加载基础模型(如UI-TARS-7B-DPO)和生成的SFT数据,进行标准的因果语言模型训练,目标是最大化模型生成正确动作序列的概率。

2. 强化学习(RL): 使用GRPO(Group Relative Policy Optimization)算法,这是项目推荐的方式。RL不仅利用成功数据,也利用失败数据,让模型学习到“为什么这样做是好的,那样做是坏的”。

cd src/r1-v bash run_grpo_gui_8_7b.sh

RL训练过程更加复杂,它需要在环境中进行采样、计算奖励(由世界状态模型或规则提供)、并更新策略模型。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团队也在此基准上测试了他们的世界状态模型。

评估步骤相对复杂,因为需要适配模型的多图输入格式:

  1. 克隆并安装AgentRewardBench仓库。
  2. 修改代码:替换原仓库中的run_judge.py等文件为SEAgent项目提供的版本。这些修改主要是为了将AgentRewardBench原本的单图输入提示词,适配为SEAgent世界状态模型需要的多图轨迹输入提示词。
  3. 运行评估脚本
    bash run_judge.sh
  4. 分析结果:脚本会输出世界状态模型在AgentRewardBench测试集上的准确率、F1分数等指标。高准确率意味着该模型能够可靠地区分成功和失败的轨迹,为后续的SFT/RL训练提供了高质量的数据标签。

注意事项:OSWorld的评估是在线的,需要模型在模拟环境中实时交互,耗时较长。而AgentRewardBench的评估是离线的,只需对已有的轨迹数据进行打分,速度较快。通常,在每次进化循环后,进行OSWorld抽样评估;而对世界状态模型的评估,则在模型训练完成后进行一次全面测试即可。

6. 常见问题与实战调试技巧

在实际复现和实验过程中,你几乎一定会遇到各种问题。以下是我在实践过程中总结的一些典型问题及其解决方案。

6.1 环境与依赖问题

问题:setup.sh执行失败,尤其是安装OSWorld或vLLM时。

  • 排查思路:首先检查Python版本是否为3.11。然后,尝试分开安装核心依赖。
  • 解决方案
    1. 手动安装PyTorch:pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118(根据你的CUDA版本调整)。
    2. 单独安装vLLM:pip install vllm。如果失败,可能是由于Ninja编译问题,尝试先安装ninjapip install ninja,或者使用预编译的wheel。
    3. OSWorld可能对系统图形库有要求。在无头服务器上,确保安装了xvfbsudo apt-get install xvfb。在运行OSWorld脚本时,使用xvfb-run -a python your_script.py来启动虚拟显示缓冲区。

问题:vLLM服务启动成功,但客户端脚本连接超时或报错。

  • 排查思路:检查网络连通性、防火墙设置以及服务是否真的在监听。
  • 解决方案
    1. 在服务器本地测试:curl http://localhost:8001/v1/models。如果失败,检查vLLM日志。
    2. 如果本地成功但远程失败,检查服务器防火墙是否开放了对应端口(如8001)。对于云服务器,还需要检查安全组规则。
    3. 确保客户端脚本中设置的VLLM_BASE_URLUI_TARS_1_0_URL的IP地址和端口完全正确。

6.2 模型推理与交互问题

问题:Actor模型在OSWorld中执行动作混乱,或很快失败。

  • 排查思路:这可能是模型能力问题,也可能是环境观察信息不足或参数设置不当。
  • 解决方案
    1. 调整观察类型:尝试将--observation_typescreenshot改为screenshot_a11y_tree。可访问性树(A11y Tree)提供了UI元素的层级和属性信息,能极大帮助模型定位。
    2. 调整推理参数:降低--temperature(如从1.0降至0.2)可以减少输出的随机性,使动作更确定。增加--max_tokens确保模型有足够的空间输出完整的动作序列。
    3. 检查动作解析:OSWorld有自己定义的动作空间(如click(x, y),type(“text”))。确保模型输出的动作字符串能被环境正确解析。可以打印出模型输出的原始文本来检查。

问题:世界状态模型评判速度慢,或内存溢出(OOM)。

  • 排查思路:轨迹可能过长,包含太多图片,导致输入token数爆炸。
  • 解决方案
    1. 轨迹截断:在评判前,对过长的轨迹进行采样,例如只取开始、中间关键几步和结束时的截图,而不是每一步都评判。
    2. 调整vLLM参数:启动vLLM服务时,可以增加--gpu-memory-utilization 0.9来提高GPU内存使用率,或使用--max-model-len限制最大序列长度,但需注意后者可能截断输入。
    3. 硬件升级:世界状态模型处理多图本身开销大,考虑使用内存更大的GPU或增加--tensor-parallel-size

6.3 训练与数据问题

问题:SFT/RL训练后,模型性能没有提升,甚至下降。

  • 排查思路:训练数据质量是根本。可能是世界状态模型评判不准,产生了噪声标签;也可能是课程任务太难或太简单。
  • 解决方案
    1. 可视化检查数据:务必使用项目提供的visualize_data.py脚本,随机查看一些被标记为“成功”的轨迹。肉眼确认这些轨迹是否真的完成了任务。如果发现很多误判,就需要重新审视或微调世界状态模型。
    2. 分析课程难度:查看课程生成器在初始阶段(phase -1)生成的任务。如果任务过于复杂,智能体无法产生任何成功轨迹,学习就无法开始。可以考虑人工设计一批简单的种子任务,引导进化循环启动。
    3. 控制训练步数:避免过拟合。在SFT时,监控验证集上的损失,早停(early stopping)是防止模型遗忘基础能力的有效手段。

问题:自我进化循环无法持续,后期任务成功率停滞。

  • 排查思路:这可能是遇到了“能力天花板”,或者进化过程中出现了“遗忘”或“退化”。
  • 解决方案
    1. 混合数据训练:在每一轮新的训练中,不仅使用本轮新生成的数据,也混合一部分之前轮次的高质量数据。这有助于保留已学会的技能,防止灾难性遗忘。
    2. 引入课程难度评估:让世界状态模型或另一个小模型来评估生成任务的难度,确保课程进度平滑,避免难度跳跃过大。
    3. 探索策略多样化:在轨迹采样阶段,可以引入一些随机探索(如--temperature调高),或者使用多个不同策略的Actor模型进行探索,以增加数据的多样性。

SEAgent为我们展示了构建自进化智能体的一个强大范式。从我的实践来看,最大的挑战并非代码本身,而是如何设计一个稳定、高效的自治循环。这个循环中的每一个环节——任务生成、轨迹执行、成功评判、模型更新——都需要精心调优。世界状态模型的准确性是这个循环的基石,它的质量直接决定了进化是走向“智能”还是“智障”。此外,计算资源的管理也至关重要,并行化数据收集(num_envs)是提升迭代速度的关键。这个项目更像是一个强大的实验框架,它提供了所有必要的工具,而要真正训练出一个在特定领域(如办公自动化、软件测试)表现卓越的智能体,还需要研究者投入大量的精力进行领域适配、循环调优和评估设计。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询