Claude Code 动态工作流详解:让 Claude 现场编写自己的 harness
A harness for every task: dynamic workflows in Claude Code
Anthropic 上周在 Claude Code 中发布动态工作流,Claude 可为任务即时编写定制 harness。工作流通过执行 JavaScript 脚本,用 agent()、parallel() 和 pipeline() 生成并协调各自拥有独立上下文窗口的 subagent,以缓解单上下文中的 agentic laziness、自我偏好偏差和目标漂移。
Anthropic 员工讲解 Claude Code 动态工作流的原理、六种组合模式和适用边界,并给出 token 预算等实用技巧。
上周,我们在 Claude Code 中发布了动态工作流。Claude 现在可以即时编写自己的执行框架,针对手头的任务量身定制。
虽然默认的 Claude Code 执行框架是为编程而构建的,但它对许多其他类型的任务也很有用,因为事实证明,许多任务与编程任务相似。但有些类别的任务,我们必须在 Claude Code 之上构建自定义执行框架才能达到最佳性能,例如研究、安全分析、智能体团队或代码审查。
工作流让你能够动态创建构建在 Claude Code 之上的执行框架,使 Claude 能够更原生地解决所有这些问题。你还可以与他人分享和复用这些工作流。
在本文中,我将介绍我最初的工作流体验和心得,以便你充分利用。请记住,最佳实践仍在发展中:动态工作流通常消耗更多 token,最适合复杂、高价值的任务。
示例提示词
在深入技术细节之前,我想先给出几个示例提示词,让你思考工作流的各种可能性:
“这个测试大约每 50 次运行会失败 1 次。设置一个工作流来复现它。针对这个竞态条件提出相互竞争的理论,直到有一个理论经得起证据检验才停止。”
“使用一个工作流,浏览我最近 50 次会话,从中挖掘我反复犯的错误,并把反复出现的错误转化为 CLAUDE.md 规则”
“使用一个工作流,翻查 Slack 中 #incidents 频道过去六个月的内容,找出那些没有人提交工单的反复出现的根本原因。”
“拿我的商业计划书,运行一个工作流,让不同的智能体分别从投资者、客户和竞争对手的角度把它批得体无完肤。”
“这里有一个包含 80 份简历的文件夹,使用一个工作流为后端岗位给它们排名,并复核前十名。使用 AskUserQuestion 工具就评分标准对我进行访谈。”
“我需要给这个 CLI 工具起个名字。使用一个工作流头脑风暴出一堆选项,并运行一场锦标赛选出前 3 名。”
“使用一个工作流,把我们的 User 模型在所有地方重命名为 Account。”
“使用一个工作流,通读我的博客文章草稿,对照代码库核实每一个技术论断,我不想发布任何错误的内容。”
动态工作流如何工作
动态工作流执行一个 JavaScript 文件,其中包含几个特殊函数,用于生成和协调子智能体:

动态工作流还包含标准的 JavaScript 函数,如 JSON、Math 和 Array,用于帮助处理数据。
特别有用的一点是,动态工作流可以决定智能体使用哪些模型,以及子智能体是否在各自的工作树中运行,从而让 Claude 选择所需的智能水平和隔离程度。
如果工作流被中断,例如由于用户操作或退出终端,恢复会话将允许工作流从上次中断的地方继续。
为什么需要动态工作流
当你让默认的 Claude Code 执行框架完成一项任务时,它需要在同一个上下文窗口中既规划又执行。对于许多编程任务来说,这非常有效,但在长时间运行、大规模并行、高度结构化和/或对抗性的任务中,它可能会失效。
这是因为 Claude 在单个上下文窗口中处理复杂任务的时间越长,就越容易受到几种特定失败模式的影响:
- 智能体惰性是指 Claude 在完成一项特别复杂的多部分任务之前就停下来,在取得部分进展后就宣称任务已完成,例如在安全审查中只处理了 50 项中的 35 项。
- 自我偏好偏差是指 Claude 倾向于偏好自己的结果或发现,尤其是在被要求根据评分标准对其进行验证或评判时。
- 目标漂移是指在多轮对话中逐渐丧失对原始目标的忠实度,尤其是在压缩之后。每一次摘要步骤都是有损的,诸如边缘情况需求或“不要做 X”之类的约束等细节可能会丢失。
创建工作流有助于应对这些问题,方法是编排具有各自上下文窗口和专注、隔离目标的独立 Claude 子智能体。
动态工作流与静态工作流
你之前可能使用 Claude Agent SDK 或 claude -p 创建过静态工作流,以协调多个 Claude Code 实例协同工作。
但由于静态工作流需要适用于所有边缘情况,它们通常更为通用。借助 Claude Opus 4.8 和动态工作流,Claude 现在足够智能,能够为你的用例量身定制一套专属的测试框架。

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

