我想创建可自我进化的 Agent 技能。

@hooeem
英语1个月前 · 2026年6月01日
107K
255
34
10
637

TL;DR

学习如何实现 Microsoft 的 SkillOpt,这是一种文本空间优化器,可自动优化 AI Agent 的指令。本指南涵盖了数据设置、训练循环以及部署可移植、高准确性的技能文件。

阅读完本文后,你将学会如何使用 Microsoft 的 SkillOpt,将其指向你自己的技能,然后放手不管,回来时你将获得一个比你最初拥有的技能明显更优的技能。

目前,人们都是手动调整技能,添加规则、删除行、运行评估、再次测试、观察 Agent 的行为,然后重复这个过程。

SkillOpt 终结了这种猜测。

hoeem - inline image

每当我写一篇文章时,我都喜欢确保我的解释能让一个对技能一无所知的人也能从中学到东西。对于你们中的一些人来说,可能有些部分会让你觉得多余,直接跳过那些部分,去看你想学的内容就行了。

技能 就是你交给 Agent 的一整块自然语言指令,让它在工作前执行:流程、输出规则、该做的和不该做的。SkillOpt 把这些文件当作可以 训练 的东西,就像训练模型一样,只不过被训练的是文本,而不是权重。它会在一个示例任务批次上运行你的 Agent,观察哪些做对了、哪些做错了,然后提出对技能的微小修改,并且只有在它能提高保留样本的评分时,才保留该修改。 最终的输出是一个紧凑的文件。

在我们开始之前:SkillOpt 是否适合你?

当你的任务有可以对照已知正确答案进行检查的输出时, SkillOpt 就是正确的工具。信息提取、分类、结构化生成、带有参考答案的问答、能运行或不能运行的代码,任何有正确答案的任务。所有这些都在它的适用范围之内。

而当 “正确” 不存在时,它就是 错误的 工具。

目录:

  1. 什么是 SkillOpt?
  2. 为什么 SkillOpt 非常牛(好)?
  3. 你需要提供什么。
  4. 安装和配置(+官方链接)
  5. 运行它
  6. 阅读结果并部署
  7. 微调(如果你是超级技术宅)
  8. 注意事项
  9. 回报

好了,让我们来改进技能吧。

1:什么是 SkillOpt?

SkillOpt 是一个 文本空间优化器。这句话是整个概念的核心,我们来拆解一下。

当人们改进模型时,通常会改变两个东西之一:权重(微调:成本高,通常在封闭的前沿模型上不可行)或提示(成本低,但只是一次性的猜测,永远不会从发生的事情中学习)。SkillOpt 改变了第三个东西:一个位于你和冻结模型之间的持久 技能文档。模型从不改变,改变的是技能。

它作为一个循环运行,包含四个动部件,并且这个循环刻意模仿了你训练神经网络的方式:

A

冻结的目标模型

使用当前技能运行你的任务。

一个

优化器模型

(第二个 LLM,仅在训练期间使用)读取成功和失败的结果,并提出结构化的修改。添加这条规则,删除那条规则,替换这行。

一个

有边界的编辑预算

限制技能在一步中可以改变的程度,使其逐步改进,而不是被重写成无法识别的东西。论文称此为“文本学习率”。

一个

验证门

在保留集上运行编辑后的技能,并且

只有当评分提升时才会接受该编辑。

失败的编辑会被拒绝并记录下来,这样优化器就会停止再次提出它们。

部署的结果是一个小文件。在论文的六个基准测试中,作者报告最终的最佳技能文件长度大约在 380 到 2,000 个 token 之间,并且仅仅来自 1 到 4 次被接受的编辑。小到可以在几分钟内阅读和审计。

hoeem - inline image

给视觉型学习者的图

2:为什么 SkillOpt 非常牛(好)?

两个原因。对于一个从不触及权重的方法来说,它出奇地有效,而且它产生的结果是可移植的。

它有效。 作者在六个基准测试(搜索问答、电子表格、文档、多模态问答、数学和具身 Agent 任务)、七个目标模型和三种执行模式(直接聊天、Codex 工具集和 Claude Code 工具集)上评估了 SkillOpt。他们报告说,在他们测量的所有 52 个(模型、基准、工具集)组合 中,SkillOpt 是最好的或并列最好的方法。在 GPT-5.5 的直接聊天模式下,他们报告六个基准测试的平均值从没有技能时的 58.8 上升到了 82.3,这是一个 +23.5 分 的提升,平均每个组合比最强的竞争基准线高出 +5.4 分。他们报告的具体跳跃包括 SpreadsheetBench 从 41.8 到 80.7,以及 OfficeQA 从 33.1 到 72.1。

