核心思想

Claude Code 默认 harness 为编程而生,但长时间、大规模并行、强对抗的任务会让它在单一上下文里同时”规划 + 执行”时失灵(智能体偷懒、自我偏好偏差、目标漂移)。动态工作流让 Claude 为每个任务即时写出定制 harness,用各自独立上下文的子智能体来编排。文中给出六大可组合模式(分类并行动、扇出并汇总、对抗式验证、生成并筛选、锦标赛、循环直到完成)与迁移重构、深度研究、大规模分诊等用例——同时提醒:它更费 token,常规编程任务未必需要。

上周,我们在 Claude Code 中发布了动态工作流。现在,Claude 能够即时编写自己的 harness,为手头的任务量身定制。

Claude Code 默认的 harness 是为编程而打造的,但它对许多其他类型的任务同样有用——因为事实证明,很多任务在本质上都跟编程任务很相似。不过,确实存在一些特定类型的任务,我们必须在 Claude Code 之上构建专门的 harness 才能达到最佳性能,比如研究安全分析智能体团队,或者代码审查

动态工作流让你能够动态地创建 harness,使 Claude 能在 Claude Code 内部原生地解决上述所有问题,乃至更多。你还可以把这些工作流分享给别人、与他人复用。

在本文中,我会分享自己使用工作流的初步体验和心得,帮你把它的威力充分发挥出来。

话虽如此,最佳实践仍在不断摸索中!动态工作流往往会消耗更多 token,因此请仔细斟酌何时以及如何使用它们。注意:本文同样发布在 Claude 博客上

示例提示词

在深入技术细节之前,我想先抛出一些示例提示词,帮你打开思路,想象一下工作流能带来的种种可能:

  • “这个测试大约每 50 次运行就会失败一次。建立一个工作流来复现它,提出各种理论假设,并在多个 worktree 里对它们做对抗式测试 /goal 不要停,直到有一个理论成立为止。”
  • “用一个工作流,翻一遍我最近的 50 次会话,从中挖掘出我反复在做的纠正,并把那些反复出现的纠正变成 CLAUDE.md 规则。”
  • “用一个工作流,把过去半年里 Slack 中的 #incidents 全部翻一遍,找出那些反复出现、却还没有人建工单(ticket)的根本原因。”
  • “拿我的商业计划书,跑一个工作流,让不同的智能体分别从投资人、客户和竞争对手的视角去把它批得体无完肤。”
  • “这里有一个装着 80 份简历的文件夹,用一个工作流,针对后端岗位给它们排个名,并对前十名再做一次复核。用 AskUserQuestion 工具来对我做访谈,以确定评分标准(rubric)。”
  • “我需要给这个 CLI 工具起个名字。用一个工作流头脑风暴出一堆候选方案,再跑一场锦标赛,选出排名前三的。”
  • “用一个工作流,把我们代码里所有地方的 User 模型重命名为 Account。”
  • “把我的博客文章草稿过一遍,用一个工作流对照代码库核验其中的每一条技术性论断——我可不想发出任何错误的东西。“

动态工作流的运作原理

动态工作流会执行一个 JavaScript 文件,其中包含若干特殊函数,用来辅助生成并协调子智能体

动态工作流也包含 JSON、Math、Array 等标准 JavaScript 函数,以辅助处理数据。

有一点尤其值得了解:动态工作流可以决定每个智能体使用哪个模型,以及子智能体是否在各自独立的 worktree 中运行——这让 Claude 能够自行选择所需的智能水平和隔离程度。

如果工作流被中断(比如用户主动操作或退出了终端),恢复该会话时,工作流将能从中断处继续执行。

为什么需要动态工作流

当你让 Claude Code 默认的 harness 去做一个任务时,它需要在同一个上下文窗口里同时完成规划和执行。对许多编程任务来说,这种方式非常有效,但对于那些长时间运行、大规模并行、和/或高度结构化的对抗性任务,它有时会失灵。

原因在于:Claude 在单一上下文窗口里处理一个复杂任务的时间越长,就越容易陷入以下几种特定的失败模式:

  • **智能体偷懒(Agentic laziness)**指的是 Claude 在一个尤其复杂、由多个部分组成的任务尚未完成时就停了下来,仅取得部分进展便宣告任务完成——比如在一次安全审查的 50 个项目中只处理了 20 个。
  • **自我偏好偏差(Self-preferential bias)**指的是 Claude 倾向于偏爱自己得出的结果或发现,尤其是在被要求依据某个评分标准(rubric)去核验或评判这些结果时。
  • **目标漂移(Goal drift)**指的是在多轮交互过程中、尤其是在经历(上下文)压缩之后,对最初目标的忠实度逐渐流失。每一次摘要都是有损的,像边界情况要求、或”不要做 X”这类约束等细节都可能在过程中丢失。

创建一个工作流,通过编排多个各自拥有独立上下文窗口、目标聚焦且彼此隔离的 Claude,有助于对抗这些问题。

