[控场AI]
· 12 分钟阅读· 6,495 字

开源一个被自己杀死规则判死的AI Agent技能工具

开源一个被自己杀死规则判死的AI Agent技能工具

一个预注册杀死规则的技能生成管道输给一次性生成,却因暴露的失败机制而有了真正价值。

团队预先写下杀死规则:如果结构化技能生成管道无法在触发召回率上击败一次性生成,就承认假设死亡。结果管道以 91.7% 输给一次性生成的 98.3%。但他们仍然开源了 Skill Forge,因为实验过程揭示的失败机制才是工具真正的骨架。description 里的否定式边界被小模型当作停止标志;失败记录指令放在脚注二十次零触发、移入编号步骤后弱模型得分从 0.00 升到 1.80;同一脚手架提升弱模型却束缚强模型,需按模型强度和边界模糊度双轴路由;6KB 以下零烧穿、9KB 以上约半数空响应。整个项目仅花约 1.5 美元 API 费用——真实、可测量、且小。

摘要: 开发者预先写下一个「杀死规则」——如果结构化技能生成管道无法在触发召回率上击败一次性生成,就公开宣告假设死亡、修改产品。结果管道输了 98.3% 对 91.7%。但他们仍然开源了 Skill Forge,因为失败过程中暴露的技能文件失效机制,才是这个工具真正的价值所在。


实验之前,先写好了死亡判决书

在跑实验之前,团队就写下了会杀死这个产品的规则。被测对象是一个为 AI agent 构建技能文件(SKILL.md)的管道:通过需求访谈、受控生成和机械审计,产出结构化的指令文档——告诉 agent 何时触发、做什么、永远不做什么。

假设看起来很直观:经过结构化管道的技能,应该打败模型一次性即兴生成的技能。他们预注册了四条预测和一条杀死标准——如果管道无法可量化地击败一次性生成,就公开承认,并改变产品。

结果出来了。一次性生成在触发召回率上以 98.3% 对 91.7% 击败管道(120 题中 118 对 110),95% Wilson 区间重叠。按照事先写入磁盘的规则,假设已死。

然而团队仍然开源了 Skill Forge(属于 wallaby-agent-rules 仓库,MIT + Commons Clause 许可)。这个看似矛盾的举动,恰恰是整个实验最有价值的部分。杀死规则只测试了一个主张:结构化的生成在路由层能否击败即兴发挥。这个主张死了,但围绕它的实验项目产出了一批关于「技能文件如何实际失败」的测量发现——每一条都成了工具中承重的设计依据。

rss source: We open-sourced the tool that failed its own kill rule

预注册(Preregistration)是这一实验方法论的关键。研究者在下场跑数据之前,就把假设、预测、评价指标以及最要命的——判定假设死亡的阈值——写进文件并落盘。它的核心价值是切断「事后叙事」的后路:如果没有预注册,团队在看到 91.7% 这个数字后,完全可以重新定义什么算「击败」、把指标从触发召回率换到别的维度,或者干脆不公布结果。预注册的灵魂是一条杀死规则(kill rule)——事先约定什么样的结果会让自己认输。本文的团队正是靠这条规则在数据出来之后无法自欺,只能承认「结构化生成在路由层击败即兴发挥」这个主张已死。这种做法在机器学习、心理学和医学临床试验里都有传统,但在个人开发者构建 AI 工具的场景中很少见,因为它要求你在情感上先接受自己的产品可能失败。

死掉的是什么,尸体教会了我们什么

描述字段成了停止标志

第三轮实验是路由测试,使用弱模型 DeepSeek广告 V4.1-Flash,480 次路由判断,片上顺序按种子随机打乱。管道组跑完整流程,一次性组直接让模型写技能文件。

管道输了,而且所有失误都以同一种方式失败:模型干脆拒绝触发,从没选错技能。问题出在 description 字段上——生成器一直往里写入边界从句,比如「不触发于 X」「仅在 Y 时」,这种否定式范围界定在人类看来是好习惯,但对做相关性判断的小模型而言,它们是停止标志。

把边界句从 description 中彻底移除后,这类失误从 10 次降到 0。

