一次失败到底错在哪?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\}\),没有中间步骤的稠密反馈。进化目标是找到最大化期望通过率的技能:
这个设定下的麻烦有两个,而且互相纠缠。
第一个是归因困难。 一个能源定价任务失败,可能是 LMP(节点边际电价)的对偶变量取错了符号,可能是备用容量约束没建模,也可能只是输出文件格式不对——但验证器只告诉你"挂了"。环境反馈把多种潜在失败原因折叠进同一个模糊观测里。
第二个是探索约束。 技能修订空间巨大,而每次环境交互都很贵,不可能穷举。
现有的自进化方法(比如 CoEvoSkills、SkillRevise)在这个设定下有个结构性缺陷:它们每轮都 commit 到当前技能的单一偏好编辑上,本质是纯 exploitation。一旦第一轮误诊——这在模糊反馈下太常见了——后面所有迭代都在错误的方向上越陷越深。
论文图 1 把这个现象画得很直白:

图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:(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\),行是已评估的技能版本,列是验证过的测试,元素是通过与否:
每当评估了一个新 patch,追加一行——用所有现存测试重放它的缓存输出;每当验证了一个新测试,追加一列——在所有历史缓存输出上回溯重放它。
你想想看这意味着什么:一条新测试瞬间刷新所有历史修订的诊断视图,一个新修订立刻接受全部历史测试的检验。而且因为是在缓存输出上重放,不消耗任何环境交互次数。这是把稀疏奖励"变稠密"的核心机制——诊断证据成了不花预算的稠密信号。
配套的还有个定向剪枝:假设被 Refute 后,它独占的测试列从矩阵里移除(公式 7),清掉 LLM 推理偏差带来的误导信号。
🌳 组件二:证据引导的树搜索
对付探索约束的武器。三个机制。
语义扩展。 被选中的节点由 reflection agent 基于活跃假设和证据提出至多 \(K\) 个候选 patch。有意思的是作者不要 LLM 的绝对置信度(众所周知 LLM 校准很差),只要序数排名 \(\rho_u\),映射成归一化先验:
排名最低的候选也不会被剪掉——先验只偏置搜索方向,不做不可逆的剪枝。这个克制是对的:LLM 的排名也就是个启发式,信一半就好。
层次化评估与 Max-Backup。 测试分硬约束(语法有效、输出格式确定)和语义指标,语义指标以硬约束全部满足为前提,逼搜索先修基础错误。回传用 max-backup:
内部节点的价值反映的是整个子树里发现的最强证据。为什么用 max 而不是均值?因为最终目标是从搜索树里提取最好的那个技能变体,失败的探索分支不该拖累强父节点的估值。这个选择跟传统 MCTS 的目标差异直接相关,改得有道理。
PUCT 变体选择。 选择规则是 PUCT 的改版,把均值边价值换成 min-max 归一化后的 max-backup 值 \(\bar{Q}(u)\):
坦白讲,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:从零起步(None, 34.5→51.7)、LLM 生成技能起步(39.5→55.9)、人工技能起步(52.9→73.6)。三种起点的进化增益都在 16-21 个点之间,但人工技能起点的天花板明显更高。
从零进化也能到 51.7%,说明框架不依赖好的初始化;但人工技能起步能冲到 73.6%——强领域先验缩小修订空间,搜索效率高得多。工程上的启示很直接:如果团队里有人能写初版技能,别省这个力气,人机接力比全自动上限高。
从人工技能出发再进化,各领域几乎全面反超原始人工技能:

图4:以人工精选技能初始化、再经 SkillHEX 进化 5 轮后的领域级通过率(红色)对比原始人工技能(蓝色)。8 个领域全部提升,Industrial & Physical Systems 从 45.2 拉到 76.2,Office & White Collar 从 42.9 拉到 71.4。
🔬 案例:一次真实的"回溯逃生"
附录里 energy-market-pricing 任务的完整轨迹是全文我最喜欢的部分,因为它把抽象机制演了一遍。
任务是基于 MATPOWER 的 DC 最优潮流加备用联合优化,要输出节点边际电价和备用市场出清价。轨迹如下:

图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前沿,关注我