这个工具叫 SkillOpt,它把写 skill.md 这件事变成了一种训练过程。
目的只有一个,让 Agent 真的能把你写的技能文档用起来,而不是每次都靠运气。
事情是这样的。
前阵子我在写一个 skill,教 Agent 怎么帮我整理每天的技术笔记。
写了大概两千字,把自己能想到的场景全塞进去了。
然后扔给 Agent 跑,结果一言难尽。
有时候能跑对,有时候完全跑偏,我改一处,它别的地方又出问题了。
就这么来回改了一个晚上。
我后来想了一下,这件事跟调模型没什么区别。
你改参数,跑一下,看结果,再改,再跑。
只是调模型有 loss,有梯度,有系统性的方向。
改 skill.md,靠的是感觉。
先说结论
SkillOpt 就是来解决这个问题的。
它让 skill.md 的优化过程变得可量化、可迭代、有方向。
微软把这个项目开源了,现在已经 9000+ Star。
核心思路一句话就能说清楚,把 Agent 执行技能的过程记录下来,分析哪些规则有用哪些没用,然后有针对性地改,改完再验证,直到性能不再提升。
听起来不复杂对吧。
但你去想想,之前大家是怎么写 skill 的。
它到底做了什么
SkillOpt 把整个过程拆成了四个阶段,恰好对应深度学习的训练循环。
我一个个说。
第一阶段 前向传播
让 Agent 拿着现有的 skill.md 去跑一批任务,把整个过程录下来。
用了哪些工具、调用了几次、每一步的输入输出、最后的得分,全记录。
这一步不需要任何优化,就是跑一遍,看现状。
跟训练模型里先跑一次前向传播看 baseline 是一个意思。
第二阶段 计算梯度方向
这是整个工具最聪明的地方。
它用一个单独的模型来分析刚才那些执行记录,找出成功和失败的模式。
比如说,所有成功跑完的任务都调用了某个工具,而失败的全没调用。
那说明 skill.md 里可能漏写了这个工具的用法。
反过来,某些规则在失败案例里频繁出现,说明这条规则可能有问题。
它把成功轨迹和失败轨迹分开处理。
成功的规则,不能随便动。
失败的,才允许改。
这就跟梯度方向一样,告诉你朝哪个方向改是对的。
第三阶段 有节制地改
找到方向之后,它提出具体的修改方案,加一条规则、删一条规则、或者改某个描述。
但每次最多改 4 处。
这个 4 是「文本学习率」,你可以调。
为什么不能一次改太多?
因为改多了你不知道哪一处起了作用,改错了也无从排查。
就跟学习率设太大模型会发散是一个道理。
第四阶段 验证后再接受
改完的 skill.md 要在验证集上跑一遍,分数真的涨了才接受这个修改。
如果没涨,或者跌了,这个修改就被拒绝,并且记录到一个「拒绝编辑缓冲区」里。
下次不会再往这个错误方向改了。
这整个循环跑完,skill.md 就被迭代了一轮。
有几个边界得顺手说一下。
SkillOpt 需要你准备带验证标签的数据集。
就是你知道每个任务跑完之后,对的结果长什么样。
如果你的任务是「帮我整理笔记」这种开放式任务,你先得想办法给它定义一个可量化的评分标准。
这是使用门槛,不是开箱即用。
另外,它目前主要针对的是 skill.md 这种 Markdown 格式的技能文档。
如果你用的是其他格式的 prompt 管理方案,可能需要自己适配。
顺着上面的再说迁移能力。
这个是我觉得最实用的部分。
在 GPT-5.5 上训出来的 skill.md,可以直接搬到 GPT-5.4-mini 上用。
在 Codex 上训出来的,也可以用在大模型 Claude Code 上。
也就是说,你不需要为每个模型重新训一遍。
训一次,多个模型复用。
这个意义很大。
因为现在各家模型的能力边界不一样,Agent 框架也不一样,以前每个环境都要重新调 prompt,现在有可能一套 skill 通吃。
当然,迁移效果取决于任务本身的通用性。
如果某个技能高度依赖某个模型的特有行为,那迁移过去可能还是会掉分。
SkillOpt 论文里的实验数据显示掉分不多,但你自己用的时候建议还是验证一下。
测试结果
论文里跑了 52 个测试场景。
全部达到了最好或者并列最好的结果。
具体数字。
GPT-5.5 平均提高了 23.5 个百分点。
ALFWorld 环境里,GPT-5.4-mini 从原来的 70.9% 提升到了 85.8%。
而且只用了 4 个被接受的编辑。
也就是说,不需要改很多处,找准方向的话几处修改就能带来明显提升。
训练过程中的分数变化是可视化的,哪些编辑被接受了、哪些被拒绝了、拒绝的原因是什么,全有记录。
这个对我这种喜欢搞清楚「为什么」的人很有帮助。
如果你想试一下
项目地址先放这里。
https://github.com/microsoft/SkillOpt
基于 MIT 协议开源,可以直接用。
安装很简单,就是标准 Python 项目那套。
git clone https://github.com/microsoft/SkillOpt.git
cd SkillOpt
pip install -e .
配置 API 密钥,把 .env.example 复制成 .env,填进去就行。
# OpenAI
export OPENAI_API_KEY="sk-..."
# 或者 Azure OpenAI
export AZURE_OPENAI_ENDPOINT="https://your-resource.openai.azure.com/"
export AZURE_OPENAI_API_KEY="your-key"
# 或者 Anthropic Claude
export ANTHROPIC_API_KEY="sk-ant-..."
数据准备有两种方式。
让 SkillOpt 自动划分训练集、验证集、测试集。
或者你自己准备好三个文件夹,手动指定。
然后开始训练。
python scripts/train.py --config configs/searchqa/default.yaml
可以指定 teacher 和 student 模型。
python scripts/train.py \
--config configs/searchqa/default.yaml \
--teacher_model gpt-5.5 \
--student_model gpt-5.5
训练完之后的输出目录结构很清晰。
outputs/<run_name>/
├── best_skill.md # 最终训练出的技能文档
├── skills/ # 每个步骤对应的技能快照
├── steps/ # 每个步骤的详细记录
└── history.json # 训练历史
把 best_skill.md 的内容直接塞进 Agent 的 system prompt 里就能用。
整个训练过程没有增加额外的推理开销。
部署的时候也不需要调用优化器模型,就多了一个 Markdown 文件。
说一下我的看法
SkillOpt 让我重新想了一个问题。
Agent 的能力上限,到底是受限于模型本身,还是受限于你给它的技能文档?
过去两年大家都在卷模型,参数规模、benchmark 分数、多模态能力。
但模型强,skill 写得烂,Agent 还是用不起来。
这件事其实很多人都有体感,只是没有系统性的办法去解决。
SkillOpt 提供的是一个方向,把技能文档也当成一种可以训练的「参数」,用数据驱动的方式去优化它。
这个思路我觉得会慢慢变成标配。
不一定是用 SkillOpt 这个工具,但这个方向是对的。
以后可能会有更多人做类似的事情,针对不同的 Agent 框架、不同的技能格式,都会有对应的优化工具。
到最后。
Agent 这个东西,是在模拟一个人怎么用工具完成任务。
你给它模型、给它工具、给它技能文档,它就能干活。
这三个里面,模型是别人训好的,工具是你集成的,只有技能文档是你自己写的。
如果你写的技能文档质量上不去,Agent 的上限就被你卡住了。
SkillOpt 把这件事变得有方法了一些。
不是什么革命性的东西,但挺实用的。
以上。
既然看到这里了,欢迎随手点赞、在看、转发,也可以给我一个星标,接收最新的文章。我们下期见。