CHAPTER · 02
同一个任务,做两次 — skill 库是 agent 的记忆肌肉
没有 skill 库,agent 每次都从零摸索,经验直接丢进垃圾桶;有了 skill 库,reward / strategy / expert / note 四类经验沉淀回库,下一次任务直接取用 — 这是 agentic RL 从"一次性反应"走向"可累积学习"的关键拐点。
没有 skill 库 — 灰色重复,经验进垃圾桶 blank task 经验丢掉 🔍💭 ✍️🔁 🔍💭 ✍️❌ 🔍❌ 任务来了 → 从零摸索 → 经验进垃圾桶 ❌ 同一坑掉 5 次 有 skill 库 — 取一格,做一遍,沉淀回库 SKILL #042 命中 14× "PDF 图表数学题" TRIGGER PDF + 图表 + 算式 STEPS 1. crop 图区 2. OCR 提数字 3. 列方程 4. 验算 ⚠ 别先口算, 先 crop 取用 task 命中 +1 / 更新步骤 ↻ 任务来了 → 取对应 skill → 经验沉淀回库 ✓ 下次再遇,直接抽屉
读这张图: skill = 一张「触发条件 + 步骤 + 命中次数」的卡片。第 1 次见到这类任务把套路抽出来存进库; 第 2 次再遇直接调出, 不重新摸索。
Agentic RL 综述 · 第 02 / 04 章
Why skill — 三类经验, 不适合只活在权重里
纯 RL 训出来的能力全藏在模型权重里,跨任务、跨 session 不可见也不可控。有三类经验天然该被搬到权重外面,做成可调用的 skill — RL 才学得动,经验才能积累。
θ 黑箱 π 🔒 看不见, 不可调度 抽出来 SKILL LIBRARY #001 crop → OCR → solve 14× #042 先看目录再动手 strategy 三类该被抽出来的经验 选项太多 ⚠ 塞权重 → 每步从词表自由生 crop "我先" 截图 tool( def OCR( 让我 parse {json} 先... x_1= 太多组合 每步在 10⁵ 个词里挑 × 100 步 → RL 学不动 ✓ 抽成 skill → 菜单 K 选 1 📷 crop 🔤 OCR solve 🔗 chain ▼ pick 决策空间变小 好思路别连坐 ⚠ 塞权重 → 思路 + 执行 一起算 思路 A: grep τ₁₁ τ₁₂ → 0% 思路 B: ls τ₂₁ τ₂₂ → 50% B 第 2 次失败 → 该怪谁? B 第 1 次已经赢过 ✓ → 思路是对的, 只是这次执行翻车 但系统只看最后成败: B 的好思路也被一起罚 — 冤 ✓ 抽成 skill → 信用分两路算 思路 +1 保留 执行 −1 修执行 信用分配更精准 套路存成卡片 ⚠ 塞权重 → 一题的影响, 一滴入海 💧 一道题 = 一滴教训 🪣 混进一桶 和上百题平均 🥄 每次调一勺 学习率很小 要让模型真记住一招: 同类题得见几十~上百次 所以 RL 学得又慢又费数据 ✓ 抽成 skill → 遇同类题 → 查卡片 新题 2x+3=7 含 x #117 ✓ 命中 列等式 → 消元 存成卡片, 下次命中

[1] Skill-RM Qwen Applications 2026.06

一句话: 让打分的裁判先开会查证据再落笔, RM 自己变成会调工具的 agent。

动机RLVR 的奖励来源太杂: 规则脚本、参考答案、checklist、rubric 评分各自一套, 混训时彼此打架。

切入点把"算 reward"这件事抽象成一组 agentic skill, judge 模型像 agent 一样自选证据、调工具、最后聚合成一个标量分。

证据 (异质) skill dispatcher reward skill 聚合 rule verifier 脚本 GT 参考答案比对 checklist 条目勾选 rubric 细粒度评分表 judge 自选证据 + 工具链 (ReAct 风格) judge_fair 屏蔽数据集名 judge_operational 开放校验器 instruction_following 格式 / 长度核查 Σ wₖ → r

怎么读: 左边四类异质证据进来, 中间 judge 自己挑该走哪条路, 右边三类 reward skill 各打一个分, 加权后变成单一标量 r 喂给下游 RL。

