[Agent 考古] 别再给机器人装“大脑”了!1986 年的“三无”架构证明:越不思考,活得越久。

Under the Sun with Paddy

系列:[Agent 考古] 符号单体时代:三条反叛伏线

篇号:第 10 篇 / 共 13 篇 主题分类:历史记述 前置阅读:Minsky 心智社会 1986 · STRIPS 1971 阅读时间:约 10 分钟


同一时期两个实验室的路线对峙

1986 年,两支团队在解决同一个问题——让机器人在现实环境中自主导航。SRI 的 Shakey 机器人在建模:感知环境、构建谓词世界模型、在状态空间中搜索规划、逐步执行。这条路线代表了符号主义的正统方法——先理解世界,再决定行动。

MIT AI Lab 的 Rodney Brooks 选择了完全不同的方向。他不构建世界模型,不搜索规划,不维护谓词集。他的机器人通过分层行为优先级仲裁实现自主导航——低层行为(避障)可以抑制高层行为(漫游)的输出,感知直接耦合行动。

这不是两条”等价”路线的平行发展,而是一场根本性的范式对峙。核心问题只有一个:智能是否需要中央世界模型?

为什么鲁棒分层控制在 1986 年成为迫切需求

1980 年代中期,移动机器人面临的核心困难是鲁棒性。传统方法在实际环境中极为脆弱:传感器噪声导致世界模型不准确,不准确的世界模型导致规划失败,规划失败导致机器人停止或碰撞。误差沿着”感知→建模→规划→执行”的流水线逐级放大,最终系统崩溃。

Brooks 的工程直觉是:脆弱的根源是中央世界模型。如果不需要维护一个精确的世界模型,就不存在”模型与现实的偏差”问题。感知直接耦合行动——传感器读数直接驱动行为层,行为层按优先级仲裁输出电机指令。没有”建模”这一步,也就没有”模型不准”这一步。

这个直觉看似反常识,但切中了符号主义路线的痛点。当系统的脆弱性来自中间环节时,最彻底的解决方案不是改进中间环节,而是取消中间环节。

两种分解方式的本质差异

Brooks 1986 年论文的第一图给出了核心对照。传统分解是功能流水线式的——感知、建模、规划、执行,每层是一个功能模块,模块间串行依赖,必须全部建齐才能工作。Subsumption 分解是行为切片式的——避障、漫游、探索,每层是一个完整的控制系统,从感知到行动的完整通路。

传统分解(功能流水线):              Subsumption 分解(行为切片):
┌────┐ ┌────┐ ┌────┐ ┌────┐     ┌─────────┐ ┌─────────┐ ┌─────────┐
│感知 │→│建模 │→│规划 │→│执行 │     │ 避障   │ │ 漫游   │ │ 探索   │
└────┘ └────┘ └────┘ └────┘     │感知→行动│ │感知→行动│ │感知→行动│
                                └────┬────┘ └────┬────┘ └────┬────┘
每层是功能模块                     抑制↑         压制↑
必须全部建齐才能工作               └──────┬──────┘
                                    电机指令
每层是完整控制系统,可独立工作

用更直观的 Mermaid 图来表达这两种分解方式:

功能流水线的思路是”分工协作”——每个模块只做一件事,串联起来完成全部功能。行为切片的思路是”能力分层”——每一层都具备完整的感知-行动能力,高层在低层基础上增加新能力。前者的弱点是一环断裂全链瘫痪,后者的优势是一层失效其他层照常工作。

抑制与禁止——优先级仲裁的接线实现

高层”包容”低层的方式有两种原语:抑制和禁止。抑制是高层替换低层模块的输出线——低层的输出被高层的输出覆盖。禁止是高层阻断送入低层模块的输入线——低层收不到输入,停止输出。

关键设计在于:仲裁由接线固定优先级,不存在运行时中央仲裁器。优先级在硬件接线时确定,运行时不可改变。这与 STRIPS 的”搜索器决定操作顺序”形成鲜明对照:STRIPS 的搜索器是运行时动态决策,subsumption 的仲裁是编译时静态接线。

从代码实现来看,抑制和禁止机制非常简洁——就是两个列表和两轮遍历:

# 摘自 layer.py
class Layer:
   def __init__(self):
       self.layers: List[BehaviorLayer] = []
       self._suppression_links: List[tuple] = []   # 抑制连接
       self._inhibition_links: List[tuple] = []    # 禁止连接

   def add_suppression(self, higher: str, lower: str):
       """高层抑制低层:替换低层输出。"""
       self._suppression_links.append((higher, lower))

   def add_inhibition(self, higher: str, lower: str):
       """高层禁止低层:阻断低层输入。"""
       self._inhibition_links.append((higher, lower))

运行时的仲裁过程也完全是”接线式”的——先让所有层运行,再按抑制/禁止连接表逐层覆盖:

