找回密码
 立即注册
首页 业界区 业界 【GUI-Agent】阶跃星辰 GUI-MCP 解读---(1)---论文 ...

【GUI-Agent】阶跃星辰 GUI-MCP 解读---(1)---论文

司寇涵涵 3 小时前
【GUI-Agent】阶跃星辰 GUI-MCP 解读---(1)---论文


目录

  • 【GUI-Agent】阶跃星辰 GUI-MCP 解读---(1)---论文

    • 0x00 摘要
    • 0x01 GUI Agent 的核心要素

      • 1.1 基本逻辑
      • 1.2 核心要素
      • 1.3 关键挑战

    • 0x02 阶跃星辰论文解读

      • 2.1 需求
      • 2.2 架构

        • 低层 MCP
        • 高层 MCP

      • 2.3 优势

        • 执行效率提升
        • 隐私保护增强


    • 0x03 无MCP调用

      • 3.1 执行脚本
      • 3.2 流程分析
      • 3.3  数据流向
      • 3.4 逻辑层级
      • 3.5 evaluate_task_on_device

    • 0x04 Agent在哪里?

      • 4.1 隐式的 Agent 实现
      • 4.2 系统中的 Agent 特性系统
      • 4.3 Agent 工作流程
      • 4.4 专业化的 Agent 功能

    • 0xFF 参考


0x00 摘要

25年底,阶跃星辰升级发布了全新的AI Agent系列模型Step-GUI,包括云端模型Step-GUI、首个面向GUI Agent的MCP协议:GUI-MCP(Graphical User Interface - Model Context Protocol),这是首个专为图形用户界面自动化而设计的 MCP 实现,兼顾标准化与隐私保护。

  • GitHub仓库:https://github.com/stepfun-ai/gelab-zero
  • 技术论文:https://github.com/stepfun-ai/gelab-zero/blob/d1cd0c7be83e234b66dbec4c5554f5fde44dce08/report/Step-GUI_Technical_Report.pdf
GUI-MCP 提供一套标准化、跨平台的协议,将设备能力抽象为少量原子及组合工具。其分层双栈架构结合:“低层 MCP”提供细粒度操作(点击、滑动、文本输入等),“高层 MCP”将整个任务委派给本地部署的 GUI 专有模型(如 Step-GUI-4B)。该设计使主语言模型专注于高层规划,同时将常规 GUI 操作卸载至本地模型。尤为关键的是,GUI-MCP 支持高隐私执行模式:原始截图与敏感状态留在设备端,仅语义摘要流向外部语言模型,从而在利用云端推理能力的同时有效保护用户隐私。
因此,我们就来解读这个MCP协议,顺便看看端侧Agent的实现架构。
本文是第一篇,主要是论文解读,非MCP调用和主要组件介绍。因为是反推解读,所以可能会有各种错误,还请大家不吝指出。
0x01 GUI Agent 的核心要素

我们首先看看 GUI Agent 的一些通用信息。
1.1 基本逻辑

GUI Agent 的基本逻辑如下:
1.png

1.2 核心要素

区别于纯文本 Agent,GUI Agent 的价值在于 “能真正操控图形界面”,而非仅生成文本。GUI Agent 最核心的是 “看懂界面 + 规划步骤 + 适配变化” ,其中 “界面理解与定位” 是基础,“任务规划与纠错” 是核心,“鲁棒性” 是落地保障。具体如下:

  • 像素 / 控件级的界面理解与定位能力(基础):能像人类一样 “看懂” GUI 界面的元素(按钮、输入框、菜单、弹窗),并精准定位其位置;这是 GUI Agent 区别于纯文本 Agent 的核心,也是最基础的要求 —— 如果连 “哪个按钮是提交、输入框在哪” 都识别错,后续操作毫无意义。

    • 核心要求:

      • 视觉理解:通过 CV / 多模态模型来解析界面截图,区分 “可点击控件”“文本区域”“弹窗遮挡” 等;
      • 控件定位:输出精准的坐标 / 控件标识(如安卓的 resource-id、Windows 的控件句柄),而非模糊的 “右上角按钮”;
      • 状态感知:识别界面 “加载中”“操作成功 / 失败”“需要验证” 等状态,避免无效操作。


  • 任务驱动的操作规划与纠错能力(核心):能拆解复杂 GUI 任务为可执行的步骤(如 “登录 APP→找到设置→修改密码”),并在操作出错时自适应调整;GUI 任务往往是多步骤、有依赖的(如 “网购下单” 需:打开 APP→搜索商品→加入购物车→结算→支付),LLM 生成的单一步骤易遗漏 / 出错,需具备 “规划 - 执行 - 反馈 - 调整” 的闭环能力。

    • 核心要求:

      • 任务拆解:将自然语言指令(如 “帮我订明天上海到北京的高铁票”)拆分为 “打开铁路 APP→点击订票→选择出发地 / 目的地→选择日期→查询→选车次→提交订单” 等原子操作;
      • 实时纠错:操作失败时(如点击后界面无响应、弹窗打断),能识别错误原因并调整策略(如重试点击、先关闭弹窗);
      • 上下文记忆:记住已完成的步骤(如已选好车次),避免重复操作。


  • 跨环境 / 跨应用的鲁棒性(保障):能适配不同分辨率、系统版本、界面样式,避免因微小界面变化导致任务失败。普通自动化脚本只能适配固定界面,而 GUI Agent 需应对真实场景的界面变化 —— 这是从 “实验室 demo” 到 “实际可用” 的核心门槛。

    • 核心要求:

      • 适配性:兼容不同分辨率(手机 / 平板)、系统版本(安卓 13/14)、应用版本(微信 8.0.30/8.0.40);
      • 抗干扰:能处理广告弹窗、加载延迟、界面卡顿等异常情况;
      • 无侵入:无需修改应用源码,通过通用方式(ADB、UI Automation、键鼠模拟)操作,符合真实用户交互逻辑。


