[Agent 考古] 600 条规则,一个反向推理引擎——专家系统的顶峰是怎么建成又怎么暴露边界的

Blog

系列名称[Agent 考古] 符号单体时代:第一组织形式的确立与反叛

篇号:第 8 篇 / 共 13 篇 主题分类:历史记述 前置阅读ELIZA 1966 · STRIPS 1971 阅读时间:约 12 分钟


1970 年代初,Stanford University 的医学与计算机科学交叉研究团队面临一个实际问题:感染性疾病的诊断需要大量专业知识——细菌类型、革兰氏染色、形态、需氧性、药物敏感性——而这些知识在一般医生中并不普及。Edward Shortliffe,一位同时拥有医学博士和计算机科学背景的研究者,将这两条线交汇于 MYCIN shortliffe1976

600 条规则,一个反向推理引擎,加上一套确定性因子计算框架——这就是 MYCIN 的全部。它能在菌血症这个医学子域中给出可追溯的诊断和治疗建议,其诊断准确率达到了与感染病专科医生相当的水平。然而,正是这个被视为专家系统顶峰的项目,最清晰地暴露了符号主义范式的边界:规则数量增长带来的知识获取瓶颈、规则间交互的不可预测性,以及”选择哪些规则适用于当前患者”这一前提选择难题。

本篇将拆解 MYCIN 的技术构造——从规则结构到确定性因子,从反向链推理到上下文树——并探讨它为何在登上顶峰的同时,也为符号主义的衰落埋下了伏笔。


从 DENDRAL 到 MYCIN——启发式规则的谱系延续

MYCIN 不是凭空出现的。它的前身是 DENDRAL——Stanford 的第一个专家系统,用于从质谱数据推断分子结构。DENDRAL 确立了”知识工程”的基本范式:将专家的知识编码为规则,让计算机按规则推理。MYCIN 将这一范式从化学结构推断转移到医学诊断 buchanan-shortliffe1984

1980 年,William van Melle 将 MYCIN 的规则引擎从医学知识库中分离出来,形成了 EMYCIN(Essential MYCIN)——一个通用的规则系统外壳 vanmelle1980。EMYCIN 证明了 MYCIN 的架构不限于医学诊断——任何领域只要有可编码的规则,就能用 EMYCIN 构建专家系统。这是”陈述句告知”范式的一次规模化尝试。

MYCIN 的意义在于,它第一次在高风险的医学领域证明了符号规则系统的实用价值。医生可以通过自然语言问答与系统交互,系统会给出诊断结论、置信度以及完整的推理链条。这种可解释性是 MYCIN 获得医生信任的关键,也是它与后来黑箱式 AI 系统最本质的区别。


MYCIN 系统的整体架构——上下文树、规则库与推理引擎的协作

MYCIN 的系统架构由四个核心部分组成:上下文树、规则库、反向链推理引擎和用户交互接口。推理在上下文树的节点上进行——先确定患者有哪些培养物,再确定每个培养物中有哪些病原体,最后对每个病原体推断其身份。

患者 (PATIENT)
└── 培养物 (CULTURE)
      └── 病原体 (ORGANISM)
          ├── 革兰氏染色
          ├── 形态
          ├── 需氧性
          └── ...

这种层级结构确保了推理的有序性——系统不会在确定培养物之前就去推断病原体身份。上下文树既是知识的组织结构,也是推理的控制结构。


规则的基本形态——IF 前提 THEN 结论 WITH 置信度

MYCIN 的知识以规则的形式存储,每条规则遵循统一的三段式结构:前提、结论、置信度。Shortliffe 从感染病专家那里获取知识,然后将每一条临床经验转化为一条形式化的规则 shortliffe1976

RULE 050
IF (1) the gram stain of the organism is gramneg
  (2) the morphology of the organism is rod
  (3) the aerobicity of the organism is aerobic
THEN there is suggestive evidence (0.8) that
    the identity of the organism is enterobacteriaceae

在我们的 Python 复现中,Rule 类精确地映射了这一结构。每条规则包含一个唯一标识符、一组前提条件(键值对列表)、一个结论(属性-值元组)和一个置信度数值。

# 摘自 mycin/rule.py —— Rule 类定义
class Rule:
   def __init__(self, rule_id: str, premises: list, conclusion: tuple, cf: float):
       self.rule_id = rule_id       # 规则编号,如 "RULE_050"
       self.premises = premises     # 前提列表,如 [("gram_stain", "gramneg"), ...]
       self.conclusion = conclusion # 结论,如 ("identity", "enterobacteriaceae")
       self.cf = cf                 # 规则置信度,如 0.8

   def evaluate_premises(self, facts: dict):
       """检查所有前提是否满足,返回 (是否满足, 各前提详情)"""
       results = []
       all_satisfied = True
       for attr, expected in self.premises:
           if attr not in facts:
               results.append((attr, expected, None, 0.0))
               all_satisfied = False
           else:
               actual, cf = facts[attr]
               match = (actual == expected)
               results.append((attr, expected, actual, cf))
               if not match:
                   all_satisfied = False
       return all_satisfied, results

