手机里的 Agent 用着用着就"失忆"?这篇论文把上下文管理变成了一个可以学的动作
你有没有遇到过这种情况:让一个手机 GUI Agent 帮你"在 Amazon 上对比三款耳机的价格和续航,然后把结论记到备忘录里"——前几步它干得挺利索,可一旦跨了 App、走到第二十几步,它就开始犯迷糊:价格记串了、忘了自己要对比哪几款、甚至把还没做的操作当成已经做完了。
这不是个例,而是当下移动 GUI Agent 一个相当普遍的软肋。短程任务(点几下就完事)大家都做得不错,可一旦任务横跨几十步、要在多个 App 之间倒腾信息,成功率就断崖式下跌。
最近读到一篇叫 MemGUI-Agent 的论文(arXiv:2606.19926),它给这个问题开的药方挺有意思:不再让模型被动地把每一步都堆进 prompt,而是把"管理上下文"本身变成一个和点击、输入平起平坐的动作,让模型自己决定什么该压缩、什么该记住、什么该留着随时取用。我读完第一反应是——对,长程 Agent 早就该这么干了。
📖 一段话讲清楚这篇论文在做什么
长程移动 GUI Agent 不可靠,论文把锅甩给了 ReAct 式提示:它的做法是把每一步的记录被动地往 prompt 后面追加,结果就是两个病——prompt 爆炸(上下文随任务步数线性膨胀)和关键信息稀释(价格、验证码、复制的文本这些跨 App 的硬事实被冲淡、改写、截断甚至遗忘)。MemGUI-Agent 提出 Context-as-Action(ConAct),让同一个策略在选 UI 动作的同时,也输出三个结构化上下文字段的维护指令。配套构建了 MemGUI-3K 数据集(2,956 条带完整 ConAct 标注的轨迹),训出的 MemGUI-8B-SFT 在 MemGUI-Bench 上拿到开放数据 8B 模型的最佳成绩;而把 ConAct 零样本套到 Qwen3-VL-235B-Thinking 上,Pass@3 直接干到 62.5%,反超了基于 Gemini-2.5-Pro 的智能体框架。一句话评价:这是把"记忆/压缩"从外挂模块收编进策略本体的一次漂亮整合,思路干净,实验也撑得住。
论文信息 - 标题:MemGUI-Agent: An End-to-End Long-Horizon Mobile GUI Agent with Proactive Context Management - 作者:Guangyi Liu, Gao Wu, Congxiao Liu, Pengxiang Zhao, Liang Liu, Mading Li, Qi Zhang, Mengyan Wang, Liang Guo, Yong Liu - 链接:https://arxiv.org/abs/2606.19926 (提交于 2026 年 6 月 18 日,33 页 6 图) - 项目主页:https://memgui-agent.github.io/
🤔 问题到底出在哪:被动累积的原罪
先看一组让人有点扎心的数字。论文里提到,就连目前最强的 8B 端到端模型 GUI-Owl-1.5-8B,在 AndroidWorld(平均 8.4 步)上还有 71.6% 的成功率,可一到 MobileWorld(平均 27.8 步)就掉到 38.2%,再到 MemGUI-Bench(平均 36.2 步)只剩 11.7%。
任务一长,模型就崩。崩在哪?
论文的判断是:崩在上下文管理。现在的主流做法无非两条路。一条是智能体框架——给一个骨干 MLLM 配上规划、记忆、grounding 等一堆外挂模块,能打,但流程复杂、还经常依赖闭源大模型。另一条是端到端模型,简单、好部署,可它们管理上下文的方式特别"机械":要么把每步动作-想法往后堆(Action-Thought),要么多轮对话硬塞(Multi-turn),要么按规则截断(Rule-based),要么干脆不留历史(No History)。
这几种姿势的共同毛病,论文这张图讲得很直白:

