11 Agent / Workflow 状态机与任务编排
章节目标
理解 Agent 和 Workflow 的工程边界,学会把复杂任务拆成状态、节点、工具、人审和异常恢复。
开篇案例:自由 Agent 为什么不适合直接进生产
一个团队做了供应链风险 Agent:用户输入订单号,Agent 自己决定查库存、查供应商、查物流,再生成处理建议。Demo 很顺,但试点时出现两个问题:工具偶发超时后 Agent 重复查询,成本飙升;某次物流状态不完整,Agent 仍然生成了“建议改交期”的结论。
这不是 Agent 不好,而是缺少状态机和控制面。生产系统不能让 Agent 在关键流程里自由漂移,必须用 Workflow 控制主路径,用状态记录过程,用人审阻断高风险动作,用异常恢复处理工具失败。
一句话:Agent 负责局部判断,Workflow 负责业务责任链。
Workflow 与 Agent
Workflow 适合固定流程,Agent 适合动态决策。生产系统里常见做法不是二选一,而是“Workflow 管主路径,Agent 处理局部动态任务”。
最小状态机
flowchart TD
startNode[接收任务] --> intentNode[意图识别]
intentNode --> retrieveNode[检索资料]
retrieveNode --> toolNode[调用工具]
toolNode --> validateNode[结果校验]
validateNode --> reviewNode{需要人审吗}
reviewNode -->|"是"| humanNode[人工确认]
reviewNode -->|"否"| outputNode[输出结果]
humanNode --> outputNode
节点设计
- 意图识别:判断是问知识、查数据、生成报告、创建任务还是发起审批。
- 检索节点:获取相关文档、表格或历史记录。
- 工具节点:调用数据库、表格、业务系统、消息系统或审批系统。
- 校验节点:检查字段、引用、权限和格式。
- 人审节点:高风险动作前暂停确认。
- 输出节点:生成报告、清单、工单、消息或可下载文件。
状态管理
生产 Agent 必须记录:
- 当前任务阶段。
- 已调用工具。
- 工具输入和输出摘要。
- 用户确认状态。
- 异常状态。
- 最终结果。
节点说明表示例
| 节点 | 输入 | 输出 | 失败处理 | 是否人审 |
|---|---|---|---|---|
| intent | 用户任务 | 任务类型、风险等级 | 低置信度转人工 | 否 |
| retrieve | 任务类型、关键词 | 文档片段、引用 | 无命中则请求补充 | 否 |
| tool_call | 订单号、用户角色 | 工具结果摘要 | 超时重试 1 次后降级 | 否 |
| validate | 工具结果、模型草稿 | 校验结果 | 字段缺失则阻断 | 否 |
| approval | 高风险建议 | 审批结论 | 拒绝则记录原因 | 是 |
FDE 要把每个节点写成输入输出明确的工程单元,而不是把所有逻辑都塞进一个 Prompt。
异常恢复设计
生产 Agent 至少要处理四类异常:
| 异常 | 策略 |
|---|---|
| 工具超时 | 重试、降级、转人工 |
| 权限不足 | 返回权限说明,不尝试绕过 |
| 数据冲突 | 标注冲突来源,要求人工确认 |
| 成本/循环失控 | 熔断,停止调用并记录 Trace |
如果一个 Agent 无法解释自己为什么停下,也就无法安全上线。
实操任务
为一个场景设计 Agent / Workflow:
- 入口。
- 状态字段。
- 节点列表。
- 工具列表。
- 人审节点。
- 异常处理。
交付物
- 状态机图。
- 节点说明表。
- 任务状态字段表。
- 异常恢复策略。
常见误区
- 让 Agent 自由决定所有步骤。
- 只看最终输出,不记录中间工具调用。
- 没有任务恢复机制。
- 高风险动作没有人审。
检查清单
- 是否知道每个节点输入输出?
- 是否能回放一次 Agent 执行过程?
- 是否能处理中断和工具失败?
- 是否明确哪些步骤由 Workflow 控制?