这是《LLM 应用开发 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 企业应用中,LLM 常常只是长流程中的一个节点。工作流编排把模型调用、规则、API、人工审批和异步任务组织成可观测、可恢复的执行图。
19.1 为什么需要编排
单次调用难以覆盖:
- 多步骤任务;
- 人工审批;
- 定时任务;
- 事件触发;
- 失败重试;
- 并行分支;
- 长时间等待;
- 多系统一致性。
Webhook
-> validate
-> classify
-> RAG answer
-> guardrail
|-- auto reply
+-- human review
19.2 编排方式
| 方式 | 适用 | 示例 |
|---|---|---|
| 代码编排 | 逻辑稳定 | FastAPI + service |
| 状态机 | 明确状态流转 | 工单处理 |
| 工作流引擎 | 长事务、审批 | Temporal、Airflow |
| 图编排 | 数据管道 | Dagster |
| 规则引擎 | 复杂决策 | Drools 类方案 |
不要为了“Agent 感”把稳定流程交给自由循环。固定流程用工作流,不确定部分再用模型。
19.3 状态机示例
| 状态 | 事件 | 动作 | 下一状态 |
|---|---|---|---|
| CREATED | start | 校验输入 | CLASSIFYING |
| CLASSIFYING | done | 保存分类 | RETRIEVING |
| RETRIEVING | done | 构造上下文 | GENERATING |
| GENERATING | done | 安全检查 | REVIEWING |
| REVIEWING | approve | 发送回复 | DONE |
| REVIEWING | reject | 记录原因 | FAILED |
状态要求:
- 状态数量有限;
- 事件幂等;
- 每次状态写入审计;
- 支持超时补偿;
- 可人工介入;
- 可回放。
19.4 DSL 设计
name: ticket-answer
input_schema: ticket-input.v1
steps:
- id: classify
type: llm
prompt: ticket-classifier.v3
timeout_ms: 5000
- id: retrieve
type: retrieval
profile: hybrid-policy.v2
depends_on: [classify]
- id: answer
type: llm
prompt: ticket-answer.v5
depends_on: [retrieve]
- id: review
type: human
when: answer.risk == "high"
DSL 的价值是把流程版本化,但不要过度抽象到难以调试。
19.5 异步任务
Client
-> POST /tasks
-> task_id
-> worker executes
-> callback / polling
-> result
实现要点:
- 任务持久化;
- 幂等任务 ID;
- 队列削峰;
- 优先级隔离;
- 超时取消;
- 死信重试;
- 进度可查询;
- 结果保留周期明确。
19.6 人工介入
模型草稿
-> 风险评分
|-- low: 自动发送
|-- medium: 人工抽检
+-- high: 强制审批
审批界面应显示用户问题、引用资料、模型草稿、工具调用、风险原因和最终动作。审批人只能看到权限内数据,审批记录要可追溯。
19.7 失败处理
| 失败 | 策略 |
|---|---|
| 模型超时 | 备用模型或模板 |
| 检索失败 | 关键词降级 |
| 工具失败 | 幂等重试 |
| 安全拦截 | 拒答并记录 |
| 数据不一致 | 终止并告警 |
| 队列堆积 | 限流和扩容 |
| 审批超时 | 升级或关闭 |
每个节点都应有明确 on_error 行为,而不是让异常穿透整个流程。
19.8 幂等与事务
外部系统调用示例:
update_order
-> request_id
-> target system dedupe
-> apply once
建议:
- 使用稳定业务 ID;
- 前置状态检查;
- 乐观锁版本号;
- 补偿动作;
- 本地消息表或事务日志;
- 不假设“没响应就是失败”。
19.9 版本与灰度
发布单元包括:
workflow version
prompt version
model version
tool version
policy version
dataset version
灰度策略可以按租户、用户比例、任务类型和风险等级执行,必要时新旧流程双跑,指标达标后全量。
19.10 观测
每个流程记录:
{
"workflow": "ticket-answer",
"version": "v7",
"status": "completed",
"steps": [
{"id": "classify", "latency_ms": 320, "status": "success"},
{"id": "retrieve", "latency_ms": 180, "status": "success"},
{"id": "answer", "latency_ms": 2400, "status": "success"}
],
"total_latency_ms": 2900
}
关键指标包括完成率、节点失败率、自动解决率、人工率、p95 耗时和单次成本。
本章小结
工作流编排把 LLM 变成可靠业务流程中的一个组件。要用状态机或工作流引擎管理步骤、超时、重试、人工审批和版本灰度,保证幂等和可回放。流程越关键,越需要显式状态和治理。
思考题
- 哪些任务适合工作流而不是自由 Agent?
- 状态机的每个节点应满足什么工程要求?
- 人工介入的阈值如何设计?
- 外部系统调用为什么要幂等?
- 工作流灰度需要绑定哪些版本?