图1:左边是过去的 ReAct 路线——passive history append,每一步 step₁、step₂…stepₙ 直接往下堆,于是"context grows with task length",上下文成本高、无关信息不断累积;右边是 MemGUI-Agent 的 proactive manage via ConAct,把上下文拆成 Folded Action History、Folded UI State、Recent Step Record 三块,做到紧凑又结构化,上下文成本低、关键信息留得住。
说白了……抱歉,换个说法——问题的核心在于:这些方法都把上下文当成一个游离在策略之外的日志。外置记忆把上下文的取舍交给了模型之外的模块;prompt 式或规则式方法要么被动累积、要么机械丢弃旧事实。两边都没解决那个真正的诉求:长程任务既需要紧凑的工作上下文(不然 prompt 撑爆、推理变慢变贵),又需要跨屏幕、跨步骤、跨 App 持久保留的 UI 事实(不然价格、ID 这些硬信息说没就没)。
于是作者抛出了那个核心问题——能不能让一个端到端 Agent,在选 UI 动作的同时,自己管好工作上下文,使得长程交互既保持紧凑、关键 UI 事实又能跨步跨 App 地活下来?
🏗️ ConAct:把"管上下文"变成模型亲自下的决策
MemGUI-Agent 的答案,建立在一个叫 Context-as-Action(ConAct) 的范式上。名字起得挺贴切——上下文即动作。
核心思想一句话:不再被动追加历史,而是让同一个策略在一次前向传播里,既决定执行什么 UI/记忆动作,又决定折叠哪段历史、怎么描述当前这一步。 压缩和记忆不再外包给单独的 summarizer、retriever 或记忆 agent,而是直接继承 Agent 自己的任务级推理。
具体怎么落地?看这张框架图:

图2:单步执行流。模型吃进当前截图 \(I_t\) 和状态 \(S_t\),一次性吐出 ConAct 的五部分输出;A 模块按折叠指令更新历史 \(H_{t+1}\),B 模块执行 UI 动作(改变屏幕)或记忆动作(只改上下文),C 模块更新最近步记录 \(L_{t+1}\),三者合并成下一状态 \(S_{t+1}\),循环往复。
三个结构化字段,各管一摊
ConAct 把工作上下文拆成三块,对应论文里反复出现的状态定义:
- Folded Action History(\(H_t\),折叠动作历史):压缩后的轨迹摘要。一句话解释:把走过的路浓缩成几行"我之前干了啥",而不是逐帧回放。
- Folded UI State(\(M_t\),折叠 UI 状态):持久化的 UI 派生事实。这是用来存价格、电话号、复制的文本这类一个字都不能错的硬信息的。
- Recent Step Record(\(L_t\),最近步记录):最近一步的交互细节,保持新鲜和精确。
每一步,MLLM 策略输出一个联合决策:
其中 \(\tau_t\) 是推理,\(\phi_t\) 是折叠指令,\(a_t\) 是 UI 或记忆动作,\(o_t\) 是 UI 观察,\(\iota_t\) 是动作意图。
五部分结构化输出
落到具体的输出格式上,ConAct 在 Qwen3-VL 的 function-calling 模板基础上扩了字段,每步吐出 5 个部分:
<thinking> 推理过程
<folding> {range, summary} —— 要折叠的历史区间 + 生成的摘要
<tool_call> 一个 UI 动作 或 记忆动作
<ui_observation> 当前屏幕的精确事实(可见文本、数字、名称)
<action_intent> 这一步想达成什么
动作空间也扩了,多出了记忆操作这一类:
\(\mathcal{A}_{ui}\) 是点击、输入、滑动、等待、终止这些;\(\mathcal{A}_{mem}\) 则是对折叠 UI 状态 \(M_t\) 的增删改。
三个机制的细节,各自解决一个具体的病
历史折叠(管 \(H_t\)):从第 2 步开始,Agent 必须输出一个 <folding> 块。折叠指令 \(\phi_t = ([s_t, t], z_t)\),\([s_t, t]\) 是要压缩的历史区间,\(z_t\) 是生成的摘要。这里有个我觉得挺巧的设计——区分了两种粒度:\(s_t = t\) 是步级蒸馏(把最新一步压成紧凑记录),\(s_t < t\) 是跨步抽象(把一个完成的子任务整段总结成一条可复用记录)。它替换掉了那种不受控的 <conclusion> 堆积,把上下文增长从线性往次线性推。
UI 记忆动作(管 \(M_t\)):每条记忆是个三元组 \(m = (\text{id}, d, c)\)——唯一标识、简短描述、完整内容。注意论文这里强调了一点,我认为是整篇最关键的工程直觉:记忆写入存的是完整的、任务相关的原始信息,而不是引用或有损摘要。存的是"那个完整的价格 $129.99",而不是"之前看到的那个值"。当价格、验证码、联系方式必须熬过屏幕切换、长时间等待和 App 跳转时,这点至关重要。
自描述步输出(填 \(L_t\)):<ui_observation> 给出带精确可见文本/数字的屏幕描述,<action_intent> 说明这步工具调用想干啥。这两个字段让每一步都"可被未来的上下文动作复用"。论文有个发现挺诚实——如果没有这俩字段,折叠和记忆动作就只能从原始的 <thinking> 和 <tool_call> 里去猜这步啥意思,他们实测发现,把上下文动作硬叠到 ReAct 的 3 部分协议上是不够用的。
整个状态转移合起来就是:UI 动作改屏幕、记忆动作只改上下文,三个字段各自更新,喂进下一步。因为折叠、记忆、意图都由同一个多模态策略在一次前向里预测,压缩和记忆天然带着 Agent 的任务级理解,而不是甩给一个独立模块去拍脑袋。
📚 MemGUI-3K:为什么光有协议还不够,得让模型学
这里有个反直觉的发现,是我觉得这篇论文做得最扎实的地方。
你可能会想:ConAct 既然是个 prompt 协议,那直接套到各种尺寸的模型上不就行了?作者老老实实做了这个实验,结果是——不行。