规则库中的一条示例规则——RULE_050,对应原文中那条经典的肠杆菌科诊断规则:

# 摘自 mycin/knowledge_base.py —— 示例规则
Rule("RULE_050",
    [("gram_stain", "gramneg"),    # 革兰氏染色阴性
    ("morphology", "rod"),        # 形态为杆状
    ("aerobicity", "aerobic")],   # 需氧性为需氧
    ("identity", "enterobacteriaceae"),  # 结论:肠杆菌科
    0.8)                           # 置信度 0.8

这个数据结构的简洁性正是 MYCIN 的力量所在——每一条医学知识都被拆解为相同的格式,使得通用推理引擎可以不加修改地应用于所有规则。


确定性因子——为什么医生不用概率

MYCIN 最独特的设计是确定性因子(Certainty Factor,简称 CF)。CF 不是概率,它不满足概率公理,而是 Shortliffe 为医学诊断场景量身定制的不确定性表示方法 shortliffe-buchanan1975

CF 的定义基于两个独立的度量:

CF[h, e] = MB[h, e] - MD[h, e]

其中 MB(Measure of Belief)是证据 e 对假设 h 的支持程度,MD(Measure of Disbelief)是证据 e 对假设 h 的反对程度。两者独立计算,意味着系统可以”既支持又反对”同一个假设——这在概率论中是不可能的,但在临床思维中却很常见。

CF 的计算包含三个核心操作,都在 cf_engine.py 中实现:

# 摘自 mycin/cf_engine.py —— CF 计算核心函数
class CFEngine:

   @staticmethod
   def combine_premises(premise_cfs: list) -> float:
       """前提组合:取最弱链(min)"""
       if not premise_cfs:
           return 0.0
       return min(premise_cfs)

   @staticmethod
   def propagate(rule_cf: float, premise_cf: float) -> float:
       """规则传播:结论 CF = 规则 CF × 前提 CF"""
       return rule_cf * premise_cf

   @staticmethod
   def combine_conclusions(cf1: float, cf2: float) -> float:
       """多规则合并:CF1 + CF2 × (1 - |CF1|)"""
       if cf1 >= 0 and cf2 >= 0:
           return cf1 + cf2 * (1 - cf1)
       elif cf1 < 0 and cf2 < 0:
           return cf1 + cf2 * (1 + abs(cf1))
       else:
           return (cf1 + cf2) / (1 - min(abs(cf1), abs(cf2)))

用一个具体的数值例子来说明。假设患者 A 的检测结果全部确定(各前提 CF = 1.0),有两条规则都指向肠杆菌科:

  • RULE_050:CF = 0.8(革兰氏阴性 + 杆状 + 需氧)
  • RULE_045:CF = 0.9(革兰氏阴性 + 杆状 + 需氧 + 尿液来源)

第一步,前提组合。RULE_050 有三个前提,CF 分别为 1.0、1.0、1.0,取 min 得前提 CF = 1.0。

第二步,规则传播。RULE_050 的结论 CF = 0.8 × 1.0 = 0.8。

第三步,多规则合并。两条规则都支持同一结论:

  • 合并 CF = 0.8 + 0.9 × (1 – 0.8) = 0.8 + 0.18 = 0.98

最终诊断:enterobacteriaceae,CF = 0.98。

这个结果来自我们的复现实验——患者 A 的实际诊断 CF 就是 0.98,与计算完全一致。

Shortliffe 选择 CF 而非贝叶斯概率有四个核心理由 shortliffe-buchanan1975。第一,医生的不确定性不是概率性的——医生说”很可能是”时,并不等于 P=0.7,这个数字没有精确的统计学含义。第二,贝叶斯推理需要先验概率,而在很多临床场景中先验概率不可用或难以估计。第三,CF 允许信任与不信任同时存在——MB 和 MD 独立计算,更符合医生”证据有好有坏”的思维方式。第四,CF 的可解释性更强——医生可以理解 CF=0.8 的含义,但难以理解 P=0.73 的精确统计学意义。

CF 与贝叶斯的真正差异不在结论合并,而在前提组合。CF 取最弱链(min),概率取乘法。当两个前提的 CF 都是 0.5 时,CF 框架下前提组合 CF = 0.5,而概率论下联合概率 = 0.25——差异高达 0.25。这意味着 MYCIN 系统性地高估了多前提规则的可信度,但 Shortliffe 认为这种”高估”恰恰更接近医生的实际判断方式。


反向链推理——从假设追溯到证据的递归过程