1.3 关键挑战

此处我们借鉴 MAI-UI 论文来看看GUI-Agent的关键挑战。
MAI-UI是阿里通义实验室发布的一项重磅研究成果:是一个旨在 重塑人机交互方式 的“基础图形用户界面(GUI)智能体”。其实,和阶跃星辰的思路非常类似。其相关信息是:
https://arxiv.org/pdf/2512.22047
https://github.com/Tongyi-MAI/MAI-UI
MAI-UI的论文精准地指出了四个关键挑战:

  • 缺乏自然的“人-机-人”交互:真实场景中,用户的指令常常是模糊、不完整的。一个合格的助手必须能主动提问澄清,而不是瞎猜一通。
  • 局限于“纯UI操作”:只靠点击、滑动来完成所有任务,不仅步骤冗长、容易出错,而且很多任务(如操作GitHub)在手机上几乎无法实现。
  • 没有实用的“端云协同”架构:大模型能力强但费钱、耗电、有隐私风险;小模型省资源但能力有限。目前的智能体要么全在云端,要么全在设备端,缺乏能根据任务动态调度的智能架构。
  • 在动态环境中很“脆弱”:训练数据往往是静态的。但真实世界充满变数:App版本更新布局会变、突然弹出的权限对话框、网络加载慢……没有在动态环境中“摸爬滚打”过的智能体,很容易“翻车”。
0x02 阶跃星辰论文解读

本小节我们来学习下阶跃星辰的论文。
2.1 需求

尽管大语言模型进展显著,其在 GUI 自动化中的应用仍因缺乏跨平台设备控制的标准化接口而受阻。现有方案往往平台限定,且与不同语言模型及设备集成需大量工程投入。一个强大的GUI模型训练出来后,如何让各种大模型都能方便、安全地使用它来控制设备?
为弥补这一缺口,StepFun团队借鉴了“模型上下文协议(MCP)”的思想,提出了 GUI-MCP(Graphical User Interface - Model Context Protocol),这是首个专为 GUI 操作任务设计的 MCP 实现。它像一个翻译器和安全过滤器,标准化了LLM与设备间的交互。
GUI-MCP 提供标准化工具包,无缝连接多种语言模型与多设备平台(Ubuntu、macOS、Windows、Android、iOS),使语言模型能通过统一协议控制移动与桌面设备,执行 GUI 操作任务。
2.2 架构

GUI-MCP 采用分层设计,将功能划分为两个不同层级:低层 MCP 与高层 MCP,如下图所示。
2.png

低层 MCP

低层 MCP 专注于原子级设备操作,提供细粒度控制接口。该层级公开以下类别的原语:

  • 设备管理:接口 get_device_list() 获取所有已连接设备,实现多设备编排。
  • 状态感知:接口 get_screenshot() 捕获当前设备屏幕状态,为决策提供视觉反馈。
  • 基本操作:如下图所示的完整交互原语集合。
这些原子接口为主语言模型提供最大灵活性,使其能够根据当前状态和任务需求进行细粒度规划与控制。适合需要逐步规划的场景。
3.png

高层 MCP

