AI WINTER AND SPRING · CHAPTER 11
附录:为什么它会爆炸
从组合爆炸、隐性知识和开放世界边界解释专家系统与 Agent 的三个结构性病灶。
本附录是对第三、第八、第九章的深度补注。
正文讲了"发生了什么"——规则爆炸、知识获取瓶颈、脆弱性。
本附录回答那个更深的问题:为什么会这样?为什么不是"更聪明就能解决"?
本附录配有可运行的复现脚本(06-复现实验/reproduction.py),读者可亲手验证文中每一个论断。
一、组合爆炸:为什么 N 条规则意味着 O(N²) 个冲突点
现象
复现脚本里有一个直观的画面:规则从 3 条加到 13 条,冲突从 1 个暴涨到 68 个。规则只增长了 4 倍,冲突增长了 68 倍。这不是偶然——这是一个数学结构。
根因
一条规则不是一个孤立的判断。它是一个约束——对系统能给出的结论集合施加限制。两条规则之间的关系,有三种可能:独立(互不影响)、互补(各自覆盖不同情况)、冲突(在同一情况下给出矛盾结论)。
关键在于:N 条规则之间有 C(N,2) = N(N-1)/2 个两两配对。 每一个配对都可能是一个冲突点。3 条规则有 3 个配对;13 条有 78 个;17,500 条有超过 1.5 亿个。这就是 XCON 后期维护团队为什么需要几十个人——他们不是在写新规则,他们是在检查 1.5 亿个可能的冲突里,哪些真的会出问题。
这不是"不够聪明"的问题。这是一个组合论的结构性事实:只要你的系统用"两两可能交互的离散条目"来承载知识,维护成本就必然随条目数平方增长。换什么推理引擎、用什么编程语言、雇多聪明的工程师,都改变不了这个数学。
复现验证
运行 python reproduction.py,观察步骤 1→2→3 的冲突增长曲线:
初始 │ 规则 3 ██████ 冲突 1
+规则 │ 规则 7 ████████████████ 冲突 2
+规则 │ 规则 13 ████████████████████████ 冲突 68 ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
规则 4 倍增长,冲突 68 倍增长。这就是 O(N²)。
为什么 Agent 时代也没逃掉
Agent 的"规则"叫 prompt 指令、工具描述、记忆条目。它们同样是离散的、两两可能交互的条目。复现脚本的第二幕证明了这一点:Agent G 把 10 条诊断知识塞进 system prompt,这些指令两两之间同样可能产生"一条说用药 A,另一条说用药 B"的冲突。容器变了,组合论的结构没变。
二、知识获取瓶颈:为什么隐性知识无法被"说清楚"
现象
第三章讲过:知识工程师坐在放射科医生旁边两周,也写不完医生三秒钟的直觉。费根鲍姆把它叫"瓶颈"。
根因
答案在波兰尼 1958 年的哲学里:我们能够知道的,远多于我们能够说出来的。
一个资深医生看胸片,三秒钟判断"这片子不对劲"。你问她怎么知道的,她可能会说"这里有点模糊""密度不太均匀"——但如果你把这些描述写成规则,你会发现它们覆盖不了她真正的判断过程。因为她的判断依赖模式识别——一种在数万张胸片的训练中形成的、下意识的、整体性的认知能力。这种能力是具身的、情境的,不是一串可以逐条写下来的命题。
这不是"她表达不清楚"的问题。这是认识论的结构性事实:有一类知识(Polanyi 称之为 tacit knowledge,隐性知识),它的本质就是无法被完全显式化。你能展示它(通过行为),但你不能穷尽地陈述它。试图把隐性知识翻译成规则,就像试图把骑自行车的平衡感写成说明书——你可以写"向左倾斜时向左打把",但真正骑车时发生的远不止这一条规则。
为什么这造成了瓶颈
专家系统的全部价值,依赖于把专家知识显式化成规则。但隐性知识无法被完全显式化。这意味着:无论知识工程师多努力,规则库永远只是专家能力的近似——而且是一个不断漏掉"隐性部分"的近似。 每覆盖一个新情况,就暴露出更多没被编码的隐性判断。这就是"瓶颈"的精确含义——不是一个可以加速的瓶颈,而是一个认识论层面的天花板。
为什么 Agent 时代也没逃掉
今天的 Agent 工程师,坐在一个业务专家旁边,把"什么情况下该调用哪个工具、参数怎么填、返回值怎么判断"写进 prompt 和记忆条目。这是同一个动作——把专家的隐性判断翻译成显式的指令。专家脑子里的"这个客户的情况有点特殊,不能套标准流程",和 1977 年放射科医生脑子里的"这片子不对劲",在认识论上是同一种东西。容器从 IF-THEN 变成了 prompt,但"隐性知识不可显式化"这个天花板没有升高一毫米。
三、脆弱性:为什么边界外会"自信地错"
现象
复现脚本里有一个精确的瞬间:给感染诊断专家系统一个"皮疹患者"——这在它的规则库里没有对应规则——系统没有说"我不知道",而是 confidently 开出了"大环内酯类抗生素"。这是 MYCIN 式的 brittleness:边界外不拒绝,而是给出可能错误的答案。
根因(专家系统版本)
专家系统的推理引擎是贪婪的——它遍历规则库,找到所有条件满足的规则,触发它们。如果没有任何规则匹配,它不会说"我不知道",它只是什么也不输出——或者更糟,触发了某条"兜底规则"给出一个泛泛的结论。
问题在于:规则库的"边界"是隐式的。 没有任何一条规则写着"以下情况超出我的能力范围"。系统的全部知识就是它的规则集合;规则集合没有覆盖的情况,对系统来说不是"未知的未知",而是"透明的空白"——它看不见自己的盲区,所以它不犹豫。
人类专家不是这样。一个人类医生遇到没见过的症状,会意识到自己不知道,然后说"这超出我的专业了,建议转诊"。这种"知道自己不知道"的能力(元认知),专家系统没有。它的自信不来自于"判断自己对了",而来自于"没有机制判断自己错了"。
根因(Agent 版本,更隐蔽)
复现脚本和第四章的 Agent 实验,揭示了一个更深的演化。当代 Agent 在边界外的失效,不是"什么也不输出",而是靠 LLM 的预训练记忆给出看起来正确的答案——但绕过了工具校验层。
这比专家系统的脆弱性更危险,原因有两层:
第一层,失效变得不可见。 专家系统的边界外失效是显性的——它给出荒谬结论或什么都不给,容易被发现。Agent 的边界外失效是隐性的——LLM 靠记忆兜住了表面正确性,看起来"答对了",但推理过程是假的。你很难从一个看起来合理的答案里,发现它没有真正调用推理工具。
第二层,"自信"的来源发生了位移。 专家系统的"自信"来自于无知(没有机制发现错误)。Agent 的"自信"来自于幻觉——LLM 在生成文本时,并没有一个内部机制区分"我知道这个"和"我在编造这个"。它的"自信"是温度参数的产物,不是判断的产物。这意味着 Agent 可以极其自信地、流畅地、有说服力地,给出一个完全错误的答案——而你无法从输出本身判断它是在回忆还是在编造。
复现验证
运行 python reproduction.py,观察步骤 4 的脆弱性测试:
边界外患者: {'symptom': '皮疹', 'wbc': '正常', 'temp': 37.5, 'source': '皮肤'}
❌ 系统仍然给出了诊断(但可能是错的): ['R11: 改用大环内酯类']
→ 这就是 Brittleness:边界外不承认不会,而是 confidently 给出可能错误的结论
再结合第四章 Agent 实验中 DENDRAL 升级版 Agent 面对二茂铁(边界外的金属有机化合物)的表现——它没有承认超范围,而是靠 LLM 记忆给出了答案。两种脆弱性,同一个根因:系统无法识别自己的边界。
解药为什么是独立的验证层
这就解释了为什么第十章的 Verification 必须独立于推理过程。你不能用 Agent 自己的"自信"来判断它对不对——因为它的"自信"恰恰是问题本身。你需要一个外部仲裁者:一个不参与推理、只负责检查推理结果的机制。Fact-Checker 智能体不信任 Researcher 智能体的初判;METR 审查 SWE-bench 通过的 PR 能否真正合并——这些"独立验证"之所以必要,正是因为推理系统自身的边界识别能力,从 1977 年到 2026 年,一直没有真正解决。
四、统一的根诊断
三个病灶看似不同,但共享同一个根:
它们都试图用显式的、手工编码(或手工编排)的知识增量,去覆盖一个开放世界。而开放世界的状态空间随规模超线性增长,永远比你能写下来的知识跑得更快。
组合爆炸是这个宿命在数学上的面孔:知识条目两两交互,O(N²)。知识获取瓶颈是它在认识论上的面孔:隐性知识无法被穷尽地显式化。脆弱性是它在认知上的面孔:系统无法识别自己知识的边界。三个面孔,同一个根——开放世界是无限的,显式知识是有限的,有限追不上无限。换什么容器都一样:规则、特征、prompt、记忆条目,统统改变不了这件事。
这也解释了为什么第十章的答案不是"消灭"这些病灶(做不到),而是降级——把它们从灾难性坍塌降级为可控的工程问题。状态管理让组合爆炸可追踪;知识演化让已编码的知识可被维护;独立验证能抓住那些靠记忆伪装出来的隐性失效。三根支柱不消灭宿命,但它们让你能和宿命共存。
四十年前,费根鲍姆看到了这个宿命并给它命了名。四十年后,我们有了比他更好的工具来和它周旋——但周旋,不是战胜。
附:如何亲手验证
本附录的全部论断都可通过复现脚本验证:
cd 06-复现实验
python reproduction.py
| 附录论断 | 对应复现步骤 | 观察什么 |
|---|---|---|
| 组合爆炸 O(N²) | 步骤 1→2→3 的冲突增长曲线 | 规则 4 倍增长,冲突 68 倍 |
| 规则冲突 | 冲突矩阵 13×13 | ✗ 的分布 |
| 脆弱性(专家系统版) | 步骤 4 脆弱性测试 | 边界外输入仍给出诊断 |
| Prompt 爆炸 | 第二幕 Agent G vs D 对照 | token 差异 4.4 倍 |
| 脆弱性(Agent 版) | 第四章 Agent 实验 | 二茂铁案例中工具校验被绕过 |
运行脚本时,你亲手加的每一条规则,就是 1978 年麦克德莫特在 DEC 办公室里做的事。你亲眼看到的每一次冲突爆炸,就是 XCON 维护团队在 1988 年经历的事。四十年压缩进一个命令行。
(本附录是全书论证的"为什么"层。它不引入新史料,而是对已有论证做结构性深度解释。全部论断配有可运行代码验证。)