52个测试格,全部最佳或并列最佳。
这不是某家厂商在跑分榜上刷了一个数字,而是微软联合上海交通大学、同济大学和复旦大学做的一件事,把agent技能的训练过程,从「写提示词」变成了「像训练神经网络一样优化文本」。
论文链接:https://arxiv.org/pdf/2605.23904v2
这篇论文叫SkillOpt,2026年5月发在arXiv上,代码已经开源。
先说成绩,52/52格全胜
SkillOpt测了6个基准,覆盖搜索问答、电子表格、办公文档、多模态文档、数学推理和具身决策。跑了7个目标模型,从前沿的GPT-5.5到小型的Qwen3.5-4B。用了3种执行框架,直聊模式、Codex框架和Claude Code框架。一共52个「模型×基准×框架」测试格,SkillOpt在每一个格子上都是最佳或并列最佳。
不是大部分最佳,是52个里面52个最佳。
在GPT-5.5直聊模式下,六个基准的平均分从58.8拉到82.3,涨了23.5分。在Codex框架里涨24.8分,在Claude Code里涨19.1分。
你说这不是某一个基准碰巧运气好?它同时打过了七个对手,包括人类专家手写技能、LLM一次性生成技能、Trace2Skill(轨迹蒸馏)、TextGrad(梯度式提示优化)、GEPA(帕累托反思进化)、还有最强的框架端对手EvoSkill。就算你每个格子里从这七个对手里挑最强的来比,SkillOpt平均还是高出5.4分。
说实话我看到这个数据的时候愣了一下,一个不改模型权重的方法能做到这种程度。
这篇论文到底在干什么
现在agent要用得好,光有模型权重不够,还得有一套「技能文档」。你可以把它理解成给模型的一份操作手册,里面写着怎么调用工具、按什么格式输出、遇到什么情况怎么处理。
但这个技能文档现在怎么来的?三种方式,手写、让LLM一次性生成、或者让它自己改着改着看。问题是,这三种都不像「训练」,都不保证会变好。手写靠专家经验,碰上不熟悉的领域就抓瞎。一次性生成就是抽卡,好就是好不好就是不好。自己改着改着看更不靠谱,改歪了也没人管。
SkillOpt说,别这样搞,技能文档应该被「训练」,而且要用训练神经网络那套纪律来训练。
这就是论文的核心主张,把技能文档当作冻结模型的可训练外部状态。模型不动,技能来动,但技能的训练过程要像训练模型一样有学习率、有验证集、有梯度方向。
深度学习类比,这不是装饰
论文里有一组类比,我觉得特别关键,理解了这组类比就理解了整个方法。
参数对应技能文档。你训练神经网络是在调参数,SkillOpt是在改技能文档的文本。
梯度对应编辑方向。神经网络通过反向传播算梯度,SkillOpt通过分析成功和失败的轨迹来决定往哪个方向改技能。
学习率对应编辑预算。训练网络时学习率控制每步走多大,SkillOpt的编辑预算控制每步最多改几条规则。
验证集对应选择门控。训练时用验证集决定要不要接受这次更新,SkillOpt用选择集决定这次改的技能要不要留下来。
epoch间的动量对应慢/meta更新。神经网络训练有动量项把历史梯度方向带过来,SkillOpt有epoch间的慢更新把跨epoch的经验教训写进受保护区。
这套类比不是硬凑的,它真的在指导方法设计。后面的每一步机制,都能在这张映射表上找到对应。
前向传播和反向传播,怎么从轨迹中学习
前向传播就是rollout。目标模型拿着当前技能去跑一批任务,把整个过程记录下来,包括任务元数据、消息、工具调用、观察结果、最终答案、验证反馈。这些轨迹就是训练数据。
批量大小有讲究。小批量更新快但噪声大,大批量能暴露更多反复出现的模式。论文还支持accumulation,几个rollout批量分别反思再合并成一次更新,把执行吞吐和更新频率解耦。
反向传播就是minibatch反思。优化器模型拿到轨迹后,先把成功和失败分开,再各自分成minibatch。为什么要分minibatch?因为单条轨迹只能给出个案修法,minibatch才能暴露反复出现的程序性错误,比如agent总是搜错来源、总是写错输出格式、总是不验证工具结果。
失败组提出纠正性规则,成功组提出保护性规则。然后层次合并,先把失败和成功的编辑各自去重合并,再按失败优先的原则合到一起。这步会过滤掉重复的、矛盾的、只针对个案的建议。
有界更新、验证门控、慢更新
拿到合并后的编辑池之后,不是一股脑全改上去。
编辑预算L_t是学习率的等价物,每步最多只应用L_t条编辑。优化器先对编辑池排序,按预期效用排,然后只取前L_t条。这是跟ad hoc重写的关键区别,无界重写会擦掉有用规则、引入矛盾指令、过拟合局部失败。有界更新保持连续性,同时还能学到新东西。
论文支持四种调度策略,constant、linear、cosine和autonomous。默认用cosine,开头改大一点,后面慢慢收小。
改完之后上验证门控。每个候选技能都要在选择集上跑一遍,只有严格超过当前分数才被接受,打平也不行。这个门控把反思变成了「提出再测试」的优化过程,而不是无条件自编辑。因为看起来合理的文本诊断也可能害到目标模型,你光看说得好不好不行,得跑一下看分数。
被拒绝的编辑也不会白费。拒绝缓冲区会记录失败模式和被拒绝的编辑,同一epoch内后面的反思调用能看到这些记录,避免重复踩坑。这就是训练中的负反馈,而且不增加部署时成本。
epoch慢更新是跨epoch的动量。每个epoch结束时,用相同任务在上一版技能和当前技能上各跑一遍,分成进步、退步、持续失败、稳定成功四类。优化器据此写一段纵向指导,放进受保护的慢更新区。这个区步级编辑改不了,只有epoch边界的慢更新流程能重写。
meta技能是优化器端的,总结哪类编辑有帮助、哪类被拒、哪些失败持续存在。它只出现在优化器的反思上下文里,不随部署的技能一起走。这样部署技能保持紧凑,训练时还能享受更丰富的编辑历史。
主结果:每一格都赢
这张表是论文最硬的证据。我挑几个关键数字说一下。
GPT-5.5直聊模式下,SpreadsheetBench从41.8拉到80.7,涨了38.9分。OfficeQA从33.1到72.1,涨了39.0分。LiveMath从37.6到66.9,涨了29.3分。SearchQA从77.7到87.3,涨了9.6分,这个涨幅小是因为无技能基线已经接近天花板了。
小模型受益更大。GPT-5.4-nano在DocVQA上几乎翻倍,在ALFWorld上翻了三倍。Qwen3.5-4B在SpreadsheetBench上从9.3到23.9,翻了2.6倍。这说明紧凑的技能制品能补上小模型在权重里还没存好的程序性知识。
在Codex框架里,GPT-5.5的SpreadsheetBench从27.5到85.0,涨了57.5分。Claude Code里从22.1到80.4,涨了58.3分。这两个数字太离谱了。
平均下来,七个直聊目标模型的平均提升约17.6分。
六个基准,覆盖面够不够
你可能会问,这六个基准能不能说明问题?我看了下覆盖面确实够宽。
SearchQA测的是搜索式问答。SpreadsheetBench测的是电子表格代码和工具使用,默认模式要多轮codegen,最多30轮,跑真实的openpyxl和pandas。OfficeQA测办公文档推理,最多24轮工具调用。DocVQA测多模态文档问答。LiveMathematicianBench测数学多选题推理。ALFWorld测的是具身决策,每个episode最多50步。
从单轮QA到多轮工具循环,从代码执行到多模态理解,从数学推理到具身交互,覆盖面是够的。数据集类的基准用确定的训练/选择/测试分割,默认2:1:7。选择集只用来决定接受还是拒绝技能编辑,所有报告的分数都在不相交的测试集上算。
Table 2和Table 5,方法鲁不鲁棒
Table 2做了六个面板的超参分析,分别变训练集大小、反思minibatch大小、rollout批量大小、学习率、学习率调度和慢更新采样数。
整体结论是,SearchQA因为天花板效应在大部分设置下波动不超过正负1.5分。SpreadsheetBench和LiveMath对训练证据量更敏感,SpreadsheetBench从1个样本的47.5涨到100%训练集的78.0,LiveMath从59.1涨到70.5。但minibatch大小从1到32变化时,三个基准都在很窄的区间内波动,默认B_m=8在所有基准上都接近最优。
学习率方面,L_t在1到16之间都能用,L_t=4在SearchQA和SpreadsheetBench上最优,L_t=8在LiveMath上最优。调度策略方面,constant、cosine、linear都差不多。
Table 5问的是另一个问题,SkillOpt的成功到底靠的是强优化器在蒸馏弱学生,还是优化循环本身在起作用?
Table 5用了两种优化器,强前沿优化器GPT-5.5和跟目标模型同规模的优化器。结果很清楚,强优化器在每个格子上增益都更大。但同规模优化器也不差,在四个格子里恢复了56%到74%的增益。
这说明SkillOpt不是蒸馏管道,优化循环本身贡献了实质价值。强优化器是更好的默认选择,因为它只花训练时的API调用,不增加部署成本。但如果预算有限用同规模优化器,方法依然有效。
Table 3,去掉每个组件会怎样
Table 3做了三组组件消融。
第一组看学习率形式。默认lr=4拿到87.1/77.5/61.3,动态lr降到85.8/71.8/54.0,完全不要lr(即无界重写)只有84.6/75.7/57.3。有界文本学习明显优于无界重写。
第二组看拒绝缓冲区。有缓冲区87.1/77.5/61.3,去掉降到85.5/72.9/58.9。SearchQA跌1.6分,SpreadsheetBench跌4.6分,LiveMath跌2.4分。缓冲区起的是稳定器作用。
第三组最狠。去掉meta技能但保留慢更新,87.1降到85.1(SearchQA),77.5降到75.7(SpreadsheetBench)。两个都去掉,SpreadsheetBench从77.5直接跌到55.0,跌了22.5分。这是整个消融实验里最大的退步。
为什么去掉慢/meta更新对SpreadsheetBench伤害这么大?因为SpreadsheetBench是程序性最强的基准,最需要跨epoch积累的程序性教训。去掉慢更新就等于去掉了长视野证据流和受保护区契约,局部编辑就能覆盖掉持久的程序性规则。
Table 4,训练一次能不能到处用
这是我觉得论文最有应用价值的部分。Table 4做了三轴迁移实验。
跨模型迁移。在GPT-5.4上训练的SpreadsheetBench技能,直接放到GPT-5.4-mini上用,涨了9.4分。放到GPT-5.4-nano上,涨了3.0分。LiveMath的技能迁移到mini涨4.5分,迁移到nano涨5.6分。有一个案例里迁移版甚至超过了原地训练版,LiveMath在GPT-5.4-nano上迁移得分28.8,原地训练只有27.2。这说明有些学到的程序性规则跟目标模型无关。
跨框架迁移是最强的部署信号。在Codex框架里训练的SpreadsheetBench技能,直接放到Claude Code里用,从22.1拉到81.8,涨了59.7分。还略微超过了原地训练的80.4。反过来Claude Code训练的技能放到Codex里,从27.5到71.1,涨了43.6分。
两个框架的工具和文件API完全不同,能迁移说明学到的不是框架特定的命令配方,而是工作簿层面的程序性知识,比如先检查结构、用公式验证、把静态值写进去。
LiveMath的跨框架迁移增益小一些但也是正的。Codex到Claude Code涨1.6分,Claude Code到Codex涨12.8分。
跨基准迁移是最严格的一轴。源基准和目标基准只共享大类(数学)。OlympiadBench上训练的技能放到Omni-MATH上用,GPT-5.4涨3.7分,GPT-5.4-mini涨1.8分,GPT-5.4-nano涨1.3分。增益比前两轴小,但全部为正,说明学到的技能编码的是可复用的数学程序,不是记住了特定基准的格式。
Table 4三个子表的每一行迁移结果都超过了目标方的无技能基线,没有一行掉到基线以下。
Table 6,训练要花多少,产物多大
Table 6回答了两个实践问题,训练花多少,产物长什么样。
产物大小方面,最终best_skill.md从379个token(LiveMath)到1995个token(SpreadsheetBench),中位数大约920个token。最长的也远低于现代前沿模型的系统提示预算,最短的连一屏都放不满。领域专家几分钟就能读完、审计、编辑这个部署制品。
编辑次数方面,六个基准里实际被接受的编辑只有1到4次,中位数2.5次。LiveMath涨29.3分只靠一次被接受的编辑。OfficeQA涨39.0分也只靠一次。这是验证门控在起作用的直接证据,优化器每个epoch提出的编辑远不止这些,但只有少数通过了选择集检查进入了部署技能。
训练成本方面,程序性强的基准(SpreadsheetBench、OfficeQA、LiveMath)轨迹短成本低,每提升一个测试分需要0.6到3.6百万训练token。SearchQA和DocVQA因为轨迹长或多模态上下文丰富,每分成本37.9和46.4百万token。但这个成本只在训练时付一次,部署后best_skill.md不增加任何优化器调用。
学到的技能到底说了什么
Figure 4摘录了六个基准各一条代表性规则,都是从最终best_skill.md里原文引用的。
SearchQA学到了「从线索措辞推断期望的答案类型,然后选择最短的标准实体,该实体由共现的区分性证据支持」。
SpreadsheetBench学到了「检查工作簿结构和公式,然后在整个请求的目标范围内写入评估后的静态值,而不是依赖Excel重新计算」。
OfficeQA学到了「将oracle解析页面作为主要证据,锁定表格/日期/单位上下文,输出恰好是请求的舍入值,不加额外标签」。
LiveMath学到了「在最强陈述的多选题中,按定理强度排序选项,优先选择有依据的更强结果选项,而非正确但较弱的推论」。
这些规则有三个共同特点。第一,都是程序性的,没有一条提到具体的题目、文件或实体。第二,都编码了前沿模型零样本缺乏的纪律,答案格式约束、证据绑定、搜索前沿管理。第三,读起来像一个有经验的人类从业者在基准上泡了一天后会写的规则,但它们是优化器自动产生并逐条在held-out数据上验证的。
论文还给了一个定性演化的例子。ALFWorld的初始技能是一个通用的「搜索-变换-放置」策略,优化后变成了一个有状态的执行策略,学到了精确物体名匹配(杯子和锅不能互换)、已访问位置记忆(别反复检查已经搜过的地方)、目的地记忆和进度锁(一旦能完成下一个子目标就直接做,别再检查了)。在这个案例里,held-out测试从49.3提到74.6。
SpreadsheetBench的初始技能只是「用Python电子表格库,保留无关内容」,优化后变成了工作簿取证策略,学到了检查实际工作簿而非依赖预览、跨多个工作表定位表头和目标范围、在查找或聚合前规范化键和单元格类型,还有一条关键规则,当评分器读取单元格值时,即使提示提到INDEX/MATCH或XLOOKUP等公式,也要计算并写入评估后的静态值。这个案例的held-out测试从40.4提到78.9。
这一切到底改变了什么
我把全文的核心数字再过一遍。
52个测试格全部最佳或并列。七个直聊目标模型平均提升约17.6分。GPT-5.5在直聊、Codex、Claude Code三种框架下分别提升23.5、24.8、19.1分。比最强的逐格基线还高5.4分。
移除慢/meta更新,SpreadsheetBench跌22.5分。跨框架迁移,Codex到Claude Code涨59.7分。最终技能1到4次编辑,不超过2000个token。同规模优化器恢复56%到74%的增益。
这些数字指向一个判断。文本空间优化是一个完整的、可控的、可验证的范式。它有学习率控制步长,有验证门控保证安全,有拒绝缓冲区提供负反馈,有慢更新积累跨epoch经验。产出的技能制品紧凑、可审计、可跨模型跨框架跨基准迁移。
而且整个过程不改变模型权重。
你想想看这意味着什么。你有一个GPT-5.5,你不能改它的权重,但你想让它在你的领域里表现更好。以前你能做的只有写prompt,写得好不好全凭经验。现在你可以用SkillOpt训练一份技能文档,像训练模型一样有验证有门控有学习率,训练完拿到一个几百到两千token的文本文件,塞进系统提示就行。
训练时你用了强优化器,部署时只需要那个文本文件。训练在Codex里做的,部署可以放到Claude Code里。训练在GPT-5.4上做的,部署可以放到更小的mini或nano上。
技能本身变成了一个可训练、可审计、可迁移的适配层。
论文最后提了几个自然延伸方向,技能库跨域共享、优化器meta技能跨基准复用、无奖励或偏好驱动的验证门控、把优化后的技能蒸馏回模型权重作为迈向权重级适配的跳板。我觉得这个方向想得很远,把技能当成可优化对象而不是提示词的附属品,确实能打开很多可能性。