图3:MemGUI-3K 的数据流水线。从 MemGUI-Bench 的 128 个种子任务出发,经过实体替换、记忆操作增强、任务简化三种策略扩展成 7,303 个任务池,5,293 个进入 rollout;Qwen3-VL-235B-Thinking 当教师用完整 5 部分 ConAct 协议执行,MemGUI-Eval+ 做评估、每一步打"合理/不合理"标签,双重过滤后最终得到 2,956 条轨迹、64,430 个 SFT 步样本。
回到那个"协议够不够"的问题。论文把同一套 5 部分 ConAct 协议零样本套到不同尺寸的 Qwen3-VL 上,结果是这样的:
| 模型尺寸 | Base P@1 | ConAct P@1 | Base P@3 | ConAct P@3 | Base IRR | ConAct IRR |
|---|---|---|---|---|---|---|
| Qwen3-VL-2B | 10.0 | 5.0 ↓ | 17.5 | 10.0 ↓ | 10.8 | 1.6 ↓ |
| Qwen3-VL-4B | 20.0 | 12.5 ↓ | 27.5 | 15.0 ↓ | 19.0 | 10.7 ↓ |
| Qwen3-VL-8B | 12.5 | 7.5 ↓ | 22.5 | 15.0 ↓ | 15.0 | 10.7 ↓ |
| Qwen3-VL-235B-Instruct | 23.4 | 19.5 ↓ | 36.7 | 28.9 ↓ | 29.2 | 32.5 ↑ |
| Qwen3-VL-235B-Thinking | 5.0 | 40.0 ↑ | 27.5 | 62.5 ↑ | 19.5 | 51.0 ↑ |
看明白了吗?在 MemGUI-Bench-40 上,只有最强的 235B-Thinking 套上 ConAct 才暴涨——P@1 从 5.0% 飙到 40.0%。其余的小模型、甚至 235B-Instruct,加了这套协议反而掉点。
这说明什么?主动上下文管理不是改个 prompt 格式那么简单。模型得真的学会:什么时候该折叠历史、什么时候该把 UI 事实写进记忆、怎么生成可复用的步描述。这些是需要监督信号去教的决策能力。这个观察直接撑起了 MemGUI-3K 存在的必要性——我挺欣赏这种"先证伪简单方案、再引出复杂方案"的写法,比上来就甩数据集有说服力多了。
数据集长什么样

