你了解 Blackboard(黑板系统)吗?听说过基于黑板系统实现的智能体吗?

最近在准备后端和 Agent 相关面试时,碰到了一个挺有意思的问题:
你了解 Blackboard(黑板系统)吗?听说过基于黑板系统实现的智能体吗?
你刚才说黑板系统会出现的那些问题,是自己实际尝试、遇到过的吗?
第一个问题考的是概念和架构理解,第二个问题则是在追问:你说的到底是工程经验,还是只看过资料后的总结?
这两个问题放在一起,其实很值得聊聊。本文从黑板系统的基本原理讲起,再看看它为什么适合多智能体协作、落地时会遇到什么问题,以及面试时该怎么回答才更严谨。
一、Blackboard 到底是什么?
Blackboard
System,通常翻译为"黑板系统",是一种经典的协作式问题求解架构。它的核心思路并不复杂:
多个具备不同能力的模块,不必彼此直接调用,而是围绕一份共享的中间状态协作。
可以把它想象成一个团队在白板上共同解决问题。
- 白板:记录当前问题、已知信息、中间结论和待解决事项。
- 专家模块:每个模块只负责自己擅长的一类工作。
- 控制器:判断当前应该让哪个模块执行,以及什么时候继续、暂停或结束。
例如,要分析一份复杂的技术故障报告,可以有模块负责提取日志、模块负责分析异常、模块负责检索知识库,还有模块负责汇总结论。它们不一定需要按固定顺序执行,而是根据共享状态中的信息决定下一步能做什么。
这里有个关键点:黑板不只是一个大家都能读写的变量,它更重要的作用是承载协作过程中的共享问题状态。
如果只是把几个 Agent 的输出依次拼在一起,通常还谈不上完整的黑板式协作。
二、黑板系统通常由哪些部分组成?
一个典型的黑板架构可以拆成三个核心部分。
1. 黑板(Blackboard)
黑板保存任务的公共状态。具体内容取决于业务,可能包括:
- 原始任务与目标;
- 已收集的事实、证据和上下文;
- 各阶段的中间结果;
- 当前尚未解决的问题;
- 结果的来源、置信度和更新时间。
比如一个代码排障任务,黑板上可以记录"测试失败发生在模块
A""日志显示数据库连接超时""尚未确认是否由连接池配置导致"等信息。
这些记录最好有明确的数据结构,而不是把所有内容都塞进一段越来越长的自然语言文本里。否则,随着任务变复杂,信息很容易互相覆盖,后续模块也难以准确判断哪些结论可信。
2. 知识源(Knowledge Sources)
知识源可以理解为能够处理某类问题的专家模块。在 Agent
系统中,它们可能是:
- 负责拆解任务的 Planner;
- 负责检索文档的 RAG 模块;
- 负责分析代码或日志的分析 Agent;
- 负责执行工具调用的 Executor;
- 负责验证结果的 Reviewer。
它们读取黑板上的相关信息,判断自己是否能推进当前任务;如果可以,就执行对应工作,再把新发现或处理结果写回黑板。
注意,知识源不一定都要是大模型。普通函数、规则引擎、检索器和外部工具也可以成为其中的一部分。
3. 控制机制(Control)
有多个模块能做事,不代表它们应该同时做事。控制机制需要决定:
- 当前哪些模块具备执行条件;
- 哪个模块优先执行;
- 是否允许并行处理;
- 新结果写回后,是否需要再次触发其他模块;
- 任务何时算完成,何时应该中止或转人工处理。
控制策略可以很简单,例如按优先级选择可执行模块;也可以更复杂,根据任务状态、执行成本、依赖关系和失败次数来调度。
所以,黑板系统并不等于"完全没有流程"。它只是把协作重点放在共享状态和动态调度上,而不是只能依赖一条预先写死的调用链。
三、它和固定顺序的 Agent 工作流有什么区别?
拿一个"定位并修复测试失败"的任务举例。
固定工作流可能是:
text
读取任务
→ 分析失败原因
→ 修改代码
→ 运行测试
→ 输出结果
这种方式的优点是结构清晰、容易调试,也比较适合步骤稳定的业务。但如果测试结果表明原来的分析方向不对,系统可能需要重新走一段流程,或者额外编写分支处理逻辑。
黑板式方案则更关注任务的当前状态:
text
┌──────────────┐
│ 共享黑板 │
│ 任务、证据、状态│
└──────┬───────┘
│读取 / 写回
┌────────────┼────────────┐
▼ ▼ ▼
日志分析器 代码分析器 文档检索器
│ │ │
└────────────┼────────────┘
▼
控制器重新调度
│
验证器 / 执行器 / 结束
例如,日志分析器发现数据库超时后,把证据写回黑板。控制器发现这个线索值得进一步验证,于是触发文档检索器查找连接池配置说明。检索结果回来后,代码分析器再检查项目配置。如果证据仍然不足,系统可以继续收集信息,而不是机械地进入"修改代码"步骤。
不过,这并不意味着黑板架构一定更好。任务流程稳定、模块数量少时,普通工作流可能更简单可靠。黑板的价值主要体现在:多个异构模块需要围绕同一个问题反复贡献信息,而且下一步动作需要根据中间结果动态决定。
四、基于黑板系统的智能体是怎么工作的?
把 Agent 接入黑板架构后,可以将 Agent
看作一种具有推理和工具调用能力的知识源。
一次典型的协作过程可以是:
- 初始化任务:把用户目标、约束和初始上下文写入黑板。
- 检查当前状态:控制器根据黑板内容,找出当前可以推进任务的模块。
- 选择并执行模块 :某个 Agent
读取必要信息,调用模型、工具或检索服务完成工作。 - 提交结果:Agent 将结论、证据、执行状态和后续建议写回黑板。
- 检查是否继续:控制器评估是否出现新线索、是否需要其他模块介入,或是否满足完成条件。
- 结束或重新调度:达到目标就整理结果;未达到目标则继续处理,必要时触发重试或人工确认。
这个过程可以循环多轮,也可以让相互独立的模块并行执行。关键不是 Agent
的数量,而是每个模块能否围绕共享状态有效协作。
工程实现上,黑板也不一定非要是某种特殊数据库。简单原型可以用内存中的结构化对象;需要持久化、并发读写或跨进程协作时,再考虑数据库、缓存或事件机制。选择什么技术,要看任务规模和一致性要求。
五、黑板系统有什么优势?
1. 模块之间耦合相对较低
模块主要通过约定好的黑板数据结构交换信息,不必让每个 Agent 都了解其他
Agent 的内部实现。更换某个检索器或分析器时,对整体架构的影响可能更小。
2. 适合动态协作
后续动作可以根据当前状态决定,不必所有任务都严格遵守同一条流水线。对于需要反复分析、补充证据和验证结果的问题,这种方式比较灵活。
3. 中间过程更容易被观察
如果黑板记录了每次更新的来源、时间、状态和结果,开发者就能追踪某个结论是怎么产生的,也更容易定位错误来自哪个阶段。
4. 能组合不同类型的能力
黑板上的参与者可以是大模型
Agent,也可以是普通程序、搜索工具、规则系统或人工审核节点。协作机制不必绑定某一种模型。
六、它也会遇到一些实际工程问题
黑板系统听起来很灵活,但共享状态一旦成为多个模块共同依赖的地方,工程复杂度也会随之增加。
1. 状态冲突和并发写入
两个 Agent
可能同时读取同一份旧状态,随后分别提交结果。如果都直接覆盖整份黑板,就可能把对方刚写入的信息覆盖掉。
常见的处理方向包括:只更新自己负责的字段、使用版本号做乐观并发控制、为关键更新加锁,或者将更新设计成可追踪的事件。具体选择取决于并发规模和一致性要求。
2. 信息越来越多,上下文难以管理
如果所有历史结果都一直保留,黑板会逐渐膨胀。对于基于大模型的 Agent
来说,读取过多无关内容会增加调用成本,也可能干扰判断。
因此,最好把任务状态、证据索引、历史事件和详细执行日志分开管理。Agent
每次只读取当前任务需要的信息,必要时再按引用查询完整内容。
3. 结论冲突,谁来判断?
不同 Agent
可能给出互相矛盾的结论。例如,一个模块认为问题来自数据库配置,另一个模块认为是网络故障。
黑板不能只负责保存这些结果,还需要保留来源和依据,并由控制器、验证模块或仲裁策略决定下一步。涉及高风险操作时,不能仅凭某个
Agent 的一句判断就直接执行。
4. 调度不当导致反复循环
如果每次写回黑板都会无条件触发其他 Agent,系统可能陷入反复调用:模块 A
更新状态后触发 B,B 又更新状态触发 A,任务却没有实质进展。
可以通过触发条件、任务预算、最大迭代次数、重复结果检测和明确的终止条件来限制这种情况。调度策略是黑板架构设计中的重要部分,并不是可有可无的附属功能。
5. 调试和评估更复杂
固定流程通常可以沿着一条调用链排查问题;动态协作则可能在不同轮次选择不同模块,执行路径也会随中间结果变化。
因此,日志最好记录每次调度的原因、模块输入、输出摘要、状态变更、工具调用和失败信息。否则,出现错误时就很难回答"为什么系统会走到这一步"。
七、面试追问:这些问题是你自己实际遇到的吗?
我觉得这个追问很关键。面试官不只是想知道你能不能列出架构的缺点,而是在确认你是否清楚区分了理论分析、代码验证和真实项目经验。
如果确实在项目中遇到过,就可以具体讲清楚:
- 场景是什么? 当时有几个模块,黑板保存了哪些数据?
- 现象是什么? 是状态被覆盖、上下文过长,还是 Agent 反复调用?
- 怎么定位的? 看了哪些日志、复现了什么情况?
- 怎么处理的? 修改了数据结构、调度规则,还是增加了校验机制?
- 结果如何? 有没有测试或数据能证明问题得到改善?
比如,如果你确实做过并发写入实验,可以说清楚两个模块同时更新时出现了什么现象,以及如何通过字段级更新或版本校验解决。这样的回答远比只说"黑板会有并发问题"更有说服力。
但如果目前只是从资料、论文或代码阅读中总结出的风险,也完全可以坦诚说明。可以这样回答:
这几个问题目前主要是我根据黑板系统的架构特点做的工程风险分析,并不是说我已经在一个完整的生产级黑板系统里全部遇到过。我理解它们背后的原因:多个模块共享状态会带来并发更新和数据一致性问题;任务持续推进会让历史信息膨胀;动态调度如果没有终止条件,也可能产生重复调用。
如果要验证这些风险,我会先搭一个最小原型:让两个模块并发更新同一份状态,观察是否发生覆盖;再设计一个会反复触发的任务,检查调度器能否正确停止;最后记录每轮输入、输出和状态变化。这样可以把架构层面的推断转化为可复现的实验结论。
这段回答的重点不是把自己说得很有经验,而是让面试官知道:哪些是亲自验证过的,哪些是从原理推导出来的,以及接下来会怎样验证。
如果还没有做过实验,不要把"理论上可能出现"说成"我在项目里遇到过"。面试官继续追问复现步骤、日志和修复细节时,很容易暴露这个区别。
八、如果要自己动手,可以从一个小实验开始
不必一开始就做一个复杂的多 Agent 平台。可以先实现一个很小的黑板原型:
- 黑板:使用 Python 字典或一个简单的数据类,保存任务状态和证据;
- Agent A:负责分析用户输入;
- Agent B:负责检索相关资料或检查 A 的结论;
- 控制器:根据黑板状态决定下一步执行谁;
- 日志:记录每次读取、写入、调度和结束原因。
然后逐步加入实验:
- 让 A、B 同时更新同一个字段,测试冲突处理。
- 让 A、B 给出不同结论,测试冲突检测与验证机制。
- 让 Agent 反复触发彼此,测试最大迭代次数和终止条件。
- 逐渐增加历史记录,测试上下文裁剪和摘要机制。
这样做的好处是,每一个工程问题都有对应的复现方式和验证结果。等真正遇到类似问题时,面试中就能讲出具体细节,而不是停留在概念层面。
九、最后总结
Blackboard(黑板系统)最值得记住的,不是"有一个共享空间",而是它用共享问题状态连接多个具备不同能力的模块,再通过控制机制动态推进问题求解。
它适合需要反复推理、汇集多方信息、根据中间结果调整下一步动作的任务;但它也会带来状态管理、并发控制、信息膨胀、冲突处理和调度终止等问题。
如果面试官进一步问"这些问题是自己遇到的吗",最好的回答不是急着证明自己经验丰富,而是准确交代经验边界。做过什么就讲什么,推导出的风险就说明推导依据,再给出验证思路。
对技术面试来说,能把一个架构讲清楚很重要;能分清楚哪些是事实、哪些是判断,并说明如何验证,同样重要。