AI学习吧
📍 源码七号站 开源解码 把 Skill 当成可训练的「参数」:微软 SkillOpt 如何让智能体技能自我进化(原理拆解 + 上手全流程)

把 Skill 当成可训练的「参数」:微软 SkillOpt 如何让智能体技能自我进化(原理拆解 + 上手全流程)

摘要:SkillOpt 是微软研究院开源的工具,它像训练神经网络一样,自动优化你写给智能体的技能说明书(Markdown文档)。通过两个模型分工协作——一个干活、一个复盘并小步修改,每次改动都需通过验证集检验才能保留。在6类任务、7个模型、52个对比中全部第一,GPT-5.5上平均准确率提升23.5分。很多智能体不靠谱,不是模型笨,而是你的技能写得不够好——而这件事现在可以被自动训练出来。
字号 100%
行距 2.05
当前可见 60% 的内容
本文由 莫潇羽@源码七号站(www.fuyuan7.com)撰写,转载请注明出处。

先给只想要结论的人一句话: 微软研究院开源了一个叫 SkillOpt 的工具,它不动模型一根毫毛,只把你写给智能体看的那份「技能说明书」(一份 Markdown 文档)当成可以反复训练、自动调优的对象——像训练神经网络那样去训练一段自然语言提示词,有训练轮次(epoch)、批量大小(batch size)、验证集和「学习率」这些概念,唯独不碰模型权重。它的做法是让一个模型按当前技能去跑任务、另一个模型在旁边复盘并小步修改技能,每次改完都拿没见过的新题去验证,改好了才留下、改砸了立刻回滚。在官方给出的成绩里,它在 6 类任务、7 个目标模型、共 52 个对比格子上全部拿到第一或并列第一;在 GPT-5.5 的直接对话场景下,平均准确率比「不给技能」的基线高出约 23.5 分,表格类任务的提升尤其明显。 也就是说:很多时候智能体不靠谱,不是模型笨,而是你那份 Skill 写得不够好——而这件事现在可以被「训练」出来。

想看完整拆解(原理、流程图、官方数据、从安装到产出 best_skill.md 的实操命令、以及我自己踩过的坑),往下翻


一、先把问题说清楚:为什么你的 Skill 越改越糟

写过智能体(Agent)的人,大概都经历过下面这个循环。

你给智能体配了一份技能文档(Skill / 系统提示词),让它去干一类活儿——查资料答题、读文档、填表格、解数学题,随便哪种。一开始还行,跑着跑着就开始跑偏:格式不对、漏掉关键步骤、在同一个坑里反复栽。于是你打开那份 Skill,手动加一句「别这么做」。第二天发现输出格式又乱了,再补一句「输出应该长这样」。再过两天遇到新情况,又往里塞一段说明。

几轮下来,那份文档越写越长,规则越堆越多,智能体却没变听话,反而更糊涂了。这几乎是所有手写提示词的通病,我自己折腾下来体会很深,原因大致有三个。

第一,人改提示词靠的是直觉,说不出所以然。 你觉得「加这一句应该会好」,但到底是哪一句起了作用、起了多大作用,没人测得清楚。改对了是运气,改错了也未必能马上发现。等你回过神来,文档里早已躺着一堆当初拍脑袋加上去、现在谁也不敢删的「祖传规则」。

第二,改动之间会互相打架。 你为了堵住 A 问题加了一条规则,结果它悄悄把原本运行良好的 B 行为也带偏了。提示词不像代码有清晰的依赖关系,一句自然语言的副作用可能扩散到任何角落,人脑很难全程兜住。

第三,越长不等于越好。 直觉上「规则写得越细越保险」,但实际恰恰相反:冗长的指令会稀释真正关键的那几条,模型的注意力被一堆边角料分走,核心约束反而被淹没。到最后你会发现,真正起决定作用的核心规矩,往往就那么一两条、三四条,剩下的全是噪声。

