惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
N
Netflix TechBlog - Medium
大猫的无限游戏
大猫的无限游戏
爱范儿
爱范儿
Martin Fowler
Martin Fowler
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Register - Security
The Register - Security
IT之家
IT之家
博客园_首页
Microsoft Security Blog
Microsoft Security Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
I
InfoQ
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Jina AI
Jina AI
Apple Machine Learning Research
Apple Machine Learning Research
M
MIT News - Artificial intelligence
博客园 - Franky
C
Check Point Blog
T
The Blog of Author Tim Ferriss
V
Visual Studio Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Tailwind CSS Blog
Recent Announcements
Recent Announcements
云风的 BLOG
云风的 BLOG
美团技术团队
The Cloudflare Blog
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
MyScale Blog
MyScale Blog
The GitHub Blog
The GitHub Blog
D
DataBreaches.Net
Google DeepMind News
Google DeepMind News
V
V2EX
aimingoo的专栏
aimingoo的专栏
GbyAI
GbyAI
G
Google Developers Blog
S
SegmentFault 最新的问题
Hugging Face - Blog
Hugging Face - Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
U
Unit 42
罗磊的独立博客
量子位
MongoDB | Blog
MongoDB | Blog
Last Week in AI
Last Week in AI
Stack Overflow Blog
Stack Overflow Blog
小众软件
小众软件
D
Docker
人人都是产品经理
人人都是产品经理

博客园_首页

