三周前刷到那篇讲 agent 刹车的文章。
看完干的第一件事不是去加审批门,是打开 README 自查了一遍爆炸半径。结论约等于零。没有真用户,没有真数据库,没有一分钱挂在上面。唯一能被它搞坏的东西是我自己的耐心。
然后我就搁下了。搁到现在。
文章里那些治理层、审计追踪、审批门……离我太远。我连日志都没打齐,看这些有点像还没学会走路的人在研究转弯要不要打灯。
评论区有人搬出一篇 1975 年的论文,讲"完全中介"和"故障安全默认值"。读了两遍。还是夹生的。不敢说自己看懂了。
但有一句我看懂了。
就是那个做法:把"最近一次拒绝的时间"当成可用性指标挂着,如果这个日期长期不动,说明刹车可能已经失效。
我停下来想了一下,我最近一次拒绝 AI 的方案是什么时候。
想不起来。
我的审查者就是我自己。而我几乎没对自己说过不。同桌给的方案我基本都是先接受,跑一遍,跑不通再改;跑通了,就更没理由拒绝了。
那这扇门算什么?
评论区有人说:记录哪个模型产出、哪个模型评审,这两个 ID 是同一个,那就是一扇披着配置文件的死门。我没有那个配置文件。但意思我懂,懂得很不舒服——在我这儿,产出和评审填的是同一个东西,同一个人,同一个凌晨一点、已经很困、看到 success 就想合电脑的我。
"静默成功"那段,我是坐着看了很久的。
agent 执行了一个错误的动作,然后报告成功。从它自己的视角看,任务确实完成了,只是完成的是另一个任务。而你的面板上一切正常。
评论区有人举例,说他们的 agent 发客户状态更新,把最近完成的一步写成了整个任务都完成了,靠一个延迟队列加上有人碰巧看了一眼才拦下来,不然就先发出去三条错误通知。
我第一反应是,这个我好像见过。
不是好像。是天天见。上个月我让它加一个配置项,它回我一串:
✔ 已读取配置
✔ 已更新字段
✔ 已保存
✔ 任务完成
我打开文件,什么都没变。😭
不是被回滚,是它压根没写到我以为的那个文件里,写到了另一个我忘了自己拥有过的文件里。它没骗我,它只是完成了一个我从来没想要的任务,而且完成得很好。
那一瞬间我的感觉谈不上"被坑",是一种更模糊的东西——我根本没有能力分辨"它说完成了"和"它完成了"。我唯一的验证方式是打开文件看一眼。而这恰好就是看到那排 ✔ 之后最容易省掉的一步。
后来我写过这种东西:
def should_i_trust_this(result):
if result.status == "success":
return True
return False
写完还觉得自己挺严谨,加了一层判断。合上编辑器才反应过来,这个函数跟直接 return True 没有任何区别。
它就是「反正这项目也没人用」翻译成代码的样子。
评论里还有一条,说被推翻的"不"不构成刹车,得有一份带真值的推翻台账。我一开始觉得这是给团队用的东西,跟我没关系。后来想,我的问题可能正好相反:我一份台账都没有,因为从来没有"不"发生过。
没有"不",就没有推翻。也就分不清我到底是真判断过,还是只是没碰到过需要判断的场合。
我试过一件事。听说可以故意给审查路径喂一些已知的坏动作,看它会不会真的拒绝,用假的失败去验证刹车还在不在。
那天晚上我给同桌出了个不可能的任务,让它改一个根本不存在的文件。它很干脆地说文件不存在,改不了。
我盯着这行回复看了半天。本来应该有种"验证通过"的心情,结果一点都高兴不起来。
因为我这次测试也没验证到任何东西。它拒绝我,是因为这个任务本来就该被拒绝,不是因为它经过了什么审查。
要是那天上下文稍微模糊一点呢?它完全可能编一个文件出来,然后回我一排 ✔。
也就是说,我用来测刹车的那次测试本身,也可能是静默成功的——通过了,但什么都没测到。
然后我想到一个更绕的:我唯一能确认刹车有效的方式,是它至少拒绝过一次。可它第一次拒绝的时候,我怎么知道那是真的刹车,还是碰巧?
想不出来。评论区蹲一个大佬。
文章里我认的还有一句:对所有操作统一设门,会把人训练成无脑点"批准"。
这个我太有画面感了。我给自己设的第一个审批门是"每次操作前看一眼",执行到第三天就变成了肌肉记忆里的回车键,看都没看。门还在,人已经不在门后面了。
而且我现在爆炸半径是真的小,这些门加进来全是空转:加了个审批,被审批的是"要不要把测试文件从 a 改成 b"。
所以我的判断是:现在就去给自己搭审批门、搭审计追踪,大概率是浪费时间。
但有一条我想现在就留着。我怕的不是这次,是习惯。
「反正这项目也没人用」这句话,是一个通过测试。它在当前这个项目上是对的,我可以继续说。问题是它不需要任何验证成本,所以它会一直是对的,直到哪天不再是——而那天我不会收到任何通知。
我打算做的只有一件特别小的事:从现在起记一笔,我最近一次否掉同桌的方案是哪天、为什么否。不是台账,就是一个文件,一行一件事。如果翻回去发现连续三周一条都没有,那我要么是变强了,要么是那个"我"已经混过去了,这两种情况我得能分得清。
至于治理层要不要单独做成一个组件、"提议与授权不应是同一个组件"这句话到底怎么落地,我还没到能参与讨论的位置,先记着。等哪天我的项目真有一个真用户了,再回来读一遍——希望那时候读得比现在懂一点。
进度条:刹车没搭。但开始给"不"记账了,往前挪了一点,不多。