举个我自己遇到过的具体场景。我让一个智能体去做「从一段产品描述里抽取关键参数、整理成表格」的活儿。第一版它老把单位漏掉,我就加了一句「务必带上单位」;第二版单位是带上了,但它开始把多个参数硬塞进同一个单元格,我又加「每个参数单独一行」;第三版行是分开了,可遇到描述里没提到的参数它会自己瞎编一个,我再补「找不到就留空,不要臆造」。三句话加下来,文档是长了,可它又冒出了新毛病——把本该合并的同类项拆得七零八落。我当时的真实感受是:像在打地鼠,按下一个又冒一个,而且我完全说不清这几句话之间到底有没有互相干扰。 后来我才意识到,这种「手忙脚乱地打补丁」本身就是问题,因为我既没有一个客观标准判断每一句到底有没有用,也没有一张能让我安心删改的安全网。

所以问题的本质是:调 Skill 这件事,长期处在「凭感觉、不可验证、不可回退」的手工作坊状态。 你没有客观的「这次改动到底有没有让它变好」的判据,也没有「改坏了就退回去」的安全网,更没有一个机制帮你把那几条真正有用的规则从噪声里捞出来。

这正是 SkillOpt 想解决的事——它把「调技能」从一门玄学,变成一件能验证、能回退、能自我迭代的工程。下面我们就来看它具体是怎么做的。

二、SkillOpt 到底是什么:把「技能文档」当成可训练的参数

2.1 一句话定位

SkillOpt 是微软研究院开源的一个 「文本空间优化器」(text-space optimizer)。它的官方定位有一句很精炼的话,我把它翻译成大白话就是:像训练神经网络一样去训练一段可复用的自然语言技能,但全程不碰模型权重。

这里有几个词要拆开解释,因为它们正是理解整套思路的钥匙。

「技能(Skill)」:指的就是你喂给智能体的那份说明书——可以是一份 Markdown 文档,也可以理解成系统提示词里关于「这类任务该怎么干」的那部分内容。它不是模型的一部分,而是模型之外、由你掌控的一段文字。

「冻结的模型(frozen model)」:意思是模型本身一动不动。我们平时说「训练模型」,改的是模型内部成千上万的权重参数,又费钱又费卡。SkillOpt 反其道而行——模型保持原样,被训练的对象不是模型,而是那份技能文档

「文本空间(text space)」:神经网络的参数活在数值空间里,靠梯度一点点调。SkillOpt 把那份文档当成「参数」,但它活在文本空间里,靠的是「读懂哪里写得不好、然后改几个字」来调。

2.2 「在文本空间里训练」到底是什么意思

打个我自己常用的比方。传统训练神经网络,更新参数靠的是梯度下降,写成公式大概是这样:

[

\theta_{t+1} = \theta_t - \eta \cdot \nabla L(\theta_t)

]

这里的 (\theta) 是模型参数,(\eta) 是学习率,(\nabla L) 是损失对参数的梯度——一句话,朝着「让错误变小」的方向,按一定步长去挪参数

SkillOpt 干的是结构上一模一样的事,只不过把每一个零件都换成了「文字版」:

[

\text{Skill}_{t+1} = \text{Update}\big(\text{Skill}_t,; \text{反思}(\text{这一批任务跑得怎么样})\big)

]

  • 「参数 (\theta)」换成了技能文档 Skill
  • 「梯度 (\nabla L)」换成了一个模型对「哪里做砸了、为什么砸」的反思——它读不到数值梯度,但它能读懂任务轨迹,从里头总结出「问题大概出在技能的哪条规则上」;
  • 「学习率 (\eta)」换成了每次只允许小改几处的限制——步子不能迈太大;
  • 最关键的「损失变小」这个判据,换成了拿没见过的题去验证、分数变高才算数

