Skip to content

第 36 章 Research Brief:Harness Design Patterns

要解决的工程问题

当团队把每一类 Agent 任务都塞进同一个“多 Agent”框架时,任务拥有者、状态边界、停止条件和副作用责任会变得不可见;反过来,所有任务都用固定串行步骤,又会把真正需要分派、并行或异步响应的工作强行压平。本章研究如何把控制流选择写成可审查的模式卡(Pattern Card):读者可以说明为什么选择一种结构、它需要哪些输入与证据、何时应升级,以及它不保证什么。

读者问题与范围

读者问题本章研究的回答本章不回答
什么情况下应保留简单循环?当一个任务的下一步主要由当前观察决定、只有一个结果所有者且不需要预定义子任务图时,可先使用受控单循环,并明确观察、预算和停止条件。单循环天然安全、成本最低,或足以处理所有长任务。
什么时候把计划与执行分开?当子任务和验收门可以预先写清时,可用计划—执行模式把计划工件、执行状态和重新规划门分开。计划一经生成就必然正确,或执行者可以跳过验证。
为什么需要监督者或流水线?当需要一个结果所有者协调有边界的专长输出时,使用监督者—工作者;当步骤顺序稳定且每段可以设置门时,使用流水线。工作者数量越多越好,或监督者能够替代领域审批。
事件驱动结构解决什么?当任务由外部状态变化触发且消费者可独立处理时,显式记录事件契约、去重、交付语义、失败所有者与恢复策略。“事件”一词本身保证可靠投递、顺序、幂等或安全。
如何避免模式堆叠?每个模式卡都声明触发条件、控制权、状态边界、证据、停止/升级和副作用责任;缺一项时先补契约,不增加新角色。一张决策树可以替代性能测试、风险评估或人工授权。

研究范围与非范围

研究范围: 控制流模式的选择条件、输入输出边界、单一结果所有者、状态与证据、组合限制、反模式和演进触发器。拟讨论的五张模式卡为受控单循环(Controlled Single Loop)、计划—执行(Plan–Execute)、监督者—工作者(Supervisor–Worker)、流水线(Pipeline)和事件驱动(Event-Driven)。这些名称是本书用于比较 Harness 控制流的工程模型;它们不构成产品 API、行业标准或运行时实现。

研究非范围: 不实现 Agent、队列、事件总线、调度器、外部工具、并发执行、工作流引擎或真实文件修复;不比较模型能力、吞吐、延迟、价格或基准;不承诺任何模式的可靠投递、恰好一次、自动恢复、权限或安全性质;不把 CloudEvents、AWS Step Functions、Node.js 或 OpenAI Agents SDK 的具体行为改写成跨产品规则。

已核验的一手资料

本地键来源明确表达的内容允许用途不可外推
CH36-REF-01 → REF-029Anthropic 将预定义代码路径编排的系统称为 workflow,将模型动态决定过程与工具使用的系统称为 agent;文章分别说明串联、路由、并行、编排者—工作者与评估—优化等常见结构,并建议仅在能证明改善结果时增加复杂度。用作“固定控制流与模型主导控制流不同”“模式应从简单结构开始”的受限工程背景。不是通用分类标准、性能结论、默认架构、生产安全保证或本书模式卡定义。
CH36-REF-02 → REF-030OpenAI Agents SDK 的 Python 文档区分由 LLM 决策与由代码编排;在该 SDK 语境中说明 manager 调用 specialist、handoff、串联、评估循环和独立任务并行。用作监督者—工作者、路由和代码控制流的产品特定例子。不证明其他 SDK 有同一接口、handoff 安全、并行无共享状态冲突,或任一结构已经在本书运行。
CH36-REF-03 → REF-031AWS Step Functions 文档将该产品的 workflow 描述为由事件驱动步骤构成的状态机,并列出 Choice、Wait、Map、Parallel 等流控制状态以及执行、输入输出和错误处理概念。用作“显式状态、分支和并行都需由具体运行时定义”的产品例子。不把 ASL 字段、redrive、数据格式、执行语义或恢复能力推广为通用 Harness 契约。
CH36-REF-04 → REF-114CloudEvents 规范把 event 定义为表达一次发生及其上下文的数据记录,区分 producer、consumer 与 intermediary,并规定事件描述的可互操作格式。用作事件契约至少要区分发生事实、上下文、生产者和消费者的规范背景。不证明投递保证、顺序、去重、授权、重试、事件总线可用性或本书事件驱动模式的实现。
CH36-REF-05 → REF-115Node.js EventEmitter 文档说明其命名事件与监听器模型;该实现会按注册顺序同步调用监听器。用作“事件运行时语义必须具体核验”的反例背景。不把 Node.js 监听器顺序或同步行为外推给消息队列、浏览器、云事件或任何其他事件系统。