分类并执行
使用分类器智能体来决定任务类型,然后根据任务路由到不同的智能体或行为。或者,在最后使用分类器来确定输出。
扇出并综合
将任务拆分为许多更小的步骤,对每个步骤运行一个智能体,然后综合这些结果。当存在大量较小步骤时,或者当每个步骤都受益于自己干净的上下文窗口以避免相互干扰或交叉污染时,这尤其有用。综合步骤是一个屏障——它等待所有扇出智能体完成,然后将它们的结构化输出合并为一个结果。
对抗性验证
对于每个生成的智能体,运行一个单独的生成智能体,根据评分标准或准则对其输出进行对抗性验证。
生成并筛选
就某个主题生成若干想法,然后根据评分标准或通过验证进行筛选,去除重复项,仅返回质量最高、经过测试的想法。
锦标赛
不是划分工作,而是让智能体就工作进行竞争。生成 N 个智能体,每个都使用不同的方法尝试同一任务。然后由提示或模型使用评判智能体以两两对决的方式评判结果,直到产生一个获胜者。
循环直至完成
对于工作量未知的任务,循环生成智能体,直到满足停止条件(没有新发现,或日志中没有更多错误),而不是固定次数的遍历。
用例
创造性地思考何时以及如何让 Claude Code 构建动态工作流。我发现工作流有时对非技术性工作甚至更有用。
迁移与重构
Bun 使用工作流从 Zig 重写为 Rust。你可以在 Jarred 的帖子中了解更多关于这一过程是如何完成的,或者看看我们如何在百万行代码库中运行 AI 代码迁移。
关键在于将任务分解为一系列需要处理的步骤,例如调用点、失败的测试、模块等。在工作树中为每个修复启动一个子代理来完成修复,然后让另一个代理进行对抗性审查,并将它们合并。考虑告诉代理不要使用资源密集型命令,这样你就可以最大限度地并行化,而不会耗尽机器上的资源。
深度研究
我们在 Claude Code 中发布了一项深度研究技能(/deep-research),它使用动态工作流。具体来说,它会展开网络搜索、获取来源、对抗性地验证其主张,并综合出一份带引用的报告。
但你可能不仅仅为网络搜索做这类研究。例如,让 Claude 从 Slack 中的上下文汇编一份状态报告,或者通过深入探索代码库来研究某个功能是如何工作的。
深度验证

另一方面,如果你有一份报告,想要检查并溯源其中引用的每一个事实性主张,你可能希望生成一个工作流:让一个代理识别所有事实性主张,然后为每一个主张启动一个子代理进行详细检查。你还可以让一个验证代理检查来源子代理,以确保其来源质量高。
排序

你可能有一份项目列表,想按某种你认为 Claude Code 擅长评估的定性指标进行排序,例如:按 bug 严重程度对支持工单排序。但如果你试图在一个提示中排序 1000 多行,质量会下降,而且无法放入上下文。相反,可以运行一场锦标赛、一条由成对比较代理组成的流水线(比较性判断比绝对评分更可靠),或者并行进行分桶排名后再合并。每次比较都是它自己的代理,因此确定性循环持有对阵表,只有运行顺序留在上下文中。
记忆与规则遵循