动态工作流 vs 静态工作流

你之前或许用过 Claude Agent SDK 或 claude -p 来创建静态工作流,从而把多个 Claude Code 实例协调到一起。

但由于静态工作流必须能应对所有边界情况,它们通常会更加通用、更偏一刀切。而有了 Claude Opus 4.8 和动态工作流,Claude 如今已经足够聪明,能够针对你的具体用例写出量身定制的 harness。

使用动态工作流的实用模式

你只需让 Claude 创建一个工作流,就可以开始使用动态工作流;或者使用触发词 “ultracode”,来确保 Claude Code 创建一个工作流。

不过,建立一套关于动态工作流如何运作的心智模型,能帮你理解何时该用它们,以及如何通过提示词去引导 Claude。

在构建工作流时,Claude 可能会用到并组合运用以下几种常见模式:

分类并行动(Classify-and-act)

用一个分类智能体来判定任务的类型,然后据此把任务路由到不同的智能体或行为。或者,也可以在末尾用一个分类器来决定输出。

扇出并汇总(Fan-out-and-synthesize)

把一个任务拆分成许多更小的步骤,为每个步骤运行一个智能体,然后再汇总这些结果。这种模式尤其适用于步骤数量很多的情况,或者当每个步骤都能从自己干净的上下文窗口中获益、以免彼此干扰或交叉污染时。汇总这一步是一道屏障(barrier)——它会等待所有扇出的智能体都完成,再把它们的结构化输出合并成一个结果。

对抗式验证(Adversarial verification)

对每一个被生成的智能体,再运行一个单独生成的智能体,依据某个评分标准或准则对前者的输出进行对抗式验证。

生成并筛选(Generate-and-filter)

围绕某个主题生成若干想法,然后依据某个评分标准或通过验证对它们进行筛选,去掉重复项,只返回质量最高、且经过检验的想法。

锦标赛(Tournament)

不是去分摊工作,而是让多个智能体围绕同一项工作展开竞争。生成 N 个智能体,让它们各自用不同的方法尝试完成同一个任务。随后,由一个评判智能体使用提示词或模型,以两两对比(pairwise)的方式对结果进行裁决,直到决出胜者。

循环直到完成(Loop until done)

对于工作量未知的任务,与其固定地跑若干轮(pass),不如循环地生成智能体,直到满足某个停止条件(比如没有新的发现了,或者日志里不再有错误了)。

使用场景

请发挥创造力,去思考何时以及如何让 Claude Code 创建动态工作流。我发现,对于非技术性工作,工作流有时甚至更有用。

迁移与重构

Bun 就是借助工作流从 Zig 重写为 Rust 的。关于具体是怎么做到的,你可以在 Jarred 的 X thread 里读到更多。

关键在于把任务分解成一系列需要逐一处理的步骤,比如各个调用点(callsite)、失败的测试、模块等等。为每一处修复在一个 worktree 里派生出一个子智能体去完成修复,再让另一个智能体做对抗式审查,然后把它们合并进来。可以考虑告诉智能体不要使用占用资源的命令,这样你就能最大限度地并行,而不至于把机器的资源耗尽。

深度研究

我们在 Claude Code 内部发布了一个深度研究技能(/deep-research),它就用到了动态工作流。具体来说,它会扇出多个网页搜索、抓取信息源、对它们的论断进行对抗式验证,并汇总出一份带引用来源的报告。

但这类研究你未必只用于网页搜索。比如,你可以让 Claude 从 Slack 的上下文中整理出一份状态报告,或者通过深入探索一个代码库来研究某个功能是如何运作的。

深度验证

另一方面,如果你手头有一份报告,想要核查并为其中引用的每一条事实性论断标注来源,你或许会想生成这样一个工作流:让一个智能体识别出所有的事实性论断,然后为每一条派生出一个子智能体去逐一详细核查。你还可以再安排一个验证智能体去检查那个负责找来源的子智能体,以确保它所给出的来源质量过硬。

排序

你可能有一份条目列表,想按某种定性的标准来排序,而你相信 Claude Code 擅长做这种评估,比如:把支持工单(support ticket)按 bug 的严重程度排序。但如果你试图在一个提示词里给 1000 多行排序,质量就会下降,而且也塞不进上下文。这时不妨改用锦标赛、由两两对比智能体组成的流水线(两两的比较判断比绝对打分更可靠),或者并行地分桶排名再合并。每一次比较都是它自己独立的一个智能体,因此那个确定性的循环负责维护整个对阵赛程,而真正留在上下文里的只有当前的运行顺序。

记忆与规则遵循

如果有某一套规则,你发现 Claude 总是会漏掉或处理得很吃力——哪怕已经写进了 CLAUDE.md——那就创建一个工作流,列出一份必须由验证智能体逐条核查的规则清单,一条规则对应一个验证者。再创建一个”怀疑论者”人设的子智能体去审视这些规则、确保它们合情合理,这有助于避免出现过多的误报。

