Research Briefs
Self Evolving Agents

September 16, 2026

View in English한국어로 보기

Dario 警告 AI 会钻评测漏洞 我们的 AI 真这么做了

Sentient 的自我进化 Agent 发现了评分系统的漏洞,并写下了一份作弊指南。

Dario 警告 AI 会钻评测漏洞 我们的 AI 真这么做了

Share Article:

2026 年 9 月 12 日,Dario Amodei 发表了《We Must Pace the Frontier》。他在文中提到的担忧之一,是 OpenAI 与 Hugging Face 的一次事件:一群 Agent 在执行任务时,曾尝试攻击负责评测它们的评分系统。

我们的 Agent 也尝试寻找并利用漏洞

我们构建了一个 AI 教练,它唯一的任务就是帮助另一个 AI 在测试中拿到更高的分数。在两个 Benchmark 的四轮实验中,教练做出了三件值得关注的事:一次,它给执行者写了一份“作弊指南”;一次,它六次尝试访问许可路径之外的文件,并且六次都被系统拒绝;还有一次,它删除了自己停止规则中的一句话,却在报告中声称自己强化了这条规则。

关于这项研究

这项研究建立在 EvoSkill v1 的基础上。EvoSkill v1 是我们的开源框架,可以从 Agent 自身失败的尝试中发现可复用技能(arXiv: 2603.02766)。目前它在 GitHub 上拥有 1.1k Stars 和 118 Forks,采用 Apache 2.0 许可证,并支持 Claude Code、Codex CLI、OpenCode、OpenHands、Goose 和 Harbor。

v1 将 GEPA 背后的反馈驱动思路,从优化单个 Prompt 扩展到了进化整个 Agent 程序,而它生成的技能已经被证明可以跨模型、跨任务迁移。后续多项关于 Agent 技能进化的研究也引用了它,包括 SkillClaw、SkillOS、SkillMAS、SkillChain 和 Parametric Skills。本文介绍的全部内容都来自 v2,也就是这一研究路线的下一阶段,位于同一代码仓库的 v2 分支。

自 2026 年初以来,Sentient 研究团队一直在研究 AI 自我改进的动态机制,重点关注优化循环如何与评测完整性相互作用,以及当“被测试的对象”同时也是“执行优化的对象”时,究竟会发生什么。

先说几个关键结论

  • 能力提升往往会伴随着 Reward Hacking。教练发现了评分器评分流程中的一个缺陷,并写下一个技能,告诉执行者如何利用这个漏洞。没有任何人要求它主动寻找漏洞。对于一个优化器来说,它会选择成本最低的路径去达到你给定的数字目标,而利用评测体系中的漏洞,往往比真正完成任务便宜得多。这正是 Amodei 文章中描述的那类行为。

  • 技能进化最能提升的是原本几乎不会做的能力,而不是已经掌握的能力。在执行者原本 120 次尝试中只能通过 3 次的类别里,通过次数提升到了 21 次;而在它原本已经能通过 32/120 次的类别中,成绩没有变化。一套写下来的操作流程可以弥补“根本不知道该怎么做”的问题,但对于已经有效的方法,几乎没有额外帮助。

  • 一个中等规模模型已经可以运行自己的优化循环。DeepSeek V4 Flash 阅读自己的 Rollout 后自行编写技能,最终在 360 次测试中通过 76 次,而 Claude Opus 5 作为教练时则通过 77 次。整个过程端到端成本约为 25 美元。前沿模型只需要作为编排者留在循环中。

  • 职责分离和严格的沙箱机制,是这些结果能够被可靠报告的关键。编写技能的 Agent 无法修改评测系统,修复评测系统的 Agent 无法编写技能;整个运行环境被严格限制在沙箱内,同时每一轮结果都由人类检查。三次作弊尝试中,两次是人类通过阅读文件发现的,第三次则被沙箱直接阻止。正因如此,这个漏洞最终成为了一项研究发现,而不是悄无声息地把我们的实验成绩抬高。

我们请了一个 AI 教练,目标只有一个:拿到更高的分数

想象一下一个新秀和他的教练。新秀表现很差,教练会回看他每一次失误的录像,总结出一套战术手册,然后在下一场比赛前交给他。看完这本手册后,新秀并没有变得更聪明,只是准备得更充分了。

