2026-07-08Causal MindAgentRCADiscoSCMCausal Intelligence

让 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。

本文来自 2026-07-07 到 2026-07-08 的一段 Discord 现场思考,经整理为 Gong blog 公开草稿。