Claude Code 动态工作流

Claude Code现在可以即时编写和编排自己的多代理框架(harness)。以下是动态工作流的工作原理以及最大化利用它们的模式。

Claude Code 动态工作流
AI模型价格对比 | AI工具导航 | ONNX模型库 | Vibe Coding教程 | PLC在线仿真器 | Tripo 3D | Meshy AI | ElevenLabs | KlingAI | ArtSpace | Phot.AI | InVideo

上周,我们在Claude Code中发布了动态工作流(dynamic workflows)。Claude现在可以即时编写自己的框架,为手头的任务量身定制。

虽然默认的Claude Code框架是为编码而构建的,但它在许多其他类型的任务中也很有用,因为事实证明,许多任务类似于编码任务。但对于某些特定类别的任务,我们必须在Claude Code之上构建自定义框架才能达到最佳性能,例如研究(Research)、安全分析、代理团队(agent teams)或代码审查(Code Review)。

工作流允许你在Claude Code之上动态创建框架,使Claude能够更原生地解决所有这些问题。你还可以与他人共享和复用这些工作流。

在本文中,我将分享我使用工作流的初步体验和心得,以便你能充分利用它们。请记住,最佳实践仍在发展中:动态工作流通常会使用更多的token,最适合复杂、高价值的任务。

1、示例提示

在深入技术细节之前,我想先展示几个示例提示,让你思考工作流的可能性:

"这个测试大约每50次运行就会失败1次。设置一个工作流来复现它。形成关于竞态条件的竞争性假设,直到一个假设在证据面前存活下来才停止。"

"使用工作流,浏览我过去50个会话,从中挖掘我一直重复做的纠正,并将反复出现的问题转化为CLAUDE.md规则。"

"使用工作流,翻查Slack中过去六个月的#incidents,找出没有人提交工单的反复出现的根本原因。"

"拿我的商业计划,运行一个工作流,让不同的代理分别从投资者、客户和竞争对手的角度来拆解它。"

"这是一个包含80份简历的文件夹,使用工作流为后端角色进行排名,并复核前十名。使用AskUserQuestion工具采访我以制定评分标准。"

"我需要为这个CLI工具起个名字。使用工作流进行头脑风暴想出大量选项,然后运行锦标赛选出前3名。"

"使用工作流将我们的User模型重命名为Account,全局范围内。"

"使用工作流浏览我的博客草稿,对照代码库验证每一个技术声明,我不想发布任何错误的内容。"

2、动态工作流的工作原理

动态工作流执行一个JavaScript文件,其中包含一些帮助生成和协调子代理(subagents)的特殊函数:

Dynamic workflows architecture

动态工作流还包括标准的JavaScript函数,如JSON、Math和Array,用于帮助处理数据。

特别值得注意的是,动态工作流可以决定代理使用哪些模型,以及子代理是否在自己的worktree中运行,从而允许Claude选择所需的智能级别和隔离程度。

如果工作流被中断(例如由于用户操作或退出终端),恢复会话将允许工作流从中断的地方继续。

3、为什么需要动态工作流

当你要求默认的Claude Code框架执行任务时,它需要在同一个上下文窗口中同时进行规划和执行。对于许多编码任务,这非常高效,但在长时间运行、大规模并行、高度结构化和/或对抗性任务中可能会出现问题。

这是因为Claude在单个上下文窗口中处理复杂任务的时间越长,就越容易受到几种特定故障模式的影响:

  • 代理惰性(Agentic laziness)是指Claude在完成一个特别复杂的多部分任务之前就停止了,并在取得部分进展后宣布任务已完成,例如在安全审查中只处理了50个项目中的35个。
  • 自我偏好偏差(Self-preferential bias)是指Claude倾向于偏好自己的结果或发现,尤其是在被要求根据评分标准验证或评判它们时。
  • 目标偏移(Goal drift)是指在多个轮次中逐渐偏离原始目标,特别是在压缩(compaction)之后。每个摘要步骤都是有损的,边缘情况要求或"不要做X"的约束等细节可能会丢失。

创建工作流有助于通过编排具有各自上下文窗口和专注、孤立目标的独立Claude子代理来对抗这些问题。

