初级

为每项任务量身定制:Claude Code 中的动态工作流

为每项任务量身定制:Claude Code 中的动态工作流

上周,我们在 Claude Code 中发布了动态工作流。Claude 现在可以即时编写自己的工具框架,为手头的任务量身定制。
虽然默认的 Claude Code 工具框架是为编码而构建的,但它也适用于许多其他类型的任务,因为事实证明,许多任务与编码任务相似。但某些类型的任务,我们不得不在 Claude Code 之上构建自定义工具框架才能达到最佳性能,例如研究安全分析智能体团队代码审查
工作流允许你动态创建工具框架,使 Claude 能够在 Claude Code 内部原生解决所有这些问题及更多问题。你还可以与他人共享和重复使用这些工作流。
在本文中,我将介绍我最初的工作流使用经验和心得,以便你充分利用。
话虽如此,最佳实践仍在发展中!动态工作流通常使用更多 token,因此请仔细考虑何时以及如何使用它们。
注意:本文也发布在 Claude 博客上

示例提示#

在深入技术细节之前,我想先提供一些示例提示,让你思考工作流的可能性:
  • "这个测试大约每 50 次运行失败 1 次。设置一个工作流来重现它,形成理论,并在工作树中对抗性地测试它们 /goal 不要停止,直到一个理论有效。"
  • "使用工作流,浏览我最近的 50 个会话,挖掘我反复犯的错误,并将重复出现的错误转化为 CLAUDE.md 规则。"
  • "使用工作流,挖掘过去六个月 Slack 中的 #incidents 频道,找出没有人提交工单的重复根本原因。"
  • "拿我的商业计划书,运行一个工作流,让不同的智能体从投资者、客户和竞争对手的角度对其进行剖析。"
  • "这里有一个包含 80 份简历的文件夹,使用工作流对它们进行排名,以寻找后端职位,并仔细检查前十名。使用 AskUserQuestion 工具对我进行面试,以制定评分标准。"
  • "我需要为这个 CLI 工具起个名字。使用工作流集思广益,提出一堆选项,然后运行一个锦标赛来选出前 3 名。"
  • "使用工作流,将我们的 User 模型在所有地方重命名为 Account。"
  • "浏览我的博客文章草稿,使用工作流对照代码库验证每一个技术声明,我不想发布任何错误的内容。"

动态工作流的工作原理#

动态工作流执行一个 JavaScript 文件,其中包含一些特殊函数,用于生成和协调子智能体
动态工作流还包括标准 JavaScript 函数,如 JSON、Math 和 Array,以帮助处理数据。
特别有用的是,动态工作流可以决定智能体使用哪些模型,以及子智能体是否在自己的工作树中运行,从而允许 Claude 选择所需的智能水平和隔离级别。
如果工作流被中断,例如由于用户操作或退出终端,恢复会话将允许工作流从中断处继续。

为什么需要动态工作流#

当你要求默认的 Claude Code 工具框架执行任务时,它需要在同一个上下文窗口中同时进行规划和执行。对于许多编码任务,这非常有效,但对于长时间运行、大规模并行和/或高度结构化的对抗性任务,它有时会失效。
这是因为 Claude 在单个上下文窗口中处理复杂任务的时间越长,就越容易受到几个特定失败模式的影响:
  • 智能体惰性:指 Claude 在完成特别复杂的多部分任务之前停止,并在取得部分进展后宣布工作完成,例如在安全审查中处理了 50 个项目中的 20 个。
  • 自我偏好偏差:指 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 的 X 帖子 了解更多细节。
关键在于将任务分解为一系列步骤,这些步骤需要针对调用点、失败的测试、模块等进行操作。为工作树中的每个修复任务派生一个子代理来执行修复,然后让另一个代理进行对抗性审查,最后合并。建议告诉代理不要使用资源密集型命令,以便在最大化并行化的同时避免机器资源耗尽。

深度研究#

我们在 Claude Code 中发布了一个深度研究技能(/deep-research),它使用动态工作流。具体来说,它会展开网络搜索、获取来源、对抗性验证其声明,并综合生成一份带引用的报告。
但你可以将这种研究应用于更多场景,而不仅仅是网络搜索。例如,让 Claude 从 Slack 的上下文中编译一份状态报告,或者通过深入探索代码库来研究某个功能的工作原理。