来源观点、本书工程模型与教学案例的边界

来源明确表达的事实

  • Anthropic 的文章在其工程建议语境中区分预定义 workflow 与模型动态控制的 agent,并列举多种组合结构;它明确提醒复杂度、成本和延迟存在取舍。
  • OpenAI Agents SDK 文档只说明该 Python SDK 中 manager、handoff、代码编排和并行示例的接口与适用语境。
  • AWS Step Functions 和 Node.js 文档只说明各自产品或运行时的状态/事件语义;CloudEvents 规范只说明事件数据描述与互操作格式。

本书工程扩展

本书把模式卡定义为一个可审查选择单元,最少包含以下字段。字段不是上述任何来源的 schema,也不会自动创建实现:

字段本书中的作用需要回答的问题
Trigger说明何种输入、状态或事件可以启动模式。谁能触发,触发前是否要验证?
Control owner指定谁决定下一步和谁拥有最终结果。模型、代码、监督者或人类分别能改变什么?
Work contract描述每个步骤/工作者接收什么、返回什么、不能做什么。输出是否可合并,副作用由谁批准?
State and evidence指定何处记录状态、观察和验收证据。中断后如何知道下一步,而不把自然语言摘要当作事实?
Stop and escalation说明预算耗尽、证据矛盾或高风险动作时如何停止。哪些条件只能升级给人类?
Evolution trigger记录从简单模式升级的可观察理由。什么证据表明现有结构已不足,而不是“看起来更专业”?

本书还提出一个选择顺序:先问任务的下一步是否可由稳定规则决定;再问子任务是否可预先枚举、相互独立,还是需要动态分派;最后才问是否有外部事件、跨执行状态或副作用使额外的运行时契约必要。这个顺序是教学上的风险控制,不是来源宣称的唯一决策算法。

教学案例与未执行边界

后续正文可使用一个虚构的“文件修复请求”作为比较输入:任务先读只读诊断,再决定是否形成计划并分派受限分析工作;任何写入候选都停在人工审批前。它不代表真实仓库、Bug、Agent、队列、事件、并行工作者、Git 操作、浏览器、CI、账户、网络或外部系统已经创建、调用或验证。

拟定模式卡与选择约束

本书模式卡适用的最小条件不应使用的信号必须显式拥有的边界
受控单循环一名结果所有者可根据观察决定下一步;任务规模与尝试预算可见。需要稳定拆分、多个独立结果或异步外部触发却没有状态契约。观察输入、工具/权限边界、预算、停止与证据。
计划—执行子任务、依赖和验收门可在执行前形成可审查计划。环境会快速改变,计划不能解释下一步,或计划被当作执行许可。计划版本、执行状态、重新规划门、验收与审批。
监督者—工作者有一个结果所有者,且工作者专长、输入输出和合并规则可界定。多个工作者都能写同一外部状态,或没有人负责冲突、失败和最终结论。委派契约、结果归属、合并、冲突处理与升级。
流水线阶段顺序稳定,前一阶段产物可被下一阶段校验和消费。步骤依赖高度动态,或某阶段失败后只能重新猜测全部历史。阶段输入输出、质量门、失败分支、回退和状态记录。
事件驱动触发来自可定义的发生事实,消费者可在明确交付/恢复语义下独立处理。仅为了“异步”而引入事件,或无法定义去重、顺序、失败所有者和可观测性。事件契约、路由、交付语义、去重、死信/升级与审计。

