4300+ Star 微软 SkillOpt:像训练神经网络一样训练 Agent Skill
4300+ Star 微软 SkillOpt:像训练神经网络一样训练 Agent Skill
先收藏,回头一定用得上。
如果你用过 Claude Code、Codex 这类 Agent 工具,你一定知道 Skill(技能文档) 的威力——一段精心编写的 best_skill.md,能让一个通用模型在特定任务上表现翻倍。但问题来了:Skill 怎么写?靠手写?靠让 GPT 一次性生成?靠反复自我修改?
微软联合上海交大、复旦、同济给出的答案是:像训练神经网络一样训练它。
SkillOpt 把 Skill 文档视为 LLM Agent 的「可训练权重」,用一套完整的优化循环——Rollout、Reflect、Aggregate、Select、Update、Validate——在纯文本空间中进行迭代优化。不碰模型权重,不改 Agent 框架,不增加推理时任何额外调用。最终产物就是一个紧凑的 best_skill.md(300-2000 token),直接塞给你的 Agent 用就行。
上线不到一个月,4300+ Star,MIT 协议。论文发表在 arXiv(2605.23904),在 6 个 benchmark、7 个目标模型、3 种执行环境共 52 个评测单元中全部最优或并列最优。
本文提纲
- 核心洞察:为什么 Skill 文档本身就是「权重」
- ReflACT 训练循环:六阶段流水线拆解
- 文本空间的「学习率」和「梯度裁剪」
- 验证门控:只接受严格更好的 Skill
- 实验结果:52 个评测单元全优
- 怎么用:30 秒上手
核心洞察:为什么 Skill 文档本身就是「权重」
SkillOpt 的出发点很反直觉:
模型权重冻结、Agent 框架冻结、执行环境冻结,唯一变量就是 Skill 文档本身。
在深度学习中,训练 = 更新权重矩阵。在 SkillOpt 中,训练 = 更新 Markdown 文档。这不是修辞类比,而是精确的工程对应:
| 深度学习 | SkillOpt |
|---|---|
| 模型权重(float 矩阵) | Skill 文档(Markdown 文本) |
| 前向传播 | Target Model 执行任务(Rollout) |
| 损失函数 | 任务评分(正确/错误) |
| 反向传播(计算梯度) | Optimizer Model 分析失败轨迹(Reflect) |
| 梯度 = 权重更新方向 | 文本编辑 = Skill 修改建议 |
| 学习率 | 每步最大编辑数量(edit budget) |
| 梯度裁剪 | rank_and_select 排序筛选 |
| 验证集 | held-out validation split |
| Early Stopping | Validation Gate |
| Epoch | 一轮完整训练数据遍历 |
| Meta Learning | 跨 Epoch 的 Slow Update |
这个类比的精妙之处在于:每一个神经网络训练的概念,在 SkillOpt 里都有明确的文本空间对应物。这使得整个优化过程有理论依据,不是「随便改改 prompt」。
ReflACT 训练循环:六阶段流水线拆解
SkillOpt 的核心是 ReflACT(Reflect-Act)循环。每一步训练包含六个阶段:
┌──────────────────────────────────────────────────┐
│ ReflACT Training Loop │
│ │
│ ┌─────────┐ ┌─────────┐ ┌───────────┐ │
│ │ Rollout │───►│ Reflect │───►│ Aggregate │ │
│ │(Forward)│ │(Backprop)│ │ (Merge) │ │
│ └─────────┘ └─────────┘ └─────┬─────┘ │
│ │ │
│ ┌──────────┐ ┌─────────┐ ┌───────▼──────┐ │
│ │ Validate │◄─┤ Update │◄─┤ Select │ │
│ │ (Gate) │ │(Apply) │ │ (LR Clip) │ │
│ └────┬─────┘ └─────────┘ └──────────────┘ │
│ │ │
│ ▼ │
│ Pass? ──Yes──► best_skill.md updated │
│ │ │
│ No──► reject, keep current skill │
└──────────────────────────────────────────────────┘Stage 1: Rollout(前向传播)
Target Model(被优化的 Agent)用当前 Skill 文档执行一批训练任务。产出是轨迹(trajectories)、预测结果和分数。这就是「前向传播」——模型带着当前「权重」(Skill)跑一遍任务。
Stage 2: Reflect(计算梯度)
Optimizer Model(独立的 LLM,可以是更强的模型)分析 Rollout 的结果。它逐条审看失败的轨迹,找出系统性错误模式,生成结构化的文本编辑建议。每个编辑建议就是一个「梯度」——指出 Skill 应该往什么方向改。
Stage 3: Aggregate(合并梯度)
多个并行 Reflect worker 产出的编辑建议可能有重复或冲突。Aggregate 阶段用层级合并(hierarchical merging)去重、整合、消解冲突。
Stage 4: Select(梯度裁剪)
这是「学习率」发挥作用的地方。如果候选编辑数量超过学习率(比如 edit budget = 4),系统会调用 LLM 对所有编辑按影响力排序,只保留 top-N。这就是文本空间的「梯度裁剪」。
Stage 5: Update(应用更新)
将选中的编辑应用到 Skill 文档上。SkillOpt 定义了四种原子编辑操作:
| 操作 | 含义 |
|---|---|
add |
在文档末尾(或保护区之前)追加内容 |
insert_after |
在指定锚点后插入新内容 |
replace |
替换指定锚点的内容 |
delete |
删除指定锚点的内容 |
这些编辑是有界的(bounded)——不会重写整个文档,而是精确地增删改特定段落。文档中还可以设置「保护区」(Protected Regions),防止关键内容被修改。
Stage 6: Validate(验证门控)
更新后的候选 Skill 会在 held-out 验证集上评估。只有当候选 Skill 的得分严格高于当前最佳 Skill 时,才接受这次更新。否则丢弃,保留原版。
这就是文本空间的 Early Stopping——防止「过拟合」到当前 batch 的噪声。
文本空间的「学习率」和「梯度裁剪」
SkillOpt 的「学习率」不是浮点数,而是一个整数:每步最大允许的编辑数量。
默认学习率是 4,带余弦衰减(cosine decay)。随着训练推进,每步允许的修改越来越少——先快速探索,再精细调整,和神经网络训练完全一样的策略。
Scheduler 支持四种模式:
| 模式 | 机制 |
|---|---|
| Cosine Decay | 余弦退火,默认模式 |
| Constant | 固定 edit budget |
| Autonomous | 让 Optimizer LLM 自己决定每步改多少 |
| Step Decay | 阶梯式衰减 |
当候选编辑数超过 budget 时,系统不是简单截断。它把所有编辑连同上下文送给 LLM,让 LLM 按「系统性影响、互补性、通用性、可操作性」四个维度排序,选出最有价值的前 N 个。这个排序过程本身就是一次 LLM 推理调用。
验证门控:只接受严格更好的 Skill
Validation Gate 是 SkillOpt 最关键的设计之一。
每一轮训练产出的候选 Skill 不会自动替换当前版本。它必须在验证集上通过「严格硬门控」:
- Hard Gate(默认):精确匹配准确率必须严格大于当前最佳
- Soft Gate:按 per-item 部分得分评估,适合小验证集
- Mixed Gate:两者的加权混合
被拒绝的编辑不会直接丢弃,而是进入一个 rejected-edit buffer。后续步骤可以参考这些被拒绝的提案——避免反复提出同样的无效修改,也允许在新的上下文中重新评估之前的想法。
此外,每个 Epoch 结束时还有两个纵向机制:
- Slow Update:类似 momentum,从相邻 Epoch 的学习中提取高层模式,注入到 Skill 中
- Meta Skill:跨 Epoch 的元学习,提取通用的优化策略
实验结果:52 个评测单元全优
论文的实验数据很有说服力:
评测矩阵:6 个 benchmark × 7 个 target model × 3 种执行环境 = 52 个评测单元。SkillOpt 在全部 52 个单元中达到最优或并列最优。
在 GPT-5.5 上的提升幅度:
| 执行环境 | 平均提升 |
|---|---|
| Direct Chat(直接对话) | +23.5 分 |
| Codex Agentic Loop | +24.8 分 |
| Claude Code | +19.1 分 |
更重要的是迁移性:优化出的 Skill 可以跨模型尺度、跨 Agent 框架、跨相近 benchmark 迁移,不需要重新训练。
支持的 6 个 benchmark:
| Benchmark | 类型 |
|---|---|
| SearchQA | 信息检索 QA |
| ALFWorld | 具身 Agent |
| DocVQA | 文档 QA |
| LiveMathematicianBench | 数学推理 |
| SpreadsheetBench | 代码生成 |
| OfficeQA | 工具增强 QA |
支持的 Target Model:GPT-5.5、Claude、Qwen(本地 vLLM)、MiniMax 等。Optimizer Model 和 Target Model 可以不同——用强模型做优化器,弱模型做执行者,完全支持。
怎么用:30 秒上手
# 克隆和安装
git clone https://github.com/microsoft/SkillOpt.git
cd SkillOpt
pip install -e .
# 配置 API Key
cp .env.example .env
# 编辑 .env 填入 API credentials
source .env
# 训练(以 SearchQA 为例)
python scripts/train.py \
--config configs/searchqa/default.yaml \
--split_dir /path/to/your/searchqa_split \
--optimizer_model gpt-5.5 \
--target_model gpt-5.5
# 纯评估
python scripts/eval_only.py \
--config configs/searchqa/default.yaml \
--skill ckpt/searchqa/gpt5.5_skill.md \
--split valid_unseen \
--split_dir /path/to/searchqa_split训练产出目录结构清晰:
outputs/my_run/
├── best_skill.md # 最终优化产物
├── skills/skill_vXXXX.md # 每步快照
├── history.json # 训练历史
└── steps/step_XXXX/ # 每步详细日志还自带一个 Gradio WebUI 监控训练过程(pip install -e ".[webui]" && python -m skillopt_webui.app)。
对于已有 .md 体系(比如 Claude Code Skills、Hermes Agent Skills)的团队,接入几乎无缝——把 SkillOpt 跑出来的 best_skill.md 直接替换现有的 skill 文件即可。
DeepWiki 详细文档:https://deepwiki.com/microsoft/SkillOpt,包含完整的代码架构解析、每个模块的源码映射、API 参考等。
试过了?评论区说说你的体验。还没试?收藏起来周末折腾。觉得有用点个赞让更多人看到。
作者: itech001
来源: 公众号:AI人工智能时代
网站: https://www.theaiera.cn/
每日分享最前沿的AI新闻资讯和技术研究。
本文首发于 AI人工智能时代,转载请注明出处。