Clipping 微信公众号

别再手写 Skill 了!微软最新研究:像神经网络一样训练 Skill

by 尹John 原文 ↗
Created: 2026-05-27

公众号名称:AGI Hunt

作者名称:尹John

发布时间:2026-05-26 23:47

Microsoft Research

别再手写 Skill 了

像训练神经网络一样
训练你的 Skill

SkillOpt · 52/52 最优 · 平均 +23.5 分

这篇微软最新的研究论文,可能会改变你写 Skill 文档的方式。

相信你已经在写各种 Skill 和给 Agent 的文档了:CLAUDE.md、best_skill.md、agent instructions……

你可能会和我一样,花上一两个小时甚至半天时间,精心打磨一份指令,希望 Agent 能因此而变得更加聪明。

但微软这篇论文的结论,有点点扎心:你手写的那份,大概率不是最优的。

微软的研究团队提出了一个叫 SkillOpt 的方法,核心思路是:

把 Skill 文档当成神经网络的「权重」,用类似训练神经网络的方式去自动优化它。

SkillOpt 架构概览(来源:论文)

结果,该方法在 52 个测试组合中全部取得最优或并列最优,平均提升 23.5 分,碾压了人类手写的 Skill。

关于 Skill

Claude Code、Codex、Cursor 这些工具都已经支持用户写一份「指令文档」来指导 Agent 的行为。不论是 Claude Code 的 CLAUDE.md 或是 Codex 里的 Agents.md 或是 Skill 的各种文档,它们的共性是:

一段纯文本指令,告诉 Agent 遇到什么情况该怎么做。

比如你写了一句「遇到 Excel 公式时,先检查工作表结构,再写入静态值而非依赖 Excel 自动重算」,Agent 在处理 SpreadsheetBench 这类任务时就会照着做。

这个看起来很顺理成章,好像没什么。

但问题在于,你怎么知道自己写的那几条规则就是最好的呢?

你凭经验写了 5 条规则,可能漏了 3 条关键的,还有 2 条写得不够精准。更麻烦的是……你根本不知道自己漏了什么,因为你没法穷举所有可能的写法。

在灵活性和指导性之间,你很难找到那个平衡点。

SkillOpt 的出发点是:既然人写不好,那就让 AI 自己来优化自己的说明书。

训练循环

SkillOpt 的核心思路,用一句话概括就是:

Skill 文档是 Agent 唯一可变的外部状态,那就把它当「权重」来训练。

Agent 的模型参数是冻结的,不能动,但 Skill 文档是纯文本,可以随便改。既然如此,为什么不能像训练神经网络一样,用一套完整的优化流程来迭代优化这份文档呢?

一旦开始这么思考,整个方法论其实就水到渠成了。

SkillOpt 训练流程(来源:论文)

我们先来看看深度学习中的各种概念,是怎么映射到这里的文本空间的。

训练神经网络时,你需要把数据送进去做前向传播(forward pass),对应在 SkillOpt 中的操作叫 rollout:让 Agent 带着当前的 Skill 文档去做一批任务,收集完成情况。

前向传播之后要算梯度(gradient),SkillOpt 中的对应操作叫 reflection:用一个优化器模型去分析哪些任务失败了、为什么失败,并提炼出改进方向。

有了梯度就要更新权重(weight update),对应 SkillOpt 中的操作是 edit:对 Skill 文档做 add、delete、replace 三种结构化编辑。

训练时还有学习率(learning rate)控制步长,SkillOpt 也有一个 textual learning rate:每轮最多只允许改 L_t 条规则(默认 4 条),还有 cosine decay 衰减。

最后,训练时会用验证集做 checkpoint 来保存最优模型,SkillOpt 同样有 validation gating:改完之后在验证集上跑一遍,如果分数没涨,那就不能接受这次修改。

整套流程下来,其实就是把深度学习的训练循环,一比一翻译成了文本编辑的循环。

两个模型分工

在 SkillOpt 中,用了两个模型。

一个叫 target model(目标模型),就是你平时用的那个 Agent,比如 GPT-5.5 或 Claude。它负责带着 Skill 文档去做任务,模型本身冻结不动。

