02 · Workflow 编排:路径写死反而更好
零、开始之前
这篇的目标:学会判断「这个需求到底该不该用 Agent」,并且能把不该用 Agent 的那部分,用三种基本形状搭出来。
需要的前置知识:读过 01 ReAct,知道 Agent 循环长什么样。会用 Python 的 ThreadPoolExecutor(不会也没关系,本篇会讲)。
读完你会明白:
- 为什么线上很多「AI Agent」其实是 Workflow,而且这通常是对的
- 链式、并行、路由三种形状分别解决什么问题
- Workflow 和 Agent 的分界线具体在哪一行代码上
- 为什么 Workflow 场景要把 temperature 调低
先给一个可能反直觉的结论:
上一篇教你把方向盘交给模型。这一篇教你什么时候要把方向盘拿回来 —— 而且大多数时候你都该 拿回来。
一、先看一个真实问题
你要做一个客服工单处理系统。用户发来一句话,系统要给出回复。
工单大概分三类:账单问题、技术故障、退款申请。三类问题的处理方式完全不同 —— 账单要查系统、技术要问日志、退款要走审批。
用 01 的 ReAct 怎么做? 给模型三个工具(查账单、查日志、发起退款),让它自己判断该调哪个。能跑。但上线之后你会遇到:
| 问题 | 具体表现 |
|---|---|
| 贵 | 每个工单至少 2 次模型调用(判断 + 回答),复杂的 5-6 次 |
| 慢 | 每一轮都是一次完整的网络往返,P99 延迟根本控不住 |
| 不可预测 | 同一个工单,今天走了 3 步,明天走了 5 步 |
| 没法测 | 你没办法写单元测试,因为路径每次都不一样 |
| 出错难查 | 客户投诉「回复驴唇不对马嘴」,你要翻一长串对话历史才知道哪步歪了 |
而实际上,这个业务的路径是完全确定的:判断类型 → 走对应流程 → 出回复。三条路,就这三条。
既然路径是确定的,为什么要让模型每一步都重新决定一次?
二、那直接写一个大 prompt 行不行
你可能想:那我把三种情况都写进一个 prompt,让模型一次搞定。
prompt = """
你是客服。判断用户问题属于账单/技术/退款哪一类,
然后按对应的规范回复。账单类要包含账期和金额,
技术类要给出排查步骤,退款类要说明审批流程和时限。
用户问题:{input}
"""
这也能跑,但质量会明显不如拆开。原因很实在:
一次要求模型做太多事,它每件都会做得敷衍。 你让它同时「判断类型 + 遵守该类型的格式规范 + 组织语言」,它的注意力被摊薄了。实测下来,把它拆成「先判断,再按专门的 prompt 回复」,两步各自的质量都会上升。
这就引出了 Workflow 的核心思想:
把一个大任务拆成几个小任务,每次只让模型做一件事;至于这些小任务怎么串起来,由你的代码决定,不由模型决定。
三、概念:三种基本形状
Anthropic 在《Building Effective Agents》里把这件事讲得最清楚。他们先划了一条分界线:
| 定义 | |
|---|---|
| Workflow | 路径预先定义好的系统,模型只在每个格子里干活 |
| Agent | 模型自己决定路径的系统 |
然后归纳出五种基本模式。本篇讲其中三种最基础的,另外两种因为已经越过分界线,放到后面单独讲:
| 模式 | 中文 |
|---|