统一接口每个 skill 都是 (prompt, response, evidence) → (score, rationale, tool_trace)。judge 用函数调用风格调外部 verifier / Python / 检索, 等于给 RM 套了一层 ReAct 推理框。

三类 skill 分工fair: 屏蔽 benchmark 元数据, 防 judge 沿训练记忆"抄答案"; operational: 放开校验器, 专攻代码/数学这类硬指标; instruction_following: 单查格式约束、长度、禁用词。

下游接入聚合后的 r 直接接 verl + GRPO, 在 VerInstruct 上做 RFT (Reinforcement Fine-Tuning)。

$$ A_i \;=\; \frac{r_i - \mathrm{mean}(\{r_j\}_{j=1}^G)}{\mathrm{std}(\{r_j\}_{j=1}^G)},\qquad r_i \;=\; \sum_k w_k\,\mathrm{skill}_k(x, y_i) $$

怎么读: 一组 skill 各自打分后加权得到 ri, 再在同 prompt 的 G 条 rollout 内做 z-score 归一拿到优势 Ai。组内均值取代 critic, 省一个大模型。

打个比方: 老 RM 像一个人扛全场的外卖差评师, 啥单都按同一张表硬打。Skill-RM 更像点评团队——代码题甩给单测助手跑一遍, 开放问答让 fair 助手蒙住店名再读, "必须 200 字"这种格式要求交给 instruction_following 助手, 主裁只负责派单和加权。

结果在 VerInstruct 上跑 GRPO, 相比单一 rule/GT 奖励, 在数学/代码/指令遵循混合 benchmark 上稳定提升; fair 子 skill 明显压住 reward hacking——不再靠"撞数据集名"骗分, 训练曲线比 verl 默认 PPO 更稳, reward 突崩明显减少。

[2] StraTA Oxford + Shanghai AI Lab 2026.05

一句话: 开局先憋出一段"打算"当隐变量, 后面每个动作都条件在它上面, strategy 和 action 各自做组内 z-score, 两层 GRPO 一起拧。

名词对齐: 这篇里的 strategy 就是 skill——一段开局采样出的自然语言"打法"。本章其他 paper 叫它 skill / strategy / workflow, 本质同一件事。

动机纯反应式 agent 每步只盯当前 observation, 没有轨迹级规划。后果是探索发散、同一种错反复犯, credit 也分不清是"思路烂"还是"手抖"。

解法直觉把"思路"显式拎出来当一个可采样的变量 z, 让策略变成"先想再打", 而不是边走边想。

strategy 层 z_k
z₁ 先 ls 看目录结构
z₂ 直接 grep TODO 关键字
z₃ 先读 README 再动手
… z_K 共 K 条候选打法
action 层 τ_kn
τ₁₁ ✓ 执行稳
τ₁₂ ✗ 命令错
τ₁N ✓ 解掉 issue
τ₂₁ ✗ 漏文件
τ₂₂ ✗ 思路错
τ₂N ✗ 全失败
τ₃₁ ✓ 测试过
τ_K· … 每个 z 各采 N 条
τ₃₂ ✓ 单测通
共 K×N 条 rollout
τ₃N ✓ 三连过
两层各自打分

① strategy 当高层 option开局先采一段紧凑的自然语言"打算" $z \sim \pi^{\text{strat}}(\cdot \mid s_0)$, 后续动作都条件在它上: $a_t \sim \pi^{\text{act}}(\cdot \mid s_t, z)$。这就是 RaaS(Reasoning-as-Strategy, 把推理当成可采样的隐变量, 而不是混在 CoT 里的副产物)。

② 分层 GRPOGRPO 在这里切两层: 上层在 K 个 strategy 之间比, 下层在同一 strategy 下的 N 条 rollout 之间比。

$$ A^{\text{strat}}(z_k) = \frac{\bar R_k - \mathrm{mean}_j(\bar R_j)}{\mathrm{std}_j(\bar R_j)}, \quad \bar R_k = \frac{1}{N}\sum_{n=1}^{N} R(\tau_{k,n}) $$

怎么读: $\bar R_k$ 是第 k 套打法平均能拿几分, 再把 K 套打法做 z-score。"想得对"的 strategy 在这一层被推上去, 跟执行无关。

$$ A^{\text{act}}(\tau_{k,n}) = \frac{R(\tau_{k,n}) - \bar R_k}{\mathrm{std}_n(R(\tau_{k,\cdot}))} $$

