回顾你最近一周的工作,找出一个重复性任务,判断它是否适合工作流:
Level 1: 识别你的第一个工作流场景判断标准:
- 需要处理多个相似的输入(多个文件、多个数据源、多个服务)
- 有清晰的阶段划分(提取 → 转换 → 验证 → 输出)
- 希望每次执行的流程一致
- 可以部分或全部并行执行
写下来:
- 任务描述(一句话)
- 当前怎么做的
- 如果用工作流,会分成哪几个阶段
- 预期节省多少时间
学习目标:
- 理解单次对话和工作流的本质区别
- 识别适合工作流的任务特征
- 了解工作流编排的核心价值
前置要求:使用过 Claude Code 或类似 AI 工具 | 下一课 第 2 课 >>
你让 Claude Code 重构一个大型代码库:"帮我把这个 5000 行的单体应用拆分成微服务架构。"
Claude 开始分析。它读取文件、识别模块边界、提取依赖关系……然后在第 47 个文件时,上下文窗口满了。它忘记了前面做过什么,重新开始,陷入循环。1
或者你要求它"审查所有 PR 并生成本周的发布说明"。Claude 一次只能处理一个 PR,你得手动运行 20 次,每次都要重新解释格式要求。
这就是单次对话的极限:一个对话、一个上下文窗口、一条推理链。对于复杂任务,这个模式会崩溃。2
工作流是一个可执行的脚本,它把复杂任务拆解成多个步骤,每个步骤委托给一个新的代理,由脚本负责协调。3
关键区别:
举个例子,重构工作流的脚本可能是:
这个脚本持有循环、分支和中间结果,Claude 的上下文只看到最终答案。编排是确定性的,只有每个步骤内的工作由模型驱动。3
适合工作流的任务有四个特征:
典型场景:
不适合工作流的场景:
工作流不是凭空出现的,它是 Claude Code 编排能力的第四个阶段:1
阶段 1: 单体代理
阶段 2: 子代理扇出(Agent 工具)
阶段 3: 代理团队
阶段 4: 工作流编排
工作流的核心创新是控制流反转:不是让 Agent 决定"接下来做什么",而是让脚本决定"接下来调用哪个 Agent"。3
编排(Orchestration)就是字面意思:一个乐谱,多个音乐家。1
在工作流中:
for 循环、if 语句、Promise.allagent() 调用启动的子代理一个普通的 Agent 在运行时即兴决定控制流:"先做 A,然后看情况决定做 B 还是 C"。
一个工作流把控制流写死在脚本里:"先并行做 A1-A10,全部完成后做 B,如果 B 返回的 score > 0.8 就做 C,否则做 D"。
确定性编排的好处:
.claude/workflows/,可以按名字调用让我们看一个真实场景。你的团队有 15 个待审查的 PR,每个 PR 需要检查:
用单次对话,你得运行 15 次,每次手动切换 PR。
用工作流:
这个工作流的价值:
下一课: 第 2 课:工作流的基本组成 — 学习工作流的构建块:步骤、状态、分支和循环
ClaudeWorld:什么是工作流?多代理编排详解 — https://claude-world.com/articles/what-is-a-workflow-multi-agent-orchestration/ ↩ ↩2 ↩3
Claude Code 官方文档:工作流编排 — https://code.claude.com/docs/en/workflows ↩ ↩2 ↩3
Alex Op:Claude Code 工作流确定性多代理编排 — https://alexop.dev/posts/claude-code-workflows-deterministic-orchestration/ ↩ ↩2 ↩3 ↩4
判断标准:
写下来:
场景 A: 修复一个函数的 bug,函数有 50 行代码,逻辑清晰
场景 B: 将一个包含 30 个组件的 UI 库从 Material-UI v4 升级到 v5
写出你的判断和理由(每个场景 2-3 句话)。
// 伪代码示例
async function refactorWorkflow(codebase) {
// 步骤 1: 并行分析所有模块
const modules = await Promise.all(
codebase.files.map(file =>
agent({ task: `分析 ${file} 的职责和依赖` })
)
);
// 步骤 2: 生成微服务边界方案
const plan = await agent({
task: '基于分析结果设计微服务边界',
context: modules
});
// 步骤 3: 并行提取每个服务
const services = await Promise.all(
plan.services.map(svc =>
agent({ task: `提取 ${svc.name} 服务的代码` })
)
);
// 步骤 4: 验证所有服务的测试通过
return await agent({
task: '运行所有服务的测试套件',
context: services
});
}
┌─────────┐│ Claude │ 一个上下文窗口做所有事:└─────────┘ 读取、规划、编辑、测试┌─────────┐│ Claude │──→ agent: "搜索代码库"│ (main) │──→ agent: "读取这 40 个文件"└─────────┘ 结果返回给父代理┌─────────┐ ┌─────────┐ ┌─────────┐│ Planner │───→│ Coder │───→│ Tester │└─────────┘ └─────────┘ └─────────┘ 每个代理保持自己的角色和上下文 ┌─────────────────┐ │ Workflow Script │ 持有循环、分支、状态 └────────┬────────┘ ┌───┴───┬───────┬───────┐ ↓ ↓ ↓ ↓ agent() agent() agent() agent() 每个调用启动独立的子代理async function reviewPRsWorkflow(prList) {
// 阶段 1: 并行审查所有 PR
const reviews = await Promise.all(
prList.map(pr =>
agent({
task: `审查 PR #${pr.number}`,
prompt: `检查代码风格、潜在 bug、测试和文档。
输出 JSON: { style: score, bugs: [],
coverage: number, docs: boolean }`
})
)
);
// 阶段 2: 汇总报告
return await agent({
task: '生成周报',
prompt: `基于 ${reviews.length} 个 PR 的审查结果,
生成本周的代码质量报告,
按严重性排序问题`
});
}