Linux实操--组管理、权限管理和定时任务 Java + EasyExcel 实现单个接口导出多个Excel Mem0 源码解析系列(二):提示词工程的深度剖析 Openclaw TaskFlow究竟是什么?和普通Skill技能有什么区别 博文阅读密码验证 - 博客园 嘉立创开源:应该是全网MicroPython教程最多的开发板 Hermes Agent 集成实践:从协议到生产 2026年AI编程工具横评:Cursor、Codex、Claude Code、Zed、Windsurf Java程序员必看的RAG入门教程 2026 AI效率神器:Superpowers + Claude Code 保姆级教程 本地大模型部署全攻略:从 0 到 1 玩转 Ollama 【从0到1构建一个ClaudeAgent】内存管理-上下文压缩 .NET 高级开发 | 设计、实现一个事件总线框架 电子小白入门之NE555 3. WorkBuddy:隐藏玩法,一键召唤专家,让 AI 以"专家身份"给你干活 和AI一起搞事情#3:Claude Teammate 游戏开发翻车实录 【OpenClaw】通过 Nanobot 源码学习架构---(7)Memory C# .NET 周刊|2026年3月3期 我在 Debian 11 上把 K8s 单机搭起来了,过程没你想的那么顺(/opt 目录版) 深度学习进阶(七)Data-efficient Image Transformer CLI+Skill搭建浏览器AI自动化框架,告别一切重复枯燥任务 告别Token账单无底洞:OpenClaw本地部署,重塑企业数据主权的唯一解 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! SBTI 爆火后,我做了个程序员版的 CBTI。。已开源 + 附开发过程 多模态检索开始进入工程期:用 Sentence Transformers 搭建可落地的 Multimodal RAG 100多行代码实现一个最简单的Agent(用ReAct) Claude Code 通关手册(八):推荐 5 个 Hooks,代码质量提升 3 倍 老板:“有人截图了!”。安全部门:“收到,马上查暗水印!” - why技术 技术之外,皆是人间 C#/.NET/.NET Core技术前沿周刊 | 第 69 期(2026年4.01-4.12) Snack JSONPath 项目架构分析 Claude Code Buddy 小析:一个非核心功能,如何体现产品的细节完成度 AI新时代下的图床管理方案-Cloudflare图床+MCP+Skills方案指南 化繁为简:顺丰速运App如何通过 HarmonyOS SDK实现专业级空间测量 从零实现富文本编辑器#13-React非编辑节点的内容渲染 AI开发-python-langchain框架(3-23-OpenAI Functions风格Tool Calling智能助手) .NET + AI 进阶实战:基于类的技能开发 - 打造可治理的 Agent 能力模块 【从0到1构建一个ClaudeAgent】规划与协调-技能 上周热点回顾(4.6-4.12) 电子小白的工具三件套:面包板、杜邦线、万能板 单表五亿数据的查询优化 | Mysql、StarRocks 2. WorkBuddy:从“我是谁”到“帮我干活” C# 如何减少代码运行时间:7 个实战技巧 基于HelixToolkit.SharpDX 渲染3D模型 - 笺上知微 从零开始的双臂具身VLA起源及现阶段发展综述 - SkyXZ 记对 xonsh shell 的使用, 脚本编写, 迁移及调优 - pluvium27 受够了Vibe Coding的失控?换个起点,让AI事半功倍 从开始配置漏洞环境到漏洞复现流程 - 難しい 关于10年工作经验的程序员对OpenClaw的实战经验分享以及看法 - 虚无境 Any metadata 的内存布局 C# .NET 周刊|2026年3月2期 - InCerry 我帮你测过了,测试圈排名第二的 Skill 依然很牛逼 Skill Discovery | 无监督技能发现的经典工作总结 - MoonOut PbootCMS 网站内容数量多导致访问慢?这些实用优化方案帮你提速! - 家兴网络技术工作室 上下文工程是什么?过时了么?一文讲明白! - 一枫说码 网站漏洞怎么发现并修复?一篇实用指南(附完整流程) - 家兴网络技术工作室 开了 TUN 模式还是直连?90% 的人都踩过这个坑 Github日报|2026年04月12日 - AI一族 AScript扩展多种脚本语言 - rockey627 AI 学习笔记:Agent 的记忆机制 你能被装进一个文件里吗?——7 万人把同事"蒸馏"成了 AI - 我没有三颗心脏 Claude Code 通关手册(七):给 AI 装上技能包——Skills 完全指南 - 暮色之狐 在浏览器中快速编辑代码:VSCode Web 集成实践 - Newbe36524 蒸馏自己 skill?基于 Deepseek 的蒸馏器,丐版蒸馏方式,简单便捷 - To_Carpe_Diem Spring AI Aliababa和AgentScope,哪个更好? - 苏三说技术 Etsy 把 1000 个 MySQL 分片迁进 Vitess:425TB 数据背后的真正问题不是性能,而是运维规模 MicroPython LVGL基础知识和概念:底层渲染与性能优化 - FreakStudio 数据库草图算法 Python 潮流周刊#146:CPython 引入 Rust 的进展 - 豌豆花下猫 最小生成树 - mofei1116 红日靶场七:从外网入口、容器逃逸到 AD 接管的完整利用链复盘 - YouDiscovered1t 分享四款开源且实用的 Kafka 管理工具 - 追逐时光者 vLLM 权重加载机制全解析:从挑战到理想架构 LCT 学习笔记 - ACehomoxue Avalonia UI 12.0.0 正式发布:架构演进和性能飞跃 - 张善友 当 AI Agent 把调用链拉长,延迟开始成为一门生意 conhost.exe 无法显示 U+2717 - 145a 太秀了,我把自己蒸馏成了 Skill!已开源 - 程序员鱼皮 ASP.NET Core 内存缓存实战:一篇搞懂该怎么配、怎么避坑 基于 Ghostty 带有分割标签页和为 Claude 编程设计的通知终端 - BugShare AI 焊死入口:教育的“操作系统级”重塑 - 郝hai 初级Java开发工程师使用sql脚本编写代码的过程是简单而且不糊涂 - CoderOilStation Claude Code通关手册(六):MCP协议完全指南 - 暮色之狐 边框灯光环绕动画特效实现指南 - Newbe36524 开源:子木蒸馏版的 SEO 审计工具 seo-audit-skill v1.0 我所理解的Python元模型 【从0到1构建一个ClaudeAgent】规划与协调-TodoWrite - 程序员Seven Claude 和 Codex 在审计 Skill 上性能差异探究 - ACai_sec AScript如何实现中文脚本引擎 - rockey627 【渗透测试】HTB Season10 Garfield 全过程wp - dynasty_chenzi Android 开发者为什么必须掌握 AI 能力?端侧视角下的技术变革 树状数组正确性证明 - AC-wyr 你的 AI 焦虑,可能比 AI 本身更危险——ATM 机没有消灭银行柜员,但恐慌消灭了你的判断力 - 我没有三颗心脏 一个拉胯的分库分表方案有多绝望?整个部门都在救火! - 冰河团队 动态规划入门必学之走方格问题 - Ofnoname PostgREST 与 PostgreSQL 角色权限配置全解析(生产级实践) - SheepDog1998 使用 UEFI 图形输出协议 GOP 在屏幕上显示图像的方法 - 阿源- Claude Code通关手册(五):组建你的AI专家团队,子代理系统 - 暮色之狐 一个程序员到架构师的催婚路之感悟(整整10年后的催婚相亲感悟) - MisterLip 用 Agent Skill 自动生成工作周报 - 赵康
【GUI-Agent】阿里通义MAI-UI 代码阅读(1)--- 总体
罗西的思考 · 2026-05-06 · via 博客园_首页