另一个叫 optimizer model(优化器模型),它是另一个超强的前沿模型,负责分析 target model 的表现,然后提出修改建议。

打个比方,target model 像是工厂里的操作工人,optimizer model 像是站在旁边观察的管理顾问。工人按操作手册干活,顾问看工人哪里做得不好,然后改手册。

这个分工带来一个好处:optimizer model 的成本只在训练阶段产生,部署时完全不需要它。

论文也测了用同级别模型做优化器的效果(比如用 GPT-5.4 优化 GPT-5.4 自己的 Skill)。

结果是,同级别优化器也能工作,大约能恢复强优化器 56%-74% 的增益。但用更强的优化器效果显然更好,因为它能看到 target model 自己看不到的问题。

克制的学问

这里有一个设计是:SkillOpt 每轮最多只改 4 条规则。

你可能会从直觉来想:既然都让 AI 来优化了,为什么不让它一次性把整份文档重写呢?

研究团队还真试过了……结论是:不限制反而更差。

无限制重写(unbounded)的效果比 L_t=4 低了 2-3 分。

原因很好理解,跟训练神经网络时学习率太大会导致震荡一样,一次改太多,好的改动和坏的改动混在一起,验证集没法准确判断哪些有用。

还有一个设计叫 rejected-edit buffer

被验证集否掉的修改并不会直接丢掉,它们会存进一个缓冲区。后续的 reflection 阶段会看到这些「前车之鉴」,避免重复犯同样的错。

这就像训练时的 negative feedback,让优化过程有记忆。

另一个关键机制叫 slow/meta update,类似于深度学习中的 momentum。

每个 epoch 结束时,优化器会回顾这个 epoch 和上个 epoch 的 Skill 文档,做一次跨 epoch 的纵向更新。这种慢更新的内容受到保护,step 级别的编辑不能覆盖它。

消融实验显示,去掉 slow/meta update 会导致 SpreadsheetBench 从 77.5 暴跌到 55.0,足足掉了 22.5 分之多。

各组件的消融实验结果

克制,有时候比激进更有效。

效果生猛

讲了这么多设计,效果怎么样呢?

一个字:非常生猛。

研究团队在 6 个 benchmark 上测试,覆盖了单轮问答、多轮代码生成、文档操作、多模态文档理解、数学推理、以及具身环境交互。

相比直怼 GPT-5.5 对话的结果:

SearchQA​ 77.7 → 87.3​ +9.6

SpreadsheetBench​ 41.8 → 80.7​ +39.0

OfficeQA​ 33.1 → 72.1​ +39.0

DocVQA​ 78.8 → 91.2​ +12.4

LiveMath​ 37.6 → 66.9​ +29.3

ALFWorld​ 83.6 → 95.5​ +11.9

+23.5

平均提升分数

训练过程中分数的变化曲线

SpreadsheetBench 和 OfficeQA 各涨了 39 分……这可以说,远远不是小打小闹的微调了,几乎是从「不太能用」到「相当能打」的质变。

而且不光在直接对话场景有效,在 Codex 执行环境中平均 +24.8 分,在 Claude Code 执行环境中平均 +19.1 分。

全部模型 × 环境的完整结果

52 个测试格,全部最优或并列最优。没有一个输的。

碾压人类手写

你可能想问:那跟人类手写的 Skill 比呢?

研究团队专门做了对比。

SkillOpt vs 所有基线方法

把人类精心编写的 Skill 文档(145-516 tokens)作为基线,SkillOpt 在 GPT-5.5 直接对话上的平均分是 82.3,而包含人类手写 Skill 在内的所有其他方法的「逐个 benchmark 最佳选择」组合平均只有 76.9。

也就是说,即使你每个 benchmark 都挑表现最好的那个基线方法,组合起来的平均分也比不过 SkillOpt。

被对比的方法包括:One-shot LLM 生成的 Skill、Trace2Skill(从轨迹中蒸馏)、TextGrad(梯度风格优化)、GEPA(Pareto 反射演化)、EvoSkill(技能文件夹演化)。