所以你会在它的训练里看到一整套眼熟的术语:训练轮次(epoch)、批量大小(batch size)、验证集(validation)、还有「学习率」式的步长控制。整个过程就是一次完整的训练循环,只不过被优化的那个「参数」是一段人类能直接读懂的文字。

你可能会问:好端端的为什么要在「文本空间」里折腾,不直接微调模型?我自己想清楚之后,觉得至少有三点好处,值得展开说说。

一是可读、可审、可改。 模型权重是几十亿个浮点数,没人看得懂里头哪个数字在管什么事;而技能文档是大白话,你随时能打开看它学到了什么、哪条规则是怎么来的,觉得不妥还能手动改。优化过程对人是透明的,这在很多对结果要负责的场景里特别重要——你得能解释清楚智能体为什么这么干。

二是便宜、不动卡。 微调一个大模型要准备数据、占用大量算力、还得管理一堆权重版本;文本空间优化烧的主要是推理调用,没有反向传播,也不需要把模型拆开来改。对绝大多数只能调 API、改不了权重的团队来说,这几乎是唯一现实的路子。

三是可迁移、零部署负担。 训练完你拿到的就是一份文本,理论上可以挪到别的模型、别的框架上接着用;而且因为模型本身没变,上线之后推理速度和成本一分不多——你只是把一份更聪明的说明书递给了同一个模型。这一点和「微调出一个更重的模型」是本质区别。

当然它也有代价:文本空间的「梯度」是模型反思出来的,不像数值梯度那样精确,所以它更依赖复盘模型的智商,优化曲线也没那么平滑。这笔账怎么算,后面第七章会专门聊。

这件事的妙处在于:训练结束后,你不会得到一份几个 G 的模型权重,而是得到一份普普通通的 best_skill.md 文件。它是纯文本、人能读、能审、能直接拷到别的项目里用,而且因为模型没动过,推理阶段没有任何额外开销——你只是换了一份更好的说明书而已。

接下来这份「说明书」是怎么被一步步训练出来的,得靠两个模型搭班子配合。下一章我们就把这套机制彻底拆开。

2.3 那份被训练的「技能文档」,里头到底写些什么

讲机制之前,先帮新手把对象搞具体。很多人一听「技能文档」会觉得很玄,其实它就是一段结构化的自然语言指令,告诉模型「面对这一类任务,你该按什么套路来办」。拿前面那个表格抽取的活儿举例,一份技能文档里大致会有这么几类内容:

  • 任务目标:一句话说清这是在干嘛,比如「从产品描述中抽取参数并整理成规范表格」。
  • 操作步骤 / 套路:分几步走、每步做什么,相当于一份给模型看的标准作业流程。
  • 约束与禁忌:哪些事坚决不能做,比如「找不到的参数留空、绝不臆造」。
  • 格式规范:输出长什么样,字段顺序、单位怎么带、缺失值怎么标。
  • 踩坑提示 / 启发式:一些容易出错的地方的特别叮嘱,比如「同类项要合并、别拆散」。

SkillOpt 训练时调整的,正是这一整份文档里的内容——增一条约束、删一段冗余、把某条含糊的步骤改清楚。理解了这一点,你再回头看后面「复盘模型小改几处」的描述就不抽象了:它改的就是上面这些条目里的某几句话。说白了,被训练的不是什么神秘参数,而是一份你随时能打开、读得懂、还能自己接着改的工作手册。

三、核心机制拆解:两个模型怎么搭班子

SkillOpt 最聪明的地方,是它没让一个模型既当运动员又当裁判,而是请了两个角色分工协作。官方把它们叫做目标模型(target model)和优化模型(optimizer model)。我习惯把前者叫「干活的」,后者叫「复盘的」。

整套循环可以拆成下面几个动作,我们一个一个看。

3.1 干活:按当前技能跑一批任务(rollout)

第一步,干活的模型登场。它拿着当前这一版技能文档,去做一批任务——这批任务从训练集里按 batch 抽出来,可能是几十道题。

