在 智能体强化学习总览 和 GUI 智能体 里, 我们已经反复看到一个现象: 现在的多模态智能体 (Multimodal Agent) 不缺工具, 缺的是稳定地选择、组合和复用工具的能力.
XSkill

论文 [] Unknown-material 不更新模型参数, 而是从历史多模态工具调用轨迹中提炼两类外部知识:
- 经验 (Experience): 面向局部决策的条件-动作建议
- 技能 (Skill): 面向任务流程的结构化工作流和工具模板
论文把当前多模态智能体的问题概括为两点:
- 工具使用低效. 模型可能对简单问题过度调用工具, 对复杂问题又探索不够深.
- 工具编排僵硬. 很多系统偏向单路径执行, 缺少跨任务迁移的工具组合模式.
XSkill 认为这两个问题需要两种粒度不同的知识来解决. 技能负责高层结构, 经验负责局部策略.
知识表示
论文把技能库和经验库分开维护:
$$ KB=(K,E) $$其中 $K$ 是 Markdown 形式的 Skill Library, $E$ 是 JSON 形式的 Experience Bank.
技能定义为:
$$ k=(M,W,P) \in K $$$M$ 是元信息, 包括技能名称、描述和版本; $W$ 是工作流序列; $P$ 是可复用工具模板. 比如一个视觉识别技能里, $W$ 可能包含“检查朝向、裁剪目标、增强图像、搜索图片来源”的流程, $P$ 则包含 Python 图像旋转、裁剪、放大的代码模板.
经验定义为:
$$ e=(c,a,v_e) \in E $$$c$ 是触发条件, $a$ 是建议动作, $v_e$ 是用于检索的语义向量. 论文限制单条经验的文本长度, 使它更像短的策略性 prompt, 而非完整轨迹复述.
问题建模
论文把多模态工具调用任务建模成 POMDP. 一个任务为:
$$ T=(q,I) $$其中 $q$ 是自然语言问题, $I=\{I_1,I_2,\ldots,I_m\}$ 是相关图像集合. 工具集合为:
$$ F=\{f_1,f_2,\ldots,f_n\} $$包括代码执行、网页搜索、图片搜索、网页访问等. 每一步 agent 根据当前状态和观察选择工具动作, 形成轨迹:
$$ \tau=[(s_0,a_0,o_0),\ldots,(s_T,a_T,o_T)] $$最终构造外部知识库:
$$ \max_{KB} P[\hat{y}=y^\ast \mid T, KB] $$整体框架
XSkill 分成两个阶段: 积累 (Accumulation) 和求解 (Inference). 论文中还区分了两个模型角色:
- $\mathrm{MLLM}_{exec}$: 负责实际执行工具调用和回答问题.
- $\mathrm{MLLM}_{kb}$: 负责总结轨迹、抽取经验、合并技能、重写检索结果.
算法XSkill: 双流知识循环
输入 > 训练任务集合 $\mathcal{D}_{train}$, 测试任务 $T=(q,I)$, 工具集合 $F$, 执行模型 $\mathrm{MLLM}_{exec}$, 知识管理模型 $\mathrm{MLLM}_{kb}$, 技能库 $K$, 经验库 $E$.
输出 > 最终答案 $\hat{y}$, 更新后的知识库 $KB=(K,E)$.
- 对训练任务 $T_i=(q_i,I_i)$ 执行 $N$ 条独立 rollout: $$ R_i=\{\tau_i^{(1)},\ldots,\tau_i^{(N)}\} $$
- 用 $\mathrm{MLLM}_{kb}$ 对轨迹、图像、问题和标准答案做视觉锚定总结: $$ S_{R_i},\Delta K_i=\mathrm{MLLM}_{kb}(R_i,I_i,q_i,y_i^\ast,K_{adapted}) $$ 其中 $S_{R_i}$ 记录关键决策点、工具模式和失败原因, $\Delta K_i$ 是从成功轨迹中抽出的技能片段.
- 做跨 rollout 批判 (Cross-Rollout Critique), 对成功和失败轨迹进行对比: $$ \Delta E_i=\mathrm{MLLM}_{kb}(S_{R_i},y_i^\ast,E_{ret}) $$
- 将 $\Delta E_i$ 中的经验加入 Experience Bank, 对相似经验按向量相似度合并, 并删除低质量或过度具体的条目.
- 将 $\Delta K_i$ 合并到 Skill Library, 对冗长技能做压缩、去重和变量化.
- 对测试任务 $T=(q,I)$, 先把问题分解成若干抽象子任务: $$ G=\{g_1,\ldots,g_{n_g}\} $$
- 对每个子任务检索相关经验: $$ E_{ret}=\bigcup_{g\in G}\mathrm{Top}\text{-}k(\{e\in E\mid \cos(v_g,v_e)>\tau_{min}\}) $$
- 结合当前图像和问题重写经验: $$ E_{rewritten}=\mathrm{MLLM}_{kb}(E_{ret},q,I) $$
- 结合重写后的经验, 对全局技能文档做任务适配: $$ K_{adapted}=\mathrm{MLLM}_{kb}(K,E_{rewritten},q,I) $$
- 将 $K_{adapted}$ 和 $E_{rewritten}$ 作为非强制参考注入 system prompt, 由 $\mathrm{MLLM}_{exec}$ 执行工具调用并输出答案.
- 记录实际使用了哪些技能和经验, 将使用历史回流到下一轮积累.
可以看到, XSkill 在总结、检索和改写时都显式把图像观察放进去了.

积累阶段
rollout summary. $\mathrm{MLLM}_{exec}$ 对同一个训练任务执行 $N$ 次, 得到成功和失败轨迹. $\mathrm{MLLM}_{kb}$ 看到的是完整多模态上下文: 图像、工具调用、中间输出、最终答案和 ground truth.
然后是 cross-rollout critique. 这一步对比成功和失败轨迹, 抽取导致结果差异的因素, 输出对经验库的结构化操作:
$$ \Delta E_i=\{op_1,op_2,\ldots,op_M\} $$每个操作是 add 或 modify. 如果新经验和已有经验相似度超过阈值, 系统会让 $\mathrm{MLLM}_{kb}$ 合并这些条目.
技能库的合并也类似. 从 rollout 中抽出的 workflow 和 tool template 会被合并进全局 Markdown 技能文档. 当技能文档超过长度阈值时, 系统会删除过度具体的细节. 这一步把 agent 轨迹整理成一份会不断演化的 SKILL.md.
推理阶段
推理阶段有三个设计点: 任务分解、上下文改写、非强制注入.
直接用原始问题去检索经验通常不够好, 所以 XSkill 先让 $\mathrm{MLLM}_{kb}$ 根据问题和图像分解出多个技术子任务, 再分别检索经验. 检索到的经验也不会直接塞进 prompt. 系统会先做 experience rewrite, 把通用经验改写成当前任务相关的建议.
随后系统会做 skill adaptation, 从全局技能库中剪掉无关章节, 把相关经验融进工作流, 并调整代码模板. 论文强调注入方式是非强制的参考.