AI-Workshop 文献分享 2026-08-08 22:15

AI-Workshop 文献分享 #17 — SkillOpt:面向自进化 Agent Skills 的策略优化

qyr 分享 SkillOpt 论文——借鉴反向传播(BP)的思想,在不更新模型参数的前提下自动优化外置 Skill 文本的策略优化方法:从 Skill 的定义与传统构建方式的局限出发,介绍执行模型与优化模型的分工、前向执行-成败分组-文本更新-验证接受的闭环,以及文本学习率、动量与早停机制在离散文本上的对应实现。

AI-Workshop 文献分享 SkillOpt Agent 反向传播 Skill

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 的基本工作方式

  1. 接收用户任务;
  2. 从 Skill 库中检索一个或多个相关 Skill;
  3. 将 Skill 文本注入当前上下文;
  4. Agent 按照 Skill 的指导完成任务。

1.2 传统 Skill 的构建方式

  • 人工编写:由开发者根据经验撰写规则、流程和注意事项;
  • 任务后蒸馏:Agent 完成任务后,从执行轨迹中总结出 Skill。

1.3 传统方法的局限

传统方法缺少系统性的优化闭环,主要问题包括:

  • 依赖人工评价,成本高且主观性强;
  • 依赖模型自我判断,评价标准不稳定;
  • Skill 的效果难以量化比较;
  • 对新任务的迁移能力不明确;
  • 缺少“失败—修复—验证”的自动迭代机制。

SkillOpt 的目标,就是把 Skill 从一次性编写的提示词,转变为可以通过数据驱动持续优化的策略文本。


2. 从反向传播理解 SkillOpt

2.1 传统反向传播

将大模型抽象为一个参数为 \(\theta\) 的函数:

\[ \hat{y} = f_\theta(x), \]

其中:

  • \(x\):输入样本;
  • \(\hat{y}\):模型预测结果;
  • \(y\):标准答案或目标结果。

首先定义损失函数:

\[ L(\theta; x, y) = \mathcal{L}\big(f_\theta(x), y\big). \]

通过反向传播计算参数梯度,并使用梯度下降更新模型参数:

\[ \theta_{t+1} = \theta_t - \eta\nabla_\theta L(\theta_t; x, 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)},\ r_i^{(t)} = M\big(x_i; S_t\big), \qquad x_i\in\mathrm{Tasks}, \]

其中:

  • \(\tau_i^{(t)}\):第 \(i\) 个任务的执行轨迹;
  • \(r_i^{(t)}\):由程序根据标准答案计算得到的任务得分;
  • 评分过程不依赖 LLM,以保证评估结果的客观性和可复现性。

同时,使用 \(S_t\) 在验证集 Val 上执行,并计算平均验证分数:

\[ V(S_t) = \frac{1}{|\mathrm{Val}|} \sum_{x_j\in\mathrm{Val}} r_j^{(t)}. \]

Step 2:按结果分组

优化模型 \(O\) 根据训练任务的得分和执行轨迹,将样本划分为成功组与失败组:

\[ \mathrm{Tasks} = \mathrm{Tasks}_{\mathrm{success}} \cup \mathrm{Tasks}_{\mathrm{failure}}. \]

随后,将两组样本分别拆分为若干 Batch,供优化模型总结共性。

Step 3:生成 Skill 更新

优化模型分别分析两类轨迹:

  • 从失败 Batch 中提取共性问题,生成修复点
  • 从成功 Batch 中提取有效策略,生成补充点
  • 综合修复点与补充点,生成候选 Skill \(S_{t+1}\)

可将文本更新抽象表示为:

\[ S_{t+1} = \mathrm{Update}\big(S_t, \mathrm{Fix}(\tau_{\mathrm{failure}}), \mathrm{Add}(\tau_{\mathrm{success}})\big). \]

这里的 Update 并不是数值梯度更新,而是由优化模型 \(O\) 执行的文本编辑操作。

Step 4:验证与接受

执行模型 \(M\) 使用候选 Skill \(S_{t+1}\) 在验证集上运行,得到:

\[ V(S_{t+1}) = \frac{1}{|\mathrm{Val}|} \sum_{x_j\in\mathrm{Val}} r_j^{(t+1)}. \]

仅当候选 Skill 的验证分数严格优于当前 Skill 时,才接受更新:

\[ S_{t+1}^{\mathrm{accepted}} = \begin{cases} S_{t+1}, & V(S_{t+1}) > V(S_t),\\ S_t, & \text{otherwise}. \end{cases} \]

这一步对应 BP 中的验证与早停机制,可以避免一次不理想的文本改写破坏已有能力。


4. SkillOpt 中的“学习率”与“动量”

4.1 文本学习率:限制更新幅度

Skill 文本不是连续参数,因此不能直接使用数值学习率。SkillOpt 使用一个文本层面的步长参数 \(\alpha\),限制每轮修改的规模,例如:

  • 每轮最多替换不超过 \(\alpha\) 个条目;
  • 限制新增规则的数量;
  • 限制单轮改写的文本范围。

其核心思想是:每次只做小幅、可验证的文本更新,降低性能突然下降的风险。

4.2 文本动量:参考历史更新

每轮更新不仅参考当前 Batch 的成功与失败轨迹,还参考历史上的有效修改,以避免 Skill 在相邻迭代中反复摇摆或偏离已有能力。

可以将其抽象为:

\[ S_{t+1} = \mathrm{Update}\big(S_t,\ G_t,\ H_t\big), \]

其中:

  • \(G_t\):当前迭代从轨迹中提取的更新信息;
  • \(H_t\):历史上已验证有效的更新信息。

这里的 \(G_t\)\(H_t\)文本级优化信号,不应与神经网络中的数值梯度混同。

4.3 终止条件

重复上述流程,直到满足以下任一条件:

  • 验证集分数在连续若干轮中不再提升;
  • 达到预设的最大 Epoch 数;
  • 达到计算预算或时间预算。

最终输出验证表现最好的 Skill:

\[ S_{\mathrm{best}} = \arg\max_{S_t\in\{S_0,S_1,\ldots,S_T\}} V(S_t). \]

5. 总结与讨论

5.1 核心结论

  • Skill 是一种可被检索并注入上下文的外置提示词;
  • SkillOpt 不更新模型参数,而是利用优化模型 \(O\) 迭代改写 Skill 文本;
  • 训练任务的成功与失败轨迹提供了文本优化信号;
  • 验证集筛选与更新幅度限制共同保证优化过程的稳定性;
  • 最终目标是获得在验证任务上表现最优的 \(S_{\mathrm{best}}\)

5.2 需要关注的问题

  • 泛化性:Skill 在训练任务上的提升,能否迁移到未见任务?
  • 评估偏差:程序评分是否覆盖了任务质量的全部维度?
  • 文本膨胀:多轮补充是否会导致 Skill 过长、规则冲突?
  • 优化器偏差:优化模型 \(O\) 的语言理解和总结能力会如何影响结果?
  • 稳定性:成功与失败样本的划分、Batch 大小和阈值如何影响更新方向?

一句话总结:SkillOpt 把“写 Skill”转化为一个带有执行、评分、修复和验证闭环的文本优化问题。