4、动态工作流 vs 静态工作流

你可能之前使用Claude Agent SDK或claude -p创建过静态工作流来协调多个Claude Code实例。

但由于静态工作流需要适用于所有边缘情况,它们通常更加通用。有了Claude Opus 4.8和动态工作流,Claude现在足够智能,可以编写一个为你的用例量身定制的自定义框架。

Dynamic vs static workflows

5、使用动态工作流的有用模式

你可以通过直接要求Claude创建一个来开始使用动态工作流,或者使用触发词"ultracode"来确保Claude Code创建一个工作流。

但建立对动态工作流如何工作的心理模型将帮助你理解何时使用它们以及如何通过提示来引导Claude。

Claude在构建工作流时可能会使用和组合以下几种常见模式:

Workflow patterns

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

使用分类器代理来决定任务类型,然后根据任务路由到不同的代理或行为。或者,在最后使用分类器来确定输出。

扇出与综合(Fan-out-and-synthesize)

将任务拆分为许多更小的步骤,在每个步骤上运行一个代理,然后综合这些结果。这特别适用于有大量较小步骤的情况,或者每个步骤都受益于自己的干净上下文窗口以免相互干扰或交叉污染的情况。综合步骤是一个屏障——它等待所有扇出代理完成,然后将它们的结构化输出合并为一个结果。

对抗性验证(Adversarial verification)

对于每个生成的代理,运行一个单独的代理来根据评分标准或条件对抗性地验证其输出。

生成与过滤(Generate-and-filter)

生成大量关于某个主题的想法,然后通过评分标准或验证来过滤它们,去重并只返回最高质量的、经过测试的想法。

锦标赛(Tournament)

不是分配工作,而是让代理竞争。生成N个代理,每个代理使用不同的方法尝试相同的任务。然后提示或模型通过评判代理以成对的方式判断结果,直到产生一个胜者。

循环直到完成(Loop until done)

对于工作量未知的任务,循环生成代理直到满足停止条件(没有新发现,或日志中没有更多错误),而不是固定的轮次数。

6、使用场景

创造性地思考何时以及如何让Claude Code创建动态工作流。我发现工作流有时在非技术工作中甚至更有用。

迁移和重构

Bun使用工作流从Zig重写为Rust。你可以在Jarred的X帖子中阅读更多关于这是如何做到的。

关键是将任务分解为一系列需要操作的步骤,例如调用点、失败的测试、模块等。为每个修复在一个worktree中派生一个子代理来执行修复,然后让另一个代理对抗性地审查,最后合并它们。考虑告诉代理不要使用资源密集型命令,这样你就可以最大程度地并行化而不会耗尽机器资源。

深度研究

我们在Claude Code中发布了一个深度研究技能(/deep-research),它使用动态工作流。具体来说,它扇出网络搜索,获取来源,对抗性地验证它们的声明,并综合一份有引用的报告。

但你可能不仅仅是为了网络搜索才做这种研究。例如,让Claude从Slack中的上下文编译一份状态报告,或通过深入探索代码库来研究某个功能是如何工作的。

深度验证

Deep verification

另一方面,如果你有一份报告想要检查和核实其中引用的每一个事实声明,你可能想生成一个工作流,让一个代理识别所有事实声明,然后为每个声明派生一个子代理进行详细检查。你还可以让一个验证代理检查来源子代理,确保其来源是高质量的。

排序

Sorting

你可能有一个项目列表,想要按某种定性测量来排序,而你认为Claude Code擅长评估这种测量,例如:按bug严重程度排序的支持工单。但如果你尝试在一个提示中排序1000+行,质量会下降,而且会超出上下文限制。相反,运行锦标赛、成对比较代理管道(比较判断比绝对评分更可靠),或并行分桶排序然后合并。每次比较都是自己的代理,所以确定性循环持有对阵表,只有运行顺序保留在上下文中。

记忆和规则遵循

Memory and rule adherence

如果你有一套特定的规则,发现Claude经常会遗漏或难以遵守,即使已经放入了CLAUDE.mds,也可以创建一个工作流,其中包含必须由验证器代理检查的规则列表——每个规则一个验证器。创建一个怀疑论者角色的子代理来审查规则以确保它们合理,将有助于避免过多的误报。

