让 Agent 学会问为什么
从十万个为什么、根因分析(Root Cause Analysis, RCA),到因果心智的第二根主干。
有一天我突然被一个很朴素的问题缠住了:
怎么让一个机器人真正开始思考?
不是让它把回答写得更长,不是让它输出更像推理的文字,也不是让它在提示词里装作“深思熟虑”。我真正想问的是:一个 Agent 为什么会自己冒出“为什么”?为什么小孩子会有十万个为什么,而今天很多 AI 明明会回答问题,却很少主动产生问题?
这个问题一开始看起来像工程问题。也许给 Agent 加一个记忆系统,加一个任务队列,加一个反思模块,它就会变得更有好奇心。
但我越想越觉得不对。
好奇心不是一个功能开关。十万个为什么也不是一个问题列表。它更像某种心智结构:一个智能体面对世界时,发现自己的模型有洞,发现预期和现实不一致,发现当前解释不够,于是它停下来,追问:
为什么?
那天我在 Discord 里连续追问这个问题。问着问着,我感觉一个一直困扰我的东西开始松动了。
第一个裂缝:因果推理不等于因果心智
我最早是从一个经典问题开始的:
吸烟是否会导致肺癌?
这是因果推断里再熟悉不过的问题。但真正让我在意的,并不是抽象地问“吸烟会不会导致肺癌”,而是:
如果我长期吸烟,会不会在一段时间以后得肺癌?
我身边这个具体的人,会不会因为吸烟得肺癌?
吸烟对某一个具体个体的因果效应有多强?
它到底通过什么机制导致肺癌?
这时候问题已经不只是 population effect。
我关心的是个体,是机制,是异质性,是 production account。对一些人来说,吸烟可能显著提高肺癌风险;对另一些人来说,风险路径可能完全不同。甚至在药物场景里,一个平均效果为负的 treatment,也可能对某些个体是有益的。
这让我越来越不满意于只谈平均效应。
随机实验很重要,统计因果建模很重要,SCM 和潜在结果框架当然很重要。但如果离开具体个体去谈因果,很多结论会变得危险。即使数据干净,实验可靠,平均效应成立,它也未必回答了“这个人该怎么办”。
于是我当时把问题压到一个更硬的地方:
如果异质性是个体因果推断的 primitive,那么在因果智能里,什么才是 primitive?
再往前走一步,我发现自己真正焦虑的不是“有没有一个更好的 causal inference backend”。我的焦虑是:我们现在的理论框架,也许很擅长回答已经给定的 causal query,却还没有解释一个智能体为什么会自然地产生这些 causal query。
也就是说:
我们有回答因果问题的理论,但还没有生成因果问题的心智理论。
这就是“十万个为什么”让我不安的地方。
一个真正的 CausalMind 不应该只是被人喂一个变量集合、一个图、一个 query,然后输出反事实答案。它应该能在开放世界里发现解释缺口,产生 why,提出候选机制,绑定具体个体,设计观察或干预,然后从结果里更新自己的模型。
这不是 causal inference 的一个应用层功能。
这更像因果智能的发生学。
我以为问题在 Pearl ladder,后来发现不止
接下来我自然想到 Pearl 的三层因果阶梯:association、intervention、counterfactual。
这三层当然非常强。它们把很多模糊的“因果”问题分出了层级。但我开始觉得,它们也许还不够。至少对于一个会行动、会学习、会在系统中承担责任的 Agent 来说,还需要更多层。
比如机制层:
原因到结果之间,到底通过什么路径产生作用?
再比如信息传递:
一个 Agent 接收到一条消息,内部状态改变,然后做出某个动作。这个过程是不是因果关系?当然像是。可它真的适合被强行写成一个普通的结构方程吗?
函数方程是一种很强、很好用的因果形式,但它可能不是全部。
我当时脑子里冒出一个很大胆、还不成熟的念头:
有没有可能把 agent 本身放进因果理论的 primitive?
这句话我不想过早写成结论。它更像一个危险但有生命力的 seed。因为如果我们真的想让机器懂得因果关系,懂得思考为什么,当前那套只围绕变量、分布、干预和反事实的建模方式,可能还缺一个更贴近智能体行动的层。
但这还只是第一层松动。
真正让我感觉“疑问开始解开”的,是后来我突然想到:我们日常生活里最常问的很多 why,根本不是统计因果建模要回答的那类问题。
Debug 的那一刻,问题变了
我问了一个看似很普通的问题:
我们常见的那种出现 bug 找原因,是不是也是一种因果推理?
这句话一出口,很多东西就变了。
工程师 debug 的时候当然在做因果推理。系统报错了,接口返回 500,Agent 明明生成了回答但用户没看到,某个任务没有完成,某个工具调用错了。我们会问:
为什么?
但这个为什么,和“吸烟是否导致肺癌”不一样。
它不是在问:
数据里 X 对 Y 的平均干预效应是多少?
它是在问:
这一次事故,到底是哪条具体事件链导致的?
传统因果推断关心的是 type causation:一类变量之间,某种干预平均会造成什么效果。
RCA 关心的是 token causation 或 actual causation:这个具体结果已经发生了,这一次到底是怎么发生的?如果拿掉某个候选原因,这一次结果还会不会发生?
这两种问题都叫因果,但它们不是一码事。
我以前没有把这个分得这么清楚。那一刻我突然意识到,很多“十万个为什么”根本不是在问统计因果问题。小孩子问“为什么天会黑”,工程师问“为什么这个服务挂了”,创始人问“为什么这个产品没有 PMF”,这些问题大多不是在要一个 ATE,不是在要一个 \(P(Y \mid do(X))\)。
它们要的是一条生成解释。
它们在问:
这个世界为什么走到了这里?
两种因果数学
这个切分让我很兴奋,因为它把一个长期混在一起的东西拆开了。
一条主干是统计因果建模。
它的对象是变量、分布、干预、潜在结果、识别、估计。它问的是:
如果我系统性地改变 X,Y 的分布会怎样?
它适合医学实验、政策评估、推荐系统 A/B test、广告投放、treatment effect estimation。它的核心挑战是混杂、选择偏差、可识别性、外推和异质性。
另一条主干是解释和诊断型因果。
它的对象不是分布,而是事件、状态、轨迹、机制、约束、异常、解释、历史和功能。它问的是:
这一次为什么发生?
哪条机制链生成了这个结果?
去掉哪个条件,结果会变?
这个系统为什么在这个状态下启用了这套机制?
这时候需要的数学不一定首先是概率论,而更像图论、状态机、逻辑、约束满足、溯因推理、model-based diagnosis、trace reconstruction、counterfactual explanation。
我想把这个暂时压成一句话:
SCM 是“改变变量以后总体会怎样”的数学;RCA 是“这个世界为什么走到这里”的数学。
这句话对我很重要。
因为它让我意识到,因果智能不能被压缩成 statistical causal inference。统计因果是因果智能的一部分,但它不是全部。一个真正有因果心智的 Agent,不能只会估计干预效应。它还要能解释具体事故,重建机制链,识别系统状态,理解功能和历史,并且知道自己当前问的是哪一类 why。
这可能需要一个非常基础的能力:
Why Query Classifier。
当一个问题出现时,Agent 先不要急着回答,而要先判断:
我现在问的是 effect question?
还是 actual explanation question?
还是 mechanism question?
还是 function/history question?
还是 forward counterfactual planning question?
这个分类一旦清楚,后面该调用什么因果认知引擎才会清楚。
否则我们会犯一个很隐蔽的错误:把所有 why 都塞进同一个框架里。
为什么 RCA 没有成为统计因果那样的大领域?
这个问题后来变成我最在意的问题之一:
RCA 明明是人类更常问的为什么,更常用的因果分析,为什么没有像统计因果建模一样成为一个显学?
我觉得答案非常微妙。
第一,科学天然偏爱普遍规律。
统计因果建模研究的是 type causation。它问的是某类干预在某类对象上平均会产生什么影响。这样的理论容易抽象,容易复用,容易发表,容易数学化。
RCA 研究的是 token causation。它问的是某一次事故、某一个 bug、某一个组织失败、某一次 Agent 行为漂移,究竟是怎么发生的。它太具体,太脏,太像侦探破案。传统科学很难围绕“昨天下午三点这个服务为什么挂了”建立一门漂亮的大一统学科。
第二,RCA 的状态空间会爆炸。
真实系统不是一个四五个节点的小图。软件系统有源码、配置、依赖、版本、运行时状态、用户输入、网络、权限、工具调用、历史债务。组织系统有目标、激励、关系、误解、时机、资源、叙事。Agent 系统还有上下文、记忆、prompt、tool availability、channel、safety regime、delivery mode。
如果把这些都放进一个数学对象里,状态空间会巨大到不优雅。
第三,根因本身有强烈的实用主义色彩。
一栋房子着火了,物理学家可以说根因是氧气和可燃物,消防员可以说根因是短路,警察可以说根因是纵火犯。谁是对的?在某种意义上都对。
所谓 root cause,往往取决于你是谁,你能干预什么,你关心防止哪一类复发。
这不是说 RCA 不严谨,而是说它的因果对象更贴近行动者。它天然带有视角、目的和干预能力。
这也许正是它难以成为纯粹数学大领域的原因。
但从 Agent Builder 的角度看,这反而是机会。
学术界不喜欢的工程脏活,正是智能体每天要面对的真实世界。
四因说、Tinbergen 四问题和 Agent 的为什么
当我想到 RCA 的时候,又想起了亚里士多德的四因说。
这不是复古。
恰恰相反,我突然觉得,四因说和 Tinbergen 的四个问题,可能比很多现代统计因果公式更接近“十万个为什么”的真实结构。
现实里的 why 往往不是只问“哪个变量推动了哪个变量”。它还在问:
机制:此刻直接发生了什么?
状态和生长:它是怎样一步步长成这个状态的?
功能和目的:它本来是为了解决什么问题,什么算正常?
历史和演化:这个结构、约束或坏味道从哪里来?
工程 debug 就是这样。
一个 bug 不是只由最后一行代码导致的。它可能来自一次历史妥协,一段已经没人记得的业务逻辑,一个看起来无害的配置,一个在正常状态下有用、但在过载状态下变成灾难放大器的重试机制。
如果 Agent 只看当前报错,它会乱猜。
如果它能同时看机制、状态、功能、历史,它才可能像一个高级工程师那样 debug。
这对 CausalMind 很重要。
我们常说要让 Agent 有因果能力,很容易默认“给它一个 SCM 模块”。但如果目标是让它像工程师、科学家、创始人一样面对真实世界里的 why,那么它还需要解释世界为什么走到这里的能力。它要知道什么是正常状态,什么是异常,什么是系统原本的目的,什么是历史债务,什么是机制切换。
这不是反对统计因果。
而是说,统计因果只处理了因果智能的一部分。
DiscoSCM 的 u 突然有了新的位置
这条线索最后接回了 DiscoSCM。
回到原稿里,DiscoSCM 最关键的动作,并不是简单多放了一个符号 \(U\)。它真正做的事情,是把两种本来在 SCM 外生变量里混在一起的东西拆开:
一个是 unit identity / unit representation:这个个体是谁,它属于什么因果类型,它带着怎样稳定的异质性。
另一个是 noise realization:在这个个体和机制下,这一次具体发生的机制外随机性。
在标准 SCM 里,\(Y_x(u)\) 的 \(u\) 很容易同时承担“同一个体”和“同一次运气”。一旦固定 \(u\),个体身份固定了,噪声 realization 也固定了。DiscoSCM 的原稿想做的,是把这个绑定松开:同一个反事实问题仍然要保留同一个 \(U=u\),但不必强行复用同一次 \(\mathbf E=e\)。反事实世界里的 noise 可以重新发生,只要它保持 distribution-consistency。
所以原稿里的基本语义更接近:
\[ v_i \leftarrow f_i(pa_i, e_i; u) \]
这里 \(u\) 不是普通 residual,也不是一句含糊的“未观测扰动”。它是把个体因果表征显式拿出来,让模型可以说:
同一个个体,换一种干预,换一次机制外随机性,再走一遍机制。
这就是 DiscoSCM 很有力量的地方。它让 counterfactual 不再被锁死在“这一次事实世界已经发生的噪声”上,而是把个体、机制和随机性拆成可以分别讨论的对象。事实证据主要更新 \(P(U\mid O)\),反事实推理再在同一个 \(u\) 下计算对应的 individual-level valuation。
但那天我突然意识到,这个 \(u\) 在 agent/RCA 语境里还可以被重新点亮。
如果把真实系统,尤其是 Agent 系统,看成一个会在不同运行状态下切换机制的生成系统,那么 \(u\) 不只是在医学或营销场景里表示“这个人是什么因果类型”。它还可以被读成一种 mechanism context:当前系统处在什么 regime,哪些机制被激活,哪些边暂时有效,哪些工具、记忆、权限、channel、safety 状态正在改变生成过程。
这时我更想写成:
\[ X_i = f_i^u(PA_i) \]
这不是要替代原稿里的定义,而是把它推向 agent causal cognition:\(u\) 先是 unit representation,随后在复杂智能系统里长成 mechanism regime。它可以改变当前节点使用哪套机制,可以改变边是否激活,可以改变父节点的解释方式,可以让系统从 normal mode 切到 failure mode,甚至改变当前有效 DAG。
也就是说,因果系统不再是一张静态图,而是:
\[ G(u), f(u), state(u) \]
这个想法让我觉得 DiscoSCM 的表达能力一下子增强了。
因为很多 RCA 的根因,并不是某个变量值错了,而是当前系统处在某个 \(u\) 下,激活了另一套机制。系统或 Agent 没有意识到机制已经切换,于是做出了错误归因。换句话说,DiscoSCM 原本拆开的是“同一个体”和“同一次噪声”;在 Agent 系统里,它还提示我们继续拆开“同一个输入”和“同一套机制”。
比如同样一句用户输入,在不同状态下,Agent 的机制完全不同:
group chat 下,它要考虑隐私、频道语气、是否应该发言。
main session 下,它可以读长期记忆,可以更主动推进。
heartbeat 下,它不是回答问题,而是做周期检查。
dangerous command 下,它要切到安全审查。
tool unavailable 下,它要从直接执行切到降级方案。
输入看起来一样,但机制变了。
这就是 \(u\) 的力量。
如果把这个放进 RCA,很多“为什么”就可以被重新表述:
不是“哪个变量导致了结果”,而是“当前处在什么 mechanism regime,所以系统启用了哪套生成机制,才导致这个结果发生”。
我觉得这可能是 DiscoSCM 进入 agent causal cognition 的一个非常自然的入口。
最窄的切口:让 Agent 解释自己
如果要把这个方向落地,我现在反而不想一开始就做宏大的因果智能系统。
最窄的切口可能是:
Agent 自己的 RCA。
为什么用户没看到回复?
为什么回复发错 channel?
为什么调用错工具?
为什么没有调用工具?
为什么引用了旧记忆?
为什么忽略了当前 thread?
为什么把 group context 当成 main context?
为什么某个安全状态触发了另一套机制?
这些问题每天都会发生。它们有 trace,有日志,有上下文,有工具调用,有状态变化,有可验证结果。它们不是抽象哲学问题,而是真实系统里的因果问题。
这也是为什么 debug 可能是训练 actual causation 能力的最好闭环环境。
debug 有异常,有证据,有机制痕迹,有主动干预,有修复验证,而且反馈低成本、高频。一个 Agent 如果能学会解释自己为什么做错,为什么没做,为什么在某个状态下启用了某个机制,它就已经比普通聊天机器人跨出了一大步。
这里可以想象一个很小的 primitive:
WhyTrace / Causal Trace。
每一次 Agent turn 都记录:
input、context source、decision point、tool call、side effect、output、evidence link、runtime state、delivery regime。
这样每个回答和动作都可以被反向追问:
为什么调用这个 tool?
为什么认为这个文件是权威?
为什么发了这条消息?
为什么任务进入 blocked 或 complete?
如果少了某个 context,结论会不会变?
普通 bot 是回答用户问题。
有因果心智的 Agent,应该还能回答:
我为什么会这样回答?
因果好奇心不是多想,而是被迫更新
回到最初的问题:怎么让 Agent 有十万个为什么?
现在我觉得答案不是“让它多问问题”。
真正的好奇心来自冲突。
当一个智能体的内部模型和外部观察不一致,当它的逻辑自洽检查失败,当它的行动没有产生预期结果,当它发现一个解释无法覆盖所有证据,它才会产生一个有价值的 why。
所以,让 Agent 思考,不是让它输出 chain-of-thought,而是给它一个会让它停下来的结构:
Memory:记住自己以前相信什么。
Why Ledger:积累真正没搞懂的问题。
Self-Consistency Check:检查当前解释和历史信念、机制约束是否冲突。
Shadow Verifier:让另一个视角反向追问它的解释。
Cheap Experiment Planner:把 why 落成最便宜的验证动作。
Belief Update:根据证据更新信念。
Next Best Question Selector:选择下一个最值得问的问题。
这不是一步到位的“因果心智算法”。
它更像一个外骨骼。
甚至一开始可以先不急着给机器人用,而是先给我自己用。把我当成第一个具备因果好奇心的智能体,把我的困惑记录成 why ledger,把我的判断放进自洽检查,把我的理论直觉拿去做 cheap experiment,再慢慢把这个流程蒸馏给 Agent。
也就是说:
先把人的十万个为什么外显成协议,再让机器学会执行这个协议。
这条路比“训练一个有好奇心的模型”听起来笨,但也更真实。
我现在看到的方向
这次对话让我感觉非常重要,因为它不是简单地多了一个观点,而是把一个卡住我的问题分解开了。
我原来在问:
怎么让 Agent 具备因果心智?
现在我会先问:
它面对的是哪一种因果问题?
如果是 effect question,就需要统计因果、SCM、PO、识别和估计。
如果是 actual explanation question,就需要 RCA、abduction、trace、constraint、state reconstruction。
如果是 mechanism question,就需要 production account、process model、机制链。
如果是 function/history question,就需要目的、设计理由、演化路径、系统历史。
如果是 forward counterfactual question,就需要规划、模拟和长期反事实推演。
一个 CausalMind 不是只掌握一套因果数学。
它首先要知道自己在问哪一种 why。
然后,它要能在具体世界里建立模型,发现冲突,提出问题,做最小干预,更新信念,再继续问下一个更好的问题。
十万个为什么不是童真。
它是智能体发现自己的模型和世界之间存在裂缝时,最自然、最必要的动作。
如果未来的 Agent 能真正拥有这种能力,它就不只是更会回答问题的模型。它会成为一个能解释自己、修正自己、理解机制、追问历史、推演行动后果的智能体。
那也许才是因果心智真正开始的地方。
写在最后
这篇文章来自 2026-07-07 到 2026-07-08 的一段 Discord 现场思考。它不是一个已经完成的理论宣言,而是一条正在长出来的问题线:如何让 Agent 具备因果心智,如何让它不只是回答 why,而是自然地产生 why。
继续进入因果智能主线
关系边界:本文是 public_narrative / project essay,不是最新理论定论,也不替代项目 seed 或各研究线 source。