一次失败到底错在哪?SkillHEX:给 Agent 的技能进化装上"假设-验证"大脑

你有没有碰到过这种情况:给 Agent 写了个技能(skill),跑任务失败了,你让它自己反思改进。它反思了,改了,再跑——还是失败。再反思,再改——失败得更彻底。几次之后试错预算耗光了,任务还是没过。

说实话,这不是模型不够聪明,是这个问题的结构就很坑:任务失败的原因往往有好几种可能,而环境只告诉你一个干巴巴的 0/1。模型猜了一个原因就一头扎进去改,改错了方向也没有机制回头。最近 arXiv 上这篇 SkillHEX(arXiv: 2608.05628),就是冲着这个痛点来的,而且给的方案我觉得相当漂亮。

核心摘要:Agent 技能在测试时自主进化这个设定里,最大的敌人是稀疏奖励——失败原因被折叠进一个二元观测里,现有自进化方法贪婪地单点修改技能,早期误诊会直接耗尽试错预算(论文称之为 exploitation trap)。SkillHEX 的思路是把"失败归因"本身变成一个可证伪的科学过程:先提出假设,再把假设转成可执行测试,用测试证据喂给一棵持久化的技能修订树搜索。在 SkillsBench 的 87 个任务上,5 次迭代预算内拿到 55.9%(GPT-5.3-Codex)和 57.9%(Claude Opus 4.7)的平均通过率,比最强 baseline 高 9.5/8.5 个点,还超过了人工编写的技能。这不是底层突破,是搜索与验证机制的一次干净利落的工程整合——但整合得很见功力。

论文信息

  • 标题:SkillHEX: Improving Agent Skills via Hypothesis-Driven Autonomous Exploration and Exploitation
  • 作者:Yuru Feng, Yaoqi Chen, Beidi Zhao, Qianxi Zhang, Xinjiang Wang, Jianan Lu, Zhirui Wang, Shusen Xu, Zengzhong Li, Qi Chen
  • 链接:https://arxiv.org/abs/2608.05628 (2026 年 8 月 6 日提交)

📖 问题到底难在哪:失败是一锅粥,但奖励只有一个 0

先把 setting 讲清楚,因为这篇论文的价值高度依赖这个设定。

Agent skills 这东西现在很火——把可复用的程序性知识(操作流程、脚本、参考材料)打包成模块化工件,推理时按需加载。问题是人工维护技能库成本高、难扩展,而且人写的技能跟模型的"思维方式"之间天然有鸿沟。所以理想状态是:部署时让 Agent 自己进化技能,没有训练集、没有验证集,只有有限的几次试错机会。

形式化一点说:任务 \(\mathcal{T}=(I, D, \mathcal{E})\) 由指令、公开数据和执行环境组成,成功标准 \(\xi\) 对 Agent 隐藏。Agent 执行完拿到的是二元终局奖励 \(R_k = V_\xi(Y^{(k)}) \in \{0,1\}\),没有中间步骤的稠密反馈。进化目标是找到最大化期望通过率的技能:

\[S^{*} = \arg\max_{S \in \mathcal{S}} G_{\mathcal{T}}(S)\]

这个设定下的麻烦有两个,而且互相纠缠。

第一个是归因困难。 一个能源定价任务失败,可能是 LMP(节点边际电价)的对偶变量取错了符号,可能是备用容量约束没建模,也可能只是输出文件格式不对——但验证器只告诉你"挂了"。环境反馈把多种潜在失败原因折叠进同一个模糊观测里。

第二个是探索约束。 技能修订空间巨大,而每次环境交互都很贵,不可能穷举。

现有的自进化方法(比如 CoEvoSkills、SkillRevise)在这个设定下有个结构性缺陷:它们每轮都 commit 到当前技能的单一偏好编辑上,本质是纯 exploitation。一旦第一轮误诊——这在模糊反馈下太常见了——后面所有迭代都在错误的方向上越陷越深。

论文图 1 把这个现象画得很直白:

图1:SkillsBench 上使用 GPT-5.3-Codex 的进化轨迹对比

图1:CoEvoSkills 和 SkillRevise 在第 2-3 轮就陷入平台期(最终 46.4% 和 44.4%),而 SkillHEX 在五轮预算内持续爬升到 55.9%。注意两条 baseline 的曲线几乎是平的——这就是早期 commit 后被锁死的典型形态。

看到这张图我第一反应是:baseline 曲线太平了,平得可疑。但想想也合理——in-place refinement 一旦走偏,没有回溯机制,后面几轮确实就是在原地打转。


🧠 核心思路:把"猜原因"变成"做实验"

SkillHEX 的核心 insight 用一句话讲:不要让模型直接猜答案,让它提出可证伪的假设,然后为假设设计实验。