# 摘自 layer.py — run() 方法的仲裁逻辑
def run(self, sensor_data: Dict) -> Optional[Dict]:
   # 第一步:所有层独立运行,各算各的
   results: Dict[str, Optional[Dict]] = {}
   for layer in sorted(self.layers, key=lambda l: l.priority):
       result = layer.run(sensor_data)
       results[layer.name] = result

   # 第二步:应用抑制——高层激活则低层输出作废
   for higher_name, lower_name in self._suppression_links:
       higher = self.get_layer(higher_name)
       lower = self.get_layer(lower_name)
       if higher and lower and results.get(higher_name):
           lower.suppress()
           results[lower_name] = None

   # 第三步:应用禁止——高层激活则阻断低层输入
   for higher_name, lower_name in self._inhibition_links:
       higher = self.get_layer(higher_name)
       lower = self.get_layer(lower_name)
       if higher and lower and results.get(higher_name):
           lower.inhibit()

   # 第四步:选择最高优先级的有效输出
   chosen = None
   for layer in sorted(self.layers, key=lambda l: l.priority):
       if results.get(layer.name):
           chosen = results[layer.name]

   return chosen

用 Mermaid 图来展示层间的抑制/禁止机制:

没有中央仲裁器,没有运行时决策。优先级在接线时就固定了——谁抑制谁、谁禁止谁,全部写在连接表里。这是一种极端的去中心化设计。

每层都是一个完整的感知-行动闭环

Subsumption 的每层不是一个”功能模块”,而是一个完整的控制系统。模块是增广有限状态机,通信通过”线”以固定格式消息异步传递,没有共享总线、没有全局黑板、没有同步点。

这意味着每层可以独立工作。第 0 层(避障)不需要第 1 层(漫游)就能运转——它有自己的感知和行动通路。高层失效时低层照常运转,系统优雅降级。

以下是三层行为模块的代码,每一层都是一个自包含的感知-行动闭环:

# 第 0 层:避障——自带声纳感知和转向行动
class AvoidLayer(BehaviorLayer):
   def __init__(self):
       super().__init__("Avoid", priority=0)

   def process(self, sensor_data: Dict) -> Dict:
       self.activation_count += 1
       front_dist = sensor_data.get("front_distance", 999)
       left_dist = sensor_data.get("left_distance", 999)
       right_dist = sensor_data.get("right_distance", 999)

       if front_dist < 2.0:
           if left_dist > right_dist:
               action = "turn_left"
           else:
               action = "turn_right"
           self.state = "avoiding"
       else:
           action = "forward"
           self.state = "clear"

       return {"layer": "Avoid", "action": action, "priority": 0,
               "state": self.state,
               "distances": {"front": front_dist, "left": left_dist, "right": right_dist}}
# 第 1 层:漫游——自带随机方向选择
class WanderLayer(BehaviorLayer):
   def __init__(self):
       super().__init__("Wander", priority=1)
       self._counter = 0

   def process(self, sensor_data: Dict) -> Dict:
       self.activation_count += 1
       self._counter += 1
       if self._counter % 5 == 0:
           import random
           action = f"turn_{'left' if random.random() > 0.5 else 'right'}"
           self.state = "wandering"
       else:
           action = "forward"
           self.state = "moving"

       return {"layer": "Wander", "action": action, "priority": 1, "state": self.state}
# 第 2 层:探索——自带目标方向计算
class ExploreLayer(BehaviorLayer):
   def __init__(self, target: tuple = (10, 10)):
       super().__init__("Explore", priority=2)
       self.target = target

   def process(self, sensor_data: Dict) -> Dict:
       # 含部分世界模型:探索层直接计算目标方向
       self.activation_count += 1
       robot_pos = sensor_data.get("position", (0, 0))
       dx = self.target[0] - robot_pos[0]
       dy = self.target[1] - robot_pos[1]

       if abs(dx) > abs(dy):
           action = "move_east" if dx > 0 else "move_west"
       else:
           action = "move_north" if dy > 0 else "move_south"

       self.state = "exploring"
       return {"layer": "Explore", "action": action, "priority": 2,
               "state": self.state, "target": self.target}

注意一个细节:ExploreLayer 直接计算目标方向,这意味着它”含部分世界模型”。这与 Brooks 1991 年的自我修正一致——纯反应式架构在探索层已需要某种形式的世界信息。

增量调试——从第 0 层到第 2 层的建造过程

Brooks 的方法论是增量调试:先建第 0 层,调通后加第 1 层,再加第 2 层。每加一层不修改既有层,增量建造,加层即增能力。

第 0 层是声纳避障。机器人检测前方障碍物,转向避开。单独调通,确保最基本的生存能力。

第 1 层是漫游。机器人随机选择方向移动。被第 0 层抑制时,避障优先。漫游层让机器人不再只走直线,而是开始探索环境。