这是摘要:

hoeem - inline image

稍后我会给你论文的链接。

有一个细节值得记住:最大的收益出现在 程序性 任务上。也就是模型需要关于工具使用和输出格式的纪律,而不是需要更多原始知识的任务。这告诉你 SkillOpt 在哪些地方能发挥其价值。那些模型有能力但不够严谨的任务。

它是可移植的。 这是长期来看最重要的一点。因为输出是调用冻结模型的纯文本,作者报告说,训练好的技能可以在不同设置之间迁移:在 Codex 工具集内训练的电子表格技能,迁移到 Claude Code 工具集后,据报道有 +59.7 分 的提升;在更大的 GPT 变体上训练的技能改进了较小的模型;在一个基准上训练的数学技能在另一个不同的数学基准上也产生了正向收益。

hoeem - inline image

3:你需要提供什么。

这是大多数文章跳过的一节,也是决定你成败的一节。

SkillOpt 提供了评分机制。你需要提供答案密钥。 循环负责评分、门控和编辑。这些都在代码仓库里。代码仓库无法知道的是,对于 你的 任务,什么样的输出才是正确的。只有你知道。所以,你的工作是交给它一组示例任务,每个任务都配有其正确答案。

代码仓库明确指出:数据集不附带,你需要自己准备。SkillOpt 期望一个 拆分目录,包含三个子文件夹,每个子文件夹包含一个 JSON 文件:

text
1data/my_split/
2├── train/items.json # 优化器从中学习的示例
3├── val/items.json # 门控评分时使用的保留示例
4└── test/items.json # 锁定;仅用于最终报告

每个 items.json 是一个任务数组。SearchQA 格式是最简单且最容易借鉴的:

json
1[
2 {
3 "id": "unique_item_id",
4 "question": "谁写了小说……",
5 "context": "[DOC] 相关段落文本……",
6 "answers": ["预期答案"]
7 }
8]

answers 字段就是你的答案密钥。这就是 “构建你自己的评分器” 的全部内容。对于可以客观检查的任务,它简化为 在 JSON 文件中列出示例及其正确答案。 你不需要编写评分系统。比较逻辑已经存在于基准测试的环境代码中 (skillopt/envs/<benchmark>/dataloader.py)。

最便宜的路径:借用现有基准测试的形态

不要发明新的任务类型。将你的任务表达为最接近的内置基准测试,并重用其配置和评分器。 对于大多数“正确回答”或“提取此字段”的技能,那就是 SearchQA:一个问题、可选上下文和一个由内置评分器匹配的简短规范答案。将你的数据塑造成 items.json 的格式,指向 configs/searchqa/default.yaml,那么你就不需要编写任何 Python 代码了。

你可以借用的六种内置类型:

hoeem - inline image

需要多少个示例?

研究论文的完整运行使用了数百个示例,但其自身的分析显示,程序性基准测试在只使用其中一小部分时就已经开始急剧攀升,而搜索类任务在使用了大约 20% 的训练池后趋于饱和。从小处着手。20 到 40 个示例就足以获得真正的信号和一次便宜的首次运行。 按照大约 4:1:5 的比例将它们分割到训练集/验证集/测试集中,这符合论文的默认分割比例。在确认了循环有帮助之后,再增加更多示例。

当精确匹配不够用时

如果你的正确答案不是简短的规范字符串,如果“正确”需要判断,那么备用方案是 使用 LLM 作为评判者 的评分器:另一个模型根据你编写的标准,将每个输出评为 0 到 1 之间的分数。这是支持的(代码仓库接受 OpenAI 和 Anthropic 的 API 密钥),但这是一条更困难、更不可靠的路。一个嘈杂的评判者会接受错误的编辑并拒绝好的编辑,然后整个循环就会漂移。只有当精确匹配确实无法表达你的任务时才使用它,并且如果你使用它,请保持标准严格,并手动抽查评分结果。对于你的第一次运行,选择一个客观上可评分的任务,完全避免这种情况。

答案密钥是整个游戏的关键。下游的一切都信任它。

hoeem - inline image

4:安装和配置

我永远不会相信网络上的匿名者,所以我也不期望你信任我,我只会直接链接到代码仓库:

https://github.com/microsoft/SkillOpt

https://microsoft.github.io/SkillOpt/

继续……

5:运行它

核心命令是 scripts/train.py。以下是它的结构,使用了你正在借用的 SearchQA 配置:

