共享记忆与黑板模式
2026 年多 Agent 系统中共存两种方法:消息池(每个人看到每个人的消息,如 AutoGen GroupChat 或 MetaGPT)和带订阅的黑板(Agent 订阅相关事件,如 Context-Aware MCP 或 Matrix 框架)。两者都是多 Agent 系统中唯一有状态的部分...
共享记忆与黑板模式
2026 年多 Agent 系统中共存两种方法:消息池(每个人看到每个人的消息,如 AutoGen GroupChat 或 MetaGPT)和带订阅的黑板(Agent 订阅相关事件,如 Context-Aware MCP 或 Matrix 框架)。两者都是多 Agent 系统中唯一有状态的部分——这意味着两者都是有趣 bug 的栖身之所。参考失败模式是记忆投毒:一个 Agent 幻觉出一个”事实”,其他 Agent 将其视为已验证,准确性逐渐衰减,比即时崩溃更难调试。本课程用 stdlib 构建两种结构,注入投毒攻击,并展示三种在生产中真正有效的缓解措施。
类型: 学习 + 构建
语言: Python (stdlib, threading)
前置条件: Phase 16 · 04 (原语模型), Phase 16 · 09 (并行群体网络)
时间: ~75 分钟
问题
多 Agent 系统需要一个地方让 Agent 共享事实。一个字面选项是”在消息中传递一切”——但这用额外的复制重新发明了共享状态。另一个是”给每个人一个全局日志”——但全局日志无限增长且容易投毒。第三个是”为每个 Agent 投影一个视图”——可扩展但 Schema 繁重。
当一个 Agent 幻觉并将幻觉写入共享状态时,每个读取该状态的下游 Agent 都将幻觉采纳为事实。当人类注意到时,推理链已经深入五步,根本原因是第三条写入的消息。调试多 Agent 准确性衰减比调试崩溃更难。
这就是记忆投毒。它是 MAST 分类法 (Cemri 等人, arXiv:2503.13657) 中第二大记录的失败族,而且是结构性的:任何没有来源追踪和不可写入验证者的共享记忆设计最终都会出现此问题。
概念
两种主要拓扑
全消息池。 每个 Agent 读取每条消息。AutoGen GroupChat 和 MetaGPT 使用此方式。简单、透明、可检查,但不能扩展到 ~10 个 Agent 以上,因为每个 Agent 的上下文被其他 Agent 的工作填满。
带订阅的黑板。 Agent 声明对主题的兴趣;底层只路由相关消息。CA-MCP (arXiv:2601.11595) 和 Matrix 去中心化框架 (arXiv:2511.21686) 使用此方式。扩展更远,但需要前期 Schema 设计使订阅有意义。
各自何时胜出
- 全池 在 Agent 少(< 10)、异构、对话短时时胜出。推理谁说了什么在每个人看到一切时很简单。
- 黑板 在 Agent 多、角色同质但实例众多(群体)、对话长时时胜出。路由节省 token 成本和上下文污染。
生产系统通常混合使用:顶部小全池(规划层),下方黑板(工作者层)。
记忆投毒,一个场景
三个 Agent 处理研究任务。Agent A 是检索 Agent。Agent B 是摘要者。Agent C 是分析师。
- A 获取页面并写入共享状态:“研究报告了 42% 的准确率提升。”
- 实际页面说的是”4.2% 提升。“A 幻觉了一个小数点。
- B 读取共享状态,写入:“报告了大幅 42% 准确率增益(来源:A)。”
- C 读取共享状态,写入:“建议采用——42% 提升是变革性的。”
- 最终报告引用了一个从未存在的 42% 数字。
没有 Agent 崩溃。没有测试失败。系统”工作了”。幻觉通过共享状态从一个 Agent 的上下文进入了每个下游 Agent 的推理。
为什么这是结构性的
没有共享状态,Agent A 的幻觉留在 A 的上下文中。下游 Agent 会重新获取或重新推导,可能捕获错误。有了朴素共享状态,A 的上下文变成每个人的上下文,幻觉被洗白为事实。
问题不是共享状态本身——而是没有来源追踪和没有独立验证者的共享状态。三种缓解措施解决这个问题:
- 每次写入时归属来源。 共享状态中的每个条目记录谁写的、何时、在什么提示下、以及(如果适用)Agent 引用了什么来源。下游 Agent 带着与来源关联的怀疑阅读。
- 版本化写入;视为只追加。 修正是取代旧条目的新条目,不是原地更新。审计追踪被保留。
- 保持至少一个不能写入共享状态的 Agent。 只读验证者 Agent 采样条目、重新获取来源、标记不一致。因为它不能写入池,它不能被池投毒。
黑板先例 (Hayes-Roth, 1985)
黑板模式比 LLM Agent 早四十年。Hayes-Roth (1985, “A Blackboard Architecture for Control”) 描述了观察全局黑板、贡献部分解决方案、触发其他来源的专家知识源。2026 年的黑板 (CA-MCP, Matrix) 是相同模式,LLM Agent 作为知识源,JSON blob 作为部分解决方案。旧文献有记录的解决方案处理写入争用、机会控制和一致性,现代系统正在重新发现。
投影 vs 全视图
纯黑板给每个订阅者相同的投影(主题范围)。更激进的设计是每 Agent 投影:每个 Agent 获得根据其角色定制的视图。LangGraph 的状态 reducer 是 2026 年的规范实现——reducer 函数将全局状态折叠为角色特定的切片。
每 Agent 投影扩展更远但需要 Schema。没有 Schema,你在每个 Agent 的提示中重建临时投影。
写入争用模式
多个 Agent 同时写入是一个并发问题,不仅仅是 LLM 问题。三种模式有效:
- 顺序写入者(单生产者)。 所有写入通过一个协调 Agent 序列化。简单,但是瓶颈。
- 带版本化的乐观并发。 每个条目有版本;写入者在版本不匹配时失败并重试。经典数据库技术。
- 主题分区。 不同 Agent 拥有不同主题。无跨主题争用。需要设计的分区边界。
大多数 2026 框架默认顺序写入者,因为 LLM 调用足够慢,争用很少,瓶颈不影响。
不可写入的验证者
最承重的缓解措施是只读验证者。实现规则:
- 验证者与团队共享状态(读取黑板或池)。
- 验证者没有共享状态的写入句柄——只有到单独验证通道的写入。
- 验证者独立获取写入中引用的来源。标记分歧。
- 验证者自己的输出路由到人类或单独的决策 Agent,永远不回馈到池中。
没有这种分离,验证者的输出变成池中的新条目,这意味着被投毒的池投毒了验证者,验证者投毒了其验证。
构建它
code/main.py 在 stdlib Python 中实现了两种拓扑以及一个玩具投毒攻击和三种缓解措施。
MessagePool— 线程安全的只追加日志,支持完整读出。Blackboard— 主题键控的发布/订阅,支持每 Agent 订阅。ProvenanceEntry— 每次写入记录 (writer, timestamp, prompt_hash, source_uri)。PoisoningScenario— 运行三 Agent 研究任务,其中 Agent A 幻觉了一个小数点。打印最终报告。Verifier— 重新获取来源并标记不一致的只读 Agent。运行相同场景但有验证者存在。
运行:
python3 code/main.py
预期输出:
- 运行 1(无验证者):幻觉的 42% 传播到最终报告。
- 运行 2(有验证者):验证者标记不一致,池被标记为”已标记”,最终报告包含撤回。
使用它
outputs/skill-memory-auditor.md 是一个技能,审计任何多 Agent 系统的共享记忆设计的来源追踪、版本控制和验证者分离。在生产前对新多 Agent 架构运行它。
发布它
对于任何共享记忆设计:
- 每次写入记录来源:
(writer, timestamp, prompt_hash, tool_calls_cited, source_uri)。 - 使日志只追加。修正是引用被取代条目的新条目。
- 部署至少一个具有独立来源访问的只读验证者 Agent。
- 将验证者输出路由到单独通道,不回馈到共享池。
- 记录被取代的写入比例——上升的比例是幻觉模式的早期证据。
练习
- 运行
code/main.py。确认运行 1 传播幻觉,运行 2 捕获它。 - 添加第二个幻觉:Agent B 编造了一个数据集大小。验证者应该在不针对任何一个手动调优的情况下捕获两者。
- 将全池切换为带主题分区的黑板(
prices、summaries、analyses)。主题分区使哪些投毒场景更难实施,哪些没有帮助? - 阅读 Hayes-Roth (1985, “A Blackboard Architecture for Control”)。识别论文中未讨论的两个控制模式,2026 系统会受益于。
- 阅读 CA-MCP (arXiv:2601.11595)。将其共享上下文存储映射到
code/main.py中的 MessagePool 或 Blackboard 类。CA-MCP 在其之上添加了哪些原语?
关键术语
| 术语 | 人们怎么说 | 实际含义 |
|---|---|---|
| 消息池 | ”共享聊天历史” | 每个 Agent 读取的只追加日志。完全透明,扩展性差。 |
| 黑板 | ”共享工作区” | 主题键控的发布/订阅。Agent 订阅相关主题。扩展更远。 |
| 来源追踪 | ”谁写了什么” | 每次写入的元数据:写入者、时间戳、提示、来源。 |
| 记忆投毒 | ”幻觉传播” | 一个 Agent 的错误进入共享状态,下游 Agent 采纳为事实。 |
| 只追加 | ”没有原地更新” | 修正是取代旧条目的新条目。保留审计追踪。 |
| 不可写入验证者 | ”独立审计者” | 重新获取来源并标记不一致的只读 Agent。 |
| 投影 | ”限定视图” | 从全局状态计算的每 Agent 视图。LangGraph reducer 是规范案例。 |
| 知识源 | ”专家 Agent” | Hayes-Roth 1985 年对黑板参与者的称呼。 |
延伸阅读
- Cemri et al. — Why Do Multi-Agent LLM Systems Fail? — MAST 分类法;记忆投毒是协调失败子族
- CA-MCP — Context-Aware Multi-Server MCP — 协调 MCP 服务器的共享上下文存储
- Matrix — decentralized multi-agent framework — 基于消息队列的无中央编排者黑板
- LangGraph state and reducers — 生产中的每 Agent 投影模式
- Anthropic — How we built our multi-agent research system — 生产部署的来源追踪和验证笔记