MMSkills:迈向通用视觉智能体的多模态技能库 MMSkills: Towards Multimodal Skills for General Visual Agents
把"文本步骤+状态卡片+多视图关键帧"打包成可复用的多模态技能,用分支加载避免污染主上下文
前置知识
视觉智能体(Visual Agent)
以截图或游戏画面作为观测、输出 pyautogui 代码或键鼠动作的 LLM 代理。它不依赖 DOM/accessibility tree 这类结构化接口,而是让 VLM 直接看像素做决策。代表场景包括 OSWorld 这类 Ubuntu 桌面任务和 Minecraft 这种开放视觉游戏。
本文核心对象就是这类只能看图的智能体,传统文本技能无法覆盖它们"识别屏幕处于哪种状态"的决策需求。
过程性知识(Procedural Knowledge)
关于"如何做一件事"的知识,与陈述性"是什么"的知识相对。在智能体语境下常以可复用技能、动作图、轨迹摘要的形式存储,包括前置条件、操作步骤、终止判定等元数据。
MMSkills 重新定义技能包为多模态过程性知识,必须同时绑定"动作如何执行"和"视觉证据如何判断进度",是该概念的多模态扩展。
渐进式披露(Progressive Disclosure)
系统不在主上下文一次性加载所有信息,而是先按需检索/过滤再注入,常见于 RAG、agent 记忆管理、长上下文压缩。分支加载正是这一思想的多模态版本。
MMSkills 把技能包塞进主轨迹会污染上下文、让模型被参考截图锚定,分支加载是针对该问题的渐进披露方案。
轨迹到技能(Trajectory-to-Skill)
从大量交互轨迹中归纳出可复用技能的离线 pipeline。传统方法只产出文本流程,本文扩展到同时产出"可识别状态 + 视觉证据",是难度的核心来源。
理解 Generator 的五阶段流水线(embed→cluster→plan→merge→draft→ground+audit)是掌握论文方法论的关键。
长上下文失败模式
经验上 LLM 对放在长上下文中部的信息检索能力下降,多模态参考图与现场截图同窗还会竞争注意力。Liu et al. 2023 的 "lost in the middle" 是经典证据。
论文明确指出分支加载是为了规避该现象,强行把所有视图塞进主轨迹会让智能体"被示例截图带偏"。
研究动机
现有智能体技能库(SkillWeaver、CUA-Skill、SkillX 等)几乎都把可复用行为编码为文本提示、可执行代码或执行图。这种文本优先的设计在语言足以抽象状态时是有效的,但对视觉智能体远远不够:一个桌面代理也许知道"先打开图表向导再选子类型",却识别不到对话框尚未就绪;一个游戏代理也许知道"先采矿再合成",却无法在视觉上区分"正在挖"和"挖到了"。论文 Figure 1 给出了真实失败示例——同一个"在 Sheet2 创建 Sales & COGS 图表"任务,文本技能引导代理走 Wizard 流程却丢失当前活动 sheet 信息,最终图表被错误地放在 Sheet1,得分 0.0。换句话说,过程性知识在视觉场景里天然就是多模态的:能否复用不仅取决于"该执行什么动作",还取决于"能否识别相关状态、解读进度或失败的视觉证据、决定下一步做什么"。仅靠文本,技能既冗长又欠说明;保留整段演示又冗长、绑定特定实例、难以适配。OSWorld 上弱模型 Qwen3-VL-8B-Instruct 不带技能时仅有 10.78% 成功率,说明文本不足的问题在弱模型上更突出。
本文的目标是论文目标是为视觉智能体定义并落地一套"多模态过程性知识"框架 MMSkills,让可复用技能同时绑定三类信息:文本化的操作流程、运行时状态卡片(when-to-use/when-not-to-use/可见线索/校验线索)、多视图关键帧(full_frame + focus_crop + before + after),并通过分支加载机制在推理时按需消费这些证据,而不被参考截图带偏。具体要回答三个工程问题:(I) 多模态技能包里应该装什么;(II) 这些包能从哪些公开的非评测轨迹中生成;(III) 智能体如何在推理时调用多模态证据而不撑爆上下文。
与已有工作不同的是,已有工作要么停留在文本技能(SkillWeaver、CUA-Skill、SkillClaw、SkillRL 等),要么引入多模态经验但缺乏显式状态节点(Mirage-1、XSkill、MuSEAgent),而 MMSkills 的独特切入角度是把技能设计成"以状态节点为中心"的可复用包:每张状态卡都不是图像说明,而是带 when-to-use/when-not-to-use/visible_cue/verification_cue/available_views 的决策节点,并辅以多视图关键帧。再叠加分支加载——把昂贵的多模态阅读隔离到临时分支,只把结构化 guidance 写回主轨迹,这是已有文本技能库没有的运行时机制。Generator 还强调使用"公开非评测轨迹 + 元技能审计",区别于手工编写技能或直接回放演示。
核心方法
MMSkills 由三块组成:(A) 多模态技能包 $\mathcal{M} = (D, P, S, K)$,包含紧凑描述 $D$、可复用文本流程 $P$、运行时状态卡集合 $S = \{S_j\}_{j=1}^m$、对应的关键帧束 $K = \{K_j\}_{j=1}^m$;(B) 轨迹到技能生成器,将公开非评测轨迹池 $\mathcal{T}_d$ 经五阶段流水线映射为领域技能库 $\mathcal{M}_d$;(C) 分支加载的多模态技能智能体,主轨迹先做 $\text{LOAD\_SKILL}(M_t)$,临时分支先做 gated view selection、再做 branch planning,返回结构化 guidance $G_t = (\text{applicable}_t, \text{subgoal}_t, \text{plan}_t, \text{do\_not\_do}_t, \text{verify}_t)$。直觉上可以这样理解:传统文本技能像一份说明书,只告诉模型"该做什么";MMSkills 把说明书升级成"带现场照片的检查清单",每一步都附带"什么时候该用/不该用、看到什么算到位",并通过"先在侧链核对、再回报主线"的方式避免参考照片抢走当前屏幕的注意力。
两个层面的本质区别。第一个层面是表示层面:已有文本技能是 $(\text{D}, P, \emptyset, \emptyset)$ 的退化形态,MMSkills 把 $(\text{D}, P, S, K)$ 作为最小单元,其中每张状态卡不是图像描述而是带决策属性的状态节点 $(when\_to\_use, when\_not\_to\_use, visible\_cues, verification\_cue, V_j)$,关键帧束 $K_j = \{K_{vj}: v \in V_j, v \in \{\text{full\_frame}, \text{focus\_crop}, \text{before}, \text{after}\}\}$ 提供视觉锚点。第二个层面是加载层面:已有技能检索系统直接把 skill 内容塞进主上下文,这在 MMSkills 上会因多视图与现场截图竞争注意力而崩盘,因此引入 branch loading——主代理输出 $\text{LOAD\_SKILL}$,临时分支两阶段处理后只返回 JSON 化的结构化 guidance,主代理仍以 live screenshot 为准选动作。这一"渐进披露的多模态版本"是相对 Mirage-1(搜索增强的多模态技能)和 XSkill(持续经验抽取)的本质差异。
方法步骤详情
Generator 五阶段流水线(每个 $r \in R_d$ 的终态写作 $M_r = (D_r, P_r, \tilde{S}_r, \tilde{K}_r)$)。Phase 0 嵌入聚类:对任务指令与轨迹元数据做 embedding,按语义聚成 $C_d$,OSWorld 上 Ubuntu 9 个领域产生 73 个 cluster(Table 5)。Phase 1 cluster-level 规划:LLM 代理为每个 cluster 提出原子技能,标注 workflow 边界、完成条件、覆盖任务 id,得到 $A_d$。Phase 2 合并去重:把 cluster 间的重叠技能合并并泛化为 $R_d$,拒绝过于宽泛的 umbrella skill。Phase 3 文本优先草拟:不读图,依据参考任务写出描述 $D$、文本流程 $P$、规划好的状态卡,得到 $\tilde{M}_r$。Phase 4 图像落地与审计:读选定的关键帧、grounding focus 区域、构造多视图束 $K$,再由 multimodal-skill-factory meta-skill $F$ 走质量门审计,最终产出 $M_r$。视觉落地策略保守——只为状态识别、过渡对比、完成校验添加视图,不存储原始演示。运行时分支加载(Algorithm 1)。候选技能 $C_I$ 在回合前根据任务指令 $I$ 和紧凑描述预召回。主代理每步要么直接决策,要么触发 $\text{LOAD\_SKILL}(M_t)$,进入分支:(1) Stage 1 gated view selection:$(J_t, R_t) = \text{SelectViews}(O_t, H_{t-1}, P_t, S_t)$,输出选中的状态卡索引 $J_t$ 和视图集 $V_t = \{K_{vj}: j \in J_t, v \in R_{t,j}\}$,如果文本与状态卡足够,$V_t$ 可为空;(2) Stage 2 branch planning:$G_t = \text{PlanBranch}(O_t, H_{t-1}, P_t, \{S_j: j \in J_t\}, V_t)$,返回结构化 JSON,含 applicability、subgoal、plan、do_not_do、fallback_if_no_progress、expected_state、completion_scope。主代理以 $G_t$ 为决策辅助,仍以 live screenshot 选落地动作 $A_t$。Prompt 模板中明确禁止分支返回 GUI 动作,要求"以当前截图优先,参考视图永远不是坐标模板",并给出 LOAD_STATE_VIEWS 的规范 JSON(visual_reference_needed、why_not_text_only、requests[])。
技术新颖性
技术新颖性主要在三处。第一,多模态状态节点的 schema 设计——把状态卡从"图像描述"提升为带 when-to-use/when-not-to-use/verification_cue 的决策节点,使其在 RAG/检索召回阶段就可被语义化筛选;这一点是文本技能库所没有的。第二,branch loading 把昂贵多模态阅读隔离到临时分支,主轨迹只接收 ~10 个 JSON 字段。该机制刻意避免 reference screenshots 抢占当前屏幕注意力,并避免长上下文的 "lost in the middle" 问题(Liu et al. 2023)。第三,meta-skill-guided 生成器——把多阶段质量门、聚类、合并、grounding 等都封装进可复用 $\mathcal{F}$,同时声明外部服务仅限于 embedding/clustering/grounding 这类有界支持,使得生成过程可控且可审计。消融(Figure 3A)显示同时移除状态卡与图像都会降低性能,证明两者互补;分支加载在纯文本技能上也已有增益(Branch-loaded text-only 普遍优于 Direct text loading),说明分支本身就是贡献。
实验结果
RQ1 总性能(Table 1、Table 2)。OSWorld 360 题,Gemini 3.1 Pro overall 从 44.08% 提升到 50.11%(+6.03pp),其中 Chrome 从 53.47% → 59.91%、GIMP 从 34.62% → 50.00%、Writer 从 47.82% → 60.86%、VLC 从 35.29% → 70.59%、VS Code 从 56.52% → 65.22%;Gemini 3 Flash 从 36.65% 提升到 47.97%(+11.32pp),多应用任务从 21.51% → 30.98%、OS 从 54.17% → 75.00%;Qwen3-VL-235B 从 21.34% 跃升到 39.17%(+17.83pp),是所有模型中相对增益最大的,Chrome 从 15.56% → 59.91%、GIMP 从 38.46% → 69.23%、Thunderbird 从 26.67% → 73.33%;GLM-5V 从 28.71% → 38.51%;Kimi-K2.6 从 34.98% → 46.59%;弱模型 Qwen3-VL-8B-Instruct 从 10.78% → 25.40%(+14.62pp)。macOSWorld 143 题上,Gemini 3 Flash 从 47.55% → 51.75%(+4.20pp),GLM-5V 从 34.97% → 51.75%(+16.78pp),弱模型 Qwen3-VL-8B 仍从 6.29% → 6.29%(持平)。VAB-Minecraft 上 Gemini 3 Flash 成功率 55.94% → 65.73%、Qwen3-VL-235B 47.55% → 62.07%、Qwen3-VL-8B 23.28% → 38.79%(最大跨环境提升);Super Mario Bros 上 Total reward 普遍提升 100+,Gemini 3 Flash 从 766.67 → 1081.33。RQ2 消融(Figure 3)。Panel A 移除状态卡或图像都会让 MMSkills 相对 no-skill 的收益缩水,OSWorld 上 Qwen3-VL-235B 完整包比去掉 image 多 6pp 左右;Panel B 对比 direct-full / direct-selected / branch-full / branch-selected 四种加载方式,分支加载在多数 (model, benchmark) 上优于直接加载,view selection 在分支加载之上仍有正贡献。RQ3 交互动态(Table 3)。MMSkills 召唤率显著高于纯文本:OSWorld 上 Qwen3-VL-235B 从 37.50% → 65.28%,VAB-Minecraft 上 Gemini 3 Flash 从 68.97% → 81.90%。MMSkills 同时缩短轨迹——Qwen3-VL-235B 在 OSWorld 上 steps 从 16.92 → 9.87(Δ = -5.35),VAB-Minecraft 上从 34.74 → 27.07(Δ = -7.67)。视图分布:focus_crop 远多于 full_frame,例如 OSWorld Gemini 3 Flash 79 full / 241 focus / 8 before / 24 after。RQ4 行为偏移(Figure 4)。Qwen3-VL-235B 点击占比从 75.8% → 63.7%,键盘与 DONE 动作上升;exact repeated actions 从 21.8% → 6.2%,最大同模式连续执行长度大幅缩短——说明智能体从"探索式试错"转向"基于状态的稳定执行"。
查看结构化数据
| 任务 | 指标 | 本文 | 基线 | 提升 |
|---|---|---|---|---|
| OSWorld(Ubuntu 桌面,360 题) | 成功率(Overall) | Gemini 3 Flash 47.97%、Qwen3-VL-235B 39.17%、Qwen3-VL-8B 25.40%、Kimi-K2.6 46.59%、Gemini 3.1 Pro 50.11%、GLM-5V 38.51% | No-skill 同模型:36.65% / 21.34% / 10.78% / 34.98% / 44.08% / 28.71% | +11.32pp / +17.83pp / +14.62pp / +11.61pp / +6.03pp / +9.80pp |
| macOSWorld(macOS 桌面,143 题) | 成功率(Overall) | Gemini 3 Flash 51.75%、GLM-5V 51.75%、Qwen3-VL-235B 51.75%(与 no-skill 47.55% 对比) | No-skill:47.55% / 34.97% / 47.55% | +4.20pp / +16.78pp / +4.20pp |
| VAB-Minecraft(VisualAgentBench) | 成功率 | Gemini 3 Flash 65.73%、Qwen3-VL-235B 62.07%、Qwen3-VL-8B 38.79% | No-skill:55.94% / 52.59% / 23.28% | +9.79pp / +9.48pp / +15.51pp(弱模型跨环境增益最大) |
| Super Mario Bros(LMGame-Bench) | Total reward | Gemini 3 Flash 1081.33、Qwen3-VL-235B 1514.25 | No-skill:766.67 / 955.50 | +314.66 / +558.75 |
| OSWorld 行为:重复动作抑制 | Exact repeated actions(占交互比例) | Qwen3-VL-235B + MMSkills = 6.2% | Qwen3-VL-235B no-skill = 21.8% | -15.6pp(重复行为大幅下降) |
局限与改进
作者在 Conclusion 中明确承认三点局限:(1) 技能生成依赖源轨迹覆盖度,OpenCUA 与 VAB 训练集的领域分布直接限制技能包的可生成范围,OSWorld 多应用领域只有 20 个技能(Table 6),覆盖稀疏;(2) 生成与 grounding 阶段可能引入错误,例如 focus crop 圈错控件、状态卡 when_to_use 描述不准;(3) branch loading 增加一次甚至两次额外 LLM 调用,推理成本与延迟显著上升(论文正文虽未给出量化延迟,但 Gemini 3.1 Pro 与 Kimi-K2.6 因高成本只能在 OSWorld 上跑三条件)。此外我的观察:(a) 弱模型 Qwen3-VL-8B 在 macOSWorld 上 MMSkills 与 no-skill 持平(6.29%),说明对于与源轨迹领域差异较大的环境,技能不一定能跨平台迁移;(b) MMSkills 平均为每个任务匹配 1.21 个技能,但阈值与召回策略对失败案例影响明显,论文未做 skill 召回失败分析;(c) focus crop 被选比例高,但 grounding 错误会直接把智能体引向错误控件;(d) 整个评估依赖 OSWorld/Minecraft/Mario 的固定任务集,没有在线或长程任务,技能对分布漂移的鲁棒性未验证。
独立分析的弱点
独立观察到的弱点与改进方向。第一,Generator 五阶段完全依赖 LLM-as-agent,缺乏形式化约束:Phase 1 cluster plan 与 Phase 4 audit 都靠 prompt 把关,若 LLM 漏判"过度宽泛 umbrella skill"则下游状态卡会过载。可改进方向:引入类型化 schema(如 Pydantic)做硬约束 + 自动覆盖率指标。第二,状态卡的 visible_cue 是自然语言而非可机检的视觉谓词,运行时仍要靠 LLM 比对当前截图。改进方向:把 visible_cue 同时落成可调用的视觉定位函数(如 "查找 sidebar 中带 + 的元素"),让 Stage 1 可结构化决策。第三,branch loading 始终走两阶段 LLM 调用,对弱模型不友好。改进方向:设计 fallback——若 Stage 1 判定 text-only 直接进入 Stage 2,并允许 Stage 2 复用主模型而非独立调用,进一步压低延迟。第四,跨平台迁移差:Qwen3-VL-8B 在 macOSWorld 上完全没增益(6.29%),说明 Ubuntu 训练的技能不能直接给 macOS 用。改进方向:把 domain descriptor 与平台解耦,加入 platform-aware 的 skill canonicalization。第五,缺乏错误恢复机制:技能若误导了一次动作,没有在线 repair loop,只能等主代理自我纠正。改进方向:引入 verifier 角色——若 Stage 2 输出后两步未推进,回滚到 no-skill 模式或触发另一技能。
未来方向
作者在 Limitations 与 Broader Impact 中点出未来方向:扩展到 embodied/安全敏感场景时需要更强的 verification 与在线 skill repair。我的延伸设想:(1) 实时技能增量更新——用 agent 自身的成功/失败轨迹做 online distillation,类似 Voyager 但限定在视觉状态节点上;(2) 与 GUI grounding benchmark(ScreenSpot-Pro、MMBench-GUI)耦合,把 visible_cue 落地为 grounding 模型可执行的子任务,让 Stage 1 可由 grounding 模型替代 LLM;(3) 安全与隐私维度——Broader Impact 已提到,需要给技能库加 provenance、敏感信息过滤、permission scope 元数据;(4) 多模态 RAG 与 branch loading 的统一接口——目前两个阶段都是 prompt 工程,未来可抽象为 typed guidance protocol,支持第三方技能贡献;(5) 长程任务与子目标规划——把状态卡序列升级为状态机,配合 symbolic planner 处理 multi-app 工作流。
复现评估
代码与数据:作者明确给出 GitHub 仓库 https://github.com/zkangning/MMSkills_for_Visual_Agents、技能源数据集 huggingface.co/datasets/zhangkangning/mmskills、论文主页 zkangning.github.io/MMSkills_for_Visual_Agents/。开源程度较高,技能库与 prompt 模板(Appendix E)都公开。算力门槛:评估主要跑在 AWS 上,Gemini 3.1 Pro 与 Kimi-K2.6 因成本仅做了 OSWorld 三条件;其他模型覆盖 macOSWorld、VAB-Minecraft、Mario。OSWorld 全跑约需 6 个模型 × 3 条件 × 360 题 × 最多 20 步,对中小实验室是中等门槛。复现难度:方法本身的难点在 Generator——五阶段 LLM pipeline 对 prompt 设计与 meta-skill 质量依赖大,作者给出 Stage 1/Stage 2 的完整 prompt,但 Phase 0–4 的细节只在正文概述,Appendix 没完全披露。运行时分支加载本身实现较轻。整体评估中等难度。
论文图表
以"在 Sheet2 创建 Sales & COGS 图表"任务为对比示例。左侧展示一个 MMSkill 包的结构:SKILL.md 描述何时使用、Procedure、Title 必须精确匹配指令;State_cards.json 列出 chart_exact_title_entry / chart_subtype_selected / finished_chart_visible 等状态卡,每张配 full frame 与 focus crop;右侧对比无技能 / 纯文本技能 / MMSkills 三种条件下代理的最终结果——前两者因丢失"当前活动 sheet"信息把图建在 Sheet1(得分 0.0),MMSkills 通过 branch loading 返回状态感知的 guidance(如"把图移动到 Sheet2"),最终得分 1.0。
是论文最核心的动机图,把抽象的"多模态过程性知识"具体化为一张技能卡与一次失败对比,读者第一眼理解 MMSkills 的价值。