bash
1python scripts/train.py \
2 --config configs/searchqa/default.yaml \
3 --split_dir /path/to/your/my_split \
4 --optimizer_model gpt-5.5 \
5 --target_model gpt-5.5 \
6 --num_epochs 4 \
7 --batch_size 40 \
8 --out_root outputs/my_first_run

需要理解两个角色:

--target_model

使用

技能的模型。也就是你将部署的模型。将其设置为你实际在生产环境中运行的任何模型(OpenAI、Anthropic 或本地模型部署名称)。

--optimizer_model

提出编辑方案

的模型。它仅在训练期间运行,并且永远不会随你的技能一起发布,因此它在部署时不会增加任何成本。论文发现,更强的优化器能产生更好的技能,所以在这里使用你能负担得起的最好的模型。但这是训练时间的奢侈,不是必需品。

先便宜地运行一次

在你投入真金白银之前,先通过一次特意设置的小型廉价运行来证明这个循环对你的数据有帮助:

使用

同一个模型担任两个角色

(--optimizer_model = --target_model)。论文显示,与目标匹配的优化器仍然能恢复很大一部分增益,所以这不像蒸馏技巧那样需要一个更大的教师模型。

--num_epochs

减少到 1 或 2,并将

--batch_size

减小到你的数据集大小。

使用你的 20 到 40 个示例的拆分,而不是几百个。

观察增益。如果一次微小的运行就能移动验证分数,那么就扩大规模。如果毫无作用,那么你的任务可能没有给优化器提供足够的信号。在投入更多之前,重新检查你的示例。

设定你自己的初始技能

如果你已经有一个手写的技能(例如,一个现有的 Claude 技能文档),你不必从基准测试的默认值开始。初始技能在你选择的 configs/<benchmark>/default.yaml 中定义。打开那个文件,找到指定初始技能文本的地方,然后粘贴你的技能进去。之后,SkillOpt 将 进化你的技能,而不是从零开始构建一个,这通常是你想要的。它保留已经有效的东西,并修复无效的东西。

它输出什么

每次运行都会生成一个结构化的输出文件夹:

text
1outputs/my_first_run/
2├── best_skill.md # ← 你要部署的文件
3├── history.json # 每一步的训练历史
4├── skills/skill_vXXXX.md # 每一步的技能快照
5├── steps/step_XXXX/ # 每一步的编辑和评估结果
6├── slow_update/epoch_XX/ # 跨时期整合日志
7└── meta_skill/epoch_XX/ # 优化器端笔记(不随技能发布)

重新运行相同的命令会自动从上一步完成的地方继续,所以中断的运行不会浪费。

如果你希望实时观察进度,还有一个可选的监控仪表板:

bash
1pip install -e ".[webui]"
2python -m skillopt_webui.app # 添加 --share 获取公共链接

6:阅读结果并部署

当运行完成后,有两件事很重要。

阅读 best_skill.md。 它很短,而且是纯英文(这里是简体中文)。你会看到它将一个通用指令变成了具体的、来之不易的规则。这是细心实践者在处理任务一天后才会写出的那种规则。在论文的电子表格案例研究中,一个模糊的“使用 Python 并保留工作簿”的技能演变成了具体的规则,例如 检查实际工作簿而不是预览即使提示提及公式也要写入计算出的静态值。因为它只有少数几个被接受的编辑,所以你可以阅读每一个变化并决定是否信任它。这种可审计性是一个优势。你部署的是你能理解的文本,而不是你不能理解的权重。

在保留数据上确认增益。 不要盲目相信训练分数。针对循环从未触及的测试拆分运行评估脚本:

bash
1python scripts/eval_only.py \
2 --config configs/searchqa/default.yaml \
3 --skill outputs/my_first_run/best_skill.md \
4 --split valid_unseen \
5 --split_dir /path/to/your/my_split

valid_unseen 是测试集,valid_seen 是验证集,all 则运行所有内容。将该技能的测试分数与无技能的基线(使用空技能或默认技能运行相同的评估)进行比较。这个差异就是 你的 任务上的 你的 增益。这是唯一应该决定你是否发布它的数字。

部署。 best_skill.md 只是文本。将它放入你的 Agent 中,放到任何程序性指令所在的地方:为直接聊天 Agent 把它注入到系统提示词之前,或者将其保存为你的工具集加载的技能/程序性记忆文件。这就是部署。没有改变权重,没有推理时的优化器,循环中没有任何额外的东西。只是一个更好的指令文件。

7:调优

你可以在不理解这些的情况下运行 SkillOpt。但如果你是个技术宅,喜欢深入研究,并且想智能地而不是靠猜测来调整配置,以下是这些开关的作用。每一个都刻意模拟了一个训练概念。