全部,被碾压。

AI 学到了什么

而被优化出来的 Skill 文档长什么样呢?

论文里展示了几条学到的规则,看完之后你会觉得,这些规则人类确实很难想到,但一旦看到又会觉得「确实应该这么写」。

SearchQA

根据线索的措辞推断预期答案的类型,然后从共现的独特证据中选择最短的规范实体。

告诉 Agent 不要给出冗长的答案,要精准定位到最短的、符合规范命名的实体。

SpreadsheetBench

先检查工作簿结构和公式,然后在整个请求的目标范围内写入已计算的静态值,而非依赖 Excel 自动重算。

抓住了一个关键 bug:不少 Agent 会写 Excel 公式然后期望自动计算结果,但在自动化环境中……这往往靠不住。

ALFWorld

维护一个包含地平线感知的已访问/前沿位置清单,在连续相同类型的失败后切换搜索方向,并在拿到目标物品之前避免重新访问目的地。

教会 Agent 在虚拟环境中做空间记忆管理,防止在同一个地方转圈。

这些规则有几个共同特点:

极度具体 没有「仔细检查」「认真思考」这类你的老板爱讲的空话,每一条都精确到了操作层面。

反直觉 涉及的场景,人类在写 Skill 时压根不会想到。

紧凑 最终的 Skill 文件只有 379-1995 个 token,中位数大约 920 个 token。有的 benchmark 甚至只需要一条被接受的修改就涨了 39 分。

演化过程

光看最终规则,你可能会感受不深。

于是论文里还展示了 Skill 文档的完整演化过程,你能看到一份空白的 Skill 是怎么一步步长成最终版本的。

ALFWorld 举个例子:

初始状态

一份泛泛的指令:搜索、变换、放置,类似「找到东西、处理一下、放到指定位置」

第一轮 Rollout

发现 Agent 经常找不到目标物品,在同一个房间反复搜索。加了规则:记住你去过哪些地方,别重复访问

继续迭代

发现 Agent 拿到东西后在路上弄丢了。加了规则:拿到物品后锁定进度,不做多余操作

深度优化

加入循环检测器、对象名称精确匹配等规则

最终:49.3 → 74.6(+25.3)

从几乎不能用到相当能打

SpreadsheetBench 的演化也很类似。初始 Skill 只是个通用的自动化指令,经过几轮优化后,Agent 学会了先检查工作簿的 header 和 range、做 key 归一化处理、用静态值替代公式依赖、保留辅助计算列等一系列细致操作。

最终效果:从 40.4 涨到 78.9,提升了 38.5 分。

这些演化过程都展示出:好的 Skill 文档,不是一个人坐那想出来的,它应该是从实践中跑出来的

跨模型跨环境

SkillOpt 还有一个特性是:优化出来的 Skill 可以跨模型、跨执行环境迁移。

跨模型迁移

GPT-5.4 → GPT-5.4-mini(SpreadsheetBench)

+9.4

跨执行环境迁移

Codex → Claude Code(SpreadsheetBench)

+59.7

跨任务迁移

OlympiadBench → Omni-MATH(GPT-5.4)

+3.7

也就是说,你用一个模型优化出来的 Skill,换个模型、换个工具……甚至换个任务,大概率还是有效的。

训练成本是一次性付出的(离线完成),而部署时的额外开销是零。优化后的 Skill 文件就是一段纯文本,拿过来就可以直接使用。

训练成本

而这个优化过程要花多少钱呢?

论文给出了的数据是:对于流程类 benchmark(SearchQA、DocVQA),每提升一个绝对测试分数需要 0.6-3.6M 训练 token。对于复杂轨迹类 benchmark(SpreadsheetBench、ALFWorld),则需要 37.9-46.4M token。

这笔钱其实并不算贵(甚至可以说很便宜了),且关键在于:这只需要训练一次。

训练好的 Skill 文件,在每次使用时都没有额外的成本。如果你的 Agent 要跑成千上万次任务,这点点训练成本早就摊平了,但带来的提升之大,显然是极其值得的。

