教程Claude Code系列第 4 / 8 篇

Claude Code 动态工作流怎么用:让 Claude 自己编排一组子代理

根据 Claude Code 团队的文章整理:动态工作流让 Claude 为眼前的任务临时写一段编排脚本,调度很多个各有独立上下文的子代理。讲清它解决什么问题、六种常见的编排方式、适合和不适合的场景,以及控制用量、保存和分享的办法。

发布 · 约 6 分钟读完 · 经人工审核()· 本站的内容怎么来的

本文根据公开分享整理,本站尚未实测。操作前请对照文末的原始来源。

本页目录(8 节)
  1. 它是怎么工作的
  2. 它解决什么问题
  3. 怎么让它用工作流
  4. 六种常见的编排方式
  5. 用在哪些地方
  6. 什么时候不该用
  7. 几条实用的建议
  8. 小结

这是“Claude Code 开发系列”的第四篇。

这一篇解决的问题是:有些任务,一个 Claude 在一个上下文里从头做到尾,效果就是不好。 比如检查 50 项只做了 35 项就说完成了,或者让它检查自己的结论时总是偏向自己。动态工作流是 Claude Code 给出的办法:让 Claude 为这一个任务临时写一段脚本,调度一组各自独立的子代理去做。

先说代价:动态工作流通常更费 token。 官方自己的建议是把它用在复杂、高价值的任务上。

它是怎么工作的

动态工作流执行的是一个 JavaScript 文件,里面有几个专门的函数用来发起和协调子代理:一个用来发起单个子代理,另外两个用来把很多个子代理组合成并行或流水线。脚本里也能用普通的 JavaScript 来处理数据。

两点值得知道:

  • 工作流可以决定每个代理用哪个模型,以及是否让子代理在各自的 worktree 里运行。 也就是 Claude 可以按需选择“多聪明”和“隔离到什么程度”。
  • 被打断了可以接着跑。 你中断了它,或者关了终端,恢复会话后工作流会从停下的地方继续。

它解决什么问题

默认情况下,Claude Code 要在同一个上下文窗口里既做计划又做执行。多数编码任务这样很好,但任务很长、要大量并行、结构性很强,或者需要互相挑错时,就容易出问题。原文点名了三种毛病:

毛病 表现
偷懒 任务又多又杂时,做了一部分就宣布完成。比如安全评审的 50 项只处理了 35 项
偏向自己 让它验证或评判自己的结论时,倾向于认为自己是对的
目标漂移 轮数多了,尤其是压缩过上下文之后,离最初的目标越来越远。每次总结都会丢一些细节,边界条件和“不要做某事”这类限制最容易丢

工作流的对策是:让一个个子代理各有自己的上下文窗口,各有一个明确而独立的小目标。

和“静态工作流”的区别:以前用 Agent SDK 或 claude -p 也能把多个 Claude 串起来,但那种固定的流程要照顾所有情况,所以往往比较笼统。动态工作流是 Claude 针对眼前这一个任务现写的。

怎么让它用工作流

直接让 Claude 做一个工作流就行;或者在提示词里用触发词 ultracode,确保它会创建工作流。

原文给的一些提示词(译自原文),可以感受一下它能做什么:

这个测试大概每 50 次失败 1 次。搭一个工作流来复现它。
对这个竞态问题提出几种互相竞争的解释,直到只剩一种经得起证据为止。
用一个工作流过一遍我最近的 50 次会话,找出我反复在纠正的地方,
把反复出现的那些变成 CLAUDE.md 里的规则。
这个文件夹里有 80 份简历。用工作流按后端岗位给它们排序,并对前十名复核一遍。
先用提问的方式向我问清评分标准。
用一个工作流,对照代码库核实我这篇博客草稿里的每一个技术说法。我不想发出任何错的东西。

六种常见的编排方式

Claude 写工作流时会用到并组合这几种模式。了解它们,你在提示词里就能点名要哪一种。

模式 做法 适合
先分类再处理 一个代理判断任务属于哪一类,再交给不同的代理或走不同的流程 一批性质不同的东西
分散再汇总 把任务拆成很多小步,每步一个代理,最后等全部做完再合并结果 小步骤很多,或者每一步需要干净的上下文、互不干扰
对抗式验证 每个代理的产出,由另一个代理按标准来挑错 结论必须可靠的工作
生成再筛选 先产生一批想法,再按标准筛选、去重,只留下质量最高的 起名、出点子
淘汰赛 不拆分任务,让几个代理用不同的办法做同一件事,再两两比较选出最好的 靠品味判断的工作
循环到做完 工作量不确定时,不固定跑几轮,而是一直发起代理,直到满足停止条件(比如没有新发现了) 排查、清理

