附录 A 的用法
编排模式不是风格选择,而是成本、延迟与失败率的结构性来源。同一个需求,写成串行还是并行,账单和 p95 会差出一个量级。
这份附录把卷三反复出现的五种模式压成卡片。每张卡片六项:结构图、适用判据、成本特征、延迟特征、失效方式、对应章节。结构图用 text 块画,方便直接贴进设计文档。
先看结构,再看数字。结构不成立的方案,调参救不回来。
一、串行
[输入]
│
▼
[能力 A] ──交接①──▶ [能力 B] ──交接②──▶ [能力 C]
│
▼
[输出]
适用判据:
- 后一个节点需要前一个节点的完整输出,不能只看摘要。
- 节点顺序不可交换,换序会改变语义。
- 每个节点的输出都能被下一节点校验,而不是靠“模型应该懂”。
成本特征:总 token 近似各节点输入之和;每增加一次交接,多付约 820 token 的契约载荷(示例值)。上下文沿链路累积,越往后越贵。
延迟特征:总延迟 ≈ Σ 节点延迟 + 交接次数 × 35ms(示例值)。串行没有并行收益,最长路径就是全部路径。
失效方式:
- 单点失败向后传播,整链成功率是各节点成功率的乘积。
- 重试在同一节点反复发生,成本和延迟同时放大。
- 上下文越走越长,后面的节点被无关历史稀释。
对应章节:1.1、1.2、2.2、5.1、5.3。
二、并行
all:全部分支汇合
┌──▶ [分支 A] ──┐
[输入] ──┬──┼──▶ [分支 B] ──┼──▶ [汇合] ──▶ [输出]
└──▶ [分支 C] ──┘
适用判据:
- 分支之间没有数据依赖,可以同时开始。
- 汇合需要全部结果,缺一个就不能下结论。
- 每个分支的失败语义明确:是整链失败,还是允许部分结果。
成本特征:各分支输入可共享同一份上下文;共享上下文 3,200 token、缓存折扣 90% 时,复用比每次重传便宜。分支越多,汇合处的去重与排序成本越高。
延迟特征:总延迟 ≈ max(各分支延迟) + 汇合开销。收益来自“最慢分支之外的时间被重叠”,不是来自“每个分支变快”。
失效方式:
- 最慢分支决定整体延迟,一个长尾拖垮全部收益。
- 分支并不独立,共享了同一个限流配额或同一个副作用。
- 汇合时字段冲突,没有仲裁规则。
对应章节:3.2、6.1、5.2。
any:任一成功即可
┌──▶ [候选 A] ──┐
[输入] ──┬──┼──▶ [候选 B] ──┼──▶ [取首个成功] ──▶ [输出]
└──▶ [候选 C] ──┘ │
取消其余分支
适用判据:
- 多个来源或多次生成可以互相替代,结果质量同档。
- 业务能接受“先到先得”,而不是“必须最全”。
- 其余分支可以被真正取消,且取消不会留下副作用。
成本特征:为赢得竞速,可能已经支付了多个分支的输入成本;省的是尾延迟,不是单价。若分支共享缓存,边际成本会低一些。
延迟特征:总延迟 ≈ min(各分支延迟)。收益最大,但方差也最大,p99 取决于最慢的成功分支。
失效方式:
- 分支带写操作,取消不彻底,产生重复副作用。
- 先返回的分支质量明显更差,但没有质量门槛。
- 竞速把下游配额打满,影响其他请求。
对应章节:6.1、5.2、9.2。
quorum:k of n
┌──▶ [副本 A] ──┐
[输入] ──┬──┼──▶ [副本 B] ──┼──▶ [凑够 k 票] ──▶ [输出]
└──▶ [副本 C] ──┘
需要 k = 2 / 3
适用判据:
- 需要多数一致或投票,单个结果不足以采信。
- 能容忍少数分支失败或超时。
- k 的取值有业务含义,不是“拍一个”。
成本特征:至少执行 k 个分支,n-k 个是冗余;成本约为单分支的 n 倍上限、k 倍下限。冗余换的是置信度,不是吞吐。
延迟特征:总延迟 ≈ 第 k 个完成分支的时间(顺序统计量)。k 越接近 n,延迟越接近 all。
失效方式:
- k 设得过低,两个相关分支一起错,投票变成背书。
- 分支之间不独立,同模型、同提示、同上下文,错误高度相关。
- 票数够但没有仲裁规则,冲突结果无法落地。
对应章节:3.2、6.1、7.1。
三、条件分支
┌── 条件 1 ──▶ [路径 A]
[输入] ──▶ [路由] ─┼── 条件 2 ──▶ [路径 B]
└── 默认 ────▶ [兜底路径]
适用判据:
- 输入可以被稳定分类,分类错误能被观测。
- 每条路径的边界清楚,且存在默认分支。
- 路由判断本身不需要复杂推理,或推理成本可接受。
成本特征:只执行命中的那条路径,理论上最省;但路由节点本身有成本,错分会导致返工,返工通常比多跑一条路径更贵。
延迟特征:总延迟 ≈ 路由开销 + 命中路径延迟。路由如果调用模型,会额外增加一次首字延迟。
失效方式:
- 路由漂移:输入分布变了,条件没跟着改。
- 默认分支变成黑洞,所有未覆盖输入都掉进去。
- 分类器与执行能力的版本不一致,路由到已下线的节点。
对应章节:1.2、3.1、7.2。
四、人机混合
[AI 生成] ──▶ [人工审核] ──┬── 通过 ──▶ [继续执行]
├── 修改 ──▶ [回写] ──▶ [继续]
└── 驳回 ──▶ [退回/终止]
适用判据:
- 错误代价高,或动作不可逆,必须有人承担责任。
- 人工能读懂中间产物,而不是面对一整段黑箱输出。
- 审核 SLA、队列上限与超时处理可以定义。
成本特征:人工时长是主要成本,AI 成本只是前置;一次返工可能超过十次自动执行。人工作业不能按 token 计价,要按分钟或按单计价。
延迟特征:总延迟 = AI 延迟 + 排队时间 + 人工处理时间,通常是小时级。它不适合放在同步请求路径上。
失效方式:
- 审核变成橡皮图章,人工只看一眼就通过。
- 队列积压,SLA 失效,业务绕开流程。
- 人工修改没有回写,下游仍用旧结果。
对应章节:6.2、9.2、10.2。
五、异步交付
[提交] ──▶ [任务队列] ──▶ [Worker] ──▶ [结果存储]
│ │
└── 返回 task_id ┌────┴────┐
▼ ▼
[轮询] [回调/通知]
适用判据:
- 任务时长超过同步超时,或用户愿意离开页面等结果。
- 任务可以幂等重放,重复执行不会产生第二次副作用。
- 结果可以延迟通知,且通知失败有补偿。
成本特征:队列、存储与闲置容量是固定开销;重试与补偿是变动开销。任务越短,固定开销摊得越薄;任务越少,越不该自建队列。
延迟特征:提交确认与完成交付分离。用户感知的是“受理延迟”,业务考核的是“完成时长 p95”,两者不能混用。
失效方式:
- 任务丢失,没有终态,用户永远等不到结果。
- 重复交付,同一个 task_id 被执行两次。
- 状态不一致,结果已生成但通知没发出。
对应章节:6.3、3.3、10.1。
六、模式选择表
| 场景特征 | 首选 | 备选 | 主要风险 |
|---|---|---|---|
| 后一步依赖前一步完整输出 | 串行 | 条件分支 | 失败传播、上下文累积 |
| 多个独立子任务可同时做 | 并行 all | quorum | 最慢分支拖尾 |
| 多来源可互相替代 | 并行 any | 串行重试 | 重复副作用、质量不一 |
| 输入类型决定路径 | 条件分支 | 串行 | 路由漂移、默认黑洞 |
| 动作不可逆、责任要落地 | 人机混合 | 异步 + 人工 | 队列积压、橡皮图章 |
| 任务时长超过同步超时 | 异步交付 | 人机混合 | 丢任务、重复交付 |
表格只给第一判断。真实链路通常是组合:串行里嵌并行,并行分支里有人工审核,异步任务完成后回调触发下一段串行。
七、选模式前的四个提问
- 后一步是否真的需要前一步的全部输出? 如果只需要三个字段,就不该传整段上下文,串行也可以很便宜。
- 分支是否真的独立? 共享限流配额、共享写库、共享同一个用户会话,都不算独立。
- 失败是否允许部分交付? 允许,就该设计部分结果契约;不允许,就要把整链成功率当硬指标。
- 延迟预算是秒级还是小时级? 秒级只能在串行、并行、条件分支里选;小时级才轮到人工与异步。
四个问题有一个答不上来,说明结构还没想清楚,先不要进入成本优化。
小结
五种模式的价值不在名字,而在它们各自把成本、延迟与失败放在哪里。
串行把风险放在传播,并行把风险放在长尾,条件分支把风险放在路由,人机混合把风险放在队列,异步交付把风险放在终态。选模式,本质上是在选一种你更能承受的失败方式。
结构定了,再去算附录 B 的账;结构没定,算出来的数字只是好看的幻觉。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。