图4:MemGUI-3K 全景。(a) 覆盖 26 个安卓 App、7 大类,Joplin、Amazon、Bing 这些是高频应用;(b) 轨迹平均 28.8 步、中位数 25,约为此前最长的移动 GUI SFT 数据集 GUIOdyssey(平均 15.3 步)的 1.9 倍;(c) 1,924 条(65.1%)轨迹用到了记忆动作;(d) 17,664 个(23.8%)折叠是跨步级摘要,平均跨度 6.25 步,88.7% 的轨迹至少有一次跨步折叠。
几个关键数字记一下:MemGUI-3K 最终含 2,956 条成功轨迹,跨 26 个 App,与 128 个 MemGUI-Bench 评测任务零重叠(这点很重要,避免了刷自家测试集的嫌疑)。抽取合理步后得到 64,430 个 SFT 样本(57,951 训练 + 6,479 测试)。步级合理性分析里,75.7% 的步被标为合理,平均每条轨迹 21.8 个可训练步。
训练用的是从 Qwen3-VL-8B-Instruct 出发、用 ms-swift 做 LoRA SFT,得到 MemGUI-8B-SFT。
🧪 实验:零样本反超 Gemini,8B 学完能跨基准迁移
评测在三个地方做:MemGUI-Bench、MobileWorld GUI-Only,以及用于消融和失败分析的 MemGUI-Bench-40。指标用 Pass@k(k∈{1,3})、IRR(信息保留率)、MTPR(记忆-任务熟练比)。