用在哪些地方

原文列了不少,这里挑最有代表性的几类。作者提到,工作流有时在非技术的工作上反而更有用。

迁移和重构。 把任务拆成一系列要处理的单位:调用点、失败的测试、模块。每一处由一个子代理在自己的 worktree 里改,另一个代理对抗式地评审,然后合并。原文提到 Bun 从 Zig 改写成 Rust 就用了工作流。一个实用的提醒:告诉代理不要用很吃资源的命令,这样才能在你的机器上尽量多地并行。

深度调研。 Claude Code 里有一个用动态工作流做的 skill,/deep-research:分散去搜索、读取来源、对抗式地核实其中的说法,最后综合成一份带引用的报告。同样的做法也能用在别处,比如从 Slack 里的上下文整理一份进度报告。

逐条核实。 有一份报告,想核实里面每一个事实说法:一个代理找出所有说法,再给每一条各派一个代理去查。还可以再加一个代理检查来源的质量。

给大量东西排序。 想按某种定性的标准给一千多条东西排序(比如按严重程度排工单),放进一个提示词里质量会下降,也放不下。做法是办淘汰赛:每一次两两比较由一个新的代理来做。原文的说明是,比较两个东西哪个更严重,比直接打一个绝对的分数更可靠。

让规则真的被遵守。 有些规则写进了 CLAUDE.md,Claude 还是会漏。可以做一个工作流:每条规则一个验证代理。再加一个“怀疑者”代理复核,减少误报。

找根本原因。 调试时最好是提出几个独立的假设再分别检验,但在一个上下文里,Claude 容易偏向自己先想到的那个。工作流可以从结构上避免:让不同的代理分别从日志、文件、数据出发提出假设,每个假设再交给一组代理去验证和反驳。这不只适用于代码,“三月份销售额为什么掉了”也可以这样查。

大批量分拣。 工单队列、bug 报告这类人处理不完的积压。工作流给每一条分类、和已有的记录去重,然后采取行动:尝试修复,或者上报给人。

这里有一个和安全有关的做法值得单独记住,原文叫隔离:读取不可信的公开内容的代理,不给它任何高权限的操作;真正执行操作的是另一个代理,它只看得到前者的总结。这样外部内容里夹带的指令,碰不到有权限的那一环。

什么时候不该用

原文的态度很明确:工作流不是每个任务都需要,而且可能明显更费 token。

对普通的编码任务,先问自己一句:它真的需要更多的计算量吗? 比如多数常规的编码任务,并不需要五个评审员组成的小组。

几条实用的建议

提示词写细一点。 在提示词里点名上面那些模式,效果最好。工作流也不只适合大任务,可以让它做一个“快速的工作流”,比如对某个假设做一次快速的对抗式检查。

和 /goal、/loop 配合。 可以重复的工作流(分拣、调研、核实),配上 /loop 定期运行,用 /goal 设一个必须达到的完成条件。

给它设 token 预算。 可以在提示词里直接写一个预算,比如“用 1 万 token”,它会把这个当作上限。

保存和分享。 在工作流的菜单里按 s 可以保存。保存的工作流可以放在 ~/.claude/workflows 里,也可以通过 skill 分发:把工作流的 JavaScript 文件放进 skill 的文件夹,在 SKILL.md 里引用它。原文的建议是,让 Claude 把 skill 里的工作流当作模板,而不是必须原样执行的脚本,这样更灵活。

控制模型的成本。 Claude Code 2.1.296 新增了一个环境变量 CLAUDE_CODE_WORKFLOW_SUBAGENT_MODEL,可以让工作流里的所有代理统一用一个模型,见 Claude Code 2.1.295 到 2.1.296 更新。

小结

作者把动态工作流称为一个新的起点:怎么用好它,还有很多有待发现。从使用者的角度,可以这样记:

  • 一个上下文做不好的事,换成多个各管一小块的代理来做;
  • 让一个代理检查另一个代理,比让它检查自己可靠;
  • 它更贵,所以用在值得的地方,并给它设预算。

来源

通过 API 中转站使用这些模型?到 Veridrop 免费检测中转站给你的是不是它声称的模型,或者看看中转站排行榜前 100 名。

相关文章