MemGUI-Agent 这类方案里,记忆与规划跑在 Agent 侧,点击执行交给手机端页面,于是同一个“任务失败”往往混着三种情况:记忆没更新、规划选错动作、点击发出但页面没反馈。判断顺序建议从日志入手——先确认失败发生在保存信息还是选择动作,再看点击后页面是否给出可验证反馈;页面反馈不可靠时,不要在无证据的前提下让规划层继续往下走。
把 MemGUI-Agent 的失败拆成两层看:记忆更新与规划决策属 Agent 侧,可由记录字段直接区分;点击是否生效属页面侧,只能用页面变化验证。适用场景是长程、多步的手机端任务。操作上先标出一条记忆更新记录和一条规划决策记录,再给每一步点击设确认点;风险边界是页面本身无反馈或反馈延迟时,暂停并请求人工确认,而不是靠重试硬推。
在任务记录里区分记忆更新与规划决策
先让 Agent 把两类记录写进同一份任务日志,但用不同 kind 字段区分。记忆更新回答“页面告诉了我什么”,规划决策回答“我接下来点什么”。只要日志里两者混在一起,排查就会把记忆没更新误判成模型乱点。
| 层 | 输入 | 输出 | 失败表现 | 可验证方式 |
|---|---|---|---|---|
| 记忆层(MemGUI-Agent) | 页面观察结果、历史步骤 | 结构化记忆条目,如“无线网络入口在列表第 2 项” | 页面已变化,记忆仍是旧条目 | 读记忆存储文件或日志中的 memory_update |
| 规划层(MemGUI-Agent) | 当前记忆 + 用户指令 | 下一步动作,如 tap / input / swipe | 选择的控件在当前页面不存在 | 对比 plan_step 的 based_on 与当时页面截图 |
| 执行层(手机端) | 动作指令 | 一次真实点击或输入 | 动作已下发,页面无变化 | 看点击后是否出现新的页面观察记录 |
日志可以先按下面的最小字段写,够用来分辨责任层:
{"kind":"memory_update","page":"settings_main","evidence":"list_item[text=无线网络]","text":"无线网络入口在列表第2项"}
{"kind":"plan_step","step":3,"action":"tap","target":"text=无线网络","based_on":"memory_id=17"}检查点:memory_update 里必须带页面证据(元素、文案或截图编号),plan_step 里必须带 based_on。缺 evidence 的记忆条目等于猜测,缺 based_on 的规划步骤等于脱离页面状态自由发挥。
观察点击执行后页面是否给出可验证反馈
判断点击是否真的生效,只看页面证据,不看点击是否发送成功。建议在每次动作后固定采集一次页面状态,并把下面这些反馈形式逐项对照,任何一项成立都算有反馈:
- 页面跳转:URL、Activity、标题或导航栏文案变化;
- 控件状态变化:按钮置灰、文案由“提交”变“提交中”;
- 输入框出现文本或光标位置变化;
- 弹出提示:Toast、弹窗、错误条;
- 列表选中态、勾选框、开关状态改变;
- 加载态出现后消失,且内容区发生替换。
这些证据要落在截图或 DOM/无障碍树快照上,而不是由规划层自己“声明成功”。如果动作执行后只有日志没有新快照,先补采集,再谈点击是否生效。
检查页面反馈缺失时 MemGUI-Agent 是否盲目继续
常见连锁错误是:点击没有反馈,但规划层默认它成功了,继续执行基于旧页面状态的下一步。复现方式很直接——在日志里找一次 tap 之后没有新的 observe 记录,却紧跟一个 plan_step 的片段。
step 4: tap target=text=提交 -> 无新页面观察
step 5: plan based_on=memory_id=22 -> tap target=text=确认
step 5: 执行结果: 弹窗未出现,点击落在其他控件上遇到这种情况,标出 step 5 的 based_on 指向的是哪一次页面观察:如果指向 step 3 之前的快照,就说明它在用旧页面状态继续。处理动作是把“动作后必须有一次新观察”写成硬条件,缺观察就进入重试或暂停,而不是让它自动续跑。
用同一指令测试不同应用的反馈速度
等待时间设置过短,会把“页面慢”误判成“点击无效”。选两个应用,做同一类点击(例如进入二级列表、提交一个已填好的表单),每次记录两个时间戳:动作下发时间和首次页面变化时间,观察差值分布。
测试记录模板
应用: A
动作: tap 提交
下发时间戳: T0
首次页面变化时间戳: T1
变化类型: 按钮置灰 / 出现加载态 / 跳转
配置等待上限: W
结论: T1-T0 是否超过 W两个应用差值差距明显时,不要用一个全局等待时间硬套,可以按应用或页面类型分别配置等待上限。等待上限的取值需要结合设备性能、网络和动画时长确认,不要凭一次观察定死。
给无反馈页面设置手动确认点
反馈不可靠的页面(例如点击后要等第三方回调、动画很长、无跳转的局部刷新),建议在长程任务里插一道停止条件:满足指定页面证据才继续,否则暂停并请求人工确认。写法可以是一段可替换的规则配置,由执行器在每步之后求值:
confirm_point:
name: 提交后等待结果
after_action: tap 提交
require_any:
- url_changed: true
- text_appeared: "提交成功"
- element_state: {selector: "#submit", state: "disabled"}
timeout_ms: 8000
on_timeout: pause_and_ask_human
max_retry: 1配合规划层的提示词,让它在动下一步之前先自检:
在执行下一步之前回答:
1. 上一步动作之后,页面出现了哪些与动作目标相关的变化?请给出可指认的证据。
2. 如果没有任何变化,是否允许重试一次,还是应当暂停并请求人工确认?
只有当第 1 条能给出证据时,才继续下一步。确认点的边界要写清楚:哪些证据算通过、超时后是暂停还是重试一次、哪些步骤允许跳过。这样 MemGUI-Agent 的记忆与规划仍然可以自动推进,而手机端点击是否生效,最终由页面反馈来裁决。