ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

[论文学习]把Markdown当权重来训练:微软SkillOpt如何让Agent技能自己学会进化

[论文学习]把Markdown当权重来训练:微软SkillOpt如何让Agent技能自己学会进化 SkillOpt: Executive Strategy for Self-Evolving Agent Skills论文重点SkillOpt是微软研究院联合上海交大、同济大学、复旦大学提出的首个系统性可控文本空间优化器核心思路是把Agent的自然语言技能文档当作“可训练参数”用类似深度学习训练循环的方式迭代优化它。在6个基准测试、7个目标模型和3种执行框架的全部52个评估单元中SkillOpt均达到最优或并列最优在GPT-5.5上将无技能基线准确率提升了19.1至24.8个百分点。核心研究内容问题定义今天Agent的技能——那些CLAUDE.md、Codex的skill文件、各种system prompt——几乎全是手写或用LLM一次性生成的。写好一版跑几个任务看看效果觉得哪里不对再改改完再跑。这个过程跟手调prompt没有本质区别只是对象从一句话变成了一整份文档。问题的根源在于技能编辑缺乏一套像深度学习优化器那样可复现、有反馈、能收敛的优化范式。我们不知道改了之后是全面变好了还是拆了东墙补西墙。而与此同时模型权重的适配对闭源前沿模型根本不可用对开源模型又成本高昂。技能文档恰好提供了一个天然的自适应接口——它封装了程序步骤、领域启发式规则、工具策略、输出约束和失败模式让冻结的模型能够通过外部文本进行适应。创新方法SkillOpt的核心洞察可以用一句话概括Agent的技能文档就是它的“外部权重”既然内部权重可以用梯度下降来优化外部权重也应该有一套系统化的训练方法。它构建了一个四步训练循环结构上跟深度学习的训练loop几乎同构Rollout前向传播冻结的目标模型带着当前版本的技能文档执行一批任务记录完整的执行轨迹——消息、工具调用、验证反馈、最终得分。这一步产出的是“证据”相当于神经网络的前向传播结果。Reflect反向传播一个独立的优化器模型分析这批轨迹。关键设计是失败案例和成功案例被分开反思。失败minibatch用来发现哪些操作规则需要修正成功minibatch用来确认哪些现有规则在起作用、不能动。失败驱动的编辑提案被赋予更高的合并优先级。Edit参数更新优化器提出结构化的add/delete/replace编辑操作但对编辑数量有严格预算限制——这就是“文本学习率”。Gate验证门控候选的新技能必须在held-out验证集上跑一遍只有性能严格提升时才被接受。这个门控把“反射”变成了提出-测试优化而不是无条件的自我编辑。研究成果实验结果非常硬核。在GPT-5.5直接对话模式下SearchQA从77.7提升到87.3SpreadsheetBench从41.8跃升到80.7OfficeQA从33.1提升到72.1DocVQA从78.8提升到91.2LiveMath从37.6提升到66.9ALFWorld从83.6提升到95.5。其中SpreadsheetBench的提升幅度接近翻倍38.9分OfficeQA从33.1到72.139分这两个基准恰恰是对“程序化能力”要求最高的场景——多轮工具调用、代码生成、真实的openpyxl/pandas运行时。迁移实验同样值得关注一个在GPT-5.5上用Codex训练的电子表格技能迁移到Claude Code后仍带来正向收益在OlympiadBench上优化的技能迁移到Omni-MATH后依然有效。这意味着技能可以“训练一次审计为文本跨模型、跨框架、跨任务复用”。实际落地应用的可能性落地路径非常清晰训练完成后导出的就是一个best_skill.md文件通常300-2000 tokens。部署时模型和推理链路完全不变只是原本手写的技能文件换成了经过验证的版本。推理阶段零额外模型调用零延迟增加。目前SkillOpt已在GitHub上获得超过12,000颗星采用MIT协议开源可通过pip install skillopt安装。v0.2.0版本还增加了SkillOpt-Sleep功能——一个夜间离线自进化引擎让本地编码Agent在空闲时自动复盘会话、重放任务、巩固经验。技术细节文本学习率防止灾难性遗忘深度学习里学习率太大会导致灾难性遗忘。SkillOpt在文本空间遇到了完全相同的问题如果一次编辑改动太大可能把之前学到的有效规则覆盖掉。解决方案是限制每一步允许的编辑操作数量。论文默认设置为lr4即每步最多执行4个add/delete/replace操作。消融实验验证了必要性去掉学习率约束后SearchQA性能从87.1%降到84.6%SpreadsheetBench从77.5%降到75.7%LiveMath从61.3%降到57.3%。SkillOpt支持constant、linear、cosine和autonomous四种调度策略默认使用cosine衰减——早期步子大一些探索后期步子小一些巩固。被拒编辑缓冲区负反馈记忆当编辑提案被验证门控拒绝时它不会被简单丢弃而是进入一个epoch-local的缓冲区记录失败模式和对应的性能下降。同一epoch内后续的反射调用会拿到这个缓冲区避免重复尝试已经失败的编辑方向。这给了整个训练循环负反馈机制但不增加任何推理时成本。慢更新与元技能跨epoch的记忆每个epoch结束时系统会从上一epoch和当前epoch中分别采样任务进行比较保留那些跨epoch稳定成立的编辑方向。这扮演了类似动量项的角色。同时一个“元技能”会总结已接受和已拒绝的模式作为优化器的跨epoch策略记忆。深层理论为什么文本空间的“梯度下降”能workSkillOpt最值得思考的地方在于它揭示了一个深层结构自然语言指令的优化遵循与神经网络训练相同的数学和结构模式。这不是一个比喻层面的类比而是一个操作层面的同构关系。权重空间和文本空间都是高维的、存在冗余表示的参数空间。在权重空间里梯度下降通过聚合大量样本的梯度信号来找到泛化方向在文本空间里SkillOpt通过聚合大量轨迹的反思信号来找到程序性的修正方向。两者的共同点在于单个样本的信号是噪声聚合后的信号才是梯度。这一点在SkillOpt的minibatch反思设计中体现得最为充分。单条轨迹往往产生“轶事式修复”——针对那个特定案例打补丁。但minibatch暴露的是可复用的程序性错误Agent系统性地搜索了错误的来源、系统性地写错了输出格式、系统性地没有验证工具结果。这些才是“梯度”所在。另一个值得注意的深层机制是验证门控不仅是一个工程上的安全措施它实质上定义了文本空间优化中的“损失函数单调递减”性质。在权重空间中学习率调度和梯度裁剪共同保证了损失函数不会发散在文本空间中文本学习率编辑预算保证了每次改动不会太大验证门控保证了每次接受的方向都是正确的。两者的组合使得优化过程具有了类似深度学习中的单调改善保证。这也解释了为什么“无约束重写”会失败。当优化器可以自由重写整个技能文档时它实际上是在一个巨大的、非凸的、不连续的搜索空间中跳跃很容易从一个局部最优跳到另一个更差的位置。有界编辑本质上是在文本空间中做了一个“信赖域”约束——每次只在一个小的邻域内寻找改进。案例学到的技能长什么样以SpreadsheetBench为例SkillOpt优化出的技能是程序性的、而非实例特定的。它学到的规则类似“在修改公式前先读取原始单元格格式”、“处理合并单元格时先检查openpyxl的merged_cells属性”、“输出前验证DataFrame的shape与预期一致”——这些都是可复用的操作约束而不是对某个具体电子表格的硬编码。研究设定硬件与软件配置SkillOpt本身是一个纯Python框架要求Python 3.10。训练过程中需要调用目标模型和优化器模型的API因此主要的“硬件”成本实际上来自API调用费用而非本地GPU。训练流程需要准备三份数据train/用于生成执行轨迹selection/用于验证门控test/用于最终评估。数据以split目录的形式组织。关键超参数配置如下Epoch数4技能收敛比神经网络快得多2-4个epoch通常足够Rollout batch size每步40个任务反射minibatch size8配8个并行分析worker文本学习率4采用cosine衰减下限2验证门控严格大于当前selection分数才接受平局也拒绝慢更新每epoch采样2个任务比较前后epoch的技能表现编辑模式默认patch mode局部add/delete/replace替代方案是rewrite_from_suggestions执行框架适配SkillOpt在三种执行模式下验证Direct chat技能直接前置到system prompt单次chat completionCodex harness通过codex CLI在workspace-write沙箱中驱动技能渲染为per-task的SKILL.mdClaude Code harness与Codex相同的workspace契约通过Claude Code实现一个重要的工程细节是在工具使用框架下优化器不只看最终答案还会读取紧凑的执行轨迹摘要codex_trace_summary.txt了解Agent实际做了什么而不仅仅是它说了什么。综合分析这项工作真正的贡献在哪里SkillOpt的价值不在于某个具体的技术组件——有界编辑、验证门控、反射循环这些在prompt优化领域都有先例。它真正的贡献在于把技能优化从“工程技巧”提升到了“训练方法”的层面。在此之前技能编辑的流程是发现问题→手工修改→碰运气验证。SkillOpt把它变成了采样证据→聚合反思→有界更新→严格验证→保留负反馈→跨epoch记忆。这套流程的每个环节都有明确的设计理由和消融证据而不是拍脑袋决定的。更值得关注的是它对“适应性”这个概念的重新定位。在当前的Agent技术栈中模型权重是对齐层prompt是交互层而技能是程序层。SkillOpt精准地识别出程序层才是领域适配的瓶颈——模型知道怎么做推理但不知道你的代码库的约定、你的API的坑、你的文档格式的规范。这些知识现在可以被系统化地训练进一份文本文件里。设计决策的深层逻辑有几个设计决策看起来简单实际上经过深思熟虑。为什么失败和成功要分开反思如果混合在一起让优化器分析它很容易陷入“折中”的陷阱——看到成功就倾向于保留现状看到失败又倾向于大改。分开处理之后失败minibatch专注找问题成功minibatch专注确认有效规则两者的编辑提案在合并时以失败修正为优先。这是一个信息过滤机制防止成功的“噪声”稀释失败的“信号”。为什么用独立优化器模型而不是让目标模型自己反思让目标模型自己修改自己的技能存在一个根本性的利益冲突它倾向于认为自己的做法是对的。用一个更强的前沿模型作为独立优化器相当于引入了一个“教师”角色能从外部视角看到目标模型的系统性问题。而且这个优化器只用于训练阶段部署时完全不需要。为什么慢更新能和快更新共存每步的编辑是“快”的、局部的每epoch的慢更新是“慢”的、全局的。快更新负责响应具体的失败模式慢更新负责识别跨epoch的稳定改进方向。两者分离的设计防止了局部修正被误认为全局趋势。与相关工作的定位差异与GEPA反射式prompt进化相比SkillOpt的优化对象是完整的技能文档而非单个prompt且引入了更严格的训练控制。与Trace2Skill轨迹到技能的蒸馏相比SkillOpt不是一次性从轨迹中提取技能而是迭代式地训练技能。与EvoSkill等技能进化方法相比SkillOpt的核心差异在于验证门控——不是所有“看起来合理”的编辑都被接受而是只有在held-out数据上真正带来提升的编辑才被保留。局限性论文的几个局限值得注意。首先训练过程需要调用前沿模型的API对于大规模训练场景成本可能不低。其次技能收敛速度因任务而异——有些基准可能需要更多epoch但论文没有深入讨论收敛性的理论保证。第三验证门控的“严格大于”策略虽然避免了过拟合但在某些情况下可能过于保守导致有用的小幅改进被拒绝。最后论文主要在英文基准上验证对多语言场景的适用性尚未探索。实践应用什么场景值得用SkillOptSkillOpt最适合的场景是有明确评估指标的重复性任务。如果你的Agent需要反复处理某类任务电子表格分析、文档问答、特定领域的检索增强且有办法自动打分答案匹配、验证器反馈、人工标注的小验证集SkillOpt就能发挥作用。不太适合的场景是任务评估完全主观如创意写作或者任务变化太大以至于不存在“可复用的程序性知识”。实操建议先写一个“够用”的初始技能。SkillOpt是从初始技能开始训练的一个太差的起点会让优化过程变慢。先手工写一版能跑通的技能哪怕粗糙让SkillOpt在它的基础上迭代。验证集要精心设计。验证门控是整个系统的守门人。如果验证集太小或分布有偏门控会放行那些在验证集上碰巧提升、但实际有害的编辑。建议验证集至少有100-200个样本且分布与训练集一致。监控被拒编辑的模式。被拒编辑缓冲区不只是训练时的负反馈也是诊断信号。如果你发现大量编辑被拒可能说明当前技能已经接近局部最优或者验证集有问题。如果几乎没有编辑被拒可能说明学习率太低、优化器不够激进。考虑跨框架迁移的成本收益。论文验证了技能可以跨执行框架迁移但迁移效果不是无损的。如果你的部署环境与训练环境不同建议在目标框架上做一轮轻量微调少量epoch再部署。从工程视角看SkillOpt的长期价值SkillOpt代表的是一种更广泛的趋势结构化文本指令正在成为一等公民的优化目标。与Anthropic的CLAUDE.md、VS Code的.instructions.md一起看这个趋势已经很清晰了。未来团队可能不再“写prompt”而是“训练prompt”——给数据、给评估、让优化器自动找到最好的指令。对于Agent开发者来说这意味着技能工程的工作重心会从“怎么写”转向“怎么评估”和“怎么设计训练数据”。写出一份好技能的能力可能不如设计一套好评估体系的能力重要。这个转变对很多人来说不容易但它正在发生。参考资料原始论文: SkillOpt: Executive Strategy for Self-Evolving Agent Skills
返回列表