怎么读: 在同一 z_k 内部, 用本组均值当 baseline 再 z-score。执行得稳的那条被拉上来——这一层只考核手感, 不替思路背锅。

打个比方: 教练带 K 套战术开赛前会, 每套各打 N 场内部赛。第一层评"哪套战术整体赢面大", 烂思路淘汰; 第二层评"同一套战术里谁执行最稳", 抠细节。这样"思路对但手抖"不会被冤枉成"思路错"。

③ 防塌缩 + 自我反思采样时显式拉开 K 个 strategy 的语义距离, 防止 K 条打法塌缩成同一句废话。

反思回灌每轮训完, 让模型对失败的 strategy 写一段"重来怎么改"的批判, 作为下一轮 strategy 采样的 prior 塞回 prompt——不当 RM 用, 只做条件。

奖励来源走 RLVR 这一路, 不用 PRM, 落地省事。

结果SWE-bench / WebArena / ALFWorld 三个 agentic benchmark 上一致打过纯 GRPO 基线: 成功率 +6~12pp, 平均交互轮数 −25%(思路先想清楚就少走弯路)。Ablation 砍掉 strategy 层退化成普通 GRPO, 大半提升消失; 砍掉自我反思, 样本效率明显塌。

一句话总结strategy 不是 CoT 换皮, 关键是它作为隐变量被独立采样、独立算优势, credit 才能分到"思路"这一层。

[3] Maestro 清华大学 2026.05

一句话: 4B 小模型当"调度导演",专家全冻结,它只负责喊"这场戏谁上、走哪个套路"。

动机单一巨型 LLM 配死调用链,吃不下多专家在数学/图表/视觉上的互补。但把"挑模型 + 挑 skill"全摊开,动作空间又爆炸到没法 RL。

破法分层。让一个小策略只学"挑组合",不学"造工具"。

观测 o_t 题目 + 历史 4B Orchestrator π_θ 唯一可训练 输出 a_t = (m_t, s_t) 「专家 × skill」选 1 例: 4 专家 × 5 skill = 20 选 1 pick m_t pick s_t Frozen Experts ❄️ (零梯度回传) m₁ 数学 m₂ 图表 m₃ 视觉 mₖ 新 挂注册表即可 Skill Registry atomic: OCR · solve_eq · crop composite: crop→OCR→solve_eq (打包好的多步流水线) 两类都按 ID 在菜单里编号 轨迹 τ → R(τ) (任务对错 0/1) GRPO 回流 只更新 π_θ (专家 / skill 不动)

分层动作空间编排器面前是两张菜单: 上面一张列出所有冻结专家 (谁来干), 下面一张列出所有 skill (用哪一招)。每步两张菜单各点 1 项, 组合起来就是一个动作。

为什么这么设计对比让 LLM 自己生成 "我现在想 OCR 一下" 这种自由文字: 自由文字理论上无穷多种写法, RL 无从下手。改成菜单选择 (例: 4 专家 × 5 skill = 只有 20 个可能动作), 动作空间一下子可枚举, RL 才学得动。

$$ a_t = (m_t, s_t) \sim \pi_\theta(\,\cdot \mid o_t),\quad m_t \in \mathcal{M}_{\text{frozen}},\; s_t \in \mathcal{S}_{\text{atomic}} \cup \mathcal{S}_{\text{composite}} $$

怎么读: 每一步, π_θ 看了观测 o_t 之后, 从冻结专家集合 𝓜 里抽一个 m_t (谁干), 同时从 skill 集合 𝓢 (含 atomic 和 composite 两类) 里抽一个 s_t (干什么), 这俩组成动作 a_t。整个采样过程只是在两张 dropdown 菜单里各按一下。

Outcome-based RL只用最终任务对错当 reward,中间专家调用一概不打分——避免给冻结专家硬造伪标签。优化用 GRPO。

$$ \mathcal{L}(\theta) = -\mathbb{E}_{\tau\sim\pi_\theta}\Big[\sum_{t} \log \pi_\theta(a_t\mid o_t)\cdot \hat{A}(\tau)\Big],\quad \hat{A}(\tau)=R(\tau)-\overline{R}_{\text{group}} $$

