上周,我们发布了 Claude Code 的动态工作流。现在,Claude 能够即时编写自己的 harness,为手头的任务量身定制。
虽然默认的 Claude Code harness 是为编程设计的,但它同样适用于许多其他类型的任务——因为事实证明,很多任务都类似于编程任务。然而,在某些特定类型的任务中,我们不得不在 Claude Code 之上构建自定义 harness 以达到最佳性能,例如研究、安全分析、Agent 团队或代码审查。
动态工作流允许你动态创建 harness,使 Claude 能够在 Claude Code 中原生解决所有这些问题以及更多。你还可以与其他人分享并重复使用这些工作流。
在这篇文章中,我将介绍我对动态工作流的初步体验和收获,以便你能够充分利用它。
需要注意的是,最佳实践仍在不断演进!动态工作流通常会消耗更多 tokens,因此请仔细考虑何时以及如何使用它们。
注意:这篇文章也发布在 Claude 博客上。
示例提示
在深入技术细节之前,我想先给出一些示例提示,让你开始思考动态工作流的可能性:
- “这个测试大约每 50 次运行中会失败 1 次。创建一个工作流来复现它,提出假设,并在工作树中对抗性测试它们 /goal 直到找到有效的理论为止。”
- “使用工作流,回顾我最近 50 次会话,挖掘我反复犯的错误,并将反复出现的错误转化为 CLAUDE.md 规则。”
- “使用工作流,在 Slack 中翻阅过去六个月的 #incidents 话题,找出没人提交 ticket 的反复出现的根本原因。”
- “拿我的商业计划书,运行一个工作流,让不同的 Agents 从投资者、客户和竞争对手的角度对它进行剖析。”
- “这里有 80 份简历的文件夹,使用工作流为后端职位对它们进行排名,并对前十名进行双重检查。使用 AskUserQuestion 工具按评分标准对我进行面试。”
- “我需要为这个 CLI 工具起个名字。使用工作流 brainstorm 一堆选项,然后运行一个锦标赛选出前三名。”
- “使用工作流,将我们的 User 模型在所有地方重命名为 Account。”
- “浏览我的博客文章草稿,使用工作流验证每一项技术声明是否与代码库一致——我不想发布任何错误内容。”
动态工作流的工作原理
动态工作流执行一个 JavaScript 文件,该文件包含一些特殊函数,用于生成和协调 subagents:

动态工作流还包括标准的 JavaScript 函数,如 JSON、Math 和 Array,以帮助处理数据。
特别有用的一点是,动态工作流可以决定 Agents 使用哪个模型,以及 subagents 是否在各自的工作树中运行,从而使 Claude 能够灵活选择所需的智能级别和隔离程度。
如果工作流被中断(例如由于用户操作或退出终端),恢复会话后工作流可以从中断处继续执行。
为什么需要动态工作流
当你要求默认的 Claude Code harness 执行一个任务时,它需要在同一个上下文窗口中同时进行规划和执行。对于许多编程任务来说,这种方法非常高效,但在长时间运行、大规模并行和/或高度结构化的对抗性任务中,它有时会失效。
这是因为 Claude 在单个上下文窗口中处理复杂任务的时间越长,就越容易受到以下几种特定失败模式的影响:
- Agent 懒惰:指 Claude 在完成一个特别复杂的多部分任务之前就停止,并宣称工作已完成——例如,在一次安全审查中只处理了 50 个项目中的 20 个。
- 自我偏好偏差:指 Claude 倾向于偏好自己的结果或发现,尤其是在要求它根据评分标准进行验证或评判时。
- 目标漂移:指经过多轮交互后,对原始目标的忠实度逐渐降低,尤其是在压缩后。每次总结步骤都会丢失一些信息,例如边缘情况的要求或“不要做 X”的约束可能会丢失。
创建工作流有助于对抗这些问题,因为它可以协调多个独立的 Claude 实例,每个实例拥有自己的上下文窗口和聚焦、隔离的目标。
动态工作流与静态工作流
你可能之前使用 Claude Agent SDK 或 claude -p 创建过静态工作流,用于协调多个 Claude Code 实例。
但由于静态工作流需要涵盖所有边缘情况,它们通常更加泛化。借助 Claude Opus 4.8 和动态工作流,Claude 现在足够智能,可以为你的用例编写一个完全定制的 harness。