【GUI-Agent】阿里通义MAI-UI 代码阅读(1)--- 总体

0x00 摘要

MAI-UI是阿里通义实验室发布的一项重磅研究成果:是一个旨在 重塑人机交互方式 的“基础图形用户界面(GUI)智能体”,和阶跃星辰的思路非常类似,因此我们可以互相印证。

MAI-UI的信息如下:

https://arxiv.org/pdf/2512.22047

https://github.com/Tongyi-MAI/MAI-UI

0x01 特色

MAI-UI的MCP工具使用的两大好处为:

  • 将冗长的UI操作压缩为少量API调用;
  • 将传统桌面工作流(如GitHub提交查询)带入手机。

1.1 端云协同

MAI-UI是原生设备-云协作系统,阶跃星辰也是端-云协同,豆包应该也是类似方式。

  • 本地轻量Agent:常驻设备端,负责处理大多数任务,并扮演“轨迹监控员”的角色。
  • 云端强大Agent:当本地监控员发现任务执行出现偏差(如卡住、操作错误),且当前不涉及敏感隐私数据时,会触发向云端Agent的切换。
  • 关键创新:本地模型经过专门训练,不仅会执行任务,还会判断是否偏离目标,并在切换时生成一个“错误摘要”发给云端,帮助云端快速理解问题、接手完成。

MAI-UI-0.2

1.2 应对挑战

MAI-UI也使用MCP来应对现实挑战。

  • ask_user 动作:当指令模糊时(如“把最近的文件发给他”,缺收件人和文件),MAI-UI会主动暂停,生成一个提问动作,向用户请求澄清。
  • mcp_call 动作:MAI-UI可以调用外部工具(通过Model Context Protocol, MCP)。例如,比较两个地址的开车时间,不需要在地图App里手动输入,直接调用“高德地图API”即可;在手机上查询GitHub提交历史,也只需一个API调用。

下图为MCP的动作空间。

MAI-UI-0.3

1.3 核心Agent

两类核心Agent如下:

Agent 文件 任务 输出协议
MAIGroundingAgent src/mai_grounding_agent.py UI 元素定位(单步) <grounding_think>.</grounding_think>{"coordinate":[x,y]},坐标基于 SCALE_FACT0R=999 归一化
MAIUINavigationAgent src/mai_navigation_agent.py 多步移动端GUI导航,支持ask_user与mcp_call .<tool_call>{json}</tool_call>,多轮带历史截图

1.4 整体架构图

整体架构图如下:

阿里GUI-1

关键约束如下:

  • src/内为扁平导入(from base import),调用方需把 src/插入sys.path;
  • requirements.txt(agent 客户端)与evaluation/grounding/requirements.txt(评测,含 vLLM/torch)两套独立;