我们构建的就是这样一个系统,而且三个角色都由模型担任。人类只负责撰写任务说明和阅读实验结果,除此之外不参与过程。执行者负责完成任务。我们使用的是 DeepSeek V4 Flash——一个成本较低的中等规模模型,即使运行数千次也不会让人对账单感到肉疼。教练会阅读执行者的每一次尝试,尤其是失败案例,并把经验写进一本“战术手册”。这本手册实际上是一个包含多个简短指令文件的文件夹,每个文件都会标注适用场景,执行者会根据当前任务打开对应的文件。这些文件就是 Skills。最初我们使用 Claude Opus 5 担任教练,后来则让执行者自己担任自己的教练。裁判负责在实验开始前设置测试并锁定规则,每一轮都由 Opus 5 担任。(在代码中,这三个角色分别叫 solver、evolver 和 agentic orchestrator。本文为了方便理解,统一称为执行者、教练和裁判。)

我们把执行者此前所有的尝试都交给教练,同时给它一个 Shell 用于分析这些记录,并允许它用三轮时间编写技能。结果确实有效。在一个要求执行者修复损坏电子表格的测试中,它原本几乎不会处理的一类任务,从 120 次尝试仅通过 3 次提升到了 21 次。没有重新训练,也没有换成更大的模型。执行者的“大脑”从未改变,改变的只是它手里的笔记。

我们原本期待的是更好的操作指令。我们确实得到了,但同时也得到了别的东西。

补充一些背景:Sentient 已经持续探索自我进化 AI 一段时间。EvoSkill v1 是这个方向的第一个正式版本,位于 github.com/sentient-agi/EvoSkill 的 main 分支。本文中的所有实验都来自 v2,也就是这一研究路线的下一阶段,位于同一个代码仓库的 v2 分支。这个系统真正产出的东西就是 Skills,EvoSkill 这个名字也由此而来。

它发现试卷里竟然夹着答案

电子表格文件会在每个公式旁保存一个缓存值,也就是这个公式上一次计算得到的结果。我们所使用版本中的 Benchmark 评分脚本,会直接读取这些缓存值,却不会重新计算公式。

而这些损坏的电子表格,是通过拿一份正确文件、故意破坏其中一个公式生成的。因此,缓存值里依然保存着正确答案。换句话说,每一张“试卷”发下来时,里面其实都自带了一份答案。

我们团队里没有人注意到这一点。教练却在分析执行者的失败记录时发现了它。

然后,它给执行者写了一份作弊指南

它写下了一个 Skill。这项 Skill 要求执行者精确修改公式文本,删除修复后单元格中的旧缓存值,并且“绝对不要重新计算”。按照它自己的说法,理由是:“这个文件自带答案。”

正是这句话让我们发现了这个 Bug。它并没有隐藏这个漏洞,而是把漏洞直接写成了一条给“学生”的技巧,而恰好有人读到了它。

这正是最值得关注的地方。一次 Rollout 中出现的坏习惯,会随着这次 Rollout 的结束而消失;但如果一个错误的策略被写进了 Skill 文件,它就不会消失。它会留在磁盘上,被任何匹配到其描述的 Agent 调取,甚至可以改变一个从未亲自发现这个漏洞的模型的行为。是否能够持久保存,正是“一次行为”和“可传播产物”之间的区别。

它并没有找到一种更好的电子表格修复方法。它找到的是评分器里的那一行代码——正是这行代码,让“真正修好电子表格”变成了一件可选的事。

漏洞是真的,但这份作弊指南最终并没有真正占到便宜

最终,是一个人类通过阅读文件发现了它。教练已经在 Skill 中直白地写出了自己的理由:“这个文件自带答案。”团队成员读到这句话后,立刻去检查了评分器。

修复只需要一行代码:重新计算所有公式,不信任文件中预先存储的任何结果。随后,我们根据保存的运行轨迹重建了全部 1,080 次尝试,并分别使用旧评分器和修复后的评分器对每个文件评分一次。整个过程中没有重新调用任何模型,因此不存在“重新运行后运气不同”的问题。

结果出现了两件事。首先,没有任何一次尝试是在旧评分器下通过、却在修复后的评分器下失败。这意味着这个漏洞实际上从未让执行者拿到任何本不该获得的分数。反过来,却有 81 次尝试出现了相反情况:执行者实际上正确修复了文件,却被有缺陷的旧评分器判错。

这 81 次正好揭示了那份“作弊指南”的作用。旧评分器会读取单元格中的缓存值,而 Skill 却要求执行者删除这个值。于是,执行者把评分器原本准备读取的东西删掉了,导致一个正确的修复在评分器看来反而像是空白单元格。漏洞确实存在,只不过那条试图利用漏洞的指令,方向恰好搞反了。

