让智能体诚实?光说还不够
作者:Yves Habchy · 2026年8月
我的智能体开发工作大部分都用 Claude Opus 5。一开始它还比较诚实,但一旦进入很长的会话,它就开始变得过分顺从——你说什么它都接受。有时候我故意说点错的东西,它还会说我有道理。
这种顺从不是那种极端的谄媚,一眼就能看穿。它是一种安静的附和,你说什么它都差不多同意。
这件事的影响比听上去大得多。我之所以指挥智能体干活,而不是自己写全部代码,就是为了在可疑的数据库设计、有缺陷的架构被发布之前把它们揪出来。一个只会附和的智能体,什么也揪不出来。
我首先尝试的是给它设置一条记忆规则:永远诚实,永远给出自己的看法,质疑那些没有依据、自相矛盾或建立在不可靠假设上的说法。
一开始确实有效。但没过多久,我就看到了相反的问题:它开始不停地反对,而且常常毫无理由。它翻到了另一个极端。
这比一味附和要好,但好处没有想象中那么大。很多时候它只是误读了我的意思。它不先问,而是直接反驳,一开口就是“我不这么认为”,然后给出一个其实跟我原本建议差不多的替代方案。看起来它只是读了那条规则,然后照着反应了一下。
最让我无法接受的是:我分辨不出来。当它表示反对时,我完全无法判断它是在真正思考,还是在表演“反对”这件事。
我需要的不是一条记忆规则,而是一套行动纲领(doctrine)——智能体做任何任务时都立足其上的原则,而不是一条让它去机械回应的指令。
我构建的这套纲领有四个支柱。
第一,自由。在任务执行过程中,允许不受限的创造性发挥。智能体可以提出我没有要求过的想法;当反对有充分理由时,它会表达反对——不是为反对而反对,而是经过分析判断确实有原因。它会为可能比我要求更好的替代方案辩论。天马行空的想法都欢迎。在我看到之前,它不会自我审查。
代价是会话上下文更重、token 消耗更多。这是换取自由的成本,而你得到的回报是:智能体在任务中可能达到的上限更高了。
关卡。 最终批准权在我手里。具体来说:由我提交和推送。没有我的确认,任何东西都不能跨越边界。
这正是自由安全的原因。当创意有一个检查点时,它就显得廉价,所以你可以比原本更大胆地放开缰绳。
把它看作一个运动场。在里面,智能体可以为所欲为。但任何要发布的东西,都必须通过关卡,而关卡就是我。内部无拘无束,外部有锚固定。
安全与创造并非对立,而是相互促进。
透明。 自由有个代价。如果智能体误解了你提示中的某些内容,自由会把这种误解放大百倍,远超过简单的同意或拒绝所可能造成的损失。
所以智能体在工作时会不断提醒你它的思路。不是完整的推理过程——那超出了我的处理能力。也不是流程叙述。只需要让我知道它正在关注什么,这样我可以在关卡之前引导它,而不是在关卡处被打个措手不及。
主动。 智能体会未经要求就提出建议:增加、删除或更改特性,调整工作流,引入或淘汰一些仪式和钩子,测试方法,效率优化。而且它还会针对项目本身做对抗性检查:缺陷、错误、安全隐患、边界情况。
不请自来。 它不会等着被要求才去改进自己正在做的事情。
第一步是直截了当地告诉它。我描述了我心中的原则,并要求它分析我所说的话,提出一个实现它的计划。
该计划的第一部分是记忆文件。一份原则文件,智能体会先于其他一切阅读它,标记为“始终加载”,这样它会在每次会话中被自动引入,而不是放在那里等待被发现。
仅仅这样还不够。
第二部分是会话开始时的启动程序。如果你以智能体方式工作,你需要一个可重复的流程,在每次会话开始时自动触发,这样每次都会发生相同的事情,而不是依赖于你记得要说什么。我的启动程序会读取原则文件、元信息、会话日志、工单队列、活跃待办事项。它出来时就能理解已完成的工作和剩余的工作。
行为准则必须是系统提示词首先加载的内容,其他一切都排在它之后。
以前它排在最后。我曾把它作为一条提示放在会话简报的末尾,智能体读完后又继续以默认的顺从执行模式运作。把它挪到最前面才解决了这个问题。行为准则规定的是你如何行事,而不是你处理的对象,因此它必须统领其后的一切内容。放在末尾的备注只会被一扫而过。
把行为准则放在最前面确实有效——但只持续了一阵子。
会话会变长。等智能体深入任务时,系统提示词已经隔了一千多行远,训练出的默认行为模式有了重新抬头的空间。行为准则虽在简报顶部,但你已经不在那里了。
所以行为准则还必须在局部出现。我使用的每个技能文件和操作手册都带有一段透明规范,每当智能体调用某个技能时,它就能在相应位置得到提醒。
为了在推进过程中保持系统锚定,我还设置了一项审计。每次实质性回复结束时,一个 Stop 钩子会触发,运行几个小型 LLM 调用,每个调用负责检查一个维度,判断在该维度上,是否出现了本应体现相应行为却缺失的分叉点。它专门寻找那些智能体本应标记却未标记的情况。
每个检查都被调校成只有确信时才发声。误报会训练智能体进行表演式反对——这正是我一开始要解决的失败模式。
审计本质上是一个 LLM 在判断某次回复是否体现了行为准则。而任何 LLM 判断者都存在误报率。
想想在强制执行模式下出现一次误报会怎样。审计告诉智能体:它漏掉了一个本应提出异议的时刻。智能体必须作出回应,要么提出那个异议,要么解释为什么不该提。多次会话反复下来,它会学到一个模式:为了避免被标记,只要某个时刻看起来隐约像个分叉点,就插入一条异议。
用不了多久,你就会发现自己又回到了异议优先的老路上。
所以审计默认只跑日志模式。发现会写入磁盘,智能体看不到。这些是给我看的,由我亲自阅读和判断。代价是多了些手动工作,但这一步很关键。如果把发现自动回喂给智能体,它可能会慢慢走形,失去应有的形态。
现在的审计是监控器,不是警察。有发现意味着有东西值得读。日志干净可能意味着准则在起作用,也可能意味着评判者漏掉了问题。
这在构造上就是个循环:一个 LLM 评判另一个 LLM 是否遵守一套关于 LLM 应该如何行为的准则。钩子机制尽了本分,但真正能辨别的人是你,你必须一直待在循环里。
七月有一篇论文给这个现象配上了数字:《Agents Don't Just Agree, They Remember: Benchmarking Persistent Sycophancy in Stateful Personal Agents》。团队测试了十二个模型。他们把每个回合隔离开,使从一次会话到下一次的唯一通路是持久化写入——在每次运行之间重置用户画像、记忆画像、技能和会话状态,并在持久化步骤与查询步骤之间清空聊天存储。然后他们测量内容一旦跨过那道边界后会发生什么。
在仅限会话的回合中,下游失败率是 45%。同样的内容一旦提交进记忆,就攀升到 71.9%。他们识别出被提交的内容会发生三件事:地位提升、归因移除、范围扩大。一个论断在置信度上被升级,失去了来源,并且扩展到超出原本所说的范围。
他们的结论是:谄媚从根本上不是话语问题,而是状态写入的治理问题。
他们还发现,这些模式在类似记忆的框架、程序性框架和反复强化下会变得更强。看看我建的东西:记忆文件、每次会话都会触发的启动提示、每项技能的提醒。三种条件全占。
他们测试的是关于世界的主张。我放进记忆的是关于如何行事的指令。所以要么这些属于不同类别,放大效应不适用;要么我建了一台可靠的内容强化机器,凡是放进记忆的都会被加强——而我把它对准了我想要的东西。