干活的过程会被完整记录下来:每道题它怎么一步步推理、调用了什么、最后给出什么答案、对照标准答案是做对了还是做砸了。这份「全程录像」在论文里叫轨迹(trajectory)。注意这一步里,干活的模型是冻结的——它不学习、不改进,就是老老实实按当前说明书办事,把真实表现暴露出来。

这一点很重要:它跑出来的成功与失败,就是后面优化的唯一依据。没有真实轨迹,复盘就是空谈。

3.2 复盘:成功提炼经验,失败找规律(reflection)

第二步,复盘的模型接手。它不做题,专门读上一步那批轨迹,干两件事:

  • 做成的任务,琢磨「为什么这次行」,把有效的做法提炼出来;
  • 搞砸的任务,重点找规律——是不是老在同一个地方栽?是不是某一类格式总出错?是不是技能里某条规则表述得太含糊,导致干活的模型理解偏了?

这一步对应的就是前面公式里那个「文字版的梯度」。复盘模型读不到数值梯度,但它能从一堆失败案例里归纳出「问题大概出在技能的哪一句上」,给出一个有方向的修改信号。这也解释了官方文档里强调的一点:优化模型本身得足够强——它得有能力做出靠谱的反思。复盘的模型越聪明,提炼出的修改方向越准,整套框架才越管用。所以真正发挥威力的场景,是用市面上最前沿的模型来当这个「复盘的」。

3.3 受限编辑:每次只准小改几处(bounded edits)

第三步,根据复盘结论动手改技能文档:加内容、删内容,或者把某条规则的描述换个说法。

但这里有个硬约束——每次只允许小幅修改几处,不能大刀阔斧重写。这就是前面说的「学习率」式控制。道理和训练神经网络一样:步子迈太大,很容易在堵一个新坑的同时,把原本好用的老规矩一起改坏了,结果整体不升反降。把改动量控制在很小的范围内,每一步都走得稳,整条优化曲线才不会剧烈震荡。

这种「小步快走」的设计,本质上是在降低单次改动的风险——改动越小,万一改错了,回滚的代价也越小。

3.4 验证闸门:改完要过没见过的题(validation gate)

第四步,也是我个人觉得整套设计里最关键的一环:验证闸门

改完技能之后,先别急着用。SkillOpt 会安排一批训练时没出现过的新任务(验证集 / held-out),让干活的模型用改动后的新技能去跑一遍:

  • 如果分数比改之前更高——这次改动有效,保留,新技能正式上位,成为「当前最优」;
  • 如果分数没变好——这次改动无效甚至有害,立刻回滚,退回上一个版本,当无事发生。

官方的措辞很直白:只有当「留出验证集」上的表现确实提升时,候选改动才会被接受、成为新的最优技能。 这一道闸门,就是把「凭感觉改」变成「凭数据改」的分水岭——它给了整个流程一张安全网,保证每一次被接受的改动都是经过客观检验、确实有效的

3.5 别浪费失败:失败档案、慢更新与元技能

被验证闸门挡回去的改动,是不是就白费了?不是。SkillOpt 在这里还有三个用来「拉长视野」的设计,我把官方的说法整理一下:

  • 失败档案(rejected edits):被驳回的改动会被存档。往后的优化里,系统就知道「这条路已经试过、走不通」,不会反复在原地打转、一遍遍重复同一个无效尝试。这相当于给优化过程加了记忆。
  • 慢更新(slow update):除了一步一步的快改,框架还会隔一段时间做一次「慢节奏」的整体校正,避免方向在无数次小改动里慢慢漂移。
  • 元技能(meta skill):在优化模型这一侧维护一份「怎么改技能才改得好」的经验总结,相当于教那个复盘的模型「调优本身的方法论」。

这三者的共同点是:它们都属于长周期的反馈,只服务于「让优化过程更稳」,并不会塞进最终交付的那份技能文档里——所以它们不会把 best_skill.md 撑得臃肿。这个取舍很讲究:训练时该有的记忆和校正一样不少,交付时却干净利落。