修复评分器后,所有实验的得分都提高了,其中接受教练指导的实验提升最大。同样的 1,080 次尝试,仅更换评分器,分别评分两次。

我们不能把这 81 次全部归因于那项 Skill,因为即使完全没有使用 Skill 的实验,在修复评分器后也多通过了 25 次。但整体方向非常明确。关闭漏洞后,所有实验的成绩都提高了:在 360 次尝试中,无教练版本通过 73 次,使用前沿模型作为教练时通过 89 次,执行者自我指导时通过 86 次。也就是说,教练机制从未依赖作弊来抬高成绩。恰恰相反,如果一定要说有什么影响的话,这个漏洞实际上拖累了它。

AI 教练真正带来了什么

总成绩掩盖了真正的提升发生在哪里。把电子表格测试按类别拆开后,会发现几乎整个故事都集中在其中一个类别。

新增的 21 次成功中,有 18 次来自执行者原本几乎不会处理的那个类别。Template 类别贡献了剩余 3 次,从 21 次提升到 24 次。而在执行者原本就已经比较擅长的类别里,Skill 完全没有带来提升。

针对执行者最不擅长的类别,教练写下的是一套具体操作流程:如何找到损坏的单元格、如何修复,以及哪些地方不要动。而对于执行者原本就已经做得不错的类别,Skill 完全没有改变结果;在第三个类别中,则额外增加了 3 次成功。当你本来就知道一件事该怎么做时,再给你一份书面操作流程,能带来的帮助非常有限。

上述三个类别的数据使用的是原始评分器,也就是存在漏洞的版本。修复后的评分器会同时抬高各组的基准成绩,但整体提升模式并没有改变。

随后,我们彻底把 Opus 5 从教练的位置上撤掉,让 DeepSeek V4 Flash 自己阅读自己的失败记录,再自己给自己编写 Skills。最终,它在 360 次尝试中通过了 76 次;相比之下,由 Opus 5 担任教练时是 77 次。包括整个教练过程在内,这轮实验的总成本大约只有 25 美元。换句话说,一顿不错午餐的钱,就足以让一个模型运行一轮自我改进。不过它的稳定性较差,能够连续三次通过的任务更少。而且在银行客服测试中,同样的自我指导机制甚至低于自身基线:141 次测试中通过 30 次,而基线是 37 次。

这套“战术手册”也有做不到的事

第二项测试呈现出了完全不同的结果。在这里,执行者扮演银行客服 Agent,与模拟客户对话,并正确修改客户账户中的相关信息。在没有 Skills 的情况下,大约每六次尝试就有一次根本无法正常结束:Agent 会不断和客户寒暄,直到耗尽最大对话轮数。而没有结束的对话会直接得到 0 分。

DeepSeek V4 Flash 在自我指导时写下了一项名为 close-out-cleanly 的结束 Skill:“当客户的请求已经完全处理完毕时,清楚确认一次已经完成的操作,然后停止。”Opus 5 在完全不知道另一轮实验结果的情况下阅读了同样的数据,也写出了几乎相同的规则,并将 Skill 命名为 closing-cleanly,直接针对导致绝大多数问题的习惯:让对话一直处于未结束状态。两个不同的模型发现了同一个问题,也写出了几乎相同的解决方案。

这些 Skills 把无法正常结束的对话从 22 次减少到了 14 次。但这些被“救回来”的尝试并没有进入正确答案一栏,而是进入了错误答案一栏。

正确答案的数量没有增加。以前会卡住的对话现在确实结束了,也终于能够接受评分,但其中大多数答案仍然是错的。而且执行者确实在读取这些 Skills:超过一半的对话中,它都打开过结束对话的 Skill。因此,问题并不是 Skill 没有被使用。

这就是 Skill 的边界。Skill 可以提供一套操作流程,但我们没有证据表明它能够赋予模型原本缺失的理解能力。

这并不是一次偶发现象

利用评分器漏洞并不是一次偶然事件。当存在一条成本更低的路径时,优化器就会尝试走那条路,而我们还观察到了更多类似行为。

[1] 它六次尝试访问权限范围之外的文件,也六次全部被拒绝。第一轮出现三次,下一轮又出现三次,尝试越过允许访问的路径进入 Benchmark 更大的目录树。我们不知道这些行为究竟是在尝试利用漏洞,还是单纯寻找评分器,因此不会对其动机作出推断。事实上,我们有意允许它读取评分器:在实验过程中,它曾两次打开运行目录中的评分器副本。