就好比,花一笔钱请了个顾问来写操作手册,以后所有员工照着操作手册干活就行了。顾问当然是用一次就可以滚蛋了……

大小通吃

论文还测了不同规模模型的表现。

除了 GPT-5.5、GPT-5.4、GPT-5.2 这些前沿大模型之外,研究团队还在 GPT-5.4-mini、GPT-5.4-nano、Qwen3.5-4B、Qwen3.6-35B-A3B 这些更小的模型上做了实验。

结果显示,所有规模的模型都有一致的提升。

这表明,你不一定非得用最贵的模型才能受益于 SkillOpt,哪怕是小模型配上优化过的 Skill,也能比大模型裸跑的效果好。

另一个数据是:训练数据量对效果的影响。

以 SpreadsheetBench 为例,用 1% 的训练数据做优化,分数是 47.5。用 100% 的训练数据,分数涨到 78.0。

数据越多,Skill 优化得越好。但即使数据量不大,SkillOpt 依然能带来可观的提升。

7

目标模型

6

Benchmark

52/52

全部最优

动手试试

微软已经把 SkillOpt 完整开源了(MIT 协议),你可以直接跑起来了。

安装很简单:

bash

git clone https://github.com/microsoft/SkillOpt.git
cd SkillOpt
pip install -e .

再配好 API 密钥:

bash

cp .env.example .env
# 填入你的 API 密钥,然后 source
source .env

# Azure OpenAI(推荐) (...毕竟微软自家产品)
export AZURE_OPENAI_ENDPOINT="https://your-resource.openai.azure.com/"
export AZURE_OPENAI_API_KEY="your-key"

# 或者直接用 OpenAI
export OPENAI_API_KEY="sk-..."

# 也支持 Anthropic Claude
export ANTHROPIC_API_KEY="sk-ant-..."

然后,一行命令就能开始训练:

bash

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 \
    --num_epochs 4 \
    --batch_size 40

目前支持 6 个 benchmark:SearchQA、SpreadsheetBench、OfficeQA、DocVQA、LiveMathematicianBench、ALFWorld。每个都有对应的配置文件,放在 configs/ 目录下。

训练完成后,输出目录里会有一个 best_skill.md,这就是最终优化好的 Skill 文件,可以直接拿去使用:

outputs//
├── best_skill.md            # 最优 Skill 文档
├── history.json             # 训练历史
├── skills/skill_vXXXX.md   # 每步快照
└── steps/step_XXXX/        # 每步的 patch 和评估

可以单独跑 eval 来进行评估:

bash

python scripts/eval_only.py \
  --config configs/searchqa/default.yaml \
  --skill outputs/my_run/best_skill.md \
  --split valid_unseen \
  --split_dir /path/to/searchqa_split

甚至,团队还提供了个 WebUI 可以实时监控训练过程:

bash

pip install -e ".[webui]"
python -m skillopt_webui.app --port 7860

整个项目还支持断点续训,中断后重新跑同样的命令,会自动从上次完成的 step 继续。

别再手写了

微软这篇论文传递的信号是:

手写 Skill 文档或许是个好起点,但不应该是终点。

当然,论文也坦承了该方法的局限:SkillOpt 需要任务有可自动评估的标准(exact match 或自动评分器),开放性任务目前暂还不太适用。

总结一下,SkillOpt 的核心循环是:

让 Agent 做任务 → 分析失败原因 → 生成修改建议 → 在验证集上验证 → 接受或拒绝。这个流程你完全可以手动模仿:观察 Agent 在哪些任务上犯错,分析错误模式,针对性地补充规则,然后验证效果。

Skill 文档不应该是一次性写完就放着不管的东西,它应该像模型权重一样,持续被优化。

别再手写 Skill 了!

相关链接

论文:https://arxiv.org/abs/2605.23904

项目主页:https://microsoft.github.io/SkillOpt/

GitHub 代码:https://github.com/microsoft/SkillOpt

演示视频:https://youtu.be/JUBMDTCiM0M

相关项目 SkillLens:https://microsoft.github.io/SkillLens/


cover_image

Original 尹John AGI Hunt


内容效果不满意?点此反馈

输入关键词开始搜索