此外,每跑完完整的一轮,框架还会对整份技能做一次「大复盘」,把所有规则重新捋一遍,免得越跑越偏。到最后你会发现,真正被留下、起决定作用的核心规则,常常就浓缩成那么几条——这恰好印证了第一章那个观察:技能不是越长越好,而是越准越好。

3.6 为什么非得分成两个模型

看到这儿可能有人犯嘀咕:让同一个模型既干活又自我反思,不也能转起来吗?为什么要刻意拆成「干活的」和「复盘的」两个角色?

我的理解是,这背后是一种职责分离的工程智慧,和软件开发里「写代码的人和做测试的人最好不是同一拨」一个道理。让一个模型一边执行一边给自己挑错,很容易陷入「自我合理化」——它会倾向于认为自己刚才的做法是对的,反思流于形式。把执行和反思交给两个独立的角色,复盘的那一方没有「维护面子」的包袱,能更冷静地盯着轨迹挑毛病

更现实的一层是成本与能力的解耦。干活这件事往往要跑很多遍(一个 batch 几十道题,每道还可能多步),用一个又快又便宜的小模型最划算;而复盘只在每一步做一次,但对智商要求极高,值得用最强的模型。把两个角色拆开,你就能给它们分别配最合适的模型——便宜的去跑量,聪明的去思考。前面 ALFWorld 那个例子里,干活用的是 GPT-5.4-mini、复盘用的是更强的 GPT-5.5,正是这个搭配思路的体现。

3.7 把「一步优化」完整走一遍

抽象的机制讲完了,我用最开头那个「抽参数做表格」的例子,把单独一步优化从头到尾演一遍,你就彻底有体感了。

假设当前技能 v3 里有这么一条规则:「逐个参数抽取并填入表格」。

第一步,干活:拿 v3 去跑这一批的几十条产品描述。复盘模型拿到轨迹后发现,有一批本该合并的同类参数(比如「长 10cm」「宽 5cm」「高 2cm」)被拆成了三行,而标准答案是合并进一个「尺寸」单元格。这几道全判错。

第二步,复盘:复盘模型一对比,归纳出问题——「『逐个抽取』这条规则被理解得太死,导致该合并的同类项也被拆开了」。这就是那条「文字版的梯度」,它指明了修改方向。

第三步,小改:据此把规则改成「逐个抽取参数,但属于同一属性的多个量值应合并到同一单元格」。注意只动了这一条,没有大改其它。

第四步,验证:拿一批没在这步训练里出现过的新产品描述,用改完的 v4 跑一遍。如果合并类的题分数上去了、又没把别的题带坏,整体分更高——v4 被接受,上位成新的当前最优;万一它在修好合并的同时却把别的格式搞乱了、整体反而降了,那 v4 立刻被驳回、退回 v3,并把「这样改不行」记进失败档案。

你看,整整一步下来,没有一处是靠「我觉得」拍板的,每个决定都落在「数据有没有变好」上。把这样的单步循环重复成百上千次,再叠上外层的慢更新和大复盘,一份粗糙的初始技能就被一点点磨成了 best_skill.md。这就是「训练一份说明书」最朴素也最完整的样子。

四、训练一份 Skill 的完整生命周期

把上面几个动作串起来,一份技能从初始版本到最终的 best_skill.md,整个生命周期就是一个不断转动的循环。我画一张流程图,方便对照着看:

flowchart TD
    A[初始技能文档<br/>Skill v0] --> B[抽取一批训练任务<br/>batch]
    B --> C[干活的模型<br/>按当前技能跑任务<br/>记录轨迹]
    C --> D[复盘的模型<br/>成功提炼经验 / 失败找规律]
    D --> E[受限编辑<br/>只小改几处]
    E --> F{验证闸门<br/>新题分数变高了吗?}
    F -- 变好 --> G[接受改动<br/>更新为当前最优技能]
    F -- 没变好 --> H[回滚到上一版<br/>记入失败档案]
    G --> I{本轮 epoch 跑完?}
    H --> I
    I -- 没跑完 --> B
    I -- 跑完 --> J[慢更新 + 元技能<br/>整体大复盘]
    J --> K{达到训练轮数?}
    K -- 没达到 --> B
    K -- 达到 --> L[输出 best_skill.md<br/>纯文本 · 可部署 · 零额外推理开销]

对着这张图,可以把整条主线再口语化地讲一遍:

干活的模型按当前技能跑一批任务,把成败如实记下来;复盘的模型读这些记录,找出问题、给出小幅修改建议;改完之后,新题验证是唯一的裁判——过得了关就升级、过不了就退回并存档;一轮跑完做次大复盘校正方向;如此往复,直到训练轮数用尽,最后吐出一份经过层层验证的 best_skill.md

整个过程里,最值得记住的有两句话:第一,被优化的是文档不是模型;第二,每一次改动都必须用没见过的数据验证、变好了才作数。 这两点合在一起,正是它区别于「人肉调提示词」的根本所在。

顺带说一句这张图里我觉得最精巧的地方:它把「探索」和「稳定」分到了两条不同的时间尺度上。 内层那个小循环(抽任务 → 跑 → 复盘 → 小改 → 验证)负责快速试探,允许大胆改、改错就回滚;外层每跑完一轮的「慢更新 + 元技能 + 大复盘」则负责拉长视野、校正方向,防止无数次小改动累积出整体的漂移。这种「快慢结合」的双层结构,让它既能灵活地局部试错,又不至于在长跑中跑偏——很像优秀工程师的工作节奏:日常小步提交、阶段性回头做一次整体重构。

下一章,我们看看这么一套机制,实测出来的效果到底有多硬。

五、效果到底有多硬:把官方数据摆出来

机制讲得再漂亮,最后还得看数。这里我把微软给出的几组关键成绩整理出来,重点提醒一句:下面所有提升,都是在模型本身完全没动的前提下拿到的——纯靠换了一份训练好的技能文档。

5.1 52 个格子全部第一或并列第一

SkillOpt 横向对比了好几种主流方案,包括针对智能体技能的 Trace2Skill、做提示词优化的 TextGrad、还有 GEPA、EvoSkill,以及两个最朴素的对照组——人工手写的技能让大模型一次性生成的技能

对比覆盖了 6 类任务、7 个不同的目标模型,交叉组合下来一共 52 个对比格子。结果是:SkillOpt 在这 52 个格子里全部拿到第一或并列第一。这种「全胜或全平」的结果在论文类对比里并不常见,说明它的优势不是挑了某个顺手的场景刷出来的,而是相对普适。

那 6 类任务也基本覆盖了日常智能体最常干的活儿,可以和官方支持的基准对应起来看:

任务类型

通俗说就是干这个

对应的官方基准

检索问答(QA)

查资料、答问题

SearchQA

具身智能体(Embodied)

在模拟环境里按指令一步步操作

ALFWorld

文档问答(Document QA)

读文档、从里头找答案

DocVQA

数学求解(Math)

解数学题

LiveMathematicianBench

代码 / 表格生成

做表格、写生成式代码

SpreadsheetBench

工具增强问答

边调工具边答题

OfficeQA

5.2 在 GPT-5.5 上,平均涨了 23.5 分

更直观的是绝对提升幅度。以 GPT-5.5 为例,从「不给任何技能」的裸跑基线出发:

使用场景

平均准确率提升

直接对话(direct chat)

+23.5 分

在 Codex 智能体循环里

+24.8 分

在 Claude Code 里

+19.1 分

