Skip to content

WF05:Workflow Composition:Branch、Join、Loop 与 Fallback

它解决什么问题

真实产品不是单一 pattern,而是线性步骤、条件分支、并行汇合、有界循环与降级的组合。缺少组合语义会让错误路径成为隐式代码。

核心定义

Composition 用少量控制原语构成完整 Workflow:Branch 选择路径,Join 定义汇合,Loop 定义重复与终止,Fallback 定义主路径失败后的替代结果。

工作原理

每个节点声明输入输出、超时和幂等性;边声明触发条件;Join 声明完成策略;Loop 声明预算;Fallback 声明降级质量和用户提示。

架构视图

Architecture View
Request -> branch -> parallel tasks -> join -> evaluate
             |                              |
             +-> fallback <---- bounded loop+
Product View
User goal -> start -> visible stage/progress -> result
                 |             |
                 +-- cancel / retry / fallback

最小可运行实践

运行 examples/workflows/content_pipeline.py,并选择 composition 场景。示例以普通 Python 函数模拟模型步骤,不依赖 API Key;关注输入输出契约、控制路径和失败处理,而不是模型能力。

正常场景

内容请求按类型分支,并行事实与合规检查,评价不通过最多修订两轮;搜索不可用时使用缓存并标注时效。

失败与恢复场景

若无界循环、Join 永久等待或 Fallback 隐藏关键缺失,系统会假装运行或返回误导结果。用 deadline、部分失败状态和显式降级标签恢复。

什么时候使用

当多个基础 Workflow pattern 已被需求证明需要,并且状态转换可以清晰列出时使用。

什么时候不要使用

MVP 只有两三步时不要提前画复杂图;无法定义节点契约时,图只会掩盖耦合。

Trade-offs

组合原语提高表达力和恢复能力,却扩大状态空间。统一编排便于观察,但也可能形成中央瓶颈。

产品视角

用户与业务问题

解决复杂任务需要稳定承诺:什么时候完成、何时重试、缺失什么以及还能得到什么。

产品价值

减少整单失败,支持部分结果、局部重跑和一致进度。

用户体验

用户看到业务阶段、等待原因和可操作错误,不需要看到内部 Prompt 或 Agent 名称。只有真实可测的步骤才展示进度。

自主性边界

Workflow 中模型只在步骤内部生成或判断;分支、预算、副作用和最终提交仍由代码及权限规则控制。

数据与权限

每一步只接收完成该步骤所需字段;中间结果采用结构化契约,敏感原文不因方便而自动传给全部步骤。

失败与降级

支持从失败步骤重试、跳过可选步骤、使用规则或缓存降级,并保留已通过校验的中间结果。

产品指标

衡量端到端成功率、各步骤失败率、P50/P95 完成时间、重试率、用户修正率和单成功任务成本。

框架中的对应实现

DAG、状态机和图框架都能表达;选择依据是是否需要循环、持久化、事件和人工等待,而不是节点数量。

下一模块将比较图、状态机和事件驱动;进入模型动态选边时转向 Agent orchestration。

检查清单

  • 控制路径是否显式且可测试?
  • 每步输入输出是否结构化?
  • 是否定义超时、重试、降级和停止?
  • 用户看到的进度是否对应真实状态?
  • 新增步骤带来的质量是否覆盖延迟与成本?

延伸练习与参考资料

为每条边增加失败语义,确认不存在只有 happy path 的节点。