1.5 评测流程图

阿里2

0x02 MCP在MAI-UI中的作用

为什么 MAI-UI 要把 MCP 拉进来?这是为了解决 GUI Agent 的三个老大难

问题 纯 GUI 路径的痛点 MCP 给出的解法
效率 查个公交路线要点 5-10 屏 一次 mcp_call("amap_route", ...) 直接拿结构化结果
能力天花板 模型识别能力 / 屏幕信息有限,长链路任务容易掉链子 把 "查询、计算、第三方业务" 外包给确定性 API
数据敏感性 / 设备-云协同 端上小模型搞不定的专业任务必须走云 MCP 调用本身就是云侧能力的入口;与 README 里 "Device-Cloud Collaboration" 同源

这就是 “Agent-user interaction and MCP augmentation :enabling agent to interact with user and use MCP tools to complete the task"。

MAI-UI 并不是MCP的实现方,而是MCP的消费方一它把外部MCP 工具的能力以“额外动作“的形式注入到prompt
里,让模型在合适的时候选择直接调工具,而不是去点屏幕。

MCP是给GUIAgent加一条“绕过屏幕“的快捷通道。

2.1 MCP与GUI操作的分工

分工具体如下图,三者同级共存于同一个动作集合,由模型自主判断该用哪个。

阿里3

2.2 实现

代码中实现如下:

  • 实例化 Agent 时把 工具清单(JSON-Schema 风格的列表)通过mcp_tools=[...]传进来;
  • Agent 用 Jinja2 把这份清单渲染进 system prompt的 ##MCP Tools区块;
  • 模型在某一步输出<tool_call>{"name":"...", arguments*:{...}}</tool_call>;
  • 客户端外层负责真正去调那个 MCP服务(项目本身不内嵌MCP客户端 / 不内嵌网络层)
  • 拿到结果后,把字符串结果塞到下一步 obs[mcp_response*],Agent 在_build_messages 时把它作为新的 user 消息追加。

2.3 一次完整MCP往返的时序

下图是一次完整MCP往返的完整时序。

关键三步:模型吐 tool_call ──► 外层调真实 MCP ──► 结果作为纯文本 mcp_response 回灌下一步
predict。Agent 本身不执行网络调用,只负责传话。

要点:

  • 模型对 GUI 动作和 MCP 调用使用同一种输出语法(都是<tool_call>{name,arguments}</tool_call>),客户端通过 name 是否在 mcp_tools 里来分流;
  • 工具调用的真正执行完全在仓库之外,让你想接什么 MCP 服务(高德地图、12306、淘宝、企业内网工具)都行,只要能给出 JSON-Schema 描述并自己接通网络。

阿里4

2.4 MCP如何把长的UI操作压缩为少量的API调用?

2.4.1 问题的本质

问题的本质:GUI路径 VS API路径的“步数 × 单步成本“差距

GUI路径里,每一步都包含一次完整的多模态推理:

单步GUI 成本 = encode(截图)= 几千vision token
            + encode(history_n张历史截图)
            + 模型decode(<thinking>+<tool_call>)
            + 客户端反归一化坐标 + 真机点击 + 等待UI渲染 + 重新截图

而MCP调用一次的成本如下:

单次MCP成本 = encode(MCP返回JSON字符串)几十~几百token
            + 模型decode下一个动作
            + 客户端走HTTP拿结构化结果(确定性、毫秒级)

量纲上压缩比通常是10× -100× —因为一张手机截图的视觉token数 ~= 几千;而一段JSON文本 = 几百。

2.4.2 为什么MAI-UI恰好让这种“压缩“是天然成立的?

MCP之所以能把长UI操作压缩成少量API调用,核心是用“低成本、确定性、结构化“的文本通道替换“高成本、概率性、像素级“的视觉通道 ----- 而MAI-UI刚好通过统一tool_call语法 + 文本回灌mcp_response + 工具schema一次性渲染这三件事,从而让这种压缩在工程上自然成立、不需要额外特化的代码路径。