二十多分是什么概念?在很多基准上,这已经是「能不能用」和「基本可用」之间的差距了。而且这套优化好的技能是可迁移的——官方明确提到,最终产出的 best_skill.md 可以跨不同模型、不同执行框架(harness)使用。换句话说,你在一个模型上训练出来的技能,有机会直接搬到另一个模型或另一套智能体框架上接着用。

这张表里还有个容易被略过、但我觉得很重要的细节:它不只在「直接对话」里有效,在 Codex 智能体循环(+24.8)和 Claude Code(+19.1)这种真实的智能体场景里同样能涨。这两个场景和单轮问答不一样——模型要在多步之间自己规划、调工具、根据反馈调整,链条长、出错点多。一份好技能能在这种复杂回路里依然稳定地拉高表现,说明它优化出来的不是「应付单题的小聪明」,而是能贯穿整个任务流程的、更靠谱的行为习惯。对真正要把智能体用在生产里的人来说,这一点比单轮刷分更有参考价值。

5.3 一个具体例子:ALFWorld 上四步从 70.9 提到 85.8

抽象的平均分容易没体感,看一个具体的。在具身智能体基准 ALFWorld 上,用 GPT-5.4-mini 当干活的模型、GPT-5.5 当复盘的模型,技能从一份很精简的初始指令出发,仅仅四步,成绩就从 70.9% 提升到 85.8%

更有意思的是它自己学到了什么。训练过程中,技能文档里自动长出了一些非常「接地气」的启发式规则,比如「把目标容器的任意一个同类实例都算作有效目标」「已经看过的位置不要再重复检查」。这些规则不是人写进去的,而是复盘模型从一次次失败里总结出来、又通过验证闸门留下来的。这恰恰是 SkillOpt 区别于人肉调参的地方:它能把那些连老手都未必想得到、却实实在在管用的小窍门,自动挖出来并固化进技能里。

5.4 顺便说说被它比下去的那些方案

光说「赢了」还不够直观,简单交代一下它的对手都是些什么路数,你才好掂量这份成绩的含金量。官方拿来对比的方案,大致能分成三档。

第一档是最朴素的两个对照组:人工手写的技能、以及让大模型一次性生成的技能。 前者就是我们最熟悉的「老法师凭经验写提示词」,后者是「让模型自己写一份说明书」。这两个代表了目前业界写技能最常见的做法。SkillOpt 能稳稳压过它们,说明「迭代训练」相比「一次性拍板」确有系统性的优势——一次写成的东西再好,也少了「用真实数据反复校验」这一环。

第二档是同样在做提示词 / 技能优化的方法,比如 TextGrad、GEPA 这类。它们和 SkillOpt 属于同一个大方向——都试图自动地优化喂给模型的文字,而不是改模型。能在它们面前全胜或全平,分量比赢过手写组更重,因为这是「专业选手之间的较量」。

第三档是更专门针对智能体技能的方案,比如 Trace2Skill、EvoSkill。它们和 SkillOpt 的目标最接近。SkillOpt 相对它们的差异化优势,按我的理解主要落在那套「验证闸门 + 自动回退 + 失败档案」的纪律上——很多优化方法的通病是「越改越花」,而 SkillOpt 用一道硬性的留出验证把每一步都钉死,保证整条优化轨迹只进不退

需要客观提醒一句:这些都是论文与官方页面给出的对比,具体每个方法的细节、实验设置和适用范围,建议你去翻一手论文核对,别只看「52 比 0」这个结论就下定论。基准数字好看,不代表换到你自己的任务上就一定复现得出同样的提升——这也是下一段「怎么理性看待这些分数」想说的事。

把这些数据合起来看,结论挺清楚的:在不动模型的前提下,好好「训练」一份技能文档,能榨出相当可观的性能空间——而这部分空间,过去大多被我们用「凭感觉手改」的方式浪费掉了。

六、动手实操:从安装到产出 best_skill.md