Wilson 区间是一种用于二项比例(比如「120 题中对了几题」)的置信区间估计方法,相比更常见的正态近似方法,它在小样本和比例接近边界(0 或 1)时表现更稳健。本文提到的「95% Wilson 区间重叠」,意思是两组——管道组 91.7% 和一次性组 98.3%——的置信区间有交叠,即统计上无法可靠地说这两者真的不同,观察到的差距可能只是抽样噪音。团队反复使用 Wilson 区间,是为了在小样本(每组十到二十)条件下保持诚实:只有当差距大到区间不再重叠时,才敢把它当真实效应。这也是他们把「第三轮失败」视为区间之外的真实差异、而把几个次要发现视为区间之内的噪音的原因。理解 Wilson 区间,是读懂整篇文章里「什么叫输了」「什么叫只是噪音」的前提。

陷阱问题让「磁铁技能」暴露

第四轮转向更难的领域:真实项目域的八个需求,每个技能都有近邻,陷阱问题听起来同时属于两个技能。杀死规则再次触发,但差距从 6.6 个百分点缩小到 2.7,失败模式也变了——模型开始选错近邻,而不是拒绝触发。

有个内部运维技能像磁铁一样吸引两组,陷阱问题两次全中。而手工调优的冠军版本完美回答,因为它的 description 带有一条路由判决行,直接点名了这个混淆场景。没有任何生成器见过它的近邻,所以写不出那句话。现在管道会在生成时主动询问:你的技能不能与哪些兄弟技能混淆?

**路由(routing)**在这里指 agent 拿到一句用户请求后,决定调用哪个技能文件的过程——相当于给请求做相关性归类。做这个判断的往往是「弱模型」(如文中提到的 DeepSeek V4.1-Flash),因为路由调用频繁、成本敏感,不可能每次都上最强模型。**触发召回率(trigger recall)**衡量的是:在所有本应触发某个技能的句子中,模型实际触发了多少。它和精确率不同——召回率低意味着技能被漏用(该触发不触发),精确率低意味着被误用(不该触发却触发)。本文的失败模式主要是召回率问题:模型不是选错技能,而是干脆不触发。理解这两个概念,才能明白为什么「description 里的否定从句」是致命的——它不是让路由判断偏差一点,而是直接触发了「不激活」的决策。

脚注永远得零分

两轮实验中幸存的第一个结论:机械审计——那个无聊的结构健康检查——抓住了即兴组编造从未发生的坑、引用不存在的价格。管道组在所有生成文件中没有一面红旗、没有一个虚构细节。

第二个结论,被最苛刻的外部评审称为文档中最有价值的洞察:每个 forge 技能结尾都有一条维护指令——「如果运行中出了问题,记录到失败账本」——作为脚注放在文件底部。二十次执行、两个模型,一次都没触发。 换措辞没用,单独成节没用。修复方式是把指令移入编号任务步骤,作为运行的最后一步。同一句话,新位置:弱模型的反馈记录得分从 0.00 升到 1.80(满分 2)。

第三项预注册也失败了,同样值得点名:后续测试「理想形态」假设时,四条预测错了三条。今天能下载的工具,带着三轮实验的伤疤,不只是胜利。

葬礼之后,这个工具到底是什么

团队重写了产品主张以匹配证据:Skill Forge 不制造能力均等的模型,它让品质要求在不同模型间保持一致——同样的触发器、红线、验收检查和失败记录,用在每个执行器上。重心从「创作」移到了「生命周期」:健康检查、失败账本、受控修订。

实践上它是三样东西:

  1. 推导协议:访谈骨架从用户已说的内容中提取需求,每个答案落入「用户确认 / 安全推导 / 开放且关键」三个桶,只有第三个桶能变成问题。高风险清单强制用户显式确认任何涉及生产部署、删除、金钱、凭证或公开发布的事项。
  2. 带出生证明的生成规范:生成的技能自带触发测试对——应该触发的句子和不应该触发的句子——作为任何编辑后可重跑的回归基线。
  3. 维护循环:技能自己写入的失败账本(得益于嵌入的收尾步骤)、七项健康检查、以及逐句四判决优化:删减、下沉到引用文件、降级为按需读取、或保留。

