SkillOpt 深度评测:微软把 Agent 技能文档当成可训练参数,1992 条测试全绿,覆盖率只有 61%

给 AI 写技能文档的人大概都经历过这种别扭:改一版、跑几轮、感觉好像强了点,但说不清到底强在哪。微软开源的 SkillOpt 想把这件事变成能验证的流程。它 1.9 万 Star、MIT 许可、论文挂在预印本上,核心主张很硬:像训练神经网络那样训练一份技能文档,但一个模型权重都不碰。

我在隔离沙箱里跑完了它自带的全部测试:1992 条通过,耗时 78 秒。然后顺手核了它自己发布的成品技能——6 份里有 4 份,最关键的那一段是空的。

它到底在训练什么

先说人话。现在的「技能」基本是一份 Markdown 文档,里面写着几十条「遇到 A 就 B」的规则,塞给编码助手当工作手册。常见做法有三种:人手写、让强模型一次性生成、让助手自己迭代改写。三种都不保证变好——改坏了也没人知道。

SkillOpt 换了个思路:把这份文档当成模型的参数(也就是可被优化的那部分),冻住模型本体,只训练文档。

流程走六步,每一步都能对应到深度学习里的动作:

训练里的词 SkillOpt 里对应什么
轮次 把训练任务过几遍,默认 4 遍
批大小 每轮先跑 40 条任务收集失败
梯度 另一个优化器模型读失败记录,提出有界的增、删、改
学习率 每一步最多应用 4 条编辑
验证闸门 改完在新一批任务上重打分,分数不变高就整批退回

最关键的是最后一行。每次改完,拿一份没参与训练的验证集重新打分,只有分数严格超过当前版本才保留;否则这一批编辑整份丢弃,还会记进「被拒缓冲区」,避免下一轮重复提同样的改法。所以它交付的不是「一堆越积越多的规则」,而是「每次进步都能指出是哪批任务换来的」。

最终产物就是一份几百到两千多 token 的 Markdown。部署时塞进提示词就行,不额外调用模型——这点很重要,意味着它不会拖慢线上每一次请求。

实测:测试全绿,但有四处对不上

先交代边界。论文里那些「52 组模型 × 基准 × 运行环境全部最优、比不用技能高出二十多个百分点」的数字,要靠付费的模型接口才能复现,本轮我没有跑。下面全部是可离线复核的部分,验完的每一条都能重做。

所有验证都在一次性沙箱里做:只读的系统根目录、清空的环境变量、默认断网,仓库和依赖全落在沙箱挂载点,跑完即弃。

第一件事是跑测试。1992 条通过、24 条跳过、4 条标记为预期失败、381 条子测试通过,总共 77.9 秒。跳过的 24 条我把原因逐条看了:17 条缺可选依赖(网页面板、JSON 容错、联网检索三块),3 条要真实的编码助手命令行,3 条要机器上存着历史会话或外部数据集,1 条是 Windows 专属行为。也就是说,没有任何一条是因为「要接口密钥」而跳过的——测试确实能纯离线复现,这点比很多同类项目实在。

那 4 条预期失败的也值得一提:它们不是坏了,而是项目自己标了「合同待实现」,内容是同一段证据在多轮去重时只保留第一份上下文。把待办写进测试里,而不是写进 issue 里,是成熟项目的做法。

第二件事是覆盖率,反差就出在这。

子包 语句覆盖率 说明
主包(训练引擎与基准) 56.1% 核心训练循环
夜间自进化包 17.5% 最少代码、最新功能
网页监控面板 66.8% 可选组件
合计 61% 两万行语句

主包 24,228 行源码配了 32,905 行测试,测试代码比被测代码多 36%。行数多不等于覆盖全,多出来的是大量分支与边界断言;但 56.1% 这个数字说明,仍然有接近一半的语句没被任何测试碰到。

那个 17.5% 必须单独说:它是今年 6 月才加进来的「睡眠」模块,也是目前唯一对普通用户友好的入口——读你本地的历史会话、重放任务、提出改进。功能最热闹的地方,恰恰是测试最少的地方(九千多行里只覆盖了一千六百行)。

第三件事,我核了它自己发布的 6 份官方成品技能,也就是论文主表对应的那批产物。

基准 成品规模(实测 token) 结尾「跨轮次经验」段
文档问答 394 空
数学选择题 655 空
表格问答 1,218 空
网页问答 1,993 空
表格操作 2,694 有内容
具身智能 2,743 有内容

