当智能体承担工作时的批判性思维
作者想帮助读者,在一个很容易把任何事情都交给智能体的世界里,继续保持批判性思维。
作者想帮助读者,在一个很容易把任何事情都交给智能体的世界里,继续保持批判性思维。
作者:Addy Osmani
从前,批判性思维被教成这样:带着谦逊的好奇和一份健康的怀疑去接近新信息——吸收不同的看法,形成自己的意见。这仍然成立。但越来越常见的是,既然我这么多工作都经由智能体完成,我的日常里已经没有什么在迫使我做批判性思维。对那些已经完全接受智能体工作流的工程师和产品人员(并行运行多个会话,并期待模型会改进),我想说:我非常喜欢这些工具。我写这篇,不是为了主张减少智能体工作流。
我的目标,是帮你在一个很容易把任何事情都交给智能体的世界里,继续保持批判性思维。
过去,我们大部分认知上和审美上的处理,发生在问题与答案之间的那段空隙里。现在这段空隙以秒来计量。你越是使用智能体工作流,这件事就越难(不过难的方式,并不是我所以为的人们会预期的那样):随着模型改进,明显错误所占的比例更低了。许多(大多数?)输出会写得很好,而且大体正确,但它们不会要求你再看第二眼。
即便你同时运行着许多智能体,盯着这些输出的仍然只有你一双眼睛。
你必须把批判性思维做进自己的一天里,因为在默认情况下,没有什么会替你做这件事。
这件事难以自我纠正,部分原因是智能体工作流让人愉快。在忙碌的一天里,得到快速、愉快、常常正确的答案,让人振作;但也正因为如此,你很容易放松警惕。
[1]和别人讨论这件事时,我把它描述成一条谱系:
最上端:认知卸载,也就是把任务委托给 AI,但仍然保有对结果的所有权。我整天都在这样做。你也应该这样做。中间:延后,工具的输出变成了你的新输入;这个结果不再是一个假设。最下端:认知投降——AI 的输出悄悄变成了你自己的,你觉得没有必要去检查它。
认知投降是沃顿商学院的 Steven Shaw 和 Gideon Nave 提出的术语。它恰好符合我看到的情况:随着信任(或懒惰)增加,人们沿着这条谱系往下漂。这种转变很少被人察觉,因为每一步都是逐渐的,而且看上去都合情理。你把上一个答案读得很仔细,于是下一个就略读。再下一个,你只扫一眼骨架。然后有人问你某一行,你解释不了,即便有智能体帮忙也解释不了。
这就是认知投降。认知债就是这样累积的。它通常是在你试图运用对这个系统的心智模型、却发现这个模型并不存在时才被发现。Margaret-Anne Storey 写过,这在团队里表现为对一套共享系统理论的理解正在被侵蚀。我写过它在代码上的对应物,理解债(这个术语是 Jeremy Twei 提出的)。当时它完全看不见。代码库看起来干净整齐,测试也通过了。直到你必须对系统做一处改动,才发现已经没有人理解它了。当你读完一份策略文档或规格的目录就签字通过时,也是同样的情形。
说清楚一点,我不是在主张去做不可能的事。维持一个大型现代代码库的完整心智模型是不可能的。Claude Code 团队公开说过,他们按需重建理解:当他们需要理解某一部分时,就让 Claude 解释那一块,而不是把完整模型装在脑子里。正如我以前写过的,这种债比大多数工程师预期的更容易补回来。只要你能在需要时局部重建它,就不必维持完整模型。你只需要知道自己缺的是什么。
在利害很低的地方,尽可以完全委托出去。当你解释不了一个问题的答案,即便借助于你的智能体也解释不了,你就已经让出了所有权。
这也并不总是一个问题。就在最近,我在录一门课,必须从三家评分相近的酒店里选出一家作为录制地点。我没有时间手工看完所有评价,于是把这个决定委托给了 AI。它做成了,下次我还会这样做。不过,在决定如何投资我们的钱、如何给我们的孩子提供职业建议,或者在工作中决定我们应该构建什么、哪些改动会影响哪些用户、发出去是否安全时,我不会这样做。在出错代价低的地方接受交接,在别人必须承担后果的地方,把推理留在自己手里。
[1]当我不知道自己在想什么时,我通常会回到一组很基本的问题,比如:我怎么知道自己在做正确的问题?我怎么知道自己在用正确的方式解决它?有没有证据支持我的结论?我怎么知道自己做完了?大多数时候,这不过就是谁、什么、哪里、为什么、何时、如何。写出来显得幼稚得离谱,但它迫使你去想那些你否则会忽略的类别。如今,太容易把这一切直接跳过,转而问你的智能体它认为你该做什么。下面这些,是我现在问自己的、那些问题的新版本。
在提问之前,我形成假设了吗?在让智能体跑任何并非无关紧要的任务之前,我会写下——哪怕只是在脑子里——我认为答案可能是什么。猜得差也没关系。面对新信息,你永远可以改变想法。可是一旦你读完一份写得很好的回应,就很难再想象别的可能性。如果你完全没有方向,就去要 Thariq Shihipar 所说的 blind spot pass:把你已知的交给模型,让它找出你的未知之未知。
我是在让它帮我思考,还是在把思考从我这里卸出去?两种都可以,只要你知道自己在做哪一种。
要让这件事是错的,必须有什么为真?然后去查。模型对自身信心的自我评估,远不如一个你真正能做的测试有价值,所以给它一个这样的测试。
我听过从另一个角度提出的反方论点吗?当我对一件多少有些开放、没有定论的事采取了强硬立场,我会让不止一个模型去论证相反的一方,然后审看输出,形成我自己的意见。这要花更长时间,但我对这个题目会知道得多得多。
我敢在必须维护它的那个人面前,为这件事下注吗?这适用于代码,也适用于你交付的任何其他东西。我相信,这就是可回答性的标准。
我不再练习的是什么?也许是一些例行的调试。我可以接受放下其中一些,但我想让这件事是有意的。
[1]我近来写了很多关于验证的东西,因为我相信瓶颈已经从写代码,转移到确定自己是对的。当你给智能体手段去验证它正在做的事,无论是通过端到端测试、属性测试,还是通过真正的应用交互,它可以做出一处改动、跑验证测试、读输出、再试一次,这一切都发生在你看任何东西之前。这就是 Boris Cherny 所说的“给 Claude 一种验证自己工作的办法”,我相信这是取得好结果最关键的组成部分之一。你不必去读每一行,而是在建立这些循环,并审查证据。
你也可以在验证上投降。“有没有证据支持我的结论?”变成了“检查变绿了吗?”智能体让编写测试变得如此便宜,以至于你会看到很多绿色,而一个通过的测试也可能抓不住一个坏掉的功能。如果测试和功能犯的是同一个错,它就会通过。一次变绿只传达一个性质。太容易以为它覆盖了一切。
当一次检查变绿,问它证明了什么。然后再问它没有证明什么。
事先定义什么叫“已验证”,因为事后你会为任何结果找出合理化的理由。
智能体工作的终点线应该是某种有形的东西:一个通过的测试、一张截图、一段日志或追踪。这保证完成工作的标准是事实性的,而不会基于“看起来像是做完了”这类东西去解释(以及投降)。当你收到智能体的完成通知时,在看摘要之前,先看已执行命令的代码片段和它的输出。
Claude Code 也可以(通过一个全新上下文里的子智能体)对自己的工作做自我批评,当作一次健全性检查,值得把它做进循环里,让它每次都跑,而不是只在你记得的时候跑。我仍然会在结尾问“我漏了什么吗?”这听起来很傻,但经常是这样:我用一个前沿模型做完一些复杂的功能,看过它,审查过它,然后再问“我漏了什么吗?”它接着会再拿出两三件事。所以我总是问。
当然,这些都不需要成为常态;知道何时深入,本身是一种技能。关于 Claude Code 团队如何做代码审查,我们那篇写过的文章里,我最喜欢的经验法则是:“如果你说不出这些检查会漏掉什么,就去要一次真正的审查,而不是一次快速批准。”
这在代码之外也同样适用。如果一个智能体为你综合了五十通客户电话,或一份竞争分析,就去核对其中几份源文件,确认摘要是准确的。核对一个你的建议所依赖的数字,确认它被计算对了。
智能体已经让验证变得便宜、容易搭起来。对你来说难的是,知道好的验证长什么样。
[1]假设一个智能体给你一份 600 行的 PR。你大致看了结构。你没有读每一行。变量名看上去合理,测试也通过了,于是你批准了它。但中间某处,事务边界里有一处细微的顺序变化,或者一个你从没想过的边界情况上,默认值被翻了一下。你确实审查了,我想,但只审查了你已经知道自己会发现的东西。
写代码和审查代码是不同的技能,而且存在一个点,审查会变成盖橡皮图章。所以,把 diff 当成不是 AI 写的来读,然后再越过 diff,去看智能体决定了什么。在一次很长的会话里,它替你做了许多小决定:默认值、什么被算作范围之外、当两条需求冲突时它重新解释了哪一条。
在一份说一切顺利的摘要里,你看不到这些,所以让它列出自己做出的决定和假设。然后考自己。随机挑几行,问:这一行呢?那一行呢?对一份文档,把它合上,试着凭记忆写出主要论证。有些人在长会话里有一个我喜欢的习惯:让 Claude 写一份关于这次改动的报告,然后在底部给你一份测验,规则是“我只有在测验全对之后才合并。”
把你要发出去的东西理解到足以为它辩护。因为到某个时候,会有人问。
智能体也可以替你守住注意力。例如,我有一个开源项目,会收到很多拉取请求。我会用智能体帮忙判断什么正在进来、什么与我们的准则相悖、我的注意力大概需要放在哪里。我很少让智能体自己决定这一点,但它们可以把范围收窄到我应该把注意力集中的地方,然后我可以真正去想,这些改动是不是在用正确的方式解决正确的问题。
然后还有数量,你必须对自己诚实。我把这叫做编排税。它是你的智能体生成的东西,和你愿意署上自己名字的东西之间的差距。如果做完的工作堆得比你处理得更快,再开一个会话也没用,除非你先解决这一点:收紧检查,让更少的东西需要你,或者放慢速度。
当你生产出的东西多到你无法为之站台,你就不再是在审查。你是在指望。
[1]人的心智模型仍然参与其中,但它不再位于中间,而在开头和结尾。你把精力放在任务描述和上下文的前段,以及审查输出的后段。这就是为什么好的输入对输出质量如此重要,而我把好的提示看作一种批判性思维技能。
以往,如果你提出一个不具体的请求,会有人质疑它,你可能会意识到:“等等,我其实还没把这件事想清楚。”智能体往往不会在那里拦住你。它把你留空的地方填上,交回一件看上去已经做完的东西,尽管它背后的想法仍然模糊。我把这写成意图债:那些你没有写下来的产物里,可能存在的隐含目标、约束和理由。和其他种类的债不同,没有别人能替你补上这一笔。意图必须来自你。
你的提示反映的是你对这个问题的理解,如果你不能把它说清楚,它在你自己脑子里可能也不清楚。
在求助之前,用你自己的话写你自己的需求简报。写明受众、范围之外的事项,以及完成的定义。当你第二轮修正还没有让你到达那里,就停止微调,重写你的提示。
你也可以让智能体帮你做这件事。我喜欢 Andy Clark 对“委托给一个 AI 系统”和“与它协作”所作的区分。在后一种情况下,你处于一个相互放大的良性循环:你的提示让输出更清晰,输出让下一条提示更清晰,也让你对这个问题的心智模型更清晰。如果不清楚,就让智能体就它不理解的地方采访你。如果你结束这次会话时,自己的心智模型被打磨过了,那就是成功的标志。
对输入也要小心。每个智能体都很容易只把上一个智能体的摘要传进自己的上下文,不久之后,第三个智能体就没有读过原始文档。
你也需要自己的输出标准。我在许多不同的创作媒介里试过 AI,其中大部分从未拿出来给人看,因为它达不到我的标准。东西都出来得格式整齐、语气自信,所以光鲜本身不再是有用的信号。
AI 也许让生产变快了,但如果我不愿意把这份输出算作自己的,我就不会把它发出去。
当某样东西达不到你的标准,把原因记在共享配置、钩子或测试里,让它不再发生。品味就是这样累积起来的,而记下为什么某样东西没过关,这件事本身就是好的练习。
[1]如果你和我周围的许多人一样看好这个领域的未来,你可能在前面两三节就已经有过这个想法。一两年后,模型就能发现我能够发现的东西,那何必还要维持这项技能?
在很多这类发现上,你也许是对的,我自己也一直主张把越来越多的发现工作推给智能体。但我认为它仍然重要,原因在这里:到头来,总得有人为发出去的东西负责。无论 AI 帮了多少,必须有一个人类来承担责任。
对任何一项具体任务,该在多大程度上信任一个智能体,这个问题本身就是一个判断。保持校准的一部分,就是审查这些工作,因为模型出错的地方一直在变。Anthropic 对自己的工程师和研究人员所做的研究,把这个陷阱称为监督悖论:“监督 Claude 所需要的,正是可能因过度使用 AI 而退化的那些编程技能。”
有些事对我最重要,而且更好的模型也解决不了:你在构建什么,为什么它值得,它影响谁,你愿意牺牲什么?这些都是你需要回答的问题。智能体可以帮助把它们想清楚,我也希望它能帮上忙,但它们最终仍然是你的。
你可以把工作卸出去,也可以把大量审核卸出去,但不能把责任卸出去。
[1]你不需要把这些都做得非常严格。把适合你工作流的接进去就行。
每周一次,不用智能体写一点代码,或者做一件如果你忘了怎么做就会很糟的真事。(我把这叫做校准练习,但我不是把它当成一项道德练习。)每月一次,写下你已经停止做的事,并决定其中哪些是你可以接受不再做的。我一篇旧博文里的一个问题,至今仍然同样有效:如果 AI 不存在,你会有多迷失?
如果某件事超出你的理解,就去学它。如果我在写作时遇到一个以前没见过的说法,我可以 Google 一行解释然后把它写进去。我更愿意做一点研究来真正理解它,这样我能看出它放在哪里。
认真检查这台机器是实实在在的工作,假装不是这样,团队最后就不会去做。它不是免费的,所以把它排成一个单独的事项,你才会真的把它做完。
你停止练习的技能会消失,而且可能比你猜的更快。继续做那些你不愿意放手的。
[1]要有意为之。智能体可以考你、采访你、给你看它的证据,但只有你把这件事设置好,它才会这样做。所以,把它设置好。
对自己在这条谱系上的位置要诚实。如果你解释不了这个答案,即便有智能体帮忙也解释不了,你就已经把它交出去了。
要有一个假设。在提问之前形成一个,哪怕它很差。
一次变绿只意味着一件事。它检查了什么?它没检查什么?
去找证据。在读摘要之前,先读它运行了什么、返回了什么。
读,是为了知道它做了哪些决定。它替你决定了什么?
打磨你的提示。你怎么写你所提示的内容,就显示出你对这个问题理解了多少。
设一条标准,并守住它。如果你不愿意署上自己的名字,它就不该发出去。
用手动去用那些重要的技能,让自己留在局里。你可以做的一件事:在提问之前,写下你认为会发生什么;智能体做完之后,写下它没有检查的一件事。如果这改变了你阅读输出的方式,告诉我。独立思考。问更好的问题。为结果承担责任。
[1]