共享记忆与黑板

G5
深入解析 · 多智能体系统

共享记忆与黑板:一个戴着 AI 帽子的数据库问题。

当智能体需要共享状态、又不想用 O(n²) 的消息网状时,答案是一个共享工作区:黑板。这个模式很老——Hayes-Roth,1985 年——而 2025 年把它带了回来,作为 LLM 智能体一种 token 高效的协调基底,足以与显式编排相抗衡。但只要多个智能体读写同一个存储,你就继承了所有经典并发隐患:写争用、陈旧读、丢失更新。本文讲解这套架构,以及让它不悄悄污染你运行的那套一致性纪律。

STEP 1

黑板用一份共享产物替换 N² 条消息。

在黑板系统中,智能体不互相发消息。它们读取一个全局可见的工作区,做工作,再把结果贴回去;一个控制组件决定下一个由谁行动。这把网状通信塌缩为对单一存储的 O(n) 次读写,并给你一个观测整个系统状态的单一位置。2025 年关于基于黑板的 LLM 多智能体系统的工作显示,这能匹敌甚至超过静态与动态编排两种设计,同时保持 token 高效——黑板就是协调本身,于是你不再为反复的点对点上下文交换付费。

# blackboard: read shared state, act, post back
def step(agent, bb):
    state = bb.read()                 # sees the whole board
    result = agent.run(state)
    bb.post(agent.id, result)        # new entry, not a broadcast
STEP 2

草稿纸不是黑板,混为一谈正是 bug 的根源。

两个截然不同的构造被叫了同一个名字。草稿纸通常是单个智能体的私有工作笔记——仅追加、单写者、无争用。黑板是多读者、多写者的共享状态——而那是一个并发数据库,不是笔记本。本文中的失败全都来自把一个真正的黑板当作私有草稿纸对待:没有写策略、没有版本控制、稀里糊涂地最后写者获胜。明确地判定你拥有的是哪一个;只有多写者那种情况才需要本文余下的内容。

STEP 3

写争用:并发的贴入会静默丢失更新。

如果两个智能体读了黑板,各自从该快照计算,再各自写回,第二次写就可能覆盖第一次——经典的丢失更新。在 LLM 智能体上这比普通系统更糟,因为损失是静默且语义性的:没有异常,只有一个悄悄忽略了某工作者贡献的答案,也没有堆栈追踪可供定位。修法就是标准的数据库那套:通过编排者或锁串行化写入、使用乐观并发(在版本上做 compare-and-set),或让黑板仅追加,使写入永不覆盖——它们累积,由读者来调和。

优先选仅追加、带版本的日志,而非可变的键值黑板。仅追加从结构上消除了丢失更新(没有东西被覆盖),给你一份用于跨智能体调试的完美审计轨迹,并把"第 k 步时团队知道了什么"从取证式猜测变成可重放的查询。

STEP 4

陈旧读:智能体基于一块已经移动了的黑板行动。

即便写入安全,读者也可能基于一个在它贴回时已经过时的快照行动——它昂贵的推理建立在被取代的状态之上。不加约束,这会产出与智能体思考期间所做决定相矛盾的工作,以及一块震荡而不收敛的黑板。缓解办法:给每次读编版本,并拒绝基版本陈旧的贴入(强制重读)、把智能体限定到黑板的不相交区域使其读取很少失效,或让控制组件只在某智能体的输入已稳定时才调度它。有意识地选择一致性模型——智能体黑板上的最终一致性是一个决定,不是你稀里糊涂退回去的默认。

"在演示里能跑"几乎总是意味着演示让智能体实际上是顺序运行的,于是争用和陈旧从未触发。生产中两个智能体第一次真正重叠时,丢失更新和陈旧读会一起出现——而因为两者都是静默的,你会看到一个错误的最终答案、一份干净的日志,却不知道为什么。

STEP 5

黑板既是瓶颈,也是爆炸半径放大器。

集中状态就是集中风险。每个智能体都读整块黑板,所以随着运行增长,黑板的体量会膨胀每个智能体的上下文与成本;黑板是单点故障也是串行化点;而一个智能体贴入一条自信的错误条目,会污染每个其他智能体随后读到的共享状态——一条独一无二地快速的错误传播路径(见 multi-agent-failure-modes)。对策是:限定并摘要黑板使上下文保持有限、把读取限定到相关区域、给每条条目署名并编版本使坏的贴入可追溯可撤销,并对黑板做检查点,使被污染的状态可以回滚而非绕着推理。

STEP 6

何时不要使用黑板。

当智能体其实并不需要共享状态时跳过它(带受限工作者的星型更简单,且没有这些隐患)、当黑板会无界增长并撑爆每个上下文预算时跳过、或当你不愿指定一个并发模型时跳过——因为未指定的那个就是"生产中的丢失更新和陈旧读"。黑板只有配上真正的写策略、版本化读取、署名和有界体量,才赢得它的位置。没有并发纪律的黑板不是共享记忆——它是一个会返回自信答案的共享竞态条件。