为什么需要「技能内化」?
Agent 技能(Skills)是一组结构化的操作指南,教 LLM Agent 怎么用工具、怎么完成多步任务。当前主流做法是在推理时从技能库检索相关技能,注入到 prompt 里。这很有效,但有三个根本性缺陷。
推理时技能增强 Skill Augmentation
- 检索噪声:检索到不相关或误导性的技能,污染上下文
- Token 开销:注入的技能内容在多轮交互中持续累加
- 表面执行:模型在「执行」技能,不是在「学习」——能力驻留在 context 而非参数里
技能内化 Skill Internalization(Skill0)
- 零检索:推理时不需要任何技能库
- 极低开销:每步不到 0.5k tokens
- 真正习得:技能被编码进模型参数,实现 zero-shot 自主行为
直接用 RL 训练可以吗?作者发现两头都不行:不给技能,Agent 缺乏结构化指导,学不会复杂多步行为;全程给技能,模型形成依赖,一撤走技能就崩溃。Skill0 的核心思路是设计一个从「有」到「无」的训练过程,把能力从 context 搬到 parameters。
Skill0 之前,别人怎么做的?
Skill0 直接建立在两个工作之上:AgentOCR 解决了「怎么压缩 agent 历史」,SkillRL 解决了「怎么在 RL 中利用技能」。理解它们才能理解 Skill0 到底改了什么。
Skill0 = AgentOCR 的压缩方案 + SkillRL 的技能库 + 全新的内化目标
AgentOCR 告诉你怎么省 token,SkillRL 告诉你怎么用技能做 RL,但两者都没回答「能不能不要技能」。Skill0 在它们的基础上加了一层:通过动态课程逐步撤除技能,把能力从 context 搬到 parameters。
Skill0 方法总览
Skill0 包含三个协同工作的组件。它们共同实现「训练时给技能、推理时归零」的目标。
上图是论文的核心架构图。三个组件的关系可以简要概括为:
相关性驱动的
技能分组
按任务类别离线组织技能库,减少检索噪声
上下文强化学习
(ICRL)
训练时将技能作为 context,推理时移除,RL 驱动内化
动态课程
Dynamic Curriculum
按帮助性逐步撤除技能,直到预算归零
下面我们逐一展开每个组件。先从技能管理和上下文渲染讲起,再看 ICRL 的训练目标,最后看动态课程如何自适应地「撤除脚手架」。
In-Context 强化学习(ICRL)
ICRL 是 Skill0 的训练核心:在 rollout 时把技能放进 context 让 Agent 参考,但推理时全部移除。RL 的优化目标直接驱动模型把 context 里的知识编码进参数。
前置:技能分组(Skill Grouping)
在训练开始前,Skill0 先把技能库离线组织好。技能按任务类型 + 技能类别分组,每组存成一个 Markdown 文件,形成目录结构:
每个文件里包含若干条结构化的技能规则,格式是「技能名 → 什么时候用 → 具体怎么做」。比如 clean.md 里会写:「Phase-Ordered Plan:执行固定序列 (1) 找到并拿起目标 (2) 去水槽清洗 (3) 导航到目标位置 (4) 放下」。
这种按文件分组的设计有两个好处:一是避免了推理时逐条检索的噪声——不需要语义检索,直接按任务类型选整个文件;二是动态课程的操作粒度是文件级,评估帮助性、移除、保留都是以一个 .md 文件为单位,而不是单条技能。ALFWorld 共 6 个文件,Search-QA 共 5 个文件,这就是预算 M 的上界来源。
视觉上下文渲染
为了压缩 token 开销,Skill0 将交互历史 + 技能文本渲染成一张 RGB 图片,由视觉编码器压缩为 visual embedding。模型甚至能自己决定压缩比例——成功完成任务时,更高的压缩率会获得额外奖励。
为什么用图片?
纯文本的历史记录和技能描述会让 prompt 越来越长。Skill0 把它们渲染成图片,配合 VLM 的视觉编码器,token 消耗从 2k+ 降到不足 0.5k。渲染时用颜色编码区分信息类型(黑色=任务指令,蓝色=环境观察,红色=执行动作)——本质上和文本里的 special token 是同一思路,只是标记载体从 token embedding 换成了 RGB 像素,让视觉编码器扫一眼颜色就能分辨信息结构,而且不额外占 token。
训练目标
ICRL 使用复合奖励,同时优化任务成功和压缩效率:
关键点在于:技能只在训练 rollout 时存在。模型在训练时可以参考技能来完成任务、获得奖励,但 RL 的梯度更新迫使它把这些知识固化到参数里。随着动态课程逐步移除技能,模型必须越来越依靠自身能力。
动态课程:自适应撤除脚手架
训练被划分为多个阶段,阶段之间预算线性缩减(如 [6, 3, 0]),阶段内部预算固定,每隔 d 步重新评估保留哪些技能。两层逻辑各管一件事:跨阶段控制「总共还给几个技能」,阶段内控制「给哪几个」。
跨阶段:预算线性衰减
训练共 NS = 3 个阶段,预算 M 按线性从满额衰减到 0。以 ALFWorld(共 6 个技能文件)为例:阶段 1 预算 M=6,阶段 2 M=3,阶段 3 M=0。这是一条硬上界——不管帮助性多高,阶段 3 就是不给任何技能,逼模型纯靠参数做。
阶段内:每隔 d 步筛选「给哪几个」
每个阶段内部,每隔 d=10 个训练步,在验证集上用当前策略重新评估所有技能的帮助性,然后做三步筛选:
Step 1:帮助性评估
对每个技能文件,分别测试「有该技能」和「无该技能」时的成功率,差值 Δk 即为帮助性。Δk > 0 说明模型还没学会,需要这个技能;Δk ≤ 0 说明已经内化,不需要了。
Step 2:过滤 & 排序
丢弃所有 Δk ≤ 0 的技能(已内化),剩余按 Δk 降序排列——排在前面的是模型最需要帮助的技能。
Step 3:按预算截取
保留排名前 M 个。预算有限时,优先保留模型最薄弱的技能,让 RL 集中火力去内化它们。
交互演示:多阶段训练中技能如何逐步消失
为什么不能固定预算或随机选?
消融实验显示:不过滤(跳过 Δk > 0 的筛选,直接塞满预算)会引入已经内化的或无用的技能,反而干扰训练,性能下降 2.7%;不排序(通过过滤后不按 Δk 降序排列,而是随机选 M 个)更灾难性,可能选到帮助性很低的技能、丢掉模型最需要帮助的那几个,移除技能后性能暴跌 13.7%。只有「过滤 + 按帮助性排序 + 截取 top-M」三步完整执行,才能在移除技能后反而获得 +1.6% 的提升——这意味着技能真正被内化了。
几个有意思的发现
论文中有几个观察值得单独拎出来说。
实验结果一览
在 ALFWorld(家庭环境任务)和 Search-QA(搜索问答)两个 benchmark 上,Skill0 以极低的 token 成本实现了顶尖性能。
ALFWorld 成功率(%)· Qwen2.5-VL-3B
| 方法 | Pick | Look | Clean | Heat | Cool | Pick2 | Avg | Token/步 |
|---|---|---|---|---|---|---|---|---|
| Zero-Shot | 27.0 | 24.3 | 4.5 | 20.5 | 10.2 | 0.0 | 15.2 | 1.21k |
| GRPO | 92.6 | 85.7 | 70.6 | 86.6 | 79.3 | 65.0 | 79.9 | 1.02k |
| AgentOCR | 91.9 | 81.8 | 76.0 | 73.3 | 76.1 | 70.0 | 78.2 | 0.38k |
| SkillRL | 91.9 | 100 | 82.9 | 87.4 | 78.7 | 70.0 | 82.4 | 2.21k |
| Skill0 | 95.6 | 80.4 | 100 | 86.7 | 78.7 | 75.2 | 87.9 | 0.38k |
Search-QA 准确率(%)· Qwen2.5-VL-3B
| 方法 | NQ | TriviaQA | PopQA | HotpotQA | 2Wiki | MuSiQue | Bamboogle | Avg | Token/步 |
|---|---|---|---|---|---|---|---|---|---|
| Search-R1 | 34.1 | 54.5 | 37.8 | 32.4 | 31.9 | 10.3 | 26.4 | 32.5 | — |
| EvolveR | 43.4 | 58.4 | 43.4 | 37.3 | 38.1 | 13.7 | 32.8 | 38.2 | — |
| SkillRL | 38.6 | 57.6 | 40.3 | 33.6 | 31.1 | 13.3 | 58.1 | 38.9 | 0.87k |
| Skill0 | 39.8 | 57.5 | 42.3 | 35.1 | 33.7 | 13.3 | 63.7 | 40.8 | 0.18k |
值得注意的是,Skill0 (7B) 在 ALFWorld 上达到 89.8%,大幅超过闭源模型 GPT-4o(48.0%)和 Gemini-2.5-Pro(60.3%),同时也超过各类记忆增强方法如 ExpeL(46.3%)、Mem0(54.7%)。在 Search-QA 上同样全面超过 RAG、Search-R1、ZeroSearch 等检索增强方法。
Limitations
Skill0 依赖初始 SkillBank 的质量——技能本身需要提前准备好。同时,离线技能分组在迁移到新任务域时需要重新划分。这意味着它更适合有明确技能体系的任务场景。