每一项的存在,都是因为一次测量把它放了进去。

五个设计决策,五张收据

1. description 只承载正向触发条件

生成器现在把 frontmatter description 当作受限区域:只用正向触发短语,用用户真正会说的方式写。「仅明文」「仅当 X」这类输入形状限制被彻底禁止,因为路由器把它们当作「不要触发」规则执行,召回率断崖式下跌。

边界没被禁,只是被搬迁:用近邻判决行替代抽象否定——具体句子点名具体混淆场景。抽象边界在路由时不可见,但点名判决能逐字匹配陷阱问题。

2. 失败记录是最后一个编号步骤,绝不是脚注

「二十次零触发」的发现现在已结构化:在每个生成的技能里,失败记录指令是任务流的最后一个编号步骤,不是尾部备注、不是单独章节、不是底部的「记得」。

这个结论泛化到工具之外,可能是本次发布中最可移植的洞察:agent 执行任务步骤,不执行脚注。 如果你的 AGENTS.md 或 system prompt 以「记得更新 changelog」结尾,你写的是脚注,脚注得零分。把它移进工作里。

3. 红线具体、可检查、绝不全面

两条措辞规则都在难任务集上测量过。每条红线必须具体可检查:「绝不猜测金额字段」,而不是「绝不犯错」。全面关闭条款被禁止——「如果条件未完全满足,完全停止」在人类读来是谨慎,但强模型会把它执行为正义关闭,拒绝本可完成的任务。

同一个脚手架把弱模型的执行品质从 0.88 提升到 2.0(四个评分维度),却把强模型推向过度谨慎的关闭(四维度全降)。结构帮助弱者,也可能束缚强者。 所以管道按双轴路由:模型强度 + 边界模糊度,决定技能以完整脚手架还是薄壳形式发布。

4. 大小是硬预算,按字节算

一个自然膨胀到 9.2KB 的技能文件让弱模型连续六次返回空响应。隔离大小变量后得到干净的梯度:6KB 以下八次运行零烧穿,6–9KB 约 25% 空响应,9KB 以上约 50%。

工具把 6144 字节当作安全区,按字节精确执行。超出时路由到分层形式:正文只留高频规则和场景路由表,场景细节下沉到 references/ 按需读取。仪式内容(坑位占位符、反馈钩子、changelog)硬预算三行——每一行仪式,都是模型不会读的指令行。

5. 审计是机械的,账本有空闲警报

健康检查故意无聊:description 是触发式措辞吗?大小在安全区吗?有硬编码版本、日期、价格吗?命令里是完整路径吗?内容触及 shell、网络、文件或金钱时有红线吗?坑位部分是真实的吗?仪式预算是守住吗?无聊正是重点——就是这个检查抓住了即兴组编造的坑和价格。

失败账本每次失败追加一行 JSON:日期、场景、什么坏了,附带密钥脱敏规则。因为「二十次零触发」教会团队:沉默通常意味着钩子没在跑。所以账本有条空闲规则——历史有但 14 天无新记录是信号而非安慰:要么真没失败(可能),要么没人在记录(更可能),优化流程会告诉你先查哪个。

三种形态,一套协议

同一套协议以三种方式分发,覆盖从跑 MCP 服务器到只想往聊天里粘贴内容的人群。

  • MCP 服务器(extras/skill-forge/mcp/):零依赖,仅 Python 3 标准库,stdio 传输。三个工具:skill_forge 创建、skill_optimize 健康检查加重写、skill_feedback 账本写入。自动化所有机械部分:筹码扫描、带脱敏的账本写入、空闲警告、字节级精确大小计量、七项报告。
  • 提示词包(extras/skill-forge/prompt-pack/):同一协议的 Markdown 文件,粘贴到任何 agent 对话。五项自动化变成手动清单。无需安装,无需服务器。
  • 技能形态(extras/skill-forge/skill-form/):协议本身打包为 SKILL.md,供 Hermes 及任何遵循该约定的工具使用。发布时由同步脚本从提示词包生成,确保单一事实来源、形态间不漂移。