使用动态工作流时的有用模式
你可以直接让 Claude 创建一个动态工作流,或者使用触发词“ultracode”来确保 Claude Code 会创建工作流。
但是,建立一个关于动态工作流如何运作的心理模型,将帮助你理解何时使用它们,以及如何通过提示来引导 Claude。
Claude 在构建工作流时可能会使用并组合几种常见模式:

分类并执行
使用一个分类 Agent 来决定任务类型,然后根据任务路由到不同的 Agents 或行为。或者,在结束时使用分类器来确定输出。
扇出并综合
将任务拆分成许多较小的步骤,在每个步骤上运行一个 Agent,然后综合这些结果。这对于有大量较小步骤的情况特别有用,或者当每个步骤需要自己干净的上下文窗口以避免相互干扰或交叉污染时。综合步骤是一个屏障——它等待所有扇出的 Agents,然后将它们的结构化输出合并为一个结果。
对抗性验证
对于每个生成的 Agent,运行一个独立的生成 Agent 来对抗性地验证其输出是否符合评分标准或准则。
生成并过滤
生成某个主题的一系列想法,然后通过评分标准或验证进行过滤,去重,只返回经过测试的最高质量想法。
锦标赛
不进行分工,而是让 Agents 互相竞争。生成 N 个 Agents,每个都尝试使用不同的方法完成同一项任务。然后,提示或模型使用一个评判 Agent 以两两比较的方式评判结果,直到选出获胜者。
循环直到完成
对于工作量未知的任务,循环生成 Agents,直到满足停止条件(没有新的发现,或日志中不再有错误),而不是使用固定的轮数。
使用场景
创造性地思考何时以及如何让 Claude Code 创建动态工作流。我发现,动态工作流有时甚至对非技术性工作更有用。

迁移和重构
Bun 使用工作流从 Zig 重写为 Rust。你可以在 Jarred 的 X 帖子 中阅读更多关于如何实现的信息。
关键是将任务分解为一系列需要处理的操作步骤,例如调用点、失败的测试、模块等。在每个工作树中为每个修复生成一个 subagent 来进行修复,然后让另一个 Agent 进行对抗性审查,最后合并。考虑告诉 Agent 不要使用资源密集型的命令,这样你可以最大限度地并行化,而不会耗尽机器资源。
深度研究
我们在 Claude Code 中发布了一个深度研究技能(/deep-research),它使用了动态工作流。具体来说,它扇出网络搜索、获取来源、对抗性地验证其声明,并综合成一份带有引用的报告。
但你可以进行的不只是网页搜索这类研究。例如,让 Claude 从 Slack 的上下文中编译一份状态报告,或者通过深入探索代码库来研究某个功能的工作原理。
深度验证

另一方面,如果你有一份报告,希望检查并引用其中提到的每一项事实性声明,你可以生成一个工作流:一个 Agent 识别所有事实性声明,然后生成一个 subagent 来详细检查每一项。你还可以有一个验证 Agent 来检查源 subagent,确保其来源质量高。
排序

你可能有一个想要按某种定性指标排序的项目列表,而你认为 Claude Code 擅长评估这些指标,例如:按 bug 严重程度排序的支持工单。但是,如果你试图在一个提示中对 1000 多行进行排序,质量会下降,并且超出上下文容量。相反,运行一个锦标赛、一个两两比较 Agent 的流水线(比较判断比绝对评分更可靠),或者并行进行桶排序然后合并。每次比较都是独立的 Agent,因此确定性循环持有括号,只有运行顺序保留在上下文中。
记忆和规则遵守