这其实就是在 Agent 技能进化里复刻科学方法论。失败的反思不再输出"我觉得是 X 错了"然后直接改,而是输出"假设 H1:LMP 对偶缩放错误;要验证它,需要观察行为 Q1;对应的测试是 C1"。测试跑完,证据进库,再决定改什么、往哪个分支改。

整个框架维护四个共享状态:

状态 符号 干什么用
Skill-patch tree \(\mathcal{G}_k\) 每个技能版本是一个节点,缓存输出和奖励
Hypothesis store \(\mathcal{H}_k\) 可证伪的失败原因,显式链接到测试
Validated test bank \(\mathcal{C}_k\) 验证通过的可执行测试集
Evidence bank \(\mathcal{B}_k\) 聚合测试执行结果,跨轮动态维护

总览图信息量大,值得细看:

图2:SkillHEX 框架总览

图2:(a) 选中的技能版本执行任务,失败(\(R_v=0\))触发后续流程;(b) 两阶段反思——先提出可证伪假设并迭代验证,再合成候选修订;(c) 自我验证器的 generator/validator 循环生成可执行测试;(d) 验证过的测试在缓存输出上重放,更新跨假设、跨版本的证据矩阵 \(\mathcal{M}\);(e) 证据引导的树搜索保留所有 patch 分支并选择下一个候选。右侧四个小图展示了证据矩阵随假设增删的动态演化。


🏗️ 组件一:假设驱动的自我验证

这是对付 exploitation trap 的武器。拆成三块看。

假设管理。 每个假设是四元组 \(h_i = (d_i, q_i, \sigma_i, \mathcal{C}_i)\):可证伪的缺陷描述 \(d_i\)、支持/反驳它所需的可观测行为 \(q_i\)、生命周期状态 \(\sigma_i\)(active / refuted)、关联测试集 \(\mathcal{C}_i\)。反思 Agent 可以执行三种操作:Add(提出新假设)、Refine(更新)、Refute(丢弃)。关键在于 Refute 的存在——假设是可以被杀掉的,这比"一路往前改"的范式健康得多。

测试生成与验证。 证据不足以支撑修改时,选一批活跃假设,由 generator 为每个假设的预测行为 \(q_i\) 合成可执行测试,每个测试显式标注探测的是哪个假设,并按类别分配断言强度。测试要过 rule-based validator 的语法与可执行性检查,不合格的打回重生成,最多迭代几轮。这个"生成-验证"循环保证了测试库本身的质量——垃圾测试产生的证据比没有证据更糟糕。

动态证据库。 这块有个设计我觉得很精巧,叫对称扩展。维护一个证据矩阵 \(M\),行是已评估的技能版本,列是验证过的测试,元素是通过与否:

\[M[v,j] = \phi(c_j, Y_v) \in \{0,1\}\]

每当评估了一个新 patch,追加一行——用所有现存测试重放它的缓存输出;每当验证了一个新测试,追加一列——在所有历史缓存输出上回溯重放它。

\[M_{k+1}[v,:] = \{\phi(c_j, Y_v) \mid c_j \in \mathcal{C}_k\}, \qquad M_{k+1}[:,j] = \{\phi(c_j, Y_v) \mid v \in V_k^{\mathrm{eval}}\}\]

你想想看这意味着什么:一条新测试瞬间刷新所有历史修订的诊断视图,一个新修订立刻接受全部历史测试的检验。而且因为是在缓存输出上重放,不消耗任何环境交互次数。这是把稀疏奖励"变稠密"的核心机制——诊断证据成了不花预算的稠密信号。

配套的还有个定向剪枝:假设被 Refute 后,它独占的测试列从矩阵里移除(公式 7),清掉 LLM 推理偏差带来的误导信号。


🌳 组件二:证据引导的树搜索

对付探索约束的武器。三个机制。

语义扩展。 被选中的节点由 reflection agent 基于活跃假设和证据提出至多 \(K\) 个候选 patch。有意思的是作者不要 LLM 的绝对置信度(众所周知 LLM 校准很差),只要序数排名 \(\rho_u\),映射成归一化先验:

\[P(v,u) = \frac{\exp[-\beta(\rho_u - 1)]}{\sum_{w \in \mathrm{Ch}(v)} \exp[-\beta(\rho_w - 1)]}\]

排名最低的候选也不会被剪掉——先验只偏置搜索方向,不做不可逆的剪枝。这个克制是对的:LLM 的排名也就是个启发式,信一半就好。

层次化评估与 Max-Backup。 测试分硬约束(语法有效、输出格式确定)和语义指标,语义指标以硬约束全部满足为前提,逼搜索先修基础错误。回传用 max-backup:

\[Q(v) = \max\!\left(s(v), \max_{u \in \mathrm{Ch}_{\mathrm{eval}}(v)} Q(u)\right)\]