有边界的编辑(“文本学习率”)。 每一步最多应用少数几次编辑,由论文称为 Lt(默认 4,向 2 衰减)的预算上限控制。这就是 SkillOpt 与仅仅要求模型“重写我的提示”之间的区别。无限制的重写会抹掉有效的规则,并过度拟合到最近的一次失败。有边界的编辑使每个版本都接近上一个版本,因此技能是逐步积累改进,而不是来回折腾。论文的消融实验表明,任何适度的预算都优于无限制的重写。

验证门。 每一个提议的编辑都会在保留示例上进行测试,并且 只有当分数严格提高时才会被接受。 平局会被拒绝。这就是将“模型认为这个编辑很好”转变为“这个编辑可以被衡量地证明是好的”的关键所在,这也是该方法不会无声无息地漂移到无意义状态的原因。它也是承重最大的组件,也是第 3 节存在的原因。该门的诚实程度完全取决于你提供给它的答案密钥。

已拒绝编辑缓冲区。 未能通过门的编辑不仅仅是被丢弃。它们造成的分数下降会被记录下来并反馈给优化器,使其停止再次提出已经失败的建议。论文报告说,移除这个缓冲区会显著降低结果。它在部署时不会增加任何成本。纯训练时的记忆。

慢速 / 元更新。 在每个时期结束时,SkillOpt 会将技能与前一时期的版本进行比较,并将一个更长远的“什么在持久地发挥作用”的笔记写入技能的一个受保护区域,快速的编辑无法覆盖该区域。这就是动量项。论文报告说,在电子表格任务上,同时移除慢速和元更新在其消融组合中造成了最大的单一性能下降。元技能部分留在优化器端,永远不会随你部署的文件一起发布。

hoeem - inline image

8:诚实的局限性

成本是真实存在的,并且需要预先支付。 两个模型在多个时期和批次上运行会消耗 API token。论文将训练成本衡量为每个测试集增益点消耗 数百万 个 token,从廉价程序性任务的约 0.6M 到长多模态任务的 46M。我故意不引用具体的美元金额,因为每个 token 的价格会变化,而且我无法验证今天的汇率。为此做预算,这正是第 5 节推荐先廉价运行一次的原因。好消息是:成本是一次性的。一旦你有了 best_skill.md,使用它不会增加任何成本。没有优化器,没有额外的调用。但前期投入确实不少。

垃圾答案密钥,垃圾技能。 门控机制信任你的答案。如果你的示例是错误的或不一致的,SkillOpt 会忠实地朝着错误的目标进行优化。把你的精力花在示例集上。它是决定一切的输入。

在不存在“正确”答案的地方,它无法制造一个。 重申一下最上面的过滤器,因为这是最常见浪费周末的方式:如果你的任务没有可检查的正确答案,这个工具不适合你。

9:持久的回报

这就是为什么这会改变你构建技能的方式,而不仅仅是这一个技能。

一旦你做过一次,你就拥有了一个 可移植、可检查、可重用的工件。 一个文本文件,而不是一个黑盒。你可以阅读它,手动编辑它,进行版本控制,并把它交给队友。而且因为它调用的是冻结模型,而不是被烘焙到模型中,论文的迁移结果表明它可以迁移:跨模型大小、跨执行工具链、到相近的任务上,而无需重新运行任何东西。

技能不再是每次出问题时你凭直觉重写的、一次性的提示,而是变成了 你训练、验证、保留并带向未来的资产。 你应用于模型(证据、学习率、验证检查、动量)的同一套优化工具包,现在可以应用于你 Agent 堆栈中那个曾经纯粹靠手工艺的层。

你不再需要猜测某个更改是否有帮助。你在衡量它,并且只保留那些获胜的更改。

P.S. 整个方法成败取决于一个输入:一组带有正确答案的示例。剩下的就是两个命令。如果你在真实的任务上运行它。

链接:

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

代码仓库:https://github.com/microsoft/SkillOpt

酷炫的东西:https://microsoft.github.io/SkillOpt/

一键保存

使用 YouMind AI 深度阅读爆款文章

保存原文、追问细节、总结观点,并在一个 AI 工作空间里把爆款文章沉淀成可复用笔记。

了解 YouMind
写给创作者

把你的 Markdown 变成干净的 𝕏 文章

图片上传、表格、代码块,往 𝕏 上手动重排太痛苦。YouMind 把整篇 Markdown 一键转成干净、可直接发布的 𝕏 文章草稿。

试试 Markdown 转 𝕏

更多可拆解样本

近期爆款文章

探索更多爆款文章