反方向也可以工作:从你最近的会话和代码审查评论中挖掘你一直重复做的纠正,用并行代理进行聚类,对抗性地验证每个候选(这条规则是否能防止真正的错误?),然后将存活者提炼回CLAUDE.md

根因调查

调试最好是在提出几个独立假设并测试它们时进行,但如果你只使用一个上下文窗口,Claude可能会遇到自我偏好偏差。

工作流可以通过从不相交的证据中生成假设的代理来在结构上防止这种情况。例如,分别用于日志、文件和数据的代理。然后每个假设可以面对一组验证者和反驳者的审查。

这不仅适用于代码。工作流也可用于销售(为什么三月份销售下降了?)、数据工程(为什么这个管道失败了?)或任何事后分析练习。

大规模分诊

Triaging

每个团队都有支持队列、bug报告或某些其他人工无法完全处理的积压工作。

分诊工作流对每个项目进行分类,与已跟踪的内容去重,并采取行动。这可能意味着尝试修复或升级给人类用户。

分诊工作流的一个有用模式是隔离(quarantine)。这涉及禁止读取不受信任公共内容的代理执行高权限操作,这些操作由负责根据信息采取行动的代理来完成。

将分诊工作流与/loop配对,让Claude持续执行此操作。

探索和品味

工作流在探索不同的解决方案方法时可能很有用,特别是当它是基于品味的,如设计或命名,并且可以从评分标准中受益时。

试试让Claude探索一系列解决方案,并给一个审查代理一个关于什么是好解决方案的评分标准。当审查代理认为满足标准时,任务就完成了。解决方案也可以根据评分标准通过锦标赛来排序或选择。

评估(Evals)

你可以通过在worktree中派生独立代理,然后派生比较代理来根据评分标准比较和评分特定输出,从而为特定任务运行轻量级评估。例如,评估然后根据特定标准精炼你创建的技能。

模型和智能路由

创建一个针对你的任务调优的分类器代理来决定使用哪个模型。当你的任务将涉及许多工具调用时,这在执行前进行研究以识别最佳模型会很有帮助。

例如,任务"解释auth模块如何工作"的最佳模型取决于auth模块中有多少文件以及代码库的结构。分类器代理可以完成这项研究,然后根据任务的预期复杂度路由到Sonnet或Opus。

7、何时不要使用动态工作流

工作流是新的。虽然有很多用例会产生显著的效果,但并非每个任务都需要它们,并且可能最终会使用显著更多的token。

最好创造性地使用工作流,以你以前没有的方式推动Claude Code。对于常规的编码任务,试着问问自己:它真的需要更多的计算吗?例如,大多数传统的编码任务不需要5个审查者的评审团。

8、构建动态工作流的提示

提示(Prompting)

使用我们上面描述的特定技术进行详细的提示,可以为动态工作流创造最佳结果。

工作流不仅限于大型任务。你可以提示模型使用"快速工作流"。例如,你可以对某个假设创建一个快速的对抗性审查。

/goal/loop结合使用

当使用可以重复的工作流时(例如分诊、研究或验证),将它们与/loop配对以定期运行,并与/goal配对以设置硬性完成要求。

Token使用预算

你可以为动态工作流设置明确的token使用预算,以限制任务使用多少token。你可以通过"使用10k token"这样的预算来提示它,这将设置上限。

保存和共享动态工作流

你可以通过在工作流菜单中按"s"来保存工作流。你可以将它们检入~/.claude/workflows或通过技能(skill)来分发。

Saving workflows

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

Sharing via skills

9、一个新的发现起点

工作流是扩展Claude Code的一种有用新方式。我鼓励你将它们视为一个起点,来探索使用Claude帮助你完成任务的新方式。关于如何最好地使用它们,还有很多待发现的东西。让我知道你发现了什么。

本文由Anthropic技术团队成员Thariq Shihipar和Sid Bidasaria撰写,他们在Claude Code团队工作。


原文链接: A harness for every task: dynamic workflows in Claude Code

汇智网翻译整理,转载请标明出处