Anthropic 工作流模式:简单胜过复杂 本节摘要:很多团队为一个其实只需要一次函数调用的问题伸手去拿多 Agent 框架,代价是真实的——框架加层遮蔽了提示、藏起控制流、招来过早的复杂度。Schluntz 与 Zhang(Anthropic, 2024 年 12 月)的帖子是业界被引用最多的反弹:从简单开始,只在复杂度挣回它的代价时才加上去。他们把「工作流」(工程师拥有的预定义路径)与「Agent」(模型动态决定自己的工具与步骤)分开,并给出五种覆盖大多数场景的工作流模式:提示链(线性分解)、路由(分类派发)、并行化(扇出聚合,分块或投票)、编排者-工作者(编排 LLM 动态选专家)、评估者-优化者(提议-评判循环直到通过,即第 05 节自我精炼的泛化)。
本节摘要:很多团队为一个其实只需要一次函数调用的问题伸手去拿多 Agent 框架,代价是真实的——框架加层遮蔽了提示、藏起控制流、招来过早的复杂度。Schluntz 与 Zhang(Anthropic, 2024 年 12 月)的帖子是业界被引用最多的反弹:从简单开始,只在复杂度挣回它的代价时才加上去。他们把「工作流」(工程师拥有的预定义路径)与「Agent」(模型动态决定自己的工具与步骤)分开,并给出五种覆盖大多数场景的工作流模式:提示链(线性分解)、路由(分类派发)、并行化(扇出聚合,分块或投票)、编排者-工作者(编排 LLM 动态选专家)、评估者-优化者(提议-评判循环直到通过,即第 05 节自我精炼的泛化)。所有模式都建立在「增强 LLM」之上——一个带检索、工具、记忆三能力的 LLM。本节吃透这五种模式、何时选工作流何时选 Agent,并用标准库对照一个脚本化 LLM 把五种模式全部实现一遍,每个模式仅需 10~15 行代码。
对应原课程:Phase 14 · Lesson 12 ·
anthropic-workflow-patterns(原英文phases/14-agent-engineering/12-anthropic-workflow-patterns/docs/en.md)。
阅读完本节,你应当能够:
团队为「想要一次函数调用」的问题伸手去拿多 Agent 框架。代价是真实的:框架加层遮蔽提示、藏起控制流、招来过早复杂度。Schluntz 与 Zhang 2024 年 12 月的帖子是业界被引用最多的反弹:从简单开始,只在复杂度挣回代价时才加。
两者各有位置。工作流更便宜、更快、更易调试。Agent 解锁开放性问题,但让失败模式更难推理。
五种模式都建立在一个原子上:一个 LLM,接上三种能力——检索(搜索)、工具(动作)、记忆(持久化)。任何一次 API 调用都能用这三样。
💡 设计要点:决策的简化版——「下一步能不能预测?」能预测就用工作流,不能就用 Agent。这条线一划,90% 的「我们需不需要 Agent 框架」之争就消停了。Anthropic 自己的立场是:大多数生产任务,直接 API 调用就够。
Anthropic 2025 年的《Effective context engineering for AI agents》把相邻学科形式化:20 万窗口是预算,不是容器。要包括什么、何时压缩、何时让上下文增长——这是本系列上下文工程(第 12 章)讨论的内容。
原课程 code/main.py 对照一个 ScriptedLLM 实现全部五种模式:
prompt_chain(input, steps) —— 顺序。route(input, classifier, handlers) —— 分类 + 派发。parallel_vote(prompt, n, aggregator) —— N 次跑,聚合。orchestrator_workers(task, workers) —— 编排者选工作者。evaluator_optimizer(task, proposer, evaluator, max_iter) —— 循环到通过。核心骨架如下,用伪代码展示。
def prompt_chain(input, steps): data = input for step in steps: data = llm(step, data) # 上一步输出是下一步输入 if not gate_check(data): # 程序化闸门 return None return data
def route(input, classifier, handlers): category = llm(classifier, input) # 分类器决定走哪条 handler = handlers[category] return llm(handler, input)
def parallel_vote(prompt, n, aggregator): results = [llm(prompt) for _ in range(n)] # 同一提示跑 N 次 return aggregator(results) # 多数表决或综合
def orchestrator_workers(task, workers): plan = llm("决定该用哪些工作者", task) # 动态选 chosen = [workers[name] for name in plan] outputs = [llm(w, task) for w in chosen] return llm("综合以下输出", outputs) # 编排者综合
def evaluator_optimizer(task, proposer, evaluator, max_iter=5): answer = llm(proposer, task) for _ in range(max_iter): verdict = llm(evaluator, task + answer) if verdict["pass"]: return answer answer = llm(proposer, task + verdict["feedback"]) # 带反馈重提 return answer
运行 python3 code/main.py 会看到每个模式打印自己的轨迹。每个模式的代码量约 10~15 行;一个框架的代价以千行计。
💡 设计要点:这五个模式的代码量小得惊人——这正是 Anthropic 帖子的核心论点。当你发现「我需要的模式」可以用 15 行写出来时,引入一个几千行的框架就需要非常具体的理由(持久状态、Actor 并发、角色模板)。否则,直接 API 调用永远是第一选择。
| 选项 | 何时伸手 | 代价 |
|---|---|---|
| 直接 API 调用 | 默认 | 最低 |
| Claude Agent SDK | 要 Claude Code 形态 | 中 |
| LangGraph | 要持久状态图 | 中高 |
| CrewAI | 要角色模板 | 中 |
| AutoGen v0.4 | 要 Actor 并发 | 高 |
本节产出一份可复用技能(原课程 outputs/skill-workflow-picker.md):
skill-workflow-picker.md:给定一个任务描述,挑出正确的模式,附决策理由与「工作流不够时如何重构为 Agent」的路径。包含一份五模式决策表(线性分解?类别分派?可并行?需动态选专家?需迭代精炼?),以及一份「该不该上框架」检查清单(有没有持久状态?有没有 Actor 并发?有没有角色模板?三个都没有就别上)。Python 代码(code/main.py)是五种模式的独立可运行骨架,把 ScriptedLLM 换成真实厂商调用即可投入生产——这正是「简单胜过复杂」的活样本。
parallel_vote 加超时。一个调用挂了会怎样?缺票时如何聚合?evaluator_optimizer 变成赌博机:跨迭代保留 top-2 输出,这样后到的好结果不会被后到的坏结果覆盖。下一节,我们进入「状态图编排」——LangGraph 把本节的工作流模式落到一个显式的、可持久化的有状态图框架里,当你的模式确实需要持久状态与可中断恢复时,它才挣回自己的代价。