图5:(a) Lower Context Cost——ReAct 的 token 随步数一路爬升,ConAct 则平缓得多,在长程区(step 50 之后)差距拉开,第 150 步省下约 1.5k tokens;(b) Higher Success Rate——在 MemGUI-Bench 上 MemGUI-Agent-235B 的 Pass@3 冲到 62.5%(紫色柱),超过基于 Gemini-2.5-Pro 的 Agent-S2(49.2);MemGUI-8B-SFT(浅紫,35.9)也明显高于同尺寸基线。右半 MobileWorld 同样领先。
主结果:零样本 ConAct 在 MemGUI-Bench 上刷新 SOTA
先看 MemGUI-Bench 的主表,按难度(Easy 1–20 步 / Medium 21–40 步 / Hard 41+ 步)拆开:
| Agent | 类型 | Easy P@1 | Medium P@1 | Hard P@1 | Overall P@1 | Overall P@3 | Overall IRR |
|---|---|---|---|---|---|---|---|
| Agent-S2 (Gemini-2.5-Pro) | 记忆 Agent | 41.7 | 19.0 | 18.4 | 27.3 | 49.2 | 39.5 |
| M3A (Gemini-2.5-Pro) | 记忆 Agent | 39.6 | 35.7 | 21.1 | 32.8 | 47.7 | 39.3 |
| Qwen3-VL-235B-Thinking | Action-Thought | 18.8 | 28.6 | 26.3 | 24.2 | 46.9 | 30.0 |
| Qwen3-VL-8B-Instruct | Action-Thought | 18.8 | 4.8 | 2.6 | 9.4 | 20.3 | 15.1 |
| GUI-Owl-1.5-8B-Instruct | Action-Thought | 22.9 | 2.4 | 7.9 | 11.7 | 15.6 | 15.5 |
| MemGUI-Agent-235B(零样本) | ConAct | 41.7 | 35.7 | 34.2 | 37.5 | 62.5 | 46.8 |
| MemGUI-8B-SFT | ConAct | 25.0 | 23.8 | 21.1 | 23.4 | 35.9 | 30.2 |
几个值得拎出来的点:
MemGUI-Agent-235B 零样本拿到 37.5% Pass@1 / 62.5% Pass@3,超过了最强的智能体框架 M3A on Gemini-2.5-Pro(32.8% / 47.7%)。相比同骨干的 Qwen3-VL-235B-Thinking 基线,Pass@1 涨了 13.3 个点、IRR 涨了 16.8 个点。注意,这是零样本——权重一点没动,只换了 prompting 和动作协议。这个对比图5(a) 也补刀了:增益不是靠更大的 prompt 堆出来的,恰恰相反,ConAct 的 prompt 增长比 ReAct 平缓得多。
MemGUI-8B-SFT 从 9.4% 提到 23.4% Pass@1,而且增益集中在难任务上——Medium 涨 19.0、Hard 涨 18.5,Easy 只涨 6.2。这个难度趋势很能说明问题:MemGUI-3K 教的不是个新输出格式,而是在长程上下文漂移最严重的区间真正改善了行为。
跨基准迁移:MobileWorld 上同样能打
| Agent | 类型 | GUI-Only SR (%) |
|---|---|---|
| GUI-Owl-1.5-32B-Instruct | Action-Thought | 43.9 |
| GUI-Owl-1.5-8B-Instruct | Action-Thought | 38.2 |
| OpenMobile-8B(开放数据) | Action-Thought | 17.7 |
| Qwen3-VL-235B-Thinking | Action-Thought | 14.5 |
| Qwen3-VL-8B-Instruct | Action-Thought | 9.4 |
| MemGUI-Agent-235B(零样本) | ConAct | 29.1 |
| MemGUI-8B-SFT | ConAct | 17.9 |
MobileWorld 这个基准的环境、App 集、评测协议跟 MemGUI-Bench 全不一样。MemGUI-Agent-235B 零样本拿到 29.1% SR,比 Qwen3-VL-235B-Thinking 基线高 14.6 个点;MemGUI-8B-SFT 也有 17.9% SR(比骨干高 8.5 个点),在开放数据 8B 模型里排前列。换句话说,学到的上下文管理技能是真的能迁移的,不是只会在源基准上过拟合。
离线技能分析:到底学会了啥
光看端到端成功率有点黑盒,作者又在 MemGUI-3K 测试集(295 条轨迹、6,479 步)上做了步级离线评估,把每个子技能拆开看。结论挺有意思:
- UI 动作:匹配准确率从 29.2% 升到 36.3%,点击和输入涨得多——温和提升。
- 记忆时机:触发 F1 从 19.9% 暴涨到 48.0%,甚至超过零样本 235B 的 34.3%——涨得最猛。
- 深度折叠:MemGUI-8B-SFT 做到 26.1% 深度比、58.9% 深度区间准确率,而零样本 8B 只有 8.8% 深度比(gold 是 23.2%)。
- 格式合规:99.9%,结构化生成基本不出错。
论文给的洞察我很认同:MemGUI-3K 教的是上下文控制决策,不只是格式;最大的增益来自把转瞬即逝的观察提升为持久记忆。
消融:三个组件,缺一不可
这张消融表是全文的"题眼",直接验证了 ConAct 三件套的互补性(MemGUI-Bench-40,零样本 235B-Thinking):
| 变体 | P@1 | P@2 | P@3 | MTPR | IRR |
|---|---|---|---|---|---|
| ReAct 基线 | 5.0 | 20.0 | 27.5 | 0.143 | 19.5 |
| + UI 记忆动作 | 17.5 | 35.0 | 42.5 | 0.357 | 39.1 |
| + 历史折叠 | 22.5 | 25.0 | 32.5 | 0.179 | 25.7 |
| + 自描述步 | 25.0 | 40.0 | 45.0 | 0.214 | 33.1 |
| 完整 ConAct | 40.0 | 52.5 | 62.5 | 0.429 | 51.0 |
读这张表我停了一下。单看每个组件:UI 记忆动作把 Pass@1 从 5.0% 直接翻三倍到 17.5%,持久状态的价值立竿见影;历史折叠 Pass@1 到 22.5% 但 Pass@3 只有 32.5%,说明光压缩留不住关键事实;自描述步到 25.0%。可一旦三个合起来,Pass@1 冲到 40.0%、Pass@3 到 62.5%,远超任何单组件变体。
这就是关键。三者分工明确:折叠控制上下文增长,记忆保留精确事实,自描述给前两者提供 grounding。哪个单拎出来都不够。
失败分析:ConAct 治的是哪种病

