arXiv 2604.02268

Skill0:用强化学习把 Agent 技能
内化到模型参数里

现有 LLM Agent 在推理时需要从外部技能库检索指令——嘈杂、昂贵、模型从未真正学会。Skill0 提出:在训练时提供技能,在推理时归零,让模型把技能变成自己的能力。

"Skills at training, zero at inference."

Zhengxi Lu 等 · 浙江大学 & 美团 & 清华大学 · GitHub
+9.7%
ALFWorld 成功率提升
vs. AgentOCR baseline
+6.6%
Search-QA 准确率提升
vs. AgentOCR baseline
<0.5k
每步 token 消耗
比 SkillRL 低 5 倍以上

为什么需要「技能内化」?

Agent 技能(Skills)是一组结构化的操作指南,教 LLM Agent 怎么用工具、怎么完成多步任务。当前主流做法是在推理时从技能库检索相关技能,注入到 prompt 里。这很有效,但有三个根本性缺陷。

Figure 1: Skill Augmentation vs Skill Internalization
原文 Figure 1:(a) 现有 Skill Augmentation 方法在推理时检索技能注入 context;(b) Skill0 的 Skill Internalization 方法在训练时提供技能并逐步撤除,推理时完全 zero-shot。

推理时技能增强 Skill Augmentation

  • 检索噪声:检索到不相关或误导性的技能,污染上下文
  • Token 开销:注入的技能内容在多轮交互中持续累加
  • 表面执行:模型在「执行」技能,不是在「学习」——能力驻留在 context 而非参数里

技能内化 Skill Internalization(Skill0)

  • 零检索:推理时不需要任何技能库
  • 极低开销:每步不到 0.5k tokens
  • 真正习得:技能被编码进模型参数,实现 zero-shot 自主行为
人类学技能也是如此:先照着说明书操作(explicit instruction),然后逐渐不需要说明书,变成肌肉记忆(internalized behavior)。推理时技能增强把 Agent 永远锁在第一阶段。 —— 类比自 Anderson (1982) 的技能习得理论

直接用 RL 训练可以吗?作者发现两头都不行:不给技能,Agent 缺乏结构化指导,学不会复杂多步行为;全程给技能,模型形成依赖,一撤走技能就崩溃。Skill0 的核心思路是设计一个从「有」到「无」的训练过程,把能力从 context 搬到 parameters。

Skill0 之前,别人怎么做的?

Skill0 直接建立在两个工作之上:AgentOCR 解决了「怎么压缩 agent 历史」,SkillRL 解决了「怎么在 RL 中利用技能」。理解它们才能理解 Skill0 到底改了什么。

📷 AgentOCR:把交互历史渲染成图片压缩 Skill0 的视觉压缩方案来自这里

要解决的问题:Agent 多步交互后,历史文本越来越长,token 开销爆炸。

做法:把文本交互历史(观察、动作)用代码渲染成一张 RGB 图片,不同信息类型用不同颜色标记(本质上是像素空间里的 special token),然后喂给 VLM 的视觉编码器压缩成固定大小的 embedding。模型每一步还会自己输出下一步的压缩比,通过 reward(任务成功时 ln(ct) 加成)学会在信息充足时激进压缩、关键步骤时保留细节。

效果:token 消耗从 1k+ 降到 0.3~0.5k。但 AgentOCR 只压缩历史,不涉及技能的利用或内化。

Skill0 继承了什么:视觉上下文渲染、自适应压缩比、复合奖励设计。全盘拿来用了。

🔧 SkillRL:在 RL 训练中注入并演化技能 训练和推理都带技能的范式

要解决的问题:技能库是静态的,不一定适合当前模型的策略水平。

做法:在 RL 训练时把技能作为 prompt 注入 context,同时根据 Agent 的表现迭代演化技能内容(recursive skill evolution)——让技能本身也变得更好。推理时同样检索注入技能。

局限:模型学会了更好地利用技能提示,但从未被要求「不看技能也能做」。一旦推理时撤掉技能,性能立刻下降——能力驻留在 context 里,没有转移到参数中。而且推理时始终需要检索 + 注入技能,token 开销高(ALFWorld 上 2.21k/步)。

Skill0 改了什么:用 SkillRL 提供的技能库作为初始 SkillBank,但训练目标从「更好地用技能」变成「逐步不需要技能」。

Skill0 = AgentOCR 的压缩方案 + SkillRL 的技能库 + 全新的内化目标