两个发现。一是 4 份成品的结尾段完全空白——那段本该放跨轮次的长程经验,是它方法论里明确的一环;空着说明生成这些产物时那一环没生效,或者没写进去。二是规模:后两份分别是 2,694 和 2,743 token,越过了项目自述的「通常 300 到 2,000 token」。超一点不算事故,但「通常」这个词在这里被自己的产物打破了。

第四件事更小,但更像漏了一道工序:网页问答那份成品,第 4 行还留着种子文件里的占位句,大意是「还没有学到规则,规则会在反思过程中加上」。而它下面实实在在列着 38 条规则。这行字从初始模板一路复制到最终产物,中间没有任何环节拦下它。它不是逻辑错误,但说明「能跑通」到「能交付」之间,还差一道收尾清洗。

然后是上手成本。按文档从源码安装、直接跑训练,第一条命令就会停:数据目录里只有一份 ID 清单,没有真正的题目,必须先跑物化脚本把数据集下载拼装好(我这边实测下来是 400 条训练、200 条验证、1,400 条测试,七兆多)。而如果你走更自然的包管理器安装路线,装完只有三个命令行入口,配置文件、数据集、产物样例一个都不在包里——照文档的命令跑,直接报找不到配置文件。

版本也对不上。最新版是 7 月 2 日发的,距今四个月没有新版本;主线里已经有的两个模型后端(一个接 GitHub 的编程助手命令行,一个接任意兼容 OpenAI 格式的接口),以及夜间模块的一个配对检验子命令,装进包里的版本都没有。项目把自己的成熟度标成「Alpha」,这算诚实;但读者看到的是首页那句「一行命令装好」。

那套闸门是真的吗

这是我最想验的一点,因为它决定这个项目有没有价值。

夜间模块可以用一个内置的模拟后端离线跑,不需要任何接口密钥。我造了一组 12 条任务:6 条训练、2 条验证、4 条测试,其中一部分标成「必须某条规则才能得分」。

结果:验证分从 0.500 涨到 1.000,改进被接受,产物暂存到一个待审核目录,等你确认才落到正式文件。这一步只能证明流水线是通的——模拟后端是「只要规则在文本里就能答对」的死板逻辑,它不构成任何能力证据。

真正有信息量的是反例。我另造一组任务,只塞一条故意有害的规则(大意是「无视用户的格式要求,随便答」),模拟后端的设定是这条规则永远不可能让任务得分。跑完:验证分 0.000 到 0.000,两条编辑——技能一条、记忆一条——全部被闸门拒绝,并列进了报告里「被拒编辑」那一栏。

也就是说,闸门不是装饰。分数不涨时它确实整批退回,而且会把退回的理由写清楚。这是我对这个项目评价最高的一点。

但同一份代码里还有两个默认值,值得事先知道。

一是夜间模块默认不给测试集留比例(默认 0)。默认情况下它只报「验证集分数变没变」,不报「最终留出的测试集涨了多少」。我特意把 4 条任务标成测试集,报告里依然只有验证分——测试分只写进证据日志,不进报告主体。想看到那个数字,得自己改配置。

二是训练器里「轮次边界的经验写入」默认走强制接受,而不是过验证闸门。而官方放出的那 6 份成品,是按「过闸门」模式生成的。这意味着你照当前默认重跑一遍,未必能复现出同一份产物——项目自己的产物说明里也承认了这一点。

它适合谁

如果你手上已经攒了几十条以上的真实任务、能划出一份干净的验证集,并且想用便宜的小模型跑线上、用强模型夜里优化,这套流程是目前看到最完整的一份。它把「技能越改越好」变成了能记账的过程,这是同类工具还没做到的。

不适合的情况同样明确:没有验证集(那就退化成盲改,闸门形同虚设);只想要一份通用技能(它优化的是特定基准,跨领域迁移有限);预算敏感(每一步都要把验证集整份重跑一遍)。

还有一个安全前提:夜间模块会把会话摘录发给模型供应商,项目自己在文档里写明「发出去的提示不保证不含敏感信息」。别在装着密钥的目录里直接开。

一句话结论

方法论比产品成熟。那套「改完必须过验证闸门,否则整批退回」的纪律,值得所有做技能库的人直接抄走;至于装来就用,建议先等它把版本和文档对上、把空着的那段补齐。

关注 AI商业快讯,每天一篇 AI 热点深度解读。

相关阅读

发表评论