需要在后续阶段再次核验的事实

  • TODO(verify): 在 Chapter Outline、First Draft、Technical Review 与 Fact Check 当日重新读取 CH36-REF-01 至 CH36-REF-05;动态 SDK、云产品、Node.js 版本和 CloudEvents 草案不得仅凭本次访问记录进入正文。
  • TODO(verify): 若正文保留 OpenAI Agents SDK 的 manager、specialist 或 handoff 术语,逐句限定为该 Python SDK 页面所述接口,并确认 URL 与文档版本仍可访问。
  • TODO(verify): 若正文使用 AWS Step Functions 的 Choice、Map、Parallel、redrive 或 JSON 细节,逐项重新读取对应官方产品页;不要把字段名或产品保证混入模式卡。
  • TODO(verify): 若正文讨论事件格式,确认 CloudEvents 正式稳定版本、协议绑定和所需属性;当前读取的规范页面标示为 1.0.3-wip,不能写成固定版本承诺。
  • TODO(verify): 任何“更快”“更可靠”“成本更低”“并行安全”或“可恢复”主张都需要任务级测量或实际运行证据;本研究没有该类证据。

计划图示、示例与验证

计划图示

后续可新增 diagrams/mermaid/chapter-36-control-flow-pattern-selection.mmd,以同一任务输入分别连接到五张模式卡,并在每张卡外侧标出控制权、状态/证据、停止/升级和副作用责任。图只解释本书选择模型;不描绘真实队列、事件总线、Agent、云服务或并发运行。

计划示例

后续可新增纯内存示例计划 36-harness-design-patterns.example-plan.md,并在 Example Implementation 阶段实现一个接收注入式模式提案的函数,例如 assessHarnessPatternSelection。它只检查模式卡字段是否齐全、控制权是否冲突、是否缺少停止或副作用边界,并返回教学状态;不启动工作者、不调用模型、不并行、不发送事件、不读写文件、不访问网络,也不证明任何真实架构可运行。

计划验证

  1. Research 阶段仅对本 Research Brief 与 references 文件运行 Markdown lint;未运行模式选择器、Agent、队列、事件、工作流或外部系统。
  2. Example Implementation 阶段先用一个缺失模块的测试记录红灯,再新增纯内存模块与行为测试;通过只能证明注入对象的分类契约。
  3. Diagram Review 阶段才导出并目检 Mermaid 图;图示完成也不代表控制流、并行、事件或恢复已执行。
  4. Fact Check 阶段重新定位所有动态资料,逐项复核允许用途与外推禁区。

风险、反模式与演进触发器

风险或反模式可观察表现本书建议的检测与收敛方向
为每个任务预设多 Agent工作者角色重叠,最终结论无人拥有,失败被转述而非处理。先证明单循环或流水线不能满足明确的任务约束,再新增一个有输入输出和停止条件的角色。
计划被当成执行许可计划包含写入或发布动作,却没有当前观察、授权或验收门。分离计划、批准和执行状态;任何外部副作用回到权限与审批边界。
事件掩盖责任事件产生后没有消费者所有者、去重策略、失败记录或升级路径。先写事件契约和失败责任;无法定义时保留同步边界或停止。
把并行当作免费加速共享状态冲突、预算不可见、聚合器把不一致输出压成单一结论。只并行真正独立的输入;定义结果合并、冲突处理和成本/时间预算。
模式组合没有退出条件新增路由、监督和评估循环后,无法说明何时结束或谁批准下一步。每添加一层都补 Stop and escalation;若不能补齐,回退到更简单的可观测模式。

对后续阶段的交接

  • Chapter Outline: 按“选择问题 → 五张 Pattern Card → 组合/反模式 → 虚构文件修复对比 → 纯内存准入器 → 图示断点 → 练习”的顺序展开;每节标明来源事实、本书模型与未执行边界。
  • First Draft: 用原创的文件修复场景比较受控单循环与计划—执行,避免把厂商示例、术语或模式图改写为普适定理。
  • Technical Review / Fact Check: 将 CH36-REF-01 至 CH36-REF-05 的逐句用途与动态来源复核拆开;确认“并行”“handoff”“事件”“状态机”“恢复”等词都带有具体主体与范围。
  • Example / Diagram Review: 示例只能检查注入的模式提案;图只能表达选择关系和责任边界,二者均不得声称真实系统已调度、投递或恢复。

Research Brief 完成检查

  • [x] 已说明读者问题、研究范围与明确非范围。
  • [x] 已将来源明确表达的事实、本书工程扩展与虚构案例分开。
  • [x] 每项来源均记录可支持陈述与不可外推范围。
  • [x] 已为模式卡、图示、纯内存示例和后续 Fact Check 留出可验收入口。
  • [x] 未实现或运行 Agent、工作流、队列、事件、并发、工具、外部系统或真实文件修复。

从同一套 Markdown 书稿生成。