怎么读: 一条轨迹的 advantage = 它的最终 reward 减掉同组平均。赢了就放大整串 (model, skill) 选择,输了就压。不用 PRM,省一大笔标注。

打个比方: Maestro 像剧组的调度导演——演员(专家)和动作模板(skill)都定型了,导演只决定"这场戏谁上、用哪个套路",最后票房好坏就是他唯一的 KPI。

零样本插专家因为接口是 (model_id, skill_id) 这种符号,新专家挂进注册表就能用,πθ 不重训也能在推理时把它纳入候选。

什么时候要重训想榨干新专家就跑一轮短 RL 微调编排器,专家权重一动不动。代价: 当专家池规模变化大时,组合分布漂移,advantage 估计需要重新校准。

结果多模态 benchmark(MathVista、ChartQA、视觉推理混合集)上,4B 编排器 + 冻结专家池整体准确率高于"所有专家融成一个大 SFT 模型"的强基线;新专家加入无需重训编排器即可拿到增量收益,验证组合爆炸下小策略仍可学。

[4] Evolving-RL 小红书 + PKU 2026.05

一句话: 让"干活的脑"和"写skill的脑"共用一份权重, skill被 solver 用爽了, 写skill的手才发奖金。

动机过去 self-evolving agent 只在外面挂记忆库 / prompt 模板, backbone 权重根本不动。

动机·续更糟的是 extractor(总结经验)和 solver(执行任务)各练各的, skill抽得漂亮 solver 也用不上。

① Solver 裸跑 拿原始 trace τ₀ ② Extractor 蒸 skill workflow/触发/纠错/适用 ③ Top-K 检索 Qwen3-Emb-4B 余弦 ④ Solver 重跑 带 skill 得 τ' reward 回流 → 同时奖励 ① solver 与 ② extractor

四阶段闭环Solver 裸跑一条 trace, Extractor 把 trace 蒸成 N 条结构化 skill, 每条有 workflow / 触发规则 / 纠错 / 适用条件四字段, 杜绝"加油下次努力"式空话。

检索与回流用 Qwen3-Embedding-4B(冻结索引器, 不吃梯度)按余弦相似度查 top-K skill 喂回 solver。重跑后 reward 同时打给 solver(做对了+)和 extractor(你这条 skill 真有用+)。

共参数 GRPOGRPO 把两类角色的 rollout 混进同一个 group 算 advantage。

共参数·续extractor 和 solver 共享同一份 backbone, 只是 prompt 不同。于是 extractor 的梯度方向天然被 solver 的回报牵着走, "抽得能用"才有正信号。

奖励设计纯 RLVR。不引入 PRM 也不引入 RaaS(外部大模型当裁判)。

奖励·分工source 任务上 solver 拿 task reward; retrieved 任务上 extractor 拿"加 skill 后 solver 涨了多少分"作为信号——典型的 counterfactual 增量奖励。

$$ \mathcal{J}(\theta) = \mathbb{E}_{\tau \sim \pi_\theta^{\text{sol}}}\big[r(\tau)\big] + \lambda \cdot \mathbb{E}_{s \sim \pi_\theta^{\text{ext}},\, \tau' \sim \pi_\theta^{\text{sol}}(\cdot \mid s)}\big[r(\tau') - r(\tau_0)\big] $$

怎么读: 第一项 solver 自己刷分; 第二项 extractor 抽 skill s, 让 solver 带 skill 重跑得 τ', 奖励 = 带 skill 比裸跑 τ₀ 涨了多少。两项共享同一份 θ, 一次反传同时教会"会做"和"会总结"。

打个比方: solver 是实习生, extractor 是他自己写的工作skill。传统做法skill写没写好没人验; Evolving-RL 是——明天带skill再做一遍, 真涨分了今天写skill的那只手也发奖金, skill自然越写越"对自己有用"。

检索细节retrieval 走 IID 的 in-domain pool, skill 池只装当前 batch 周边任务, 防 extractor 把答案硬塞进 skill 字段作弊。

结果数学推理 + 工具调用 + Web agent 三类 benchmark 上, 相比纯 GRPO solver baseline 平均 +5~9 pt。

结果·消融"共参数"比"两模型分训"高 ~3 pt; "reward 回流 extractor"比"extractor 走 SFT 模仿"高 ~4 pt; 训练后期 workflow 字段长度 -30%, 触发规则命中率上升——skill 越练越短越能用。