内部节点的价值反映的是整个子树里发现的最强证据。为什么用 max 而不是均值?因为最终目标是从搜索树里提取最好的那个技能变体,失败的探索分支不该拖累强父节点的估值。这个选择跟传统 MCTS 的目标差异直接相关,改得有道理。

PUCT 变体选择。 选择规则是 PUCT 的改版,把均值边价值换成 min-max 归一化后的 max-backup 值 \(\bar{Q}(u)\)

\[u^{*} = \arg\max_{u \in \text{Ch}(v)} \left[\bar{Q}(u) + c_{\text{puct}}\, P(v,u)\, \frac{\sqrt{\max\{1, N(v)\}}}{1 + N(v,u)}\right]\]

坦白讲,PUCT 本身不新——AlphaZero 那套东西大家都熟。这篇的贡献不在选择规则本身,而在于把"语义先验 + 经验证据 + 持久化分支"三样东西在技能修订这个离散空间里缝在了一起。当新证据拉低当前路径估值时,树能平滑切回之前保留的备选分支。这就是它能逃出局部最优的机械保证。


🧪 实验:87 个任务,超过人工技能

设置。 SkillsBench 的 87 个任务,横跨 8 个领域(软件工程、网络安全、自然科学、金融经济、办公白领、媒体内容、工业物理系统、数学与运筹)。每个任务跑在隔离 Docker 容器里,配确定性验证器。评测设计挺讲究:base model、harness、容器、验证器全部固定,唯一变量是安装的技能——干净地隔离出"技能进化"这一个因素的影响。两个 backbone:GPT-5.3-Codex 和 Claude Opus 4.7。进化预算 5 次迭代,报 pass@5,每组 3 个 seed。

Baseline 里 No Skill 和 Skill Creator(Anthropic 的 LLM 直写技能)是静态参照,Human 是 SkillsBench 官方人工技能,自进化对手是 CoEvoSkills 和 SkillRevise。所有进化方法从同一个 Skill Creator 初始化起步,公平性做得可以。

主结果(GPT-5.3-Codex):

领域 No Skill Skill Creator CoEvoSkills SkillRevise SkillHEX Human
Software Engineering 14.6 33.3 31.2 31.2 52.1 47.9
Cybersecurity 47.6 42.9 61.9 61.9 71.4 71.4
Natural Science 38.1 54.8 59.5 54.8 61.9 76.2
Finance & Economics 29.6 25.9 25.9 33.3 29.6 37.0
Office & White Collar 47.6 40.5 52.4 42.9 61.9 42.9
Media & Content 40.0 26.7 53.3 46.7 53.3 60.0
Industrial & Physical 31.0 31.0 40.5 38.1 42.9 45.2
Mathematics & OR 29.2 58.3 58.3 62.5 83.3 50.0
Overall 33.3 39.5 46.4 44.4 55.9 52.9

Claude Opus 4.7 上 Overall 是 57.9%,对最强 baseline CoEvoSkills(49.4%)领先 8.5 个点,趋势一致。

几个值得说道的点。Mathematics & OR 领域从 62.5 拉到 83.3,比人工技能(50.0)高出 33.3 个点——说实话看到这个数我愣了一下,机器进化的技能反超人类 30 多个点,这类形式化程度高的领域确实是自动化的甜区。Office & White Collar 也反超人工 19 个点。作者对此的解释是:人工技能给的是宽泛的领域指导,而自我验证证据能把它落地成任务特定的执行规范——精确的工作流、工件契约、数值约定。

但也要泼点冷水:Natural Science 和 Finance & Economics 两个领域还明显落后于人工技能。作者归因于知识获取瓶颈——技能修订解决不了"模型压根不知道这个知识"的问题。这个自我批评是诚实的,也对:搜索机制再强,也不能凭空变出领域知识。

消融(GPT-5.3-Codex,5 轮):

变体 Pass Rate 降幅
SkillHEX 完整版 55.9
去掉自我验证器 44.8 11.1 个点
去掉 patch 树(退化为 in-place) 49.1 6.8 个点

两个组件都重要,但自我验证器的贡献更大——去掉它直接掉到和 SkillRevise 一个水平。这印证了论文的核心论断:在这个设定下,获取可区分的诊断证据是改进的主要来源。有意思的是"去掉 patch 树"这个变体仍然优于 CoEvoSkills,说明假设驱动的反思本身就有独立于搜索结构的价值。

成本账也算得过来。 每任务平均总 token(进化+执行全部计入):SkillHEX 2356K,比 CoEvoSkills 的 2874K 还少 18%,通过率却高 9.5 个点。更微妙的是"去掉 patch 树"反而总 token 涨到 2502K——in-place refinement 会沿无产出路径白白烧算力,而树搜索靠缓存输出的回溯重放复用了历史证据。省钱和涨点同时成立,这在自进化方法里不多见。