AgentOCR 告诉你怎么省 token,SkillRL 告诉你怎么用技能做 RL,但两者都没回答「能不能不要技能」。Skill0 在它们的基础上加了一层:通过动态课程逐步撤除技能,把能力从 context 搬到 parameters。

Skill0 方法总览

Skill0 包含三个协同工作的组件。它们共同实现「训练时给技能、推理时归零」的目标。

Figure 2: Overview of Skill0
原文 Figure 2:Skill0 的完整流程。(a) 按相关性离线分组技能;(b) 训练时将技能 + 交互历史渲染为视觉 context,在 Agent Loop 中执行 ICRL;(c) 动态课程逐阶段评估帮助性、缩减预算,直到技能全部撤除。

上图是论文的核心架构图。三个组件的关系可以简要概括为:

组件 A

相关性驱动的
技能分组

按任务类别离线组织技能库,减少检索噪声

组件 B

上下文强化学习
(ICRL)

训练时将技能作为 context,推理时移除,RL 驱动内化

组件 C

动态课程
Dynamic Curriculum

按帮助性逐步撤除技能,直到预算归零

下面我们逐一展开每个组件。先从技能管理和上下文渲染讲起,再看 ICRL 的训练目标,最后看动态课程如何自适应地「撤除脚手架」。

In-Context 强化学习(ICRL)

ICRL 是 Skill0 的训练核心:在 rollout 时把技能放进 context 让 Agent 参考,但推理时全部移除。RL 的优化目标直接驱动模型把 context 里的知识编码进参数。

前置:技能分组(Skill Grouping)

在训练开始前,Skill0 先把技能库离线组织好。技能按任务类型 + 技能类别分组,每组存成一个 Markdown 文件,形成目录结构:

skills/ ├── ALFWorld/ │ ├── general.md # 通用策略:系统性探索、拿到就行动… │ ├── pick_and_place.md # 拿放任务专用 │ ├── clean.md # 清洁任务:先去水槽再放回 │ ├── heat.md # 加热任务:先拿对象再用微波炉 │ ├── cool.md # 冷却任务:先开冰箱 │ └── look_at_obj_in_light.md └── Search/ ├── general.md # 分解问题再搜索、证据充分才回答 ├── direct_retrieval.md # 直接检索类问题 ├── multi_hop_reasoning.md # 多跳推理 ├── entity_attribute_lookup.md └── compare.md # 对比类问题

每个文件里包含若干条结构化的技能规则,格式是「技能名 → 什么时候用 → 具体怎么做」。比如 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 使用复合奖励,同时优化任务成功压缩效率

# 复合奖励:任务奖励 + 压缩奖励 if task_success: r_comp = ln(compression_ratio) # 压缩越多奖励越大,但递减 else: r_comp = 0 r_total = r_task + λ * r_comp # 基于 PPO 的策略优化 loss = clip(importance_ratio, advantage, ε) - β * KL(π_θ ‖ π_ref)

关键点在于:技能只在训练 rollout 时存在。模型在训练时可以参考技能来完成任务、获得奖励,但 RL 的梯度更新迫使它把这些知识固化到参数里。随着动态课程逐步移除技能,模型必须越来越依靠自身能力。

动态课程:自适应撤除脚手架

训练被划分为多个阶段,阶段之间预算线性缩减(如 [6, 3, 0]),阶段内部预算固定,每隔 d 步重新评估保留哪些技能。两层逻辑各管一件事:跨阶段控制「总共还给几个技能」,阶段内控制「给哪几个」。

阶段 1 · M=6 阶段 2 · M=3 阶段 3 · M=0 step 0 60 60 120 120 180 Exploration Acquisition Grab Place Phase Plan Sink First 每 10 步评估 Δ_k 预算充足 6 个技能全部保留 Exploration Grab Phase Plan Acquisition Place Sink First 筛选 top-3 最薄弱技能 3 个已内化,移除 保留最需要帮助的 3 个 0 技能全部撤除 纯靠参数做任务 性能反而 +1.6% 预算 M 6 3 0

跨阶段:预算线性衰减

训练共 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% 的提升——这意味着技能真正被内化了。

几个有意思的发现

论文中有几个观察值得单独拎出来说。

Figure 5: Training Dynamics Comparison
原文 Figure 5:训练动态对比——三组实验分别回答一个问题。
(a) 内化真的在发生吗? 带 vs 不带技能验证 Skill0 自身

绿线 = 验证时带技能(w/ skill),紫线 = 验证时不带技能(w/o skill)。两条线用的是同一个模型,区别只在验证时是否注入技能 context。

