适用于每项任务的框架:Claude Code 中的动态工作流
Claude Code 现在可以即时编写并编排自己的多智能体框架。以下是动态工作流的工作原理,以及能最大化发挥其效用的模式。
上周,我们在 Claude Code 中发布了 动态工作流。Claude 现在可以即时编写自己的 harness,为当前任务量身定制。
虽然默认的 Claude Code harness 是为编码而构建的,但它对许多其他类型的任务也很有用,因为事实证明,许多任务都类似于编码任务。但有一类任务,我们不得不在 Claude Code 之上构建自定义 harness 才能实现最佳性能,例如 研究、安全分析、智能体团队或 代码审查。
工作流允许你动态创建构建在 Claude Code 之上的 harness,使 Claude 能够更原生地解决所有这些问题。你还可以与他人共享和重用这些工作流。
在本文中,我将介绍我最初使用工作流的经验和心得,以便你充分利用它们。请记住,最佳实践仍在发展中:动态工作流通常会使用更多 token,最适合复杂、高价值的任务。
示例提示
在深入探讨技术细节之前,我想先给出几个示例提示,让你思考工作流的可能性:
"这个测试大约每 50 次运行中会有 1 次失败。设置一个工作流来复现它。针对竞态条件提出相互竞争的理论,直到有一个理论经得起证据检验为止。"
"使用工作流,浏览我最近的 50 次会话,挖掘我反复做出的修正,并将重复出现的修正转化为 CLAUDE.md 规则"
"使用工作流,深入挖掘 Slack 中过去六个月的 #incidents 频道,找出那些没有人提交工单的反复出现的根本原因。"
"拿我的商业计划书,运行一个工作流,让不同的智能体分别从投资者、客户和竞争对手的角度来剖析它。"
"这里有一个包含 80 份简历的文件夹,使用工作流为后端职位进行排名,并对前十名进行复核。使用 AskUserQuestion 工具通过提问来确定评分标准。"
"我需要为这个 CLI 工具起个名字。使用工作流头脑风暴一堆选项,并通过锦标赛选出前 3 名。"
"使用工作流将我们的 User 模型在所有地方重命名为 Account。"
"使用工作流浏览我的博客文章草稿,对照代码库验证每一项技术声明,我不想发布任何错误的内容。"
动态工作流的工作原理
动态工作流会执行一个 JavaScript 文件,其中包含一些特殊函数,用于帮助生成和协调 子智能体:
动态工作流还包含标准 JavaScript 函数,如 JSON、Math 和 Array,以帮助处理数据。
特别有用的是,动态工作流可以决定智能体使用哪个模型,以及子智能体是否在各自的工作树中运行,从而让 Claude 选择所需的智能水平和隔离程度。
如果工作流被中断(例如由于用户操作或退出终端),恢复会话将使工作流从中断处继续。
为什么选择动态工作流
当你要求默认的 Claude Code harness 执行任务时,它需要在同一个上下文窗口中同时进行规划和执行。对于许多编码任务,这种方式非常有效,但在长时间运行、大规模并行、高度结构化和/或对抗性的任务中,它可能会失效。
这是因为,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 擅长评估的定性标准进行排序,例如:按错误严重程度排序的支持工单。但如果你试图在一个提示中对 1000 多行进行排序,质量会下降,而且无法放入上下文。相反,可以运行锦标赛(一系列成对比较代理的流水线——比较判断比绝对评分更可靠),或并行进行分桶排名然后合并。每次比较都是一个独立的代理,因此确定性循环持有对阵表,只有当前的运行顺序保留在上下文中。
记忆与规则遵守
如果你有一组特定的规则,发现 Claude 即使被放入 CLAUDE.mds 中也会遗漏或难以遵守,就创建一个工作流,其中包含必须由验证代理检查的规则列表——每条规则一个验证器。创建一个怀疑者角色子代理来审查这些规则以确保它们符合要求,将有助于避免过多的误报。
反向操作同样有效:挖掘你最近的会话和代码审查评论,找出你反复做出的修正,用并行代理对它们进行聚类,对抗性地验证每个候选(这条规则能防止真实的错误吗?),然后将幸存者提炼回 CLAUDE.md 中。
根因调查
调试的最佳方式是提出几个独立的假设并进行测试,但如果你只使用一个上下文窗口,Claude 可能会陷入自我偏好偏差。
工作流可以通过启动多个智能体从互不重叠的证据中生成假设来从结构上防止这种情况。例如,分别为日志、文件和数据设置独立的智能体。然后每个假设都可以接受一组验证者和反驳者的审查。
这不仅适用于代码。工作流可用于销售(3 月销售额为何下降?)、数据工程(这条管道为何失败?)或任何事后复盘工作。
大规模分诊
每个团队都有支持队列、缺陷报告或其他无法由人工完全处理的积压工作。
分诊工作流会对每个条目进行分类、与已跟踪的条目去重,并采取行动。这可能意味着尝试修复,或升级给人工用户。
分诊工作流的一个有用模式是隔离。这涉及禁止读取不受信任的公共内容的智能体执行高权限操作,这些操作改由负责根据信息采取行动的智能体来完成。
将分诊工作流与 /loop 结合使用,让 Claude 持续执行此操作。
探索与品味
当探索解决问题的不同方法时,工作流会很有用,尤其是当它基于品味(如设计或命名)并受益于评分标准时。
尝试让 Claude 探索一堆解决方案,并给一个评审智能体一份关于好方案应具备哪些特征的评分标准。当评审智能体认为已满足标准时,任务即告完成。还可以基于评分标准通过锦标赛对解决方案进行排序或选择。
评估
你可以通过在工作树中启动独立的智能体,然后启动比较智能体,依据评分标准对具体输出进行比较和评分,从而为特定任务运行轻量级评估。例如,评估并随后改进你针对特定标准创建的技能。
模型与智能路由
创建一个针对你的任务调优的分类智能体,由它决定使用哪个模型。当你的任务涉及大量工具调用,且在执行前进行研究可以识别出最适合该任务的模型时,这会很有帮助。
例如,任务“解释 auth 模块如何工作”的最佳模型取决于 auth 模块中有多少文件以及代码库的形态。分类智能体可以进行这项研究,然后根据任务的预期复杂度路由到 Sonnet 或 Opus。
何时不使用动态工作流
工作流是新的。虽然在许多用例中它会产生超乎寻常的效果,但并非每个任务都需要它,而且最终可能会消耗显著更多的 token。
最好创造性地使用工作流,以你以前未曾尝试过的方式推动 Claude Code。对于常规编码任务,试着问问自己:它真的需要更多算力吗?例如,大多数传统编码任务并不需要一个由 5 名评审者组成的小组。
同样的判断也适用于上一层的架构层面:多智能体与单智能体的决策遵循类似的逻辑——并行性和专业化必须证明其协调成本是值得的。
构建动态工作流的技巧
提示
使用我们上面描述的具体技术,为动态工作流编写详细的提示,能产生最佳效果。
工作流不仅适用于大型任务。你可以提示模型使用“快速工作流”。例如,你可以创建一个针对某个假设的快速对抗性评审。
与 /goal 和 /loop 结合使用
对于可重复使用的工作流,例如分诊、研究或验证,可将其与 /loop 配合 按固定间隔运行,并使用 /goal 设置严格的完成要求。
Token 使用预算
你可以为动态工作流设置明确的 token 使用预算,以限制任务消耗的 token 数量。你可以通过类似“使用 10k tokens”的预算提示来设置上限。
保存和共享动态工作流
你可以在工作流菜单中按“s”键保存工作流。你可以将它们检入 ~/.claude/workflows,或通过 skill 分发。
要通过 skill 共享,请将你的 JavaScript 工作流文件放入 skill 文件夹,并在 SKILL.md 中引用它们。为了更灵活,你可以提示 Claude 将 skill 中的工作流视为模板,而不是需要逐字执行的脚本。
探索的新起点
工作流是扩展 Claude Code 的一种实用新方式。我鼓励你将其视为一个起点,探索利用 Claude 协助完成任务的新方法。如何最好地使用它们仍有大量待发掘之处。欢迎告诉我你的发现。
关于哪些内容应首先纳入 harness,请参阅我们构建 Claude 的三篇 harness 设计模式 。
本文由 Anthropic 技术团队成员 Thariq Shihipar 和 Sid Bidasaria 撰写,他们致力于 Claude Code 的开发。