深度验证#

另一方面,如果你有一份报告,想要检查并追溯其中引用的每个事实性声明,可以生成一个工作流:让一个代理识别所有事实性声明,然后派生子代理逐一详细检查。你还可以让一个验证代理检查来源子代理,确保其来源质量可靠。

排序#

你可能有一个项目列表,希望根据某种定性指标进行排序,而你认为 Claude Code 擅长评估这些指标,例如:按 bug 严重程度排序的支持工单。但如果尝试在一个提示中对 1000 多行进行排序,质量会下降且无法容纳在上下文中。相反,可以运行一个锦标赛,即一个成对比较代理的流水线(比较判断比绝对评分更可靠),或者并行进行桶排序然后合并。每个比较都是一个独立的代理,因此确定性循环只保留括号结构,只有运行顺序保留在上下文中。

记忆与规则遵守#

如果你发现 Claude 即使将特定规则放入 CLAUDE.md 中也会遗漏或难以遵守,可以创建一个工作流,其中包含一个必须由验证代理检查的规则列表——每个规则对应一个验证代理。创建一个怀疑论者角色的子代理来审查规则,确保它们符合要求,这将有助于避免过多的误报。
反向操作也有效:从最近的会话和代码审查评论中挖掘你反复纠正的内容,使用并行代理进行聚类,对抗性验证每个候选规则(这条规则是否能防止实际错误?),然后将幸存下来的规则提炼回 CLAUDE.md 中。

根本原因调查#

调试的最佳方式是提出多个独立的假设并进行测试,但如果只使用一个上下文窗口,Claude 可能会陷入自我偏好偏差。
工作流可以通过从不同的证据中生成假设来结构性防止这种情况。例如,为日志、文件和数据分别设置独立的代理。然后每个假设可以面对一组验证者和反驳者。
这不仅适用于代码。工作流可以用于销售(为什么三月份销售额下降?)、数据工程(为什么这个流水线失败?)或任何事后复盘活动。

大规模分类#

每个团队都有支持队列、bug 报告或其他人类无法完全处理的积压任务。
一个分类工作流会对每个项目进行分类,与已跟踪的内容进行去重,并采取行动。这可能意味着尝试修复或升级给人类用户。
分类工作流的一个有用模式是隔离。这意味着禁止读取不受信任的公共内容的代理执行高权限操作,这些操作由负责处理信息的代理执行。
将分类工作流与 /loop 结合使用,让 Claude 持续执行此操作。

探索与品味#

工作流在探索不同解决方案时非常有用,尤其是当解决方案基于品味时,例如设计或命名,并且可以从评估标准中受益。
尝试让 Claude 探索一系列解决方案,并为审查代理提供一个关于什么是好的解决方案的评估标准。当审查代理认为满足标准时,任务完成。解决方案还可以根据评估标准通过锦标赛进行排序或选择。

评估#

你可以通过在工作树中派生出独立的代理,然后派生出比较代理,根据评估标准对特定输出进行比较和评分,从而对特定任务进行轻量级评估。例如,根据特定标准评估然后优化你创建的技能。

模型与智能路由#

创建一个针对你的任务进行调整的分类器代理,用于决定使用哪个模型。当你的任务涉及大量工具调用时,这很有帮助,在执行前进行研究可以确定最适合该任务的模型。
例如,对于"解释认证模块如何工作"这个任务,最佳模型取决于认证模块中的文件数量以及代码库的结构。一个分类器代理可以进行这项研究,然后根据任务的预期复杂度路由到 Sonnet 或 Opus。

何时不使用动态工作流#

工作流是新的。虽然有许多用例可以产生超常的结果,但并非每个任务都需要它们,而且它们可能会消耗显著更多的 token。
最好创造性地使用工作流,以你以前未曾尝试的方式推动 Claude Code。对于常规编码任务,试着问自己:它真的需要更多计算吗?例如,大多数传统编码任务不需要一个由 5 名审查者组成的小组。

构建动态工作流的技巧#

提示#

对于动态工作流,使用我们上面描述的特定技术进行详细提示,可以产生最佳结果。
工作流不仅适用于大型任务。你可以提示模型使用"快速工作流"。例如,你可以快速对抗性审查一个假设。

结合 /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 的开发。