第 2 层是探索。机器人朝目标方向移动。被第 0/1 层抑制时,避障/漫游优先。探索层赋予机器人目标导向能力。

实机验证:杂乱实验室环境中机器人靠第 0+1 层即可长时间漫游不撞。每加一层都是一次能力跃升,而不是对既有系统的重构。这个方法论预示了 Brooks 1991 年正式提出的”增量建造完整系统”原则。

对符号主义三个核心假设的否定

Subsumption 对符号主义的否定不是口号式的,而是工程式的——它在三个具体维度上取消了符号主义的核心假设。

第一个否定针对中央世界模型。STRIPS 的核心假设是智能需要一个中央世界模型——一组显式谓词集来表示环境状态。Brooks 的否定是直接的:不需要世界模型。感知直接耦合行动,不需要中间的”建模”步骤。因为没有世界模型需要维护,所以也不存在框架问题——不需要显式说明”什么变了/什么没变”。

第二个否定针对自上而下规划。STRIPS 的规划是自上而下的:先搜索一个完整的行动序列,然后逐步执行。如果执行中发现规划不适用,需要重新规划。Brooks 的否定是:不需要规划。行为层按优先级仲裁,感知直接驱动行动。没有”先规划后执行”的流水线,只有”感知即行动”的耦合。

第三个否定针对功能分解。传统 AI 的分解方式是按功能:感知模块、建模模块、规划模块、执行模块。这种分解的致命弱点是模块间串行依赖,必须全部建齐才能测试任何一个。Brooks 的替代是按行为/任务分解:避障行为、漫游行为、探索行为。每个行为自带从感知到行动的完整通路,可以独立测试和运行。

需要特别指出的是:1986 年的 subsumption 论文以工程鲁棒性论证的面目出现,而非哲学批判。Brooks 没有在 1986 年提出”无表征智能”的口号——最鲜明的哲学口号出自其 1987-1991 系列论文。1986 年论文的贡献是工程实证:证明感知-行动耦合可以在无中央模型的情况下实现鲁棒控制。

与 Shakey / STRIPS 的正面对照

STRIPS 和 subsumption 面对的是同一个问题——让机器人在环境中自主导航。但两条路线的设计哲学完全不同,我们可以用可视化的方式来对比:

更详细的对比见下表:

维度STRIPS/ShakeyBrooks subsumption
感知用途更新世界模型(谓词集)直接驱动行为层
规划状态空间搜索(前向/逆向)无规划,按优先级仲裁
世界模型显式谓词集(closed-world)
框架问题存在(需维护”什么变了”)不存在(不维护状态)
降级方式规划失败→停止高层失效→低层照常运转
能力边界积木世界等封闭世界有效“非常简单的智能水平”有效
决策时机运行时动态搜索编译时静态接线
计算开销模型更新 + 规划搜索零额外开销

框架问题在 subsumption 中不存在——但回避的方式是取消世界模型。因为没有世界模型需要维护,所以不存在”什么变了/什么没变”的问题。感知直接驱动行动,不需要在行动后更新任何状态。

但这个回避有代价。subsumption 只能在”非常简单的智能水平上”工作。复杂任务是否可以纯反应式完成?这是未解决的开放问题。

优雅降级——高层失效时低层照常运转

优雅降级是 subsumption 最引人注目的工程特性之一。因为每层都是独立的感知-行动闭环,高层失效不会拖累低层。探索层出问题了?漫游和避障还在工作。漫游层出问题了?避障还在工作。

我们的实验数据清晰地展示了这一特性:

优雅降级实验数据

正常模式(三层全开):最终位置 (18.0, 18.0),碰撞 6 次,到达目标

降级模式(探索层失效):最终位置 (35.7, -9.1),碰撞 0 次,漫游+避障仍正常工作

探索层失效后,系统退化为漫游模式——机器人不再朝目标前进,但依然能四处游走且不撞墙。0 次碰撞的数据说明低层行为完全不受高层失效的影响。

这种降级方式与 STRIPS 形成鲜明对比。STRIPS 如果规划失败,整个系统就停住了——因为执行模块依赖规划输出,规划模块依赖世界模型,一环断裂全链瘫痪。Subsumption 的分层设计使得系统能力是”叠加”的而非”串联”的,失去高层只是失去高级能力,而非系统崩溃。

但优雅降级也有另一面。实验数据显示,多层叠加后碰撞率反而上升:避障层单独运行 0 碰撞,叠加漫游层后 1 次碰撞,叠加探索层后 6 次碰撞。这说明层间交互并非简单”叠加功能”——高层行为的目标导向可能与低层避障产生冲突,引入新的碰撞风险。

Bar-Hillel 式批评——反应式控制的本质边界

Subsumption 的局限不是工程缺陷,而是反应式范式的结构性边界。从 Bar-Hillel 式批评的角度看,至少有三个本质性的问题。