训练前期,绿线远高于紫线——模型还依赖外部技能指导。但随着训练推进,紫线从 0.2 左右一路追到 0.85+,最终和绿线几乎重合。这就是内化的直接证据:模型参数里已经编码了技能知识,有没有外部提示不再重要。

(b) 性能提升来自内化还是技能依赖? Skill0 vs AgentOCR,都不带技能推理

为了排除「Skill0 只是因为训练时看了更多技能才强」的可能,这组实验把 Skill0 和 AgentOCR 放在完全公平的条件下对比:推理时都不给技能

结果 Skill0(绿线)始终高于 AgentOCR(蓝线),且差距随训练拉大。这证实优势确实来自参数里内化的知识,而不是运行时偷看了技能提示。

(c) 和其他 RL 方法比,上限在哪? Skill0 vs GRPO vs SkillRL,都不带技能推理

先说对手:GRPO 是纯 RL baseline,训练和推理都没有技能;SkillRL 训练时全程注入技能,还会迭代演化技能内容让它变得更好——但推理时也需要技能,模型从未被要求「不看技能也能做」。简单说,SkillRL 让模型越来越会技能,Skill0 让模型越来越会替代技能。

三条线统一在无技能推理下比较。GRPO(黄线)本身就没技能可用,上限受限于模型裸能力;SkillRL(紫线)训练时全程依赖技能 context,一旦推理时撤掉就暴露出能力并没有转移到参数里,在 60~90 步左右 plateau。而 Skill0(绿线)通过渐进撤除把能力搬进了参数,持续稳步提升到 150 步,达到所有方法中最高的上限。

Figure 6: Helpfulness Dynamics
原文 Figure 6:各子任务的技能帮助性 Δk 随训练变化。统一呈现「先升后降」轨迹——技能先被利用,再被内化,最终不再需要。
📈 帮助性的「先升后降」 所有子任务的技能帮助性都呈现相同规律

上面的 Figure 6 清楚地展示了这一点:所有子任务的 Δk 都遵循「先升后降」的轨迹。训练初期帮助性低(模型还没学会利用技能提示);中期快速上升(模型学会了从 context 中提取技能指导);后期回落到零(技能已被内化进参数)。这个轨迹本身就验证了「技能从 context 迁移到 parameters」的过程确实发生了。

🔄 去掉技能反而更好 推理时不用技能比用技能成绩还高

Table 2 的对角线对比令人意外:Skill0 在不带技能推理时(87.9%)比带技能推理时(86.3%)还高出 1.6%。这说明 Skill0 不仅成功内化了技能,而且避免了技能注入带来的上下文噪声。对比其他配置(如 [6,6,6] 预算),去掉技能后性能暴跌 13.3%,说明它们形成了对外部技能的依赖。Figure 5(a) 也展示了同样的趋势:不带技能的验证曲线从低处起步,但逐渐追上带技能的曲线。

🎯 Bamboogle 上的惊人泛化 域外多跳推理大幅领先

Skill0 (3B) 在 Bamboogle(一个域外多跳 QA 数据集)上拿到 63.7%,而训练时只用了 NQ 和 HotpotQA 数据。对比 EvolveR 的 32.8% 和 SkillRL 的 58.1%,这一巨大优势暗示内化的技能具有更好的泛化能力——参数化的知识比 prompt 里的指令更灵活。

实验结果一览

在 ALFWorld(家庭环境任务)和 Search-QA(搜索问答)两个 benchmark 上,Skill0 以极低的 token 成本实现了顶尖性能。

ALFWorld 成功率(%)· Qwen2.5-VL-3B

方法 Pick Look Clean Heat Cool Pick2 Avg Token/步
Zero-Shot27.024.34.520.510.20.015.21.21k
GRPO92.685.770.686.679.365.079.91.02k
AgentOCR91.981.876.073.376.170.078.20.38k
SkillRL91.910082.987.478.770.082.42.21k
Skill095.680.410086.778.775.287.90.38k

Search-QA 准确率(%)· Qwen2.5-VL-3B

方法 NQ TriviaQA PopQA HotpotQA 2Wiki MuSiQue Bamboogle Avg Token/步
Search-R134.154.537.832.431.910.326.432.5
EvolveR43.458.443.437.338.113.732.838.2
SkillRL38.657.640.333.631.113.358.138.90.87k
Skill039.857.542.335.133.713.363.740.80.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 的质量——技能本身需要提前准备好。同时,离线技能分组在迁移到新任务域时需要重新划分。这意味着它更适合有明确技能体系的任务场景。