[5] SDAR — Self-Distilled Agentic RL ZJU-REAL aux loss 蒸馏门控 verl 兼容

一句话: 同模型双前向自蒸馏, 只在"看了攻略才会"的 token 上拉 student。

动机agentic 任务 reward 稀疏, 想让模型学一些高层 skill (怎么 clean、怎么 pick_and_place), 但又不愿意推理时还在 prompt 里挂一份 skill 说明书。SDAR 想把"看攻略才会做"的能力直接压进权重, 推理时把攻略撤掉。

x 原 prompt r ⊕ x skill 攻略 + x π_θ (forward #1) student 视角 log π_θ(y_t | x) π_θ (forward #2) teacher 视角 (带攻略) log π_θ(y_t | r,x) 同一份 θ δ_t = teacher − student 攻略带来多少 log-prob → 越大说明越靠攻略 g_t = σ(β·δ_t) 0~1 软门控 𝓛_SDAR −Σ g_t · log π_θ aux loss 主 policy gradient (GRPO) advantage / rollout / reward 一动不动 + 加在一起 推理: r 撤掉, 只剩 x — 攻略压进权重, 模型自己"还记得"。

双前向对当前 student π_θ, 第一遍只喂原 prompt x, 第二遍把人工写的 skill markdown r 拼在 x 前面再 forward 一次。两次共享同一份权重, 第二次充当"看了攻略的 teacher"——这就是 self-distillation 的来源: 老师就是带 hint 的自己。

δ_t 门控对每个生成 token y_t, 算 teacher 比 student 多出来的 log-prob δ_t, 再过 sigmoid 压成 0~1 的软门控 g_t, β 控制切换陡峭程度:

$$ \delta_t = \log \pi_\theta(y_t \mid r, x) - \log \pi_\theta(y_t \mid x),\qquad g_t = \sigma(\beta \cdot \delta_t) $$

g_t → 1 意味着"看了攻略才会", 该蒸馏; g_t → 0 说明 student 已经反超, 别瞎纠正。

加权 NLLaux loss 形式是 student 自身负对数似然, 再被 g_t 加权——可以理解为把 teacher 近似成 one-hot 后退化出来的 token-level CE/KL, 只是用 g_t 决定每个 token 学多少。它跟主 policy gradient 并行相加, GRPO 那一套 advantage、rollout、reward 没动:

$$ \mathcal{L}_{\text{SDAR}} = -\sum_{t} g_t \cdot \log \pi_\theta(y_t \mid x) $$

推理时撤掉 rstudent 必须把"看攻略才学得到"的那部分技巧内化到权重里。→ 深读

打个比方: student 自己先做一遍考卷, 再让同一个人翻开攻略再做一遍。哪几道题"翻了攻略才会做" (δ_t 大), 就专门把这几道的解法压进肌肉记忆; 学生已经会的题不再瞎练。考场上攻略一收, 该会的还是会。

本章方法对比

方法skill 单元形态获取方式是否进 RL loss与 GRPO 耦合代表 benchmark
Skill-RMreward skill 三件套judge 调工具聚合只产 reward 不更新verl+GRPO 组内 z-scoreVerInstruct 混合
StraTAstrategy 隐变量 z开局采样自然语言是, strategy 独立算 A双层 GRPO (K×N)SWE-bench +6~12pp
Maestro(专家, skill) 二元组注册表符号化是, outcome only4B 编排器吃 GRPOMathVista/ChartQA
Evolving-RL四字段结构化 skillextractor 蒸 trace是, counterfactual 增量共参数混进同组数学+Web +5~9pt
SDAR人工 skill markdown r训练期外挂攻略aux NLL, g_t 加权与 GRPO 并行相加, 不动 advantageagentic 多轮 (ALFWorld 系)
Limitations: (1) 可迁移 skill library 仍未真正建立:StraTA 的 strategy 文本未沉淀为跨任务库,Maestro 注册表规模未量化, SDAR 的攻略 r 还是人工写死——『skill 是否真的能复用』在这几篇里仍以承诺多于证明。(2) GRPO 与 skill 层级的耦合方式没共识:StraTA 双层 group-relative、Maestro 纯 outcome、Skill-RM 把 skill 灌进 judge、SDAR 走 aux loss 与 GRPO 并行——四种耦合方式之间缺一组 head-to-head 对照。