SkillGate: Training In-Policy Skill Selection in Long-Horizon Agents
Qingyao Li, Wenxiang Jiao, Shuai Shao, Kangning Zhang, Yuan Lu, Yi Guo, Weiwen Liu, Weinan Zhang, Yong Yu
cs.AI
2026-08-19
SkillGate把技能名token从结局优势里切开,单独按是否读对oracle计分。16候选下9B成功率从40.8%升到53.2%,误导技能暴露砍掉约三分之二。
Agent 框架把程序性知识打成 skill:一个名字、一行描述、一份 SKILL.md 正文。公共库已经上千份,上下文塞不下,策略必须在 episode 中途只凭名字和描述决定读哪一份。选错了,后面每一步都在错的说明书上干活。
现成做法是把候选列表丢给策略,用任务成败做强化学习。这篇量出来,这条路在长轨迹上结构性地教不会选择,他们称之为 selector credit starvation。对一次只靠结局奖励的 GRPO 训练做离线审计,12800 条 on-policy 轨迹上有三件事同时成立。点出技能名的那几个 token 中位只占轨迹 loss 权重的 0.14%,轨迹变长份额再稀释约 7 倍。正确读了 oracle 的轨迹里,约五分之二继承到负优势,因为后面执行失败了;最长档里正确选择被罚的次数超过被奖的次数。同一 prompt 组里,读对 oracle 本身值 +11.2 个百分点成功率。一个值 11 分的决策,拿到的信号又少又经常反号,三项都随 horizon 单调变差。
SkillGate 不改 rollout、不改奖励、不改优化器,只改 advantage 允许落在哪些 token 上。一条轨迹的 assistant token 被切成两段互不重叠的信道。
选择 token 是读 skill 时路径里写出名字的 identity span。执行 token 是去掉整次 read 工具调用之后剩下的推理和其他工具调用。工具调用外壳两头都不训;skill 正文是 observation,也不训。
任务信道用常规 GRPO 组归一化结局优势,但把整次 read 调用从 mask 里挖掉,任务成败不许回头改选择。选择信道给每个 read 一个动作局部效用:轨迹里恰好读了一次、而且读的是 oracle,效用为 1,否则为 0。优势是组内所有 read 动作上的中心化,不做标准差归一化。读了 oracle 再读三个其他 skill 得 0,读两次也得 0。组里全对或全错时优势全是 0,信道闭嘴。
两边的 token 权重再拉齐。每个 batch 里,任务信道权重总和等于原始 assistant mask 的 N,选择信道也是 N,每个被计分的 read 分到相同的 N/M,跟轨迹长度、名字被切成几片无关。目标是带 clip 的 GRPO,选择项乘 λ=0.20,外加对冻结参考的 KL。负的选择优势只表示读错了或多读了,不表示 oracle 内容不好用。
标准混合 slate 固定 K=16:1 个为该任务写的 oracle,5 个主题相近但功能错的误导项,5 个相关加 5 个无关,从 2045 个社区 skill 里抽。训练 491 个任务,不含 Claw-Eval,训练和评测 oracle 身份不相交。策略从同一份 Qwen3.5-9B SFT 出发,100 步 on-policy GRPO,8 条 rollout,16 张 H800。每配置单次 run。
| 方法 | 总成功率 | oracle 暴露 | 误导暴露 |
| SFT 初始化 | 40.8% | 37.9% | 61.8% |
| SkillRL(只给结局) | 47.0% | 54.3% | 69.6% |
| SkillGate | 53.2% | 83.9% | 21.8% |
同一预算下,outcome-only 只学会多读,不会更好地辨别。SkillGate 的误导暴露大约砍掉三分之二,读得还更少。分基准:Claw-Eval 60.2%(SFT 50.9 / outcome-only 57.1),SkillsBench 15.6%(6.2 / 3.1),SETA 54.2%(40.0 / 50.0),SWE 65.0%(45.0 / 45.0),Terminal-Bench 2.0 37.5%(21.9 / 31.2)。Claw-Eval 任务和评测 oracle 身份训练时都没见过。9B 的 SkillGate 总成功率超过 Qwen3.5-397B-A17B 的 51.7%,仍低于 DeepSeek-V4-Flash 的 61.0%。前沿模型里没有一家 oracle 暴露过半。
280 trial 消融把选择信号分别落到「nowhere / 整个 prompt 组 / 整条轨迹 / 第一次 oracle 读 / 唯一一次读且是 oracle」。组级 regret 和轨迹 bonus 成功率停在 41.8%,还对上 outcome-only 的 42.1%。信号落到 identity token 上之后成功率到 45.0%,再加「只能读一次」才到 50.0%,clean single-oracle 从 21.4% 拉到 75.4%,reads/trial 从 1.88 降到 1.11。
外挂路由不够。27B router 把 top-1 交给冻结 SFT,成功率 36.8%,还低于 9B router 的 40.7%。SkillGate 自己从 16 个候选里选是 50.0%,超过给冻结 SFT 只塞 oracle 的 48.2%。提示「只读一个」几乎不动行为。给 SkillGate 再塞纯 oracle 还能到 52.9%,选择训练没有把执行能力打坏。
给正在用 skill 库的 agent 一个能落地的训练补丁:选择和执行是两类证据,不该共用一个 broadcast advantage。规模补不上这件事。Qwen3.5-397B 总成功率 51.7%,oracle 只读到 16.1%。价钱是训练任务必须知道哪份 skill 是对的;部署时可以不标。
这不是新架构,是把策略已经在生成的那次 read 变成被训练的决策。推理时还更省:读得少、轮次少、累计输入 token 少,按需加载的 skill 正文大约等于预加载恰好 1 份。
作者写得很清楚。每个配置只有一次 run,不确定度靠 task-level bootstrap,小差距只能当方向。方法需要训练时知道正确 skill。动作局部方案给不了「什么都不读」的信用。
实验 slate 是构造出来的 16 选 1 加硬负例。真实库没有 oracle 标签、描述更脏时,clean single-oracle 效用还能不能学,这篇没测。SkillsBench 即使 SkillGate 也只有 15.6%,选择对了执行仍可能垮。λ=0.20 没有扫。训练 100 步、16 卡 H800,复现成本不低。