如果你有一组特定的规则,发现 Claude 即使放入 CLAUDE.mds 中也会遗漏或难以处理,那就创建一个工作流,其中包含一份必须由验证代理检查的规则列表——每条规则一个验证者。创建一个怀疑者人格的子代理来审查这些规则以确保它们一致,将有助于避免过多误报。
反向操作也有效:挖掘你最近的会话和代码审查评论,找出你反复做出的纠正,用并行代理对它们进行聚类,对抗性地验证每个候选规则(这条规则本可以防止一个真实错误吗?),然后将幸存者提炼回一个 CLAUDE.md 中。
根因调查
调试在你想出几个独立假设并逐一测试时效果最好,但如果你只使用一个上下文窗口,Claude 可能会遇到自我偏好偏差。
工作流可以通过启动多个智能体从互不相干的证据中生成假设,从结构上防止这一问题。例如,为日志、文件和分别数据设置独立的智能体。每个假设随后都可以面对一个由验证者和反驳者组成的小组。
这不仅仅适用于代码。工作流可用于销售(为什么三月份销售额下降?)、数据工程(为什么这条流水线失败了?),或任何事后复盘工作。
大规模分诊

每个团队都有支持队列、缺陷报告或其他一些无法由人工完全处理的积压工作。
分诊工作流会对每个条目进行分类,与已跟踪的内容去重,并采取行动。这可能意味着尝试修复或升级给人工用户。
分诊工作流的一个有用模式是隔离。这包括禁止读取不受信任公开内容的智能体采取高权限操作,这些操作改由负责根据信息采取行动的智能体来完成。
将分诊工作流与 /loop 搭配使用,让 Claude 持续执行这一工作。
探索与品味
在探索解决问题的不同方法时,工作流会很有用,尤其是当它基于品味时,比如设计或命名,并且能从评分标准中获益。
试着让 Claude 探索一系列解决方案,并给审查智能体一份关于好方案应是什么样子的评分标准。当审查智能体认为已满足标准时,任务即告完成。解决方案也可以根据评分标准通过锦标赛进行排序或选择。
评估
你可以通过在 worktree 中启动独立的智能体,然后启动比较智能体,根据评分标准比较并给具体输出打分,来针对特定任务运行轻量级评估。例如,根据特定标准评估并随后改进你创建的一项技能。
模型与智能路由
创建一个针对你的任务调优的分类器智能体,由它决定使用哪个模型。当你的任务涉及大量工具调用,且在执行前进行研究能够确定最适合该工作的模型时,这会很有帮助。
例如,对于“解释 auth 模块如何工作”这一任务,最佳模型取决于 auth 模块中有多少文件以及代码库的形态。分类器智能体可以进行这项研究,然后根据任务的预期复杂度路由到 Sonnet 或 Opus。
何时不应使用动态工作流
工作流是新生事物。尽管在许多用例中它能带来超常的结果,但并非每项任务都需要它,而且它最终可能会消耗显著更多的 token。
最好创造性地使用工作流,以你此前未曾尝试过的方式推动 Claude Code。对于常规编码任务,试着问自己:它真的需要更多算力吗?例如,大多数传统编码任务并不需要由 5 名审查者组成的小组。
同样的判断也适用于上一层,即架构层:多智能体 vs 单智能体的决策遵循类似逻辑——并行与专业化必须证明其协调成本是值得的。
构建动态工作流的技巧
提示
使用我们上文描述的具体技巧,为动态工作流编写详细的提示,能带来最佳结果。
工作流不仅仅适用于大型任务。你可以提示模型使用“快速工作流”。例如,你可以对某个假设创建一次快速的对抗性审查。
与 /goal 和 /loop 结合使用
在使用可重复的工作流时,例如分诊、研究或验证,将它们与 /loop 配对以定期运行,并使用 /goal 设置硬性完成要求。
Token 使用预算
你可以为动态工作流设置明确的 token 使用预算,以限制任务使用的 token 数量。你可以用类似“使用 10k tokens”的预算提示它,这会设置上限。
保存和分享动态工作流
你可以在工作流菜单中按“s”来保存工作流。你可以将它们检入 ~/.claude/workflows 或通过 skill 分发它们。

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

探索的新起点
工作流是扩展 Claude Code 的一种有用的新方式。我鼓励你将它们视为探索使用 Claude 帮助完成任务的 new 方式的起点。关于如何最好地使用它们,仍有许多有待发现。让我知道你的发现。
关于什么应该首先属于 harness 的原则,请参阅我们的三种 harness 设计模式 ,用于使用 Claude 构建。
本文由 Thariq Shihipar 和 Sid Bidasaria 撰写,他们是 Anthropic 的技术人员,从事 Claude Code 相关工作。
来源:Anthropic:Claude.dev 开发者博客 · claude.dev