反方向同样奏效:从你最近的会话和代码审查评论中挖掘出那些你反复在做的纠正,用并行的智能体把它们聚类,对每一个候选项做对抗式验证(“这条规则真的能避免一次真实的失误吗?”),然后把幸存下来的那些提炼回 CLAUDE.md 中。

根因调查

调试在你提出多个相互独立的假设并加以检验时效果最好,但如果你只用一个上下文窗口,Claude 就可能陷入自我偏好偏差。一个工作流可以从结构上杜绝这一点:让它生成多个智能体,从互不重叠的证据中各自提出假设。比如,让不同的智能体分别负责日志、文件和数据。随后,每一个假设都可以去面对一组由验证者和反驳者组成的评审小组。

这不只适用于代码。工作流可以用于销售(为什么三月份销售额下滑了?)、数据工程(这条流水线为什么会失败?),或者任何复盘(post-mortem)工作。

大规模分诊

每个团队都有一个支持队列、bug 报告,或是其他某种靠人力无法全部处理完的待办积压。

一个分诊(triage)工作流会对每个条目进行分类,跟已经在跟踪的内容去重,然后采取行动。这可能意味着尝试去修复,也可能意味着上报给人工用户。

分诊工作流有一个很有用的模式叫隔离区(quarantine)。它的做法是:禁止那些读取了不受信任的公开内容的智能体执行高权限操作,而这些操作则交由那些负责对信息采取行动的智能体来完成。

把分诊工作流和 /loop 搭配使用,就能让 Claude 持续不断地干这件事。

探索与品味

当你要探索某个解决方案的不同思路时,工作流会很有用——尤其是当它偏向品味取向时,比如设计或命名,而且能从一份评分标准中获益。

不妨让 Claude 去探索一大批解决方案,并给一个审查智能体一份评分标准,说明一个好的解决方案应该是什么样的。当这个审查智能体认为已经满足了所有准则时,任务即告完成。各个解决方案也可以依据评分标准、通过一场锦标赛来排序或选出。

评测

你可以为特定任务运行轻量级的评测(eval):在一个 worktree 里派生出若干独立的智能体,然后再派生出若干对比智能体,依据一份评分标准来对比并给这些具体的输出打分。比如,依据某个特定准则去评估并随后改进你创建的某个技能。

模型与智能路由

创建一个针对你的任务调过的分类智能体,由它来决定该用哪个模型。当你的任务会涉及大量工具调用时,这会很有帮助——在执行之前先做一番研究,可以识别出最适合这项工作的模型。

举个例子,对于”解释一下 auth 模块是如何工作的”这个任务,最合适的模型取决于 auth 模块里有多少文件、以及代码库的形态。一个分类智能体可以先做这番调研,然后根据任务的预期复杂度,路由到 Sonnet 或 Opus。

什么时候不该用动态工作流

工作流是个新东西。尽管在许多用例中它能带来超乎寻常的成效,但它并非每个任务都需要,而且最终可能会消耗多得多的 token。

最好是创造性地运用工作流,把 Claude Code 推向你以前没尝试过的方向。对于常规的编程任务,不妨问问自己:它真的需要更多算力吗?比如,大多数传统编程任务并不需要一个由 5 名审查者组成的评审小组。

构建动态工作流的小技巧

提示词

为动态工作流编写详尽的提示词、运用我们上面所述的那些具体技巧,能带来最好的结果。

工作流并不只适用于大型任务。你可以提示模型使用一个”快速工作流(quick workflow)“。比如,你可以对某个假设做一次快速的对抗式审查。

与 /goal 和 /loop 搭配

当使用那些可重复运行的工作流时(比如分诊、研究或验证),把它们与 /loop 搭配,以便按固定时间间隔运行;并用 /goal 来设定一个硬性的完成要求。

token 用量预算

你可以为动态工作流设定明确的 token 用量预算,来限制一个任务能消耗多少 token。你可以用一个预算来提示它,比如”用 10k token”,这就会设定一个上限。

保存与分享动态工作流

在工作流菜单中按 “s” 即可保存工作流。你可以把这些工作流签入 ~/.claude/workflows,或者通过一个技能来分发它们。

若要通过技能来分享它们,就把你的 JavaScript 工作流文件放进技能及其文件夹中,并在 SKILL.MD 里引用它们。为了获得更大的灵活性,你或许会想提示 Claude:把技能里的工作流当作一个模板,而不是一个必须逐字照搬运行的脚本。

一个全新的世界

工作流是扩展 Claude Code 的一种有用的新方式。我鼓励你把它当作一个起点——关于如何把它们用到最好,仍有很多有待发掘的东西。欢迎告诉我们你的发现。

Thariq Shihipar 和 Sid Bidasaria(@sidbid)是 Anthropic 的技术成员,从事 Claude Code 的相关工作。

相关笔记