做了快两年移动端 GUI Agent,我最大的感受是:这个方向看着热闹,真正跑过一遍端到端的人才知道坑有多深。Fairy 这个内部项目就是我们团队从 0 到 1 的一次完整实践,核心是把 RGR、OCA、EMA 三个模块组合到一起,解决“手机屏幕上的智能体到底怎么可靠地看懂界面、规划操作、并持续变强”这个问题。如果你也在做移动端 AI 自动化、UI Agent 或类 RPA 的方向,这篇内容我把整个设计思路、落地细节和踩过的坑都梳理出来,希望能帮你少走几条弯路。
先说清楚 Fairy 能做什么。给它一个自然语言任务,比如“帮我把这个 App 的深色模式打开,再截个图发给我”,它能自己完成看屏幕、找按钮、点按、滑动、输入、校验结果这一整套流程。相比传统的基于坐标和控件的自动化脚本,Fairy 的优势在于不依赖 App 是否留了接口,也不要求每个页面都有可读的 View 层级,它更接近一个“长了眼睛和手的 AI 助理”,而不是写死的规则引擎。这套能力适合三类读者参考:正在做移动端自动化测试的工程师、研究 GUI Agent 方向的同学,以及想把大模型能力落到真实手机操作场景的产品团队。
1. 项目背景与整体设计:为什么移动 GUI Agent 这么难
1.1 移动端 GUI 自动化的痛点到底在哪
很多人一开始觉得“让 AI 操作手机”不就是把截图喂给大模型,再让它输出一个坐标点吗?真做起来完全不是这么回事。移动端 GUI 的环境复杂度远超 Web 页面,我大概归纳成四类核心痛点。
第一是界面信息获取不完整。原生 Android 页面还能通过uiautomator dump或者无障碍服务拿到控件树,但一旦碰到 Flutter、React Native、小程序、游戏引擎或者混合 WebView,控件树要么拿不到,要么拿到一堆没有语义的乱码节点。我见过最夸张的情况是一个 H5 页面 dump 出来的 XML 有四千多个节点,其中大量是无意义的 ViewGroup,真正能点的按钮在树里根本找不到对应关系。第二是视觉元素高度碎片化。同样是“确定”这个按钮,在不同 App、不同手机、不同深色模式下长得完全不一样,更别提那些只有图标没有文字的功能按钮,光靠 OCR 根本认不出来它是什么。第三是动态交互的干扰,弹窗、Toast、广告浮层、权限请求、开屏广告,随时可能插到当前页面上,把原本的界面状态完全打乱。第四是端侧资源约束,手机不是 GPU 服务器,图像推理、大模型推理都要在有限的算力和内存里完成,延迟稍微高一点,用户就会觉得这个 Agent 是个玩具。
1.2 Fairy 的整体架构与三个核心模块的关系
针对上面这些问题,Fairy 在架构上从一开始就没有选择“一个超大模型包打天下”的路线,而是拆成了三个模块各管一段,这也是标题里 RGR、OCA、EMA 三个词的由来。
RGR(Reliable GUI Recognition)负责“看”,也就是把屏幕截图转成结构化的界面状态描述,输出当前页面有哪些可交互元素、每个元素的类型、文本内容、位置和置信度。OCA(Operation Chain Agent)负责“想”,拿着 RGR 输出的界面状态,结合用户的任务目标,规划出一串原子操作并逐步执行。EMA(Exponential Moving Average)负责“学”,一个层面是模型训练时对权重的指数滑动平均更新,让策略参数更稳定;另一个层面是对历史经验样本做指数加权,让 Agent 在使用经验时更看重近期成功的轨迹、弱化过时旧经验。
三者之间的关系是一条非常清晰的流水线:屏幕截图先进 RGR,RGR 产出的结构化状态给 OCA 做规划,OCA 执行操作后产生新的截图和反馈,这些轨迹数据再经过 EMA 机制筛选和加权,用于迭代更新 RGR 的识别模型和 OCA 的策略模型。也就是说,RGR 和 OCA 是“前台干活”的,EMA 是“后台成长”的引擎。
1.3 为什么把识别、规划、更新拆成三个模块
这个决策当时在组里是有过争论的。有人主张直接端到端训练一个视觉-语言-动作模型,输入截图和任务输出动作,看着更简洁。但拆开做有三个非常实际的好处。
第一是故障定位清晰。线上任务失败时,我们能快速判断是识别错了、规划错了还是执行环境的问题。如果出问题的是 RGR,比如界面元素漏检,那我们只需要补识别数据;如果出问题的是 OCA,比如规划了非法操作,那要调整的则是规划策略。这种可分离性在实际维护里省了太多时间。第二是成本可独立优化。识别模型用轻量级模型跑在端侧,规划模块可以用中等规模的大模型跑在服务端,两者升级互不阻塞,不会因为某个模块变大而拖垮整个链路。第三是评估指标更细。拆开之后可以分别统计识别准确率、规划合理率、执行成功率,如果只用一个端到端成功率,根本说不清瓶颈到底在哪里。这一点在向老板汇报项目进展时尤其重要,拿着分模块的数据和拿着一个笼统的准确率,说服力完全不一样。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. RGR 可靠GUI识别:从层级解析到视觉理解的路线
2.1 识别层的核心挑战和设计目标
RGR 的目标不是“认出所有的 UI 元素”,而是在给定任务上下文的前提下,把当前屏幕中“跟任务相关
