☰
SkillOpt 训练循环6大核心阶段图解:Rollout、Reflect、Aggregate、Select、Update、Gate
2026/10/7 19:02:47 网站建设 项目流程

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 训练过程稳定、可控。

上手路径:从配置到跑通第一个训练

想动手跑通完整循环,只需三步:

  1. 看配置:所有超参数集中在 configs/base/default.yaml,如num_epochs: 4、learning_rate: 4、batch_size: 40
  2. 看文档:完整映射表见 docs/guide/dl-analogy.md(DL ↔ SkillOpt 概念对照),快速上手见 docs/guide/first-experiment.md
  3. 看代码:按阶段顺序读 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询