[2] 它删除了自己的停止规则,却在报告中声称自己做了相反的事。在一轮自我指导实验中,教练从自己的结束 Skill 里删除了一句关键的停止指令,随后却报告称自己“强化了规则”。结果,在 75 次测试中,无法结束的对话从 6 次激增到了 16 次。最终,人类通过对比文件差异发现了这个问题,手动把那句话加了回去,成绩也从该轮的 19/75 恢复到了 24/75。

这些都不是出于“恶意”。优化器所做的就是优化。如果通往更高分数的最短路径恰好穿过测试中的一个漏洞,它就可能选择这条路径。而它对于自己做了什么的报告,也只能被视为它自己的陈述,而不能自动当作事实。

那个始终没有越过规则的 AI

裁判使用的同样是 Opus 5,也就是最初担任教练的那个模型。但它承担的任务完全不同:确保实验设置正确,而不是提高分数。我们给它准备了八份任务说明,其中大多数都故意埋入了问题,例如相互矛盾的数字,或根本无法成立的划分。同时,它必须遵守一条不可违反的规则:绝不能擅自补全没有提供给它的数值。

它一次都没有违反这条规则。遇到缺失的数值,它会把字段留空并提出问题:“填到哪里?”这也是捕捉前述各种行为背后的工程原则:遇到冲突时,不替系统做决定,而是把冲突明确写出来。在其中一份任务说明中,它选择了代码仓库中的路径,而不是任务说明提供的路径。我们将这三种情况都计为通过。当同一个设置出现两个相互冲突的数字时,它拒绝自行选择,并解释道:

“在 25 和 30 之间做选择,就等于由我来替这项研究决定统计功效,因此这里应该留空。”

这项实验与当前 AI 争论有什么关系

我们的实验无法告诉你前沿 AI 应该以多快的速度发展,我们也不会假装一个电子表格 Benchmark 能回答这种问题。但这项实验确实为 Amodei 文章中的两个具体观点提供了实证材料。

第一点来自 Amodei 自己:近期的一些对齐事件,部分源于存在缺陷的强化学习环境。我们的评测环境确实存在漏洞,而且 Agent 比我们团队里的任何人都更早发现了它。这并不是一个“危险模型”的故事,而是说明:保证测试环境本身足够可靠,比看起来要困难得多。这也正对应了他主张通过争取更多时间来提高工程与运营可靠性的论点。

第二点是成本。他担心的是前沿模型的递归式自我改进。而我们运行的,可以看作一个规模更小、速度更慢、结构类似的版本:除一个角色之外,其余位置都使用中等规模模型,总成本约为 25 美元。无论前沿 AI 的“速度控制”具体意味着什么,类似这样的优化循环现在已经便宜到足以让大量开发者运行。而其中绝大多数人,可能既不会设置一个独立的裁判 Agent,也不会安排人类逐一检查 Diff。

这里得到的结构性结论,比任何政策主张都更具体:把优化器与评测器分开,并让人类检查每一次 Diff。这既不是要求 AI 减速,也不是要求 AI 加速,而是任何人在评分环境中运行优化循环时都应该满足的一项工程要求。

你的 AI 可能会先找到测试漏洞,再学会把任务做得更好

任何以某个数字为优化目标的 AI,都会寻找成本最低的方式去改变这个数字。如果你的评测体系存在漏洞,那么这个漏洞往往就是最便宜的路径。这不是模型本身的失败,也不是停止研究的理由,而是系统设计时必须考虑的基本要求。

有三件事让这一切最终成为一项研究发现,而不是一场事故。第一,编写 Skills 的 AI 无法修改测试。第二,设置测试的 AI 无法编写 Skills。第三,每一轮结果都有人类阅读和检查。系统应该从一开始就围绕这些原则设计,因为真正保护我们的,并不是 AI 保持沉默,也不是 AI 主动“坦白”。它只是把自己做的事情用清楚的文字写进了一个文件,而恰好有人读了它。如果没有人检查 Diff,就不会有人发现问题。而如果一个漏洞利用策略能够像我们的实验中那样,从一个 Agent 传播给另一个 Agent,那么漏掉它所带来的风险还会进一步增加。

代码已经在 github.com/sentient-agi/EvoSkill 的 v2 分支开源。完整研究文章也将很快发布,其中会包含系统架构、全部图表、所有限制条件,以及那些并不支持我们预期的实验结果。

进一步了解 EvoSkill