ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

常识形式化:从McCarthy逻辑到现代AI推理实践

常识形式化:从McCarthy逻辑到现代AI推理实践 在很长一段时间里人们普遍认为“人工智能”的核心就是“让机器像人一样思考”。但在具体实现时最难的不是写一个会下棋的程序也不是让模型识别一张图片而是让机器理解那些人类从小到大不自觉掌握的“常识”。例如杯子掉在地上会碎、人走进房间通常会关门、鸟会飞但企鹅不会。这些话语对人类来说不需要解释但对机器来说却是巨大的挑战。John McCarthy 是人工智能领域的奠基人之一也是“人工智能”这个术语的提出者。他在上世纪五六十年代就提出如果想让机器具备真正的智能就必须把人类的常识形式化并用逻辑语言表达出来。这个方向后来被称为“常识形式化”Formalizing Common Sense。虽然过去几十年里深度学习在感知任务上取得了巨大成功但常识推理仍然是 AI 最难跨越的障碍。重新审视 McCarthy 的思路不仅能帮助我们理解 AI 的历史也能为今天的知识表示、规则引擎、大模型推理能力设计提供重要参考。本文将围绕以下内容展开什么是常识形式化为什么它如此困难McCarthy 使用的核心逻辑工具谓词逻辑、情景演算、非单调逻辑这些思想如何映射到现代 AI 工程中使用 Prolog 动手实现一个简单的常识推理示例常见误区和工程化建议。无论你是刚接触 AI 的新手还是正在做知识图谱、规则引擎的后端工程师相信这篇文章都能给你带来新的启发。1. 背景与核心概念1.1 什么是“常识形式化”“常识”指的是那些大多数人在日常生活中默认知道、并且无需专门学习就能使用的事实和规则。比如液体在常温下会流动动物通常需要进食一个物体的位置不会瞬间消失人如果把手放进火里会被烧伤。这些知识看起来零散但人类在交流和决策时无时无刻不在使用它们。McCarthy 在 1959 年的论文《Programs with Common Sense》里提出一个著名的思想实验一个称为“咨询系统”Advice Taker的程序可以通过逻辑公式来描述它所处的环境并通过推理来决定如何行动。这个程序不需要把所有情况都写死而是借助逻辑推导来回答“如果我做 X会发生什么”这类问题。简单来说常识形式化就是把人类日常生活中默认成立的规则、事实和推理方式用形式化语言尤其是逻辑语言表达出来让计算机能够存储、推导和运用这些知识。这里的关键词是“形式化”。它不是写一段自然语言描述而是用严格的语法、谓词、变量、量词来表示知识。只有形式化之后机器才能进行可靠的自动推理。1.2 为什么“形式化常识”如此困难直觉上我们可能会觉得常识不就是“全世界都知道的那点事”吗但真正动手让机器掌握常识时会遇到几个非常棘手的问题。第一常识是模糊的。“高”“矮”“快”“慢”“大”“小”都是相对概念。到底多高算高在哪个场景下算高机器很难用固定阈值来表达。第二常识充满默认值。我们通常会说“鸟会飞”但也会接受“企鹅不会飞”“受伤的鸟不会飞”“被关在笼子里的鸟不会飞”。这说明常识规则不是绝对的而是带着默认条件。机器需要一种机制来处理“一般情况成立特殊情况例外”的推理。第三常识是开放式的。现实世界几乎不存在封闭的规则集。你永远可以给一个动作增加新的前置条件。比如“用手拿起杯子”需要考虑杯子是不是太烫、杯子是不是被胶水粘住、手是不是受伤……这就是 McCarthy 强调的“资格问题”qualification problem。这些困难让“常识形式化”成为一个看起来简单、实际上极其复杂的课题。也正因如此McCarthy 提出的诸多逻辑工具至今仍然是知识表示与推理研究的重要基础。1.3 符号主义与连接主义的百年之争在 AI 的发展历史中主要存在两大技术路线符号主义Symbolicism认为智能可以表示为符号和规则推理过程就是对符号的操作。代表方向是专家系统、知识表示、自动定理证明。连接主义Connectionism认为智能来自大量简单单元的连接和权值调整也就是神经网络。代表方向是深度学习和现代大模型。McCarthy 是符号主义最坚定的代表人物之一。他相信尽管统计学习可以在感知层面表现出色但真正的智能一定离不开某种形式的逻辑推理。他说过一句广为流传的话“When a system can’t handle a problem, don’t add more data, add more logic.”这句话放到今天看依然能在“大模型幻觉”“常识推理弱”等现实问题中找到共鸣。2. McCarthy 的核心技术逻辑工具与理论McCarthy 的常识形式化思想并不是一句口号而是一套可以用在具体系统中的技术体系。下面我们拆解他最核心的几项贡献。2.1 用一阶谓词逻辑表达世界McCarthy 认为一阶谓词逻辑First-Order Logic, FOL是表达常识的自然语言。它的基本组成包括个体表示世界上的对象比如张三、桌子、苹果谓词表示个体之间的关系或属性比如IsPerson(张三)、IsOn(苹果, 桌子)函数表示从个体到个体的映射比如Father(张三)量词全称量词∀对所有和存在量词∃存在。举个例子常识“所有苹果都是水果”可以写成∀x (IsApple(x) → IsFruit(x))翻译成自然语言就是对于任意对象 x如果 x 是苹果那么 x 是水果。这种表达方式对人类来说不算直观但它的优点是严格、无歧义并且可以被计算机执行推理。McCarthy 在 1958 年提出 Advice Taker 时就设想让系统基于这样一套逻辑公式自动推导出新的事实。在工程实践中一阶谓词逻辑并不直接用于大规模系统因为它的自动推理复杂度很高。但它为后面的知识图谱本体设计、描述逻辑Description Logic、语义网技术栈提供了理论基础。2.2 情景演算让逻辑能够表达动作和变化仅靠静态谓词无法表达“动作会发生什么”。McCarthy 和 Patrick Hayes 在 1969 年提出“情景演算”Situation Calculus专门用来描述动作、状态和变化。情景演算的核心概念是情景Situation世界在某一时刻的完整状态动作Action改变状态的事件结果函数do(Action, Situation)表示在某个情景下执行某个动作后得到的新情景。一个经典的例子是积木世界Blocks World。我们用谓词On(x, y, s)表示“在情景 s 中积木 x 在积木 y 上”。如果执行动作Move(x, y)那么新的情景 s 中可以推出On(x, y, s)。这种表示的意义在于它让机器不仅能描述“现在是什么”还能回答“如果我做了某件事接下来会变成什么”。这正是 AI 规划Planning问题的理论基础。后来出现的经典规划器 STRIPS、PDDL 语言都和情景演算的思想一脉相承。即使今天的机器人系统也仍然需要这类“动作-状态-效果”的建模方式。2.3 非单调逻辑与“默认规则”常识推理里最典型的特征是“默认成立允许例外”。经典逻辑是单调的如果从前提 A 能推出结论 B那么增加任何新前提 A 后B 依然成立。但现实世界的常识不是这样。已知“鸟会飞”然后又知道“企鹅是鸟”“企鹅不会飞”此时关于“鸟会飞”的结论就不再成立。这种推理被称为“非单调推理”Nonmonotonic Reasoning。McCarthy 在 1980 年提出了一种重要的非单调逻辑技术circumscription中文有时译作“限定推理”或“优先推理”。其核心思想是在满足已知事实的前提下尽可能限制“异常谓词”的范围。用大白话说除非有证据表明某个个体是异常的否则我们就认为它正常并按默认规则推理。比如规则“鸟会飞”可以表达成∀x (Bird(x) ∧ ¬Abnormal(x) → Flies(x))系统默认Abnormal(x)为假。直到某个个体满足额外的异常条件比如Penguin(x) → Abnormal(x)系统才会放弃“它会飞”这个结论。这种“默认规则 异常条件”的模式在知识工程中非常重要。你可以在规则引擎、专家系统中看到大量类似设计规则正常生效但允许被特定条件覆盖。2.4 从常识形式化到“可容忍系统”到了 90 年代McCarthy 进一步意识到一个完全严格的常识形式化系统在实际应用中会遇到巨大困难。因为现实世界充满冲突信息、例外情况和未预期事件。他提出“可容忍系统”Tolerant System的概念认为系统不应该因为某条信息无法形式化或与已有知识冲突就全面崩溃系统应该具备“近似正确”的能力在大多数情况下工作而不是追求绝对完备系统需要在“推理成本”和“表达充分性”之间取得平衡。这个思想如今看来非常超前。它几乎预见了现代推荐系统、搜索引擎、大型语言模型所面对的现实数据不干净、知识不完整、情况永远在变但系统仍然必须给出合理输出。3. 从 McCarthy 到现代 AI常识推理还有多远3.1 深度学习真的学会常识了吗近年来大规模语言模型Large Language Model, LLM在对话、写作、代码生成等任务上表现惊艳。很多人会问这些模型是不是已经掌握了常识答案是部分掌握但不可靠。模型能从海量文本中学到统计规律比如“杯子通常放在桌子上”“下雨通常会带伞”。但它的本质是“基于上下文预测下一个词”而不是真正的推演。当问题涉及多步推理、反事实推理、物理常识时模型很容易给出看似合理但实际错误的答案也就是“幻觉”。为什么会出现这种情况因为深度学习擅长“归纳模式”却不擅长“演绎推理”。而 McCarthy 所追求的常识形式化核心目标就是让系统具备可验证的演绎能力。3.2 逻辑形式化可以给现代 AI 带来什么尽管逻辑方法在过去几十年经历了低谷但随着大模型的发展人们开始重新关注符号逻辑的价值可解释性逻辑推理的过程可以被追溯和验证。在医疗、金融等强监管领域这是刚需。约束能力用逻辑规则约束模型输出可以减少幻觉。知识增强把知识图谱中的实体关系以谓词形式输入模型可以提升事实准确性。反事实推理逻辑系统天然支持“如果当时……会怎样”的反事实推理而深度模型很难做到。换句话说McCarthy 当年的思想并不是被抛弃了而是等待一个合适的时机和合适的载体重新登场。今天的“神经符号 AI”Neuro-Symbolic AI就是这种融合的尝试。4. 动手实践用 Prolog 模拟一个常识推理系统为了让你更直观地理解常识形式化我们用一个真实的逻辑编程语言 Prolog 来写一个小系统。Prolog 是一种基于一阶谓词逻辑的声明式语言非常适合表达规则和事实。4.1 环境准备本文示例使用 SWI-Prolog它是一款成熟的开源 Prolog 实现支持 Windows、Linux、macOS。你可以到官网下载对应安装包也可以使用包管理器安装。在 Ubuntu 上可以使用 aptsudo apt update sudo apt install swi-prolog在 macOS 上如果安装了 Homebrewbrew install swi-prolog安装完成后在命令行输入swipl如果进入?-提示符说明安装成功。注意这里不限定具体版本SWI-Prolog 近几个大版本对本文示例的语法支持没有差异。你可以使用当前官方稳定版本。4.2 项目结构我们创建一个简单的项目目录common-sense/ ├── birds.pl # 鸟与飞行的默认规则 └── blocks.pl # 积木世界的情景演算简化版4.3 示例一用默认规则处理例外先看一个经典例子鸟会飞但企鹅例外。创建birds.pl% 事实哪些个体是鸟 bird(tweety). bird(polly). bird(robin). bird(chicken). % 事实哪些个体是企鹅 penguin(polly). % 事实哪些个体受伤 injured(chicken). % 规则异常个体 abnormal(X) :- penguin(X). abnormal(X) :- injured(X). % 规则默认情况下鸟会飞 flies(X) :- bird(X), \ abnormal(X).这段代码的核心是flies(X) :- bird(X), \ abnormal(X).翻译成自然语言就是如果 X 是鸟并且 X 不是异常的那么 X 会飞。其中\是 Prolog 的“否定即失败”Negation as Failure操作符。它表示如果无法证明 X 是异常的那么 X 就不是异常的。这正是非单调推理的体现——默认正常直到有证据表明异常。下面在 SWI-Prolog 中运行swipl ?- [birds]. true. ?- flies(tweety). true. ?- flies(polly). false. ?- flies(robin). true. ?- flies(chicken). false.结果完全符合常识tweety 会飞polly 是企鹅不会飞chicken 因为受伤也变成了例外。这个小例子直观展示了 McCarthy 所说的“默认规则 异常条件”的推理方式。4.4 示例二情景演算的思想实验接下来看一个简化版的情景演算描述移动积木的动作。创建blocks.pl% 谓词 on(X, Y, S) 表示在情景 S 中积木 X 在积木 Y 上 % 谓词 clear(X, S) 表示在情景 S 中积木 X 的上面是空的 % 初始情景s0 on(a, b, s0). on(b, table, s0). clear(a, s0). clear(c, s0). % 动作效果如果 X 上面是空的Y 上面是空的执行移动后 X 就在 Y 上 % 这是一个简化模型不考虑积木堆叠的限制 move(X, Y, S, S2) :- clear(X, S), clear(Y, S), S2 do(move(X, Y), S). % 查询从 s0 出发能否把 a 移动到 c 上 % 我们需要执行动作后得到新情景 S2并检查 on(a, c, S2) can_move_a_to_c :- on(a, b, s0), clear(a, s0), clear(c, s0), S2 do(move(a, c), s0), on(a, c, S2).在这个简化模型中on(X, Y, S)的“更新”并不是通过逻辑推导自动完成的而是通过构造新情景do(move(a, c), s0)来显式表示。这是情景演算最核心的思想动作会生成一个新情景新情景里包含新的事实。实际上完整的情景演算还需要处理“框架问题”frame problem——也就是动作之后哪些事实保持不变。比如移动 a 之后b 仍然在 table 上c 的位置没有变化。这个问题在复杂系统中非常棘手也是 McCarthy 深入研究过的课题。Prolog 中可以用“框架公理”来显式描述不变性% 如果动作 A 不涉及 Y 和 Z那么 on(Y, Z, S) 在动作发生后仍然成立 holds(on(Y, Z), Result) :- Result do(A, S), A \ move(Y, _), A \ move(_, Z), holds(on(Y, Z), S). holds(clear(Y), Result) :- Result do(move(X, Z), S), Y \ X, Y \ Z, holds(clear(Y), S).这里用holds谓词表示一个事实在某个情景中成立。虽然代码比前面的例子复杂一些但它体现了一个重要原则在动态环境中不仅要描述动作的效果还要描述“哪些东西没有变”。这正是现实世界中常识推理最需要注意的部分。5. 常见误读与排查思路在学习和尝试常识形式化时很多人会走入以下几个误区。我把它们整理成了一张排查表。误读/问题现象可能原因解决思路把“常识形式化”理解为“把常识写成 if-else”混淆了规则列表与逻辑推理if-else 是程序控制流逻辑推理是事实与规则自动推导结果写出的 Prolog 规则在查询时结果不一致规则顺序、否定条件、变量未实例化检查\位置尽量先实例化变量再取反在真实项目中尝试建立一个“万能的常识库”低估了常识的开放性和模糊性限定领域建立领域的默认规则和异常条件认为深度学习成功后就不再需要逻辑推理忽略了深度模型缺乏可解释性和反事实能力将逻辑规则用作约束或用于生成可验证的中间结果不清楚“框架问题”的影响没有考虑动作发生后哪些事实保持不变显式建模框架公理或使用事件演算等替代方案5.1 为什么我的 Prolog 查询结果不对一个常见错误是把否定条件写在变量未实例化之前。例如% 错误写法 flies(X) :- \ abnormal(X), bird(X).在 Prolog 中\ abnormal(X)会先尝试证明abnormal(X)此时 X 还未绑定具体值系统会尝试为 X 找到某个“可能是异常”的个体。如果发现了任何异常个体那么这个否定条件会失败导致flies(X)在查询时结果异常。正确写法是把否定放在变量实例化之后% 正确写法 flies(X) :- bird(X), \ abnormal(X).这说明非单调推理对“知识的获取顺序”和“变量的实例化状态”非常敏感。5.2 为什么逻辑推理会爆炸一阶谓词逻辑的自动推理复杂度很高。在工程中一个常见的现象是规则数量一多推理时间急剧上升。解决思路包括限制规则范围避免全称量化导致的组合爆炸使用 Datalog 等受限逻辑语言引入规则引擎优化策略如 RETE 算法仅对高频场景进行规则推理其他场景走统计模型。这实际上也是 McCarthy 后来提出“可容忍系统”的原因之一完美的逻辑推理在现实世界中太昂贵必须允许妥协。6. 最佳实践与工程建议6.1 知识表示要“分层”如果你在项目中尝试使用常识形式化不要试图把整个世界都塞进一个规则库。更合理的做法是分层领域层只表达你所在业务领域的核心概念和关系。通用层表达与领域相关的通用概念如时间、空间、状态、行为。冲突处理层处理规则之间的优先级和异常。例如在一个智能客服系统中层级内容领域层用户、订单、退款、物流通用层时间先后、金额大小、状态流转冲突处理层用户已取消订单后不再允许申请退款6.2 规则之间必须有优先级和例外机制现实世界的常识很少是完全独立的。你设计规则时一定要考虑覆盖和例外。可以使用类似以下模式规则优先级 1. 明确禁止 默认规则 2. 更具体条件 更一般条件 3. 最近更新的事实 较旧的事实在 Prolog 中这种优先级可以通过规则顺序和cut操作符!实现但更工程化的方式是使用带优先级的知识库系统比如 Drools、CLIPS 或自定义的推理引擎。6.3 不要把所有知识都翻译成逻辑在具体实践中有些知识适合用逻辑表示有些则不适合。请参考以下划分适合逻辑表示明确的约束、业务规则、状态流转条件、权限判断。不适合逻辑表示模糊的审美判断、需要海量统计规律的语义相似性、非结构化的感知数据。对于第二类深度学习仍然是最佳工具。真正的做法是“神经符号结合”用神经网络处理感知用逻辑系统处理推理和验证。6.4 加入“反事实”能力McCarthy 的常识推理区别于简单查询的重要一点是它支持反事实推理。你可以问“如果当时没有移动那个积木现在它会在哪里” 在逻辑系统中这只需要改变初始条件并重新推导。而在深度模型中这个问题几乎无法可靠回答。在工程设计中你可以为系统增加“假设场景”维度保存每个关键决策的事实快照允许在某个快照上额外输入新事实重新运行推理并比较结果差异。这在金融风控、合规审核、故障诊断等领域都有很高的价值。6.5 注意安全与授权边界在真实系统中加入逻辑推理和规则引擎时需要格外注意控制系统修改的权限。请遵循以下原则规则变更应在测试环境验证后再发布所有规则和推理结果保留日志方便回溯涉及用户敏感信息的推导必须遵循最小权限原则不要让未经验证的规则直接触发高风险操作比如自动退款、自动封号、删除数据。推理系统的一个特点是“结论会影响决策”。如果规则写错了影响会被自动放大。因此生产环境一定要有规则回归测试集覆盖正常用例和异常用例。7. 总结与学习路线John McCarthy 的“常识形式化”思想虽然在今天的 AI 语境里显得有些“古典”但它所提出的问题——如何让机器理解并运用日常世界的基本知识——依然是人工智能最核心的挑战之一。通过本文你应该已经掌握常识形式化的定义和难点McCarthy 的谓词逻辑、情景演算、非单调逻辑等核心技术逻辑推理与深度学习的定位差异用 Prolog 实现“默认规则 例外处理”的完整过程在工程实践中落地常识推理的常见坑和最佳实践。如果你对这个方向感兴趣下一步可以沿着这些路径深入学习阅读 McCarthy 的经典论文尤其是《Programs with Common Sense》和《Some Philosophical Problems from the Standpoint of Artificial Intelligence》学习 PDDL 语言了解现代 AI 规划是如何继承情景演算思想的研究知识图谱和描述逻辑看看现实世界中的大规模知识是如何组织的研究神经符号 AI 的最新进展尝试把逻辑模块和深度学习模块集成到一个系统中。最后想说的是不要被“逻辑 AI 已经过时”这样的说法误导。真正成熟的工程系统从来不需要在两种技术之间做二选一。理解 McCarthy 的思想不是为了回到过去写符号规则而是为了在深度模型无法给出可靠答案的时候多掌握一种可验证、可解释、可控制的兜底方案。如果你觉得本文对你有帮助可以收藏备用。动手在 SWI-Prolog 里跑一遍示例是理解“常识形式化”最快的方式。
返回列表