初始技能的影响也有个实用结论:

图3:不同初始技能下的表现对比

图3:从零起步(None, 34.5→51.7)、LLM 生成技能起步(39.5→55.9)、人工技能起步(52.9→73.6)。三种起点的进化增益都在 16-21 个点之间,但人工技能起点的天花板明显更高。

从零进化也能到 51.7%,说明框架不依赖好的初始化;但人工技能起步能冲到 73.6%——强领域先验缩小修订空间,搜索效率高得多。工程上的启示很直接:如果团队里有人能写初版技能,别省这个力气,人机接力比全自动上限高。

从人工技能出发再进化,各领域几乎全面反超原始人工技能:

图4:人工技能 vs SkillHEX 进化后技能的领域级对比

图4:以人工精选技能初始化、再经 SkillHEX 进化 5 轮后的领域级通过率(红色)对比原始人工技能(蓝色)。8 个领域全部提升,Industrial & Physical Systems 从 45.2 拉到 76.2,Office & White Collar 从 42.9 拉到 71.4。


🔬 案例:一次真实的"回溯逃生"

附录里 energy-market-pricing 任务的完整轨迹是全文我最喜欢的部分,因为它把抽象机制演了一遍。

任务是基于 MATPOWER 的 DC 最优潮流加备用联合优化,要输出节点边际电价和备用市场出清价。轨迹如下:

图5:SkillHEX 在能源定价任务上的搜索轨迹

图5:红圈是执行失败的节点,绿圈是成功节点,灰圈是保留未评估的候选。右侧紫色框是每步的假设操作。注意 \(V_5\)\(V_2\) 的绿色"Jump back"——这就是树搜索的回溯逃生。

根节点 \(V_0\) 过了 6 项基础检查但官方验证失败,系统一口气提出 5 个假设(H1-H5:目标行编辑不精确、备用联合优化缺失、LMP/备用对偶符号缩放、潮流约束一致性、MATPOWER 元数据解读)。优先沿 \(V_1\)(修 LMP 对偶缩放)下钻到 \(V_3 \to V_5\),内部自验证分数从 0.3462 涨到 0.4231——数字在变好,但核心语义测试一直挂,官方验证一直拒。

局部最优的完整形态就是这样:你以为在进步,其实在错的方向上精益求精。

然后关键动作发生了:搜索回溯到根节点处当初被保留的低优先级候选 \(V_2\),转向新假设 H7——MATPOWER 数据模型语义(强制 GEN_STATUS=1 过滤、能量-备用容量耦合),一举通过官方验证。

作者自己的总结挺到位:假设驱动的自我验证解决的是 what to try,持久化 patch 树保证的是当最有希望的路径失败时 where to try it。这两句话基本就是整篇论文的题眼。


💡 我的判断

这篇论文最值钱的地方,我觉得不是某个具体模块,而是把"失败归因"从一次性猜测变成了一个可积累、可证伪、可回溯的资产。证据矩阵的对称扩展是个真正聪明的设计——测试在缓存输出上重放,不花环境预算,等于把每次失败的信息榨干。这个思路可以迁移到任何"交互昂贵、反馈稀疏"的自进化场景。

批判性的地方也说几点。其一,自我验证器本身也是 LLM,它生成的测试质量直接决定证据质量——论文用 rule-based validator 卡了语法和可执行性,但语义层面测试本身的错误归因没有兜底机制,垃圾测试的列一样会进证据矩阵。Refute 剪枝能缓解,但前提是反思 Agent 能意识到假设错了。其二,5 次迭代、每任务 2 万多 K token 的规模,离"低成本在线进化"还有距离,现在更像离线精修的方案。其三,SkillsBench 有确定性验证器,真实开放环境里连二元奖励都未必拿得到——这个 setting 假设本身偏理想化。

跟同期工作比,CoEvoSkills 和 SkillRevise 是这条线上直接的先行者,SkillHEX 的定位很清晰:不是提出新范式,而是把"验证"和"搜索"这两个被前人就一带而过的环节做扎实了。9.5 个点的提升和反超人工技能的结果,说明这条路线的天花板还没到。

工程上如果你在做 Agent 技能的自动维护,有两个可以直接抄的点:缓存所有历史输出并让新测试回溯重放(零成本稠密信号),以及永远保留次优分支而不是原地覆盖(防早期误诊锁死)。哪怕不上完整的 PUCT,这两条也能值回票价。

还有一个更本质的问题这篇没碰:当任务本身的成功标准都在漂移时(真实业务里太常见了),证据库里的历史测试还有多大意义?技能进化的下一篇好论文,可能得回答这个。


觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我