光说不练假把式。这一章我把上手流程按顺序走一遍。需要说明的是,目前官方没有提供开箱即用的安装包,得自己跑几条命令;环境要求是 Python 3.10 及以上

6.1 安装

先把仓库拉下来、用可编辑模式装进环境:

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

如果你打算跑具身智能体那个 ALFWorld 基准,再多装一个可选依赖、并下载它的资源:

pip install -e ".[alfworld]"
alfworld-download
小白提示:pip install -e . 里的 -e 是「可编辑安装」的意思——装好之后你改源码会即时生效,适合一边用一边折腾。

6.2 配置模型 API

SkillOpt 要调大模型来「干活」和「复盘」,所以得先把密钥配好。官方推荐先把示例配置复制一份再填:

cp .env.example .env
# 用编辑器把 .env 里的密钥填好,然后:
source .env

它支持多家模型,按你手头有什么选一个填即可:

# Azure OpenAI(官方推荐,注意 endpoint 是必填项,缺了所有调用都会失败)
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-..."

# 或者本地起一个 Qwen(走本地 vLLM 服务,适合想完全本地化的同学)
export QWEN_CHAT_BASE_URL="http://localhost:8000/v1"
export QWEN_CHAT_MODEL="Qwen/Qwen3.5-4B"

我自己更偏向先用一个能力强的模型当「复盘的」(优化模型),毕竟前面讲过,反思质量直接决定优化效果;干活的那个可以视成本换成小一点、便宜一点的。

6.3 准备数据:train / val / test 三份

这一步最容易被新手忽略,但它是整套「可验证」机制的地基。SkillOpt 要求把数据放进一个切分目录,下面分三个子目录,各放一份 JSON:

data/my_split/
├── train/items.json   # 训练用
├── val/items.json     # 验证闸门用(决定改动留不留)
└── test/items.json    # 最终评测用

每份 JSON 是一个任务数组,具体字段按基准而定。以检索问答 SearchQA 为例,一条任务大致长这样:

[
  {
    "id": "unique_item_id",
    "question": "这部小说的作者是谁……",
    "context": "[DOC] 相关段落文本……",
    "answers": ["期望的答案"]
  }
]
两点要记牢:第一,仓库里不带现成的基准数据集,得你自己按上面的格式准备;第二,准备「带答案」的数据是刚需——val 这份验证集就是验证闸门的判据,没有标准答案,框架就没法判断一次改动到底有没有让结果变好。

那三份数据该怎么切、各放多少?官方没有硬性规定,按我的经验给个起步参考:先保证总量别太小,几十条就开训,验证信号会非常飘,结论不可信;尽量凑到每份

🔒
该内容仅对更高等级社区用户开放
请谨慎解锁时效性强且发布日期较早的文章
您当前:游客 · 可见 60% 内容 · 升级至 注册用户 可见 70%
👀
游客
可见 60%
✓ 当前
注册用户
注册用户
可见 70%
社区精英
社区精英
可见 100%
仅解锁本文,永久有效。如需PDF珍藏版,请联系站长获取。 当前单篇价格 ¥8
✏️ 发表评论

请先登录后发表评论

前往登录
📊 站点统计
今日发布0 篇
文章总数1300 篇
昨日发布1 篇
本月发布11 篇
建站时间414 天
🔍 搜索
📅 日历
« 2026 » « 09 »
 123456
78910111213
14151617181920
21222324252627
282930    
站长微语

联系站长

QQ:2805463528
AIGC 技术社区
致力于解码 AI前沿技术 与经验分享
纯粹的技术交流社区

💡 欢迎您的建议与反馈,让社区变得更好

快速通道
联系站长
站长QQ二维码
AI交流群
AI交流群
仍在路上

那些寒夜里追赶过的方向

那些冷眼下没放弃的理想

一篇一篇写到现在

仍在路上

"不羁放纵爱自由"

—— 致敬 Beyond
持续创作中 莫潇羽 · 源码七号站