如果你发现 Claude 经常遗漏或难以遵守某些特定规则——即使这些规则已经写入了 CLAUDE.md 文件中——可以创建一个工作流,其中包含一组必须由验证者 Agents 检查的规则列表(每条规则对应一个验证者)。创建一个怀疑者角色 subagent 来审查规则,确保它们合理,将有助于避免过多的误报。
反向操作也有效:挖掘你最近的会话和代码审查评论中你反复犯的错误,使用并行 Agents 进行聚类,对抗性地验证每个候选规则(这条规则本可以防止一个真正的错误吗?),然后将幸存下来的规则提炼回 CLAUDE.md 中。
根本原因调查
调试的最佳方式是提出几个独立的假设并进行测试,但如果只使用一个上下文窗口,Claude 可能会遇到自我偏好偏差。
工作流可以通过生成 Agents 从不相交的证据中提出假设来从结构上防止这种情况。例如,为日志、文件和数据分别设置单独的 Agents。然后,每个假设可以面对一个由验证者和反驳者组成的评审团。
这不仅仅适用于代码。工作流可用于销售(为什么三月份销售额下降了?)、数据工程(为什么这个管道失败了?),或任何事后复盘活动。
大规模分类

每个团队都有一个支持队列、错误报告或其他人类无法完全处理的积压工作。
一个分类工作流会对每个项目进行分类,与已跟踪的项目去重,然后采取行动。这可能意味着尝试修复或升级给人类用户。
一个有用的分类工作流模式是隔离。这意味着禁止读取不受信任公共内容的 Agents 执行高权限操作,而这些操作将由负责处理信息的 Agents 执行。
将分类工作流与 /loop 配对,可以让 Claude 持续执行此操作。
探索和品味
动态工作流在探索不同解决方案时很有用,尤其是在基于品味的情况下,例如设计或命名,并且从评分标准中受益。
尝试让 Claude 探索一系列解决方案,并给审查 Agent 一个评分标准,说明一个好的解决方案是什么样的。当审查 Agent 认为已满足标准时,任务完成。解决方案也可以通过基于评分标准的锦标赛进行排序或选择。
评估
你可以通过在工作树中生成独立的 Agents,然后生成比较 Agents 来根据评分标准比较和评分特定输出,从而对特定任务运行轻量级评估。例如,评估然后根据特定标准优化你创建的技能。
模型和智能路由
创建一个针对你任务调整的分类 Agent,用于决定使用哪个模型。当你的任务将涉及大量工具调用时,这很有帮助,在执行之前进行研究可以确定最适合该工作的模型。
例如,对于“解释 auth 模块的工作原理”这个任务,最佳模型取决于 auth 模块中有多少文件以及代码库的结构。分类 Agent 可以进行这项研究,然后根据任务的预期复杂度路由到 Sonnet 或 Opus。
何时不使用动态工作流
动态工作流是新的。虽然有很多用例会带来超常的结果,但它们并非每个任务都需要,并且可能会显著增加 token 消耗。
最好创造性地使用动态工作流,以你之前未曾尝试的方式推动 Claude Code。对于常规编码任务,尝试问问自己:它真的需要更多计算能力吗?例如,大多数传统的编码任务不需要一个由 5 个审查者组成的评审团。
构建动态工作流的技巧
提示技巧
使用我们上面描述的具体技巧对动态工作流进行详细提示,能产生最佳效果。
动态工作流不仅仅适用于大型任务。你可以提示模型使用“快速工作流”。例如,你可以创建一个对假设的快速对抗性审查。
与 /goal 和 /loop 结合使用
在使用可重复的工作流(例如分类、研究或验证)时,将它们与 /loop 配对以定期运行,并与 /goal 配对以设置硬性完成要求。
Token 用量预算
你可以为动态工作流设置显式的 token 用量预算,以限制任务使用的 tokens 数量。你可以用如下提示设置预算:“使用 10k tokens”,这将设定上限。
保存和分享动态工作流
你可以按工作流菜单中的“s”键保存工作流。你可以将这些文件检查到 ~/.claude/workflows 中,或者通过技能分发它们。

要通过技能分享它们,将你的 JavaScript 工作流文件放在技能文件夹中,并在 SKILL.MD 中引用它们。为了提供更大的灵活性,你可能希望提示 Claude 将技能中的工作流视为模板,而不是需要逐字运行的脚本。

一个全新的世界
动态工作流是一种扩展 Claude Code 的有用新方式。我鼓励你将其视为一个起点,关于如何最好地使用它们,还有很多有待发现。请告诉我们你的发现。
Thariq Shihipar 和 Sid Bidasaria([@sidbid](https://x.com/@sidbid))是 Anthropic 的技术团队成员,负责 Claude Code 的工作。