GUI

比如,mai_naivigation_agent.py的_build_messages():每一步都把最近history_n张截图重新base64后塞回messages。

                    纯GUI路径下messages体积膨胀
step 0: [sys, img0]                                      ──► ~3k tok
step 1: [sys, img0, assto, img1]                         ──► ~7k tok
step 2: [sys, img0, asst0, img1, asst1, img2]            ──► ~10k tok
step 3: [sys, img1, asst1, img2, asst2, img3](滑窗)     ──► ~10k tok

对应公式:纯GUI完成任务N_ui × C_vision,N_ui 大、C_vision 也大,乘积爆炸。

GUI+MCP

而把同一段流程换成“GUI+MCP"以后,具体如下:

                GUI+MCP路径下messages体积
step 0: [sys+MCP_tools_decl,img0]
step 1: ◄── tool_call:amap_route(...)          ← 模型一次决定走MCP
step 2: [..., user(text=mcp_response_json)]    ← 外层把JSON灌回
        ◄── tool_call:open("Notes")
step 3: [...,img_after_open_notes]             ← 才需要再来一张截图
step 4: ◄── tool_call:type("行程已规划")

要点:

  • _build_messages里如果某TrajStep没有携带新screenshot而携带mcp_response,只追加一段纯文本user 消息,不会追加图片,这一步视觉token增量=0,只多几十~几百文本token。
  • mcp_tools列表只在system prompt里渲染一次,由Jinja2的[%if tools%} 控制;不会每步重发。
  • 模型用同一种<tool_call>语法统一表达GUI动作与MCP调用,所以decode 长度量级一致一压缩完全靠“省掉了一连串需要看屏幕的中间步”。

2.4.2 一张直观对比图

任务:“帮我规划:现在去招商银行取钱,再去城西银泰城;公交地铁;总时长 < 2h;把计划写进笔记App。

A. 纯 GUI 路径(无 MCP)
step 1  打开高德                  screenshot ●
step 2  点搜索框                  screenshot ●
step 3  键入"招商银行"            screenshot ●
step 4  选最近一家                screenshot ●
step 5  点"路线"                  screenshot ●
step 6  切到"公交"                screenshot ●
step 7  设起点                    screenshot ●
step 8  读屏判断时长               screenshot ●
step 9  返回,再搜下一段           screenshot ●
step 10 ...重复5-8..             screenshot ●●●●
step 14退出高德                   screenshot ●
step 15打开笔记                   screenshot ●
step 16 新建                     screenshot ●
step 17 输入标题                 screenshot ●
step 18输入内容                  screenshot ●
step 19保存                      screenshot ●
                                __________________
                                ~19步 x ~10k vision tok = ~190k tok 
                                ~19次模型RTT
                                +真机渲染等待19次
B. GUI + MCP 路径
step 1  mcp_call("amap_route",
                  {"from":"阿里云谷",
                   "to":"招商银行",
                   "constraints":{"radius_km":4,"mode":"transit"}})
                  text-only ○

step 2  mcp_call("amap_route",
                  {"from":"招商银行",
                   "to":"城西银泰城",
                   "mode":"transit"})
                  text-only ○

step 3  open("Notes")              screenshot ●
step 4  click(新建)                screenshot ●
step 5  type(标题)                 screenshot ●
step 6  type(正文-把两段路线 JSON 拼起来) screenshot ●
step 7  click(保存)                screenshot ●
                                   __________________
                                    7 步;仅 5 张截图
                                    ≈ 5 × 10k + 2 × 0.5k = ~51k tok
                                    + 2 次 HTTP RTT
                                    + 真机渲染等待 5 次

节省:步数 19→7 (-63%),视觉 token 190k→50k (-73%),决策延迟同比下降。

0xFF 参考

从豆包手机谈起:端侧智能的愿景与路线图

阿里发布MAI-UI,一个“活”在屏幕里的全能AI助手!手机真能全自动了?