SkillOpt 训练循环6大核心阶段图解:Rollout、Reflect、Aggregate、Select、Update、Gate
【免费下载链接】SkillOptSkillOpt is a text-space optimizer that trains reusable natural-language skills for frozen LLM agents through trajectory-driven edits, validation-gated updates, and deployable best_skill.md artifacts.项目地址: https://gitcode.com/gh_mirrors/sk/SkillOpt
SkillOpt 是一个文本空间优化器(text-space optimizer),它像训练神经网络一样训练可复用的自然语言技能文档(skill document),通过轨迹驱动的编辑、验证门控的更新,为冻结的 LLM Agent 产出可直接部署的best_skill.md工件。本文用一张总图 + 六个阶段逐一拆解,帮你 10 分钟读懂 SkillOpt 训练循环(training loop)的完整流水线。
先看全景:一张图理解 SkillOpt 优化流水线
SkillOpt 的核心理念是:把技能文档当作"可训练参数",优化它的过程和训练神经网络结构上完全同构——有 epoch、有 mini-batch、有"学习率"、有验证集门控,但全程不碰模型权重。
对应到代码,整条流水线由训练器 skillopt/engine/trainer.py 编排,官方文档 docs/guide/training-loop.md 给出了最直观的循环伪代码:
for epoch in epochs: for step in steps: 1. Rollout — Target 执行任务 2. Reflect — Optimizer 分析轨迹 3. Aggregate — 分层合并补丁 4. Select — 排名并裁剪编辑(学习率) 5. Update — 将补丁应用到技能文档 6. Gate — 验证并接受/拒绝下面逐个阶段拆解。
阶段 1:Rollout(前向传播)—— 让目标模型"跑"任务
Rollout 相当于神经网络的前向传播。冻结的目标模型(target)拿着当前版本 S_t 的技能文档作为提示词,执行一批训练任务;每个任务产出一条轨迹(trajectory)和一个得分。
- 入口代码:skillopt/engine/trainer.py 中的
[1/6 ROLLOUT]阶段,调用adapter.rollout(...)后用compute_score算出 hard / soft 两个分数 - 各基准环境的 rollout 实现分散在 skillopt/envs/ 下,例如最简单的参考实现 skillopt/envs/searchqa/rollout.py
- 关键配置:
batch_size: 40(每步采样多少任务),见 configs/base/default.yaml
💡 类比:
predictions = model(input, skill_document)→scores = evaluate(predictions, ground_truth)
阶段 2:Reflect(反向传播)—— 从失败轨迹里"算梯度"
Reflect 相当于反向传播求梯度。优化器模型(optimizer)分析 rollout 产出的轨迹 mini-batch,输出结构化的编辑补丁(edit patches)——即对技能文档的增(ADD)/删(DEL)/替换(REP)建议。失败的 mini-batch 必然被分析;成功的轨迹默认也会分析,除非开启gradient.failure_only。
- 核心实现:skillopt/gradient/reflect.py 中的
run_minibatch_reflect - 各环境的提示词模板,如 skillopt/envs/searchqa/prompts/ 下的
analyst_error.md与analyst_success.md - 关键配置:
minibatch_size: 8、analyst_workers: 16(分析器可并行),见 configs/base/default.yaml
💡 类比:
gradients = loss.backward()→ 得到的不是张量,而是文本编辑补丁
阶段 3:Aggregate(梯度聚合)—— 合并语义相似的编辑
同一个 rollout 批次会产生多份补丁,直接全量套用会冗余冲突。Aggregate 阶段做分层合并:把语义相似的编辑归并去重、解决冲突,压缩成一份"批级合并补丁"(batch-level merged patch),相当于 DL 里多卡梯度的 AllReduce。
- 核心实现:skillopt/gradient/aggregate.py 中的
merge_patches与_hierarchical_merge - 训练器调用点:skillopt/engine/trainer.py
- 关键配置:
merge_batch_size: 8
阶段 4:Select(梯度裁剪)—— 学习率决定"一次改几条"
Select 是 SkillOpt 里最有"深度学习味"的一步:编辑排名 + 截断,等价于梯度裁剪。所有合并后的编辑按相关度打分排序,learning_rate参数限制每步最多应用多少条编辑——防止一次性大改导致技能文档"语义跳变"(loss surface 上的大步长)。
- 排名与截断:skillopt/optimizer/clip.py 的
rank_and_select - 学习率调度器:skillopt/optimizer/scheduler.py,支持
cosine(先激进后平滑衰减)、linear、constant三种模式 - 默认配置:
learning_rate: 4(每步最多改 4 条)、lr_scheduler: cosine,见 configs/base/default.yaml
💡 类比:
selected = top_k(edits, k=learning_rate)——经验上 4~16 是"温和学习率"区间
阶段 5:Update(参数更新)—— 把选中的补丁写进技能文档
Update 就是 SGD 参数更新步。选中的编辑被逐条应用到当前技能文档,产出候选技能版本 S_{t+1}。应用过程带保护机制:慢更新字段、附录等受保护区域不会被普通编辑误伤。
- 核心实现:skillopt/optimizer/skill.py 的
apply_patch_with_report - 训练器调用点:skillopt/engine/trainer.py
阶段 6:Gate(验证门控)—— 分数不涨就不接受
Gate 是整个循环的"安全阀",对应 DL 的验证集。候选技能会在一个独立的 selection split(验证集)上重新 rollout 评测:只有当门控分数严格高于当前技能分数时,更新才被接受;否则候选被拒,拒掉的编辑还会写入"被拒编辑缓冲区",作为后续 Reflect 阶段的负面上下文,避免重复犯错。
- 核心实现:skillopt/evaluation/gate.py 的
evaluate_gate - 训练器调用点:skillopt/engine/trainer.py
- 开关配置:
evaluation.use_gate: true(关闭时验证分仍会记录,但候选强制接受)
最终训练结束时,全程最优的候选被固化为best_skill.md(通常仅 300~2000 tokens),部署时零额外推理开销。
阶段之外:Epoch 边界的两个"记忆机制"
训练跑完一个 epoch 后,还有两个跨 epoch 的机制防止"学了新的忘了旧的":
| 机制 | 作用 | 类比 |
|---|---|---|
| Slow Update | 用同一批样本分别跑上一轮技能与当前技能,对比出"改善/回退/持续失败/稳定成功"四类,生成高层指导写入技能文档 | 动量(Momentum) |
| Meta Skill | 累积跨 epoch 的策略记忆(哪些编辑有用、哪些失败),供后续 Reflect 参考 | 元学习 |
- Slow Update 实现:skillopt/optimizer/slow_update.py
- Meta Skill 实现:skillopt/optimizer/meta_skill.py
训练效果:验证门控让曲线稳步爬升
下图展示了三个基准上"训练 rollout 分 / 验证集最佳分 / 未见测试分"随 epoch 的变化:得益于每步门控,Selection best(橙色虚线)始终稳步上行,说明 SkillOpt 训练过程稳定、可控。
上手路径:从配置到跑通第一个训练
想动手跑通完整循环,只需三步:
- 看配置:所有超参数集中在 configs/base/default.yaml,如
num_epochs: 4、learning_rate: 4、batch_size: 40 - 看文档:完整映射表见 docs/guide/dl-analogy.md(DL ↔ SkillOpt 概念对照),快速上手见 docs/guide/first-experiment.md
- 看代码:按阶段顺序读 skillopt/engine/trainer.py 的
train主循环,每个阶段的打印日志都标注了[1/6 ROLLOUT]~[6/6 GATE],对照本文即可逐段理解
🎯一句话总结:Rollout 是前向传播,Reflect 求"文本梯度",Aggregate 聚合梯度,Select 裁剪梯度,Update 更新"参数",Gate 做验证——SkillOpt 用这套纪律,把一篇 Markdown 技能文档训练成了冻结 Agent 的稳定外挂。
【免费下载链接】SkillOptSkillOpt is a text-space optimizer that trains reusable natural-language skills for frozen LLM agents through trajectory-driven edits, validation-gated updates, and deployable best_skill.md artifacts.项目地址: https://gitcode.com/gh_mirrors/sk/SkillOpt
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考