MYCIN 的推理方向是反向链(backward chaining):从一个假设出发,倒过来寻找支持这个假设的证据。这与 Logic Theorist 的分离法结构同构——LT 从目标 C 出发,找 A⊃C,证 A;MYCIN 从假设 H 出发,找规则 R(H),查 R 的前提。

反向链的核心循环在 backward_chain.pydiagnose 方法中实现。它遍历所有规则,找出结论匹配目标属性的那些,逐一检查前提,计算置信度,最后合并结果。

# 摘自 mycin/backward_chain.py —— 反向链核心循环
class BackwardChainer:
def diagnose(self, facts: dict, target_attr: str = "identity") -> dict:
conclusions = {}

# 第一步:遍历所有规则,找出结论匹配目标属性的规则
for rule in self.rules:
attr, val = rule.conclusion
if attr != target_attr:
continue

# 第二步:检查规则的所有前提是否满足
satisfied, premise_results = rule.evaluate_premises(facts)
if not satisfied:
continue

# 第三步:计算前提组合 CF → 传播 → 积累
premise_cfs = [cf for _, _, _, cf in premise_results]
combined_premise_cf = CFEngine.combine_premises(premise_cfs)
conclusion_cf = CFEngine.propagate(rule.cf, combined_premise_cf)

if val not in conclusions:
conclusions[val] = []
conclusions[val].append((rule.rule_id, conclusion_cf))

# 第四步:合并多条规则的 CF,得出最终结论
final = {}
for val, rule_results in conclusions.items():
cfs = [cf for _, cf in rule_results]
combined_cf = CFEngine.combine_multiple(cfs)
final[val] = {'cf': combined_cf, 'rules': rule_results}

return final

这个过程的关键特征是”假设驱动”——系统不是盲目地从事实出发推导所有可能的结论,而是从一个具体的诊断假设出发,有目的地寻找支持或反对该假设的证据。当某个前提未知时,系统会精准地向用户提问,而不是问一堆无关的问题。这就是 MYCIN 交互体验自然流畅的原因。

完整的反向链推理树呈现出”目标 → 规则 → 前提 → 事实”的层级结构。以患者 A 的诊断为例:

每一步都可追溯,每一个数字都有来源——这就是 MYCIN 可解释性的来源。


600 条规则的代价——知识获取瓶颈与规则爆炸

MYCIN 的规则库包含约 600 条规则,覆盖了”菌血症”这一个医学子域 shortliffe1976。600 条听起来不多,但每一条规则都需要经历从专家访谈、知识提炼、形式化编码到验证调试的完整流程。这不是编程问题,而是知识工程问题。

规则爆炸体现在三个层面。第一是知识获取瓶颈——每条规则需要专家手动编码,专家的时间昂贵,编码过程缓慢,而且专家往往无法准确表达自己的推理过程——”直觉”和”经验”难以形式化为规则。第二是规则间交互不可预测——新增规则可能破坏已有推理。如果规则 A 推出”organism 是 X”(CF=0.8),新增规则 B 推出”organism 是 Y”(CF=0.7),系统需要判断 X 和 Y 是否互斥——这在 CF 框架中没有自动机制处理。第三是规模化困难——600 条规则覆盖一个子域,扩展到其他感染类型需要数千条规则,而规则数量的增长与维护复杂度的增长不是线性关系。

这正是 Bar-Hillel 1958 年的批评在医学诊断中的体现。Bar-Hillel 说”前提选择比演绎难 10^10 个数量级”——演绎不难,难的是在海量前提中找到与当前问题相关的那几条。MYCIN 的规则爆炸把这个问题具体化了:CF 计算和反向链是简单算法(演绎不难),但在 600 条规则中选择哪些适用于当前患者才是真正的瓶颈(前提选择困难)。

换句话说,”规则选择”就是”前提选择”的工程化版本。演绎引擎可以机械地执行,但哪些规则应该被激活、哪些前提应该被检查、在什么上下文中应用什么知识——这些才是知识工程真正困难的地方。600 条规则覆盖一个子域已经需要一个团队数年的努力,那么覆盖整个医学呢?这个问题的答案,就是专家系统运动盛极而衰的开始。


MYCIN 与 LLM Agent 的 BDI 坐标对照

从 BDI 坐标的角度对比 MYCIN 与当代 LLM Agent,可以清晰地看到两条路线的分野:

维度MYCIN 1976LLM Agent 2026
信念600 条显式规则参数中的统计分布
愿望诊断感染(固定目标)用户指令(动态目标)
意图反向链推理树ReAct 循环的 action 序列
置信度CF(确定性因子)logprob / temperature
可解释性高(规则链可追溯)低(注意力权重不可读)
知识获取专家手动编码训练数据自动学习
边界规则爆炸幻觉 + 不可解释

这种对比揭示了一个耐人寻味的”新词”现象——当代 AI 中的很多概念,其实在 MYCIN 时代就有了对应的原型,只是换了包装。

