AI-Workshop 文献分享 #17 — SkillOpt:面向自进化 Agent Skills 的策略优化
分享人:qyr | 日期:2026-08-08
论文:SkillOpt(面向自进化 Agent Skills 的策略优化)
论文主题:SkillOpt 借鉴反向传播(Backpropagation, BP)的思想,在不更新模型参数的前提下,自动优化外置 Skill 文本,使 Agent 在任务执行中的表现持续提升。
核心问题:如何系统地评估、修正和迭代 Skill,而不是依赖人工编写或模型一次性蒸馏?
1. 什么是 Skill?
Skill 是一种外置提示词(external prompt)。当 Agent 接收到任务后,会从 Skill 库中检索与任务相关的 Skill,并将其注入当前任务的提示词中。
1.1 Skill 的基本工作方式
- 接收用户任务;
- 从 Skill 库中检索一个或多个相关 Skill;
- 将 Skill 文本注入当前上下文;
- Agent 按照 Skill 的指导完成任务。
1.2 传统 Skill 的构建方式
- 人工编写:由开发者根据经验撰写规则、流程和注意事项;
- 任务后蒸馏:Agent 完成任务后,从执行轨迹中总结出 Skill。
1.3 传统方法的局限
传统方法缺少系统性的优化闭环,主要问题包括:
- 依赖人工评价,成本高且主观性强;
- 依赖模型自我判断,评价标准不稳定;
- Skill 的效果难以量化比较;
- 对新任务的迁移能力不明确;
- 缺少“失败—修复—验证”的自动迭代机制。
SkillOpt 的目标,就是把 Skill 从一次性编写的提示词,转变为可以通过数据驱动持续优化的策略文本。
2. 从反向传播理解 SkillOpt
2.1 传统反向传播
将大模型抽象为一个参数为 \(\theta\) 的函数:
其中:
- \(x\):输入样本;
- \(\hat{y}\):模型预测结果;
- \(y\):标准答案或目标结果。
首先定义损失函数:
通过反向传播计算参数梯度,并使用梯度下降更新模型参数:
其中 \(\eta\) 是学习率。
原讲义中将 \(y-\hat{y}\) 直接写成损失 \(L\)。严格来说,\(y-\hat{y}\) 通常只是误差项;损失函数应由具体任务定义,例如均方误差或交叉熵。
2.2 BP 中的关键概念
| 概念 | 含义 |
|---|---|
| 学习率 \(\eta\) | 控制每次参数更新的步长,避免更新幅度过大而错过较优区域。 |
| Batch | 一批训练样本。每次更新使用该批样本的平均梯度,以降低单个样本带来的噪声。 |
| Epoch | 完整遍历一次训练集。通常需要多个 Epoch 才能获得稳定效果。 |
| 动量(Momentum) | 将历史梯度纳入当前更新,减少震荡并提升优化稳定性。 |
| 早停(Early Stopping) | 验证集表现不再提升时停止训练,降低过拟合风险。 |
2.3 SkillOpt 与 BP 的对应关系
SkillOpt 不对模型参数求梯度,也不修改模型权重。它借用 BP 的优化结构,将“参数更新”替换为“Skill 文本更新”。
| BP | SkillOpt |
|---|---|
| 模型参数 \(\theta\) | Skill 文本 \(S\) |
| 训练样本 | 任务集合 Tasks |
| 损失或梯度 | 任务执行结果与失败轨迹 |
| 参数更新 | 优化器模型 \(O\) 生成新的 Skill |
| 验证集评估 | 验证任务集合 Val |
| 最优参数 | 最优 Skill:\(S_{\mathrm{best}}\) |
关键区别:BP 通过数值梯度更新连续参数;SkillOpt 通过优化器模型对离散文本进行分析和改写。
3. SkillOpt 的算法框架
3.1 模型角色
SkillOpt 使用两个参数冻结的模型:
- 执行模型 \(M\):调用 Skill 并完成任务;
- 优化模型 \(O\):分析任务轨迹与得分,提出 Skill 修改方案。
此外,需要准备:
- 初始 Skill:\(S_0\);
- 训练任务集合:
Tasks; - 验证任务集合:
Val。
执行模型和优化模型的参数都保持不变,优化对象仅是 Skill 文本。
3.2 一轮优化流程
Step 1:前向执行(Forward Execution)
执行模型 \(M\) 使用当前 Skill \(S_t\) 完成训练任务:
其中:
- \(\tau_i^{(t)}\):第 \(i\) 个任务的执行轨迹;
- \(r_i^{(t)}\):由程序根据标准答案计算得到的任务得分;
- 评分过程不依赖 LLM,以保证评估结果的客观性和可复现性。
同时,使用 \(S_t\) 在验证集 Val 上执行,并计算平均验证分数:
Step 2:按结果分组
优化模型 \(O\) 根据训练任务的得分和执行轨迹,将样本划分为成功组与失败组:
随后,将两组样本分别拆分为若干 Batch,供优化模型总结共性。
Step 3:生成 Skill 更新
优化模型分别分析两类轨迹:
- 从失败 Batch 中提取共性问题,生成修复点;
- 从成功 Batch 中提取有效策略,生成补充点;
- 综合修复点与补充点,生成候选 Skill \(S_{t+1}\)。
可将文本更新抽象表示为:
这里的 Update 并不是数值梯度更新,而是由优化模型 \(O\) 执行的文本编辑操作。
Step 4:验证与接受
执行模型 \(M\) 使用候选 Skill \(S_{t+1}\) 在验证集上运行,得到:
仅当候选 Skill 的验证分数严格优于当前 Skill 时,才接受更新:
这一步对应 BP 中的验证与早停机制,可以避免一次不理想的文本改写破坏已有能力。
4. SkillOpt 中的“学习率”与“动量”
4.1 文本学习率:限制更新幅度
Skill 文本不是连续参数,因此不能直接使用数值学习率。SkillOpt 使用一个文本层面的步长参数 \(\alpha\),限制每轮修改的规模,例如:
- 每轮最多替换不超过 \(\alpha\) 个条目;
- 限制新增规则的数量;
- 限制单轮改写的文本范围。
其核心思想是:每次只做小幅、可验证的文本更新,降低性能突然下降的风险。
4.2 文本动量:参考历史更新
每轮更新不仅参考当前 Batch 的成功与失败轨迹,还参考历史上的有效修改,以避免 Skill 在相邻迭代中反复摇摆或偏离已有能力。
可以将其抽象为:
其中:
- \(G_t\):当前迭代从轨迹中提取的更新信息;
- \(H_t\):历史上已验证有效的更新信息。
这里的 \(G_t\) 和 \(H_t\) 是文本级优化信号,不应与神经网络中的数值梯度混同。
4.3 终止条件
重复上述流程,直到满足以下任一条件:
- 验证集分数在连续若干轮中不再提升;
- 达到预设的最大 Epoch 数;
- 达到计算预算或时间预算。
最终输出验证表现最好的 Skill:
5. 总结与讨论
5.1 核心结论
- Skill 是一种可被检索并注入上下文的外置提示词;
- SkillOpt 不更新模型参数,而是利用优化模型 \(O\) 迭代改写 Skill 文本;
- 训练任务的成功与失败轨迹提供了文本优化信号;
- 验证集筛选与更新幅度限制共同保证优化过程的稳定性;
- 最终目标是获得在验证任务上表现最优的 \(S_{\mathrm{best}}\)。
5.2 需要关注的问题
- 泛化性:Skill 在训练任务上的提升,能否迁移到未见任务?
- 评估偏差:程序评分是否覆盖了任务质量的全部维度?
- 文本膨胀:多轮补充是否会导致 Skill 过长、规则冲突?
- 优化器偏差:优化模型 \(O\) 的语言理解和总结能力会如何影响结果?
- 稳定性:成功与失败样本的划分、Batch 大小和阈值如何影响更新方向?
一句话总结:SkillOpt 把“写 Skill”转化为一个带有执行、评分、修复和验证闭环的文本优化问题。