1. 项目概述
SkillDroid是一种创新的移动GUI自动化框架,它解决了当前基于大型语言模型(LLM)的移动代理在任务执行中的核心痛点:无状态性和高计算开销。传统LLM代理将每个任务调用视为独立的推理过程,需要在每个动作步骤进行完整的LLM推理调用,导致效率低下且无法积累经验。
1.1 核心问题解析
当前LLM移动代理存在三个主要问题:
重复计算开销:每次执行相同任务时,都需要从零开始进行完整的推理过程,即使任务已经成功执行过多次。在我们的基准测试中,LLM调用占用了75-94%的总执行时间。
可靠性不稳定:由于缺乏经验积累,代理的成功率不会随着使用次数的增加而提高。相反,我们的测试显示,无状态LLM代理的成功率会从80%下降到44%。
参数适应性差:对于类似但参数不同的任务(如"设置7:30闹钟"和"明天6点叫醒我"),系统无法识别其结构相似性,导致重复计算。
1.2 解决方案架构
SkillDroid采用三层架构解决上述问题:
编译层:通过LLM引导执行任务,并将成功轨迹编译为参数化技能模板。这些模板包含UI动作序列、加权元素定位器和类型化参数槽。
重放层:使用正则表达式匹配、语义相似度计算和应用过滤来识别适用的技能模板,然后直接重放而无需LLM调用。
学习层:监控技能执行情况,当可靠性下降时触发重新编译,实现技能库的动态优化。
2. 技术实现细节
2.1 技能编译机制
2.1.1 轨迹记录与验证
在初始执行阶段,系统记录每个步骤的详细信息:
UI状态捕获:通过Android无障碍服务获取完整的UI层次结构,包括:
- 资源ID(resourceId)
- 文本内容(text)
- 内容描述(contentDescription)
- 类名(className)
- 屏幕位置(boundsInScreen)
- 父/子元素关系
执行验证循环:引入"检查者在环"设计,防止LLM错误报告任务完成。当LLM声明任务完成时,系统会运行验证检查器确认实际设备状态。
2.1.2 参数化技能模板生成
成功执行后,系统通过三个步骤生成可重用技能:
槽位提取:识别任务中的可变参数(如时间、联系人姓名等),并将其替换为类型化占位符。例如,"设置7:30闹钟"被泛化为"设置{time}闹钟"。
定位器生成:为每个UI元素创建加权定位器,考虑六个特征信号:
- 资源ID(权重0.40):开发者分配的稳定标识符
- 文本(0.20)和内容描述(0.15):语义信息但可能变化
- 类名(0.10)、父上下文(0.10)和兄弟位置(0.05):结构信息
状态描述生成:记录每个步骤预期的UI上下文,用于后续重放时的状态验证。
2.2 技能匹配与重放
2.2.1 多级匹配策略
当新指令到达时,系统采用三级匹配策略:
- 正则表达式匹配:处理结构相同的指令(如仅参数变化)
- 语义相似度匹配:使用句子转换模型处理释义指令
- 应用过滤:确保目标应用匹配
匹配结果分为:
- 完全匹配(Full):找到适用技能且参数可提取
- 部分匹配(Partial):应用匹配但指令差异大
- 无匹配(No_Match)
2.2.2 推测式重放机制
对于完全匹配的技能,系统尝试直接重放动作序列,关键创新包括:
状态验证:将当前UI与预期状态比较,根据偏差程度采取不同策略:
- 无偏差:继续严格匹配(阈值0.5)
- 轻微偏差:放宽匹配(阈值0.3)
- 中度偏差:尝试自动关闭常见对话框
- 严重偏差:回退到完整LLM执行
元素查找:使用加权评分函数定位目标元素:
score(e, l) = Σ(w_f * 匹配(e.f, l.f)) / Σw_f选择得分最高且超过阈值的元素执行操作。
有限LLM回退:当特定步骤无法完成时,允许有限次数的单步LLM调用辅助,而不是完全回退。
2.3 失败学习与技能优化
系统持续跟踪技能执行情况,实现动态优化:
失败记录:记录失败上下文,包括:
- 失败步骤索引
- 偏差类型
- UI状态
- 恢复是否成功
重新编译触发:当技能失败率超过50%时,在下一次匹配时强制重新编译。
版本控制:限制每个技能最多3个版本,避免无效循环。
3. 性能评估与结果
3.1 实验设计
我们在150轮测试中评估SkillDroid,涵盖15种任务类型和4种指令变体:
- 编译阶段:使用标准指令创建初始技能库
- 低变异阶段:测试参数变化的指令
- 中变异阶段:引入释义指令
- 高变异阶段:使用口语化表达
- 扰动阶段:添加系统级干扰(如权限对话框)
3.2 关键性能指标
- 成功率:整体85.3%,比无状态LLM基线高23个百分点
- LLM调用:平均每轮5.8次,比基线减少49%
- 执行速度:纯重放速度比完整LLM执行快2.4倍
3.3 分层性能分析
重放层:79轮成功重放,成功率100%
- 35轮零LLM调用,平均耗时36秒
- 32轮需要1次LLM调用(语义确认)
- 12轮需要平均5次LLM调用(处理动态元素)
回退层:29轮回退到完整LLM执行,成功率75.9%
学习效果:系统成功率从初始87%提升至最终91%,而基线从80%降至44%
4. 实际应用与优化建议
4.1 典型应用场景
- 重复性系统操作:闹钟设置、WiFi开关、飞行模式切换
- 表单填写:联系人添加、日历事件创建
- 应用导航:浏览器搜索、设置深层配置
4.2 开发者实施建议
元素定位优化:
- 优先使用resourceId等稳定标识符
- 为动态元素设计备用定位策略
- 合理设置匹配阈值平衡鲁棒性和准确性
技能管理:
- 定期审查低成功率技能
- 为常用任务维护多个变体技能
- 实现技能版本比较工具
性能调优:
- 考虑本地部署轻量级LLM处理单步回退
- 优化无障碍服务调用频率
- 实现技能预加载机制
4.3 常见问题排查
元素定位失败:
- 检查无障碍服务是否正常
- 验证UI结构是否变化
- 调整特征权重或匹配阈值
技能匹配错误:
- 检查语义模型质量
- 优化正则表达式模式
- 添加应用过滤条件
执行中断:
- 检查系统对话框拦截
- 验证权限状态
- 查看执行日志定位问题步骤
5. 技术局限与未来方向
5.1 当前限制
- LLM依赖:初始编译仍需完整LLM执行
- 跨设备兼容:UI差异可能影响技能可移植性
- 复杂任务:多应用流程自动化支持有限
5.2 演进方向
- 视觉增强:结合OCR和图标识别提高元素定位鲁棒性
- 分布式技能库:实现用户间技能共享与评级
- 自适应学习:基于用户反馈自动优化技能参数
- 多模态输入:支持语音、手势等自然交互方式
在实际部署中,我们发现系统性能与UI稳定性高度相关。对于频繁更新的应用,建议设置定期技能验证任务。同时,将常用技能预编译可以显著提升首次响应速度。一个意外的收获是,这套框架不仅提高了自动化效率,还为分析用户操作模式提供了结构化数据,有助于UI设计和用户体验优化。