当代术语MYCIN 原型工程封装差异
“RAG”MYCIN 规则库向量检索 vs 显式规则
“confidence score”MYCIN CFlogprob vs 确定性因子
“chain-of-thought”MYCIN 反向链注意力机制 vs 显式推理
“task decomposition”MYCIN 上下文树LLM prompt vs 显式树

MYCIN 的 RAG 是精确的——你知道检索到了哪条规则,规则的置信度由专家评估。LLM 的 RAG 是近似的——向量相似度高不等于可信度高,一个文本相似但内容错误的文档可能被错误地检索到。

MYCIN 的 chain-of-thought 是可验证的——每一步推理都对应一条具体的规则,你可以检查规则的正确性。LLM 的 chain-of-thought 是生成的——它”看起来”在推理,但每一步的正确性没有外部保证。


可解释性的代价——从 MYCIN 到 LLM 是进步还是退步

MYCIN 最大的优势——也是 LLM 最大的劣势——是可解释性。MYCIN 的推理链完全可追溯:

诊断: enterobacteriaceae (CF=0.98)
← RULE_050 (CF=0.8): gramneg ∧ rod ∧ aerobic
← RULE_045 (CF=0.9): gramneg ∧ rod ∧ aerobic ∧ site=urine
← 患者数据: gram=gramneg, morph=rod, aero=aerobic, site=urine

LLM 无法提供这样的推理链——它的”推理”是注意力机制在参数空间中的统计匹配,不可读、不可追溯。当 LLM 说”可能是肠杆菌科感染”时,你不知道它是基于什么知识得出的结论,也无法验证它的推理是否正确。

在医疗、法律等高风险领域,可解释性不是可选的——这是 MYCIN 留给当代 AI 的最重要遗产。我们用 LLM 换来了规模和通用性,但失去了可解释性和确定性。从 600 条可追溯的规则到 1750 亿个不可读的参数,这究竟是进步还是退步,答案取决于你站在什么立场上。

MYCIN 是 McCarthy “陈述句告知”范式的极致——600 条规则 + CF 推理引擎 + 反向链推理,构成了一个完整的、可解释的、可运行的专家系统。它与 Advice Taker 一脉相承:从 17 条前提扩展到 600 条规则,从行动规划扩展到医学诊断,从设想变为完整系统。

但 MYCIN 也暴露了第一组织形式的本质局限:规则爆炸。600 条规则覆盖一个子域,扩展到更广域需要更多规则,规则间交互不可预测,知识获取瓶颈无法突破。这与 STRIPS 的框架问题、ELIZA 的行为判据不可靠,共同构成了符号主义第一组织形式的三个本质局限。


参考文献

[shortliffe1976]  Shortliffe, E. H. et al. (1976). “MYCIN: A Computer-Based Interpreting and Consulting System for Infectious Disease.” Proc. AMIA.

[shortliffe-buchanan1975]  Shortliffe, E. H. & Buchanan, B. G. (1975). “A Model of Inexact Reasoning in Medicine.” Mathematical Biosciences, 23, 351-379.

[buchanan-shortliffe1984]  Buchanan, B. G. & Shortliffe, E. H. (1984). Rule-Based Expert Systems: The MYCIN Experiments of the Stanford Heuristic Programming Project. Addison-Wesley. ISBN 9780201101725.

[vanmelle1980]  van Melle, W. (1980). “The EMYCIN Primer.” Stanford Computer Science Department Report STAN-CS-80-820.


系列文章

Agent 考古 符号单体时代 系列文章关键词
导读:符号单体时代:第一组织形式的确立与反叛
Logic Theorist:符号搜索的第一台证明机器手段-目的分析、状态空间搜索、定理证明
McCarthy Advice Taker:陈述句革命的最早蓝图陈述句告知、推理-行动闭环、属性表装配
STRIPS:状态空间规划的成熟与框架问题算子三元组、世界模型增量、帧问题解法
ELIZA:最小智能体的基线与错觉正则模式匹配、聊天机器人、智能判定陷阱
MYCIN:规则范式的顶峰与边界置信度推理、专家系统、规则脆性
导读:三条反叛伏线汇论:语言接口·社会涌现·具身学习
Minsky 心智社会:单体结构的内部否定单动因谬误、机构协作、K 线记忆、审查器
Brooks 包容架构:感知-行动耦合的工程反叛分层包容、抑制/禁止仲裁、无中央模型
Brooks 无表征智能:物理接地假设的哲学宣言无表征智能、四关键概念、学习四分类
回顾:Bar-Hillel 式批评:意义、翻译与框架问题翻译全自动悖论、意义消解、框架问题跨代回响
终章:自知、自觉、自止——终章定论历史辩证法、组织演化层积观、回到当下

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注