SkillOpt 源码深度解析:微软如何用训练神经网络的方式优化 Agent 技能
本文基于 GitHub 源码(v0.2.0)和官方文档分析,不依赖任何第三方转载文章。
背景
大模型 Agent 的「技能」(Skill)通常是一个 Markdown 文件,告诉模型应该怎么完成任务。但如何写出好技能?过去靠手工调试,改来改去不知道哪个版本更好。
微软研究院开源的 SkillOpt 提出了一个有意思的视角:把技能文档当作可训练参数,用训练神经网络的那套流程去优化它。
这个想法听起来很直观,但具体怎么落地?我拉下源码,看它的训练循环、配置系统和产物结构。
一、核心映射:深度学习 → 技能优化
SkillOpt 的 docs/guide/dl-analogy.md 定义了一套完整的映射表。这是理解整个项目的关键:
| 深度学习概念 | SkillOpt 对应物 | 说明 |
|---|---|---|
| 模型权重 | 技能文档(Markdown) | 被优化的对象 |
| 前向传播 | Rollout | 目标模型用当前技能执行任务 |
| 损失函数 | 任务评估器 | 对执行结果打分 |
| 反向传播 | Reflect | 优化器分析失败轨迹 → 生成编辑补丁 |
| 梯度 | 编辑补丁 | 对技能文档的修改建议 |
| 梯度裁剪 | 编辑选择 | 单步最多接受的编辑数 |
| 学习率 | learning_rate |
每步最多应用的编辑数量 |
| 验证集 | Selection split | 验证改动是否有效 |
| 训练步 | Step | 一轮 rollout → reflect → update |
| Epoch | Epoch | 完整轮次 + 慢更新 + 元记忆 |
这个映射不是修辞手法,而是实际代码结构 。skillopt/engine/trainer.py 中的训练循环严格按这个映射实现。
二、训练循环:6 阶段管道
训练循环定义在 docs/guide/training-loop.md 中,每个 epoch 包含 6 个阶段:
for epoch in epochs:
for step in steps:
1. Rollout --- 目标模型执行任务
2. Reflect --- 优化器分析轨迹
3. Aggregate --- 合并相似编辑补丁
4. Select --- 按学习率裁剪编辑数
5. Update --- 应用补丁到技能文档
6. Gate --- 验证集检查,决定是否接受
阶段 1:Rollout(前向传播)
目标模型加载当前技能文档,在训练集上执行任务。每个任务产生一条轨迹和一个分数。
skillopt/envs/ 目录下目前有 6 个内置 benchmark:
| Benchmark | 任务类型 | 数据量(训练/验证) |
|---|---|---|
| SearchQA | 搜索问答 | 400/100 |
| DocVQA | 文档视觉问答 | 400/100 |
| SpreadsheetBench | 电子表格操作 | 400/100 |
| OfficeQA | 办公文档问答 | 400/100 |
| ALFWorld | 虚拟家庭任务 | 400/100 |
| LiveMathematicianBench | 数学推理 | 400/100 |
阶段 2:Reflect(反向传播)
优化器模型分析执行轨迹。核心逻辑在 skillopt/engine/trainer.py 中:
- 失败的轨迹 → 必须分析,找出失败模式
- 成功的轨迹 → 可选分析,提取可复用的经验
- 多个分析任务可以并行(
analyst_workers参数)
输出是编辑补丁(edit patches)------ 对技能文档的具体修改建议,包括增、删、改。
阶段 3-4:聚合与选择
语义相似的编辑补丁先合并,再按相关性排序。learning_rate 参数控制每步最多应用多少个补丁 ------ 对应深度学习的梯度裁剪。
lr_scheduler 支持三种调度策略:
| 调度器 | 行为 |
|---|---|
cosine |
先激进后平缓,建议首选 |
linear |
线性衰减 |
constant |
固定速率 |
阶段 5-6:更新与验证
选中的补丁应用到技能文档,产出一个新版本。然后在验证集(selection split)上评估:
- 分数提高 → 接受
- 分数未提高 → 回退(gate 机制)
验证集的数据必须是训练时未用过的,这是 SkillOpt 最关键的过拟合防护。
Epoch 边界机制
每个 epoch 结束时,还有两个额外操作:
- Slow Update:对比当前 epoch 和上一 epoch 的技能,在相同样本上回滚,分类出「改善/退化/持续失败/稳定成功」四类,生成高层指导策略
- Meta Skill:跨 epoch 的策略记忆,类似深度学习的动量
三、配置文件体系
SkillOpt 的配置采用 YAML 继承 结构。configs/ 目录下每个 benchmark 有自己的配置:
yaml
# configs/searchqa/default.yaml
_base_: ../_base_/default.yaml
model:
reasoning_effort: medium
train:
train_size: 400
batch_size: 40
accumulation: 1
gradient:
minibatch_size: 8
merge_batch_size: 8
optimizer:
learning_rate: 4
evaluation:
sel_env_num: 0 # 验证集大小
test_env_num: 0 # 测试集大小
env:
name: searchqa
skill_init: skillopt/envs/searchqa/skills/initial.md
max_turns: 1
workers: 24
关键参数解读:
batch_size: 40:每步从训练集采样 40 个任务minibatch_size: 8:分析时每 8 个轨迹一组learning_rate: 4:每步最多改 4 处workers: 24:24 个并发 worker 执行任务
四、模型后端体系
skillopt/model/ 目录下定义了多种后端:
| 后端 | 类型 | 用途 |
|---|---|---|
openai_chat |
Chat | OpenAI 系列模型 |
claude_chat |
Chat | Anthropic Claude |
qwen_chat |
Chat | 通义千问 |
minimax_chat |
Chat | MiniMax |
openai_compatible |
Chat | 兼容 OpenAI 协议的第三方 |
codex_exec |
Exec | Codex CLI 执行环境 |
claude_code_exec |
Exec | Claude Code 执行环境 |
copilot_exec |
Exec | GitHub Copilot |
cursor_exec |
Exec | Cursor |
两个角色:optimizer_model (强模型,负责分析生成补丁)和 target_model(目标模型,负责执行任务,可以用较弱模型)。
五、SkillOpt-Sleep:夜间离线进化
v0.2.0 新增的 SkillOpt-Sleep 是另一个值得关注的设计。它是独立的 skillopt_sleep/ 包,零依赖 SkillOpt 的训练代码。
一个「夜晚」的流程:
harvest(采集当天会话)
→ mine(挖掘重复任务模式)
→ replay(在验证集上回放)
→ consolidate(生成补丁 → 验证门控 → 固化为技能)
→ stage proposal(等待用户审查)
→ adopt(用户确认后应用)
skillopt-sleep CLI 支持:
bash
skillopt-sleep dry-run # 只采集+分析,不落盘
skillopt-sleep run # 完整夜间循环
skillopt-sleep status # 查看状态
skillopt-sleep adopt --skill NAME # 采纳某个技能
skillopt-sleep schedule # 安装定时 cron 任务
支持采集的 Agent 平台:
| 平台 | 采集方式 | 安装方式 |
|---|---|---|
| Claude Code | 插件 | /plugin marketplace add |
| Codex | 插件 | bash install.sh |
| Cursor | 插件 | bash install.sh |
| Copilot | MCP 服务 | 注册 MCP |
| Devin | MCP 服务 | 注册 MCP |
| OpenClaw | 参考适配 | 按需适配 |
六、实测效果与局限
官方论文的数据:52 项测试全部第一或并列第一,GPT-5.5 平均提升 23.5 分。但有几个值得关注的细节:
优势:
- 最终产物是 300-2000 token 的
best_skill.md,推理时零额外成本 - 技能可跨模型迁移(Codex 优化的技能 → Claude Code 可用)
- 验证门控机制防止退化
局限(从源码和文档中分析):
- 需要带标准答案的评估数据集,不是所有场景都能准备
batch_size增加有收益递减,API 成本线性增长但效果不线性- 论文实验集中在 2-4 个 epoch,更多 epoch 未必更好
- 对 optimizer_model 的质量敏感------弱模型生成的补丁质量不足
七、总结与思考
SkillOpt 的贡献不在于「用 LLM 优化 prompt」------这个想法很多人都有。它的贡献在于把深度学习训练的全套纪律搬到了文本空间:验证集、门控、学习率调度、动量、元学习,每个机制都有对应实现。
对于正在构建 Agent 产品的团队,可以从两个角度切入:
- 离线训练 :如果你有标注好的评估数据集,用 SkillOpt 训练出
best_skill.md,部署时零额外成本 - 夜间进化:如果 Agent 在生产环境运行,SkillOpt-Sleep 提供了一种「白天干活,晚上进化」的闭环
关键资源:
- GitHub:https://github.com/microsoft/SkillOpt
- 论文:https://arxiv.org/abs/2605.23904
- 项目主页:https://microsoft.github.io/SkillOpt/
- 安装:
pip install skillopt
本文所有结论基于 GitHub 源码(tag v0.2.0)和官方文档的分析,不包含任何第三方转载内容。