高层 MCP 专注于抽象任务执行,通过封装完整任务执行逻辑实现。其主要接口为:execute_task(task_description)。该接口接受自然语言任务描述,并自动完成任务。例如:

  • execute_task("点击第一个元素")
  • execute_task("买一杯咖啡")
  • execute_task("搜索白色帆布鞋,37 码,100 元以内,并把第一个结果加入收藏")
内部集成本地部署的 GUI 专有模型(如 StepGUI-4B),该模型专门针对 GUI 操作任务进行优化,可在其能力范围内自主完成任务。主语言模型的系统提示(system prompt)明确描述 GUI 专有模型的能力边界,帮助主模型判断何时将任务委派给高层 MCP。这大幅减少了与主力大模型的交互次数,降低了延迟和成本。
2.3 优势

执行效率提升

双层次架构使主语言模型能够依据任务复杂度与当前状态,灵活选择控制策略:
低层 MCP 适用场景:

  • 快速获取当前设备状态
  • 需要逐步细粒度规划的任务
  • 超出 GUI 专有模型能力范围的任务
  • 需多轮用户交互以澄清需求的场景
高层 MCP 适用场景:

  • 描述清晰且落在 GUI 专有模型能力范围内的任务
  • 希望减少主语言模型推理开销与 API 调用次数
  • 可一次性完成的强独立性任务
通过合理分派,主语言模型可将简单、重复的 GUI 操作卸载给本地专有模型,自身专注于高层规划与决策,从而显著提升整体执行效率。
隐私保护增强

在隐私保护日益关键的当下,许多用户对向外部云 LLM 服务商传输截图与设备信息心存顾虑。GUI-MCP 提供的高隐私模式具有以下特征:

  • 数据匿名化机制:外部云 LLM 无法直接获取原始截图与详细设备信息,仅接收由本地 GUI 模型处理后的状态摘要。这些摘要仅包含完成任务所必需的关键语义信息,不含敏感视觉细节。
  • 本地执行:需依赖截图分析进行规划的操作,由本地 GUI 模型完成;所有图像数据与敏感信息仅在本地设备处理,外部云 LLM 仅负责高层任务分解与决策。
  • 灵活隐私级别:用户可依据自身信任偏好与任务需求,配置不同隐私保护级别。系统支持从完全开放(直接传输截图)到完全私密(仅文本摘要)的多级配置。
在此模式下,所有屏幕图像和原始设备信息都只在本地处理。本地的GUI专家模型分析屏幕后,只向云端的主力大模型发送语义摘要(例如:“当前屏幕是微信主界面,包含‘通讯录’、‘发现’、‘我’三个标签”)。主力大模型基于摘要做出高级规划,再将具体操作指令通过MCP发回本地执行。这样,既利用了云端大模型的强大推理能力,又确保了用户的敏感视觉数据不外流。这一设计使 GUI-MCP 在充分利用强大云 LLM 推理能力的同时,有效保护用户隐私数据,实现功能与隐私的最优平衡。
通过创新的双层次架构,GUI-MCP 在效率与隐私两个维度为 LLM 驱动的 GUI 自动化提供了系统化解决方案。该协议不仅降低了将 LLM 能力扩展至 GUI 操作领域的技术门槛,也为构建既强大又兼顾隐私的 AI 助手提供了可行路径。
0x03 无MCP调用

我们先看看没有MCP时候,系统如何运行。
3.1 执行脚本

run_single_task.py 具体代码示例如下。
[code]tmp_server_config = {    "log_dir": "running_log/server_log/os-copilot-local-eval-logs/traces",    "image_dir": "running_log/server_log/os-copilot-local-eval-logs/images",    "debug": False}local_model_config = {    "task_type": "parser_0922_summary",    "model_config": {        "model_name": "gelab-zero-4b-preview",        "model_provider": "local",        "args": {            "temperature": 0.1,            "top_p": 0.95,            "frequency_penalty": 0.0,            "max_tokens": 4096,        },    },    "max_steps": 400,    "delay_after_capture": 2,    "debug": False}# ===== 新增:用于记录每步耗时 =====_step_times = []# ===== 新增:包装 automate_step 方法 =====def wrap_automate_step_with_timing(server_instance):    original_method = server_instance.automate_step    def timed_automate_step(payload):        step_start = time.time()        try:            result = original_method(payload)        finally:            duration = time.time() - step_start            _step_times.append(duration)            print(f"Step {len(_step_times)} took: {duration:.2f} seconds")        return result    # 替换实例方法    server_instance.automate_step = timed_automate_stepif __name__ == "__main__":    if len(sys.argv) < 2:        print("❌ 错误:未传入任务参数!")        print("
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册