MCP 快速上手是任何 stdio 客户端里的三行配置(Python3 + 绝对路径脚本)。仓库自带 78 条断言的冒烟套件,启动真实服务器实例对临时 HOME 做协议面检查:python3 mcp/smoke_test.py。

诚实的局限

杀死原始主张的同一种纪律,也适用于他们所发布的东西:

  • 样本量小,多数轮次每组十到二十。他们公开 Wilson 区间,把接近平局当噪音处理。第三轮失败在区间之外,几个次要发现在区间之内,他们如实说明。
  • 主要工作由一个模型家族完成,评判模型与弱执行器相关。后续行为检查跑了其他模型(包括让 Claude 评审 forge 规范并回传测试工具),但核心测量描述的仍是一个家族的行为。
  • 生成和重写语义仍依赖执行模型。弱模型可能不遵守长规范,没有脚手架能消除这点。工具提升的是需求的一致性;天花板仍在模型放的位置。
  • 三篇博客背后的整个实验项目花了 ¥10.6 的 API 费用,约 1.5 美元。这就是证据的诚实规模:真实、可测量、且小。

为什么开源,为什么现在

团队构建 agent 基础设施的顺序很特定:在跑自己的 agent 时撞上真实问题,构建修复,在生产中运行,发布发生了什么,然后产品化。记忆侧此前已作为 wallaby-agent-rules 发布——每个事实都带收据的纯文件记忆系统。Skill Forge 是同一治理理念往上一层。

记忆系统管你的 agent 记得什么,这个管它做什么。两者都是他们自己运行的规则手册,原样发布,失败日志包含在内。

许可为 MIT + Commons Clause:个人项目、研究、组织内部使用免费;作为托管或捆绑产品销售需要商业许可。

对构建 agent 技能、或被同一个技能反复以同一种方式坑过的人,团队成员邀请你跑一遍。提示词包的成本不过是一次粘贴。「不主张什么应该有效。只讲我们测量到了什么。」

核心要点

  1. 杀死规则杀死了一个主张,却没杀死工具。 管道在触发召回率上输给一次性生成(98.3% vs 91.7%),但实验暴露的失败机制成了工具真正的骨架。
  2. description 里的否定式边界是停止标志。 小模型把「不触发于 X」当作不要触发的指令;把边界改写为点名近邻的路由判决行,能逐字匹配陷阱问题。
  3. 脚注永远得零分。 失败记录指令放在文件底部脚注,二十次执行零触发;移入编号任务步骤后,弱模型得分从 0.00 升到 1.80。agent 执行步骤,不执行脚注。
  4. 结构帮助弱者,也可能束缚强者。 同一脚手架把弱模型执行品质从 0.88 提到 2.0,却让强模型在模糊边界任务上全面退缩——所以按模型强度和边界模糊度双轴路由。
  5. 大小是硬预算。 6KB 以下零烧穿,9KB 以上约半数空响应;仪式内容硬预算三行。整个实验项目只花了约 1.5 美元 API 费用——真实、可测量、且小。

背景补充

**脚手架(scaffolding)**指包裹在技能执行外围的结构化支撑——比如编号任务步骤、健康检查、红线清单、失败账本钩子等,它们本身不产出能力,但约束和引导模型怎么用能力。文中反复出现的「完整脚手架」与「薄壳形式」是同一份协议按需裁剪的两个版本:完整版给弱模型补上结构和纪律,薄壳版给强模型少设约束。**反向缩放(inverse scaling)**是更一般的现象——某些提示、约束或脚手架对弱模型有帮助,却对强模型有害,因为它把本可以灵活判断的强模型推向机械遵从或过度谨慎。本文第 3 条设计决策正是这一现象的实例:同一脚手架把弱模型执行品质从 0.88 提到 2.0,却让强模型在模糊边界任务上全面退缩,因此工具按「模型强度 × 边界模糊度」双轴决定发布哪种形态。

#AI Agent技能文件#SKILL.md#Skill Forge开源#结构化生成#触发召回率#MCP服务器#agent治理#技能工程
分享:

相关推荐