图6:失败类型热力图。完整 ConAct 把总失败数从 99 砍到 58,降了 41%。降幅主要集中在两类:过程幻觉(从 52 降到 30,降 42%)和输出幻觉(从 30 降到 13,降 57%)。而知识缺陷(11)、意图理解(4)、其他(0)基本没动。
这张图说得很清楚:ConAct 主要治的是上下文引发的幻觉——过程幻觉(偏离流程或误以为某步已完成)和输出幻觉(拿到了 UI 证据却报错/存错事实)。但知识缺陷、意图理解这些跟上下文关系不大的失败,它管不着。论文的洞察很克制:剩下的天花板在于知识、意图理解和环境鲁棒性。 这种不夸大自己疗效的态度,我挺受用。
💡 我的判断:一次干净的"收编",但别神化
聊聊我的看法。
最值钱的地方,是它把"上下文管理"这件一直被当成外挂模块(记忆库、retriever、summarizer)的事,收编进了策略本体。让同一个模型在一次前向里既选动作又管上下文,这个统一带来的好处是实打实的——压缩和记忆继承了任务级推理,而不是交给一个啥都不懂的独立总结器去拍脑袋。那个"记忆写完整原始信息而非引用"的细节,看着朴素,但恰恰是长程任务里跨 App 传价格、传验证码不出错的命门。
那个模型尺寸消融也让我对这套方法多了几分信任。它没有藏着掖着说"我这协议放之四海皆准",而是诚实地展示了小模型套上去反而掉点——主动上下文管理是门需要学的手艺,不是换个 prompt 模板就白嫖的。这个发现本身就有价值。
不过有几个地方我会保持谨慎。
其一,MemGUI-3K 是用 Qwen3-VL-235B-Thinking 当教师蒸馏出来的,而零样本表现唯一能打的也正是这个 235B-Thinking。这里多少有点"自家教师教自家学生"的味道——8B 学到的上限,某种程度上被这个特定教师的行为模式框住了。换个骨干家族,ConAct 的零样本红利还在不在?论文没回答,我也不确定。
其二,绝对成功率还是偏低。MemGUI-Bench 上最好的 Pass@1 也才 37.5%,离"能放心交给它干活"还有距离。这不是贬低——长程移动 GUI 本来就难——但读者别被"反超 Gemini 框架"这种表述带飞,37.5% 的含义是十次里有六次第一遍就没做成。
其三,整套方法目前是 SFT,没上 RL。失败分析里那些没被治住的知识/意图问题,以及"记忆该写什么、何时折叠"这类决策的进一步优化,按理说是 RL 的天然战场。论文也把这个留作了未来工作。
对工程的启发
如果你也在做长程 Agent(不限于 GUI,长文档处理、多轮工具调用都算),这篇论文有两个思路值得抄:
- 别再无脑往 context 里 append 了。把上下文显式拆成"可压缩的历史 / 必须精确保留的硬事实 / 新鲜的最近记录"三类,让模型自己决定怎么维护——哪怕你不训练,光是这个结构化拆分本身,在足够强的骨干上就有红利。
- 记忆要存完整原文,不要存引用。"那个之前看到的值"这种有损指代,是长程任务里事实丢失的重灾区。
🔗 写在最后
MemGUI-Agent 不是那种横空出世改写一切的工作,它更像是一次思路清晰、执行扎实的"整合与收编"——把散落在外挂模块里的上下文管理,干净利落地塞回了策略本体,并且用一个尺寸消融诚实地告诉你"这玩意儿得学"。对长程 Agent 这个方向,我觉得 ConAct 这种"把上下文管理当一等动作"的范式,很可能会成为后续工作的一个标准组件。
代码、数据和模型作者说会在 https://memgui-agent.github.io/ 放出,感兴趣的可以蹲一下。
(本文基于 arXiv:2606.19926 解读,数据与图表均来自论文原文。)
觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我