第一个边界是反应式控制的有效范围。subsumption 在”非常简单的智能水平上”有效——避障、漫游、探索。但复杂任务呢?医学诊断需要推理链,定理证明需要搜索树,对话需要记忆历史。这些任务能否纯反应式完成?Brooks 本人在 1991 年承认了这个边界——”非常简单的智能水平上”这个限定词本身就是诚实的自我批评。subsumption 回避了复杂推理问题,而不是解决了它。

第二个边界是固定优先级无法运行时调整。subsumption 的仲裁由接线固定——抑制/禁止的优先级在编译时确定,运行时不可改变。这意味着系统无法根据环境动态调整行为优先级。在某些场景下避障应该优先,在另一些场景下探索目标可能更重要——但固定优先级的架构无法做出这种权衡。这比 STRIPS 的操作符模板更不灵活:STRIPS 的搜索器至少能在运行时选择不同操作序列,subsumption 的仲裁是静态的。

第三个边界是学习问题完全未触及。1986 年的 subsumption 论文完全没有触及学习问题——如何自动构造或修改行为模块?所有行为层都由工程师手工设计和接线,系统没有自适应能力。这个问题在 1987 年被 Brooks 明确推迟,直到 1990-91 年才给出学习四分类(且第四类”新行为模块”承认未攻克)。

与当代 Agent 的 BDI 坐标对照

从 BDI(信念-愿望-意图)框架来看,Brooks 1986 的 subsumption 与当代 LLM Agent 呈现出一种有趣的映射关系。两者都不依赖显式的世界模型,但方式和程度不同。

维度Brooks 1986 subsumptionLLM Agent 2026
信念无世界模型,感知直接耦合行动无显式世界模型,参数隐含统计分布
愿望无显式目标,行为层隐含目的system prompt 设定角色
意图无规划,按优先级仲裁的感知-行为偶对ReAct 循环(但无显式规划树)
意图编辑权工程师接线(编译时固定)工程师定义 tool/skill + 用户写 prompt
状态更新无(不维护状态)context window(隐式状态)
降级方式优雅降级(高层失效,低层照常)部分失效产生幻觉(非优雅)
学习无(1986 年未触及)RLHF / fine-tuning

信念维度上,两者都拒绝显式世界模型,但 Brooks 是”完全没有”,LLM 是”参数中隐含统计分布”。愿望维度上,Brooks 的行为层只有隐含的目的,LLM 通过 system prompt 设定显式角色。意图维度上,Brooks 是固定优先级的感知-行为偶对,LLM 是统计选择的 ReAct 循环。

另一个有趣的对照是降级方式。subsumption 的降级是优雅的——高层失效低层照常。LLM 的降级是非优雅的——部分信息丢失后产生幻觉或错误回答。这说明虽然两者都走向了”无显式模型”的方向,但在鲁棒性设计上选择了不同的路径。

与同年 Minsky 的呼应——两条伏线的交叉

Minsky 和 Brooks 在同一年(1986)否定”单体”——但否定的维度不同。Minsky 从认知理论否定:单动因谬误,心智应拆为成百上千个小 agent。Brooks 从工程实证否定:不需要中央世界模型,感知直接耦合行动。

Minsky 拆解”单体大脑”的结构,Brooks 拆解”中央世界模型”的运作机制。两者从不同角度瓦解同一个范式。

但两者的交叉不只是概念相似。Brooks 在 1991 年《无表征智能》中主动引用 Minsky 心智社会作同类解释,这是两条伏线在原文层面的明文交叉点。结构上的去中心化(Minsky)和运作机制上的去中心化(Brooks),共同指向同一个方向——符号单体的消解。

小结:运作机制维度的反叛

Brooks 1986 年的 subsumption 架构是符号主义内部孕育的第二条反叛伏线。它否定的不是”符号”本身,而是”中央世界模型”和”自上而下规划”——符号主义运作机制的两个核心假设。

通过行为层分层和抑制/禁止仲裁,subsumption 证明了感知-行动耦合可以在无中央模型的情况下实现鲁棒控制。框架问题在 subsumption 中不存在——因为不维护世界模型。优雅降级的特性使得系统在部分失效时仍能运转。

但 subsumption 有其本质局限:只在”非常简单的智能水平上”有效,固定优先级无法运行时调整,学习问题完全未触及。这些局限不是工程缺陷,而是反应式范式的结构性边界——它们在 Brooks 1990-91 系列中被正面面对。

Brooks 的否定从运作机制维度击碎了符号单体的基石。与 Minsky 的结构维度否定、McCarthy 的接口维度否定,共同构成了三条反叛伏线。下一篇我们将进入 Brooks 1990-91 年的哲学化阶段——”无表征智能”口号的正式提出。


系列文章

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

发表回复

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