智能体 · CLAUDE
每项任务都有一个 harness:Claude Code 中的动态工作流
Claude Code 现在可以即时编写并编排自己的多智能体 harness。以下介绍动态工作流如何运作,以及如何充分利用它们的模式。
原作者/来源:claude.dev
原文链接:https://claude.dev/blog/a-harness-for-every-task-dynamic-workflows-in-claude-code/
Claude Code 现在可以即时编写并编排自己的多智能体 harness。以下介绍动态工作流如何运作,以及如何充分利用它们的模式。
上周,我们在 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 工具起个名字。用一个工作流集思广益,列出一堆选项,再通过锦标赛选出前三名。”
“用一个工作流把我们的 User 模型在所有地方重命名为 Account。”
“用一个工作流检查我的博客文章草稿,并对照代码库核实其中的每一项技术声明;我不想发布任何错误内容。”
动态工作流如何运作
动态工作流会执行一个 JavaScript 文件,其中包含一些用于生成和协调子智能体的特殊函数:

图 A 工作流脚本的三个构建块:agent() 会生成一个子智能体;parallel() 和 pipeline() 用于组合多个子智能体。
动态工作流还包含标准 JavaScript 函数,例如 JSON、Math 和 Array,用于处理数据。
特别值得了解的是,动态工作流可以决定智能体使用哪些模型,以及子智能体是否在自己的工作树中运行,从而让 Claude 选择所需的智能水平和隔离程度。
如果工作流被中断,例如用户执行了某项操作或退出终端,恢复会话后,工作流就能从中断处继续。
为什么要使用动态工作流
当你要求默认的 Claude Code harness 执行一项任务时,它需要在同一个上下文窗口中同时规划和执行。对于许多编程任务,这种方式非常有效;但面对运行时间很长、高度并行、结构复杂和/或对抗性很强的任务时,它可能会失效。
这是因为 Claude 在单个上下文窗口中处理复杂任务的时间越长,就越容易出现几种特定的失效模式:
智能体懈怠是指 Claude 在完成一项特别复杂、由多个部分组成的任务之前就停下来,在只取得部分进展后便宣称任务已经完成。例如,在 50 项安全审查中只处理了 35 项。
自我偏好偏差是指 Claude 倾向于偏爱自己的结果或发现,尤其是在要求它依据评分标准对自己的结果或发现进行验证或评判时。
目标漂移是指在多轮交互中,Claude 逐渐偏离最初目标,尤其是在上下文压缩之后。每一步摘要都会损失信息,边缘情况要求或“不要做 X”这类约束等细节可能会丢失。
创建工作流有助于应对这些问题:它会协调多个各自拥有独立上下文窗口、目标聚焦且彼此隔离的 Claude 子智能体。
动态工作流与静态工作流
你以前可能用 Claude Agent SDK 或 claude -p 创建过静态工作流,用来协调多个 Claude Code 实例。
但由于静态工作流必须适用于所有边缘情况,它们通常比较通用。有了 Claude Opus 4.8 和动态工作流,Claude 现在足够智能,可以编写专为你的用例量身定制的 harness。

图 B 静态 harness 对每个问题都运行相同步骤;动态工作流则会根据眼前的具体任务来调整。
使用动态工作流时的实用模式
只要让 Claude 创建动态工作流,你就可以开始使用;或者使用触发词“ultracode”,确保 Claude Code 创建一个工作流。
不过,建立关于动态工作流如何运作的心智模型,有助于你了解何时使用它们,以及如何通过提示词引导 Claude。
Claude 在构建工作流时,可能会使用并组合几种常见模式:

图 C Claude 会组合使用的六种工作流模式。
分类并执行
使用一个分类器智能体判断任务类型,然后据此将任务分派给不同的智能体,或采用不同的行为。也可以在最后使用分类器来确定输出。
扇出并综合
将任务拆分成许多较小的步骤,每个步骤由一个智能体处理,然后综合这些结果。当步骤数量很多,或者每个步骤都能从独立且干净的上下文窗口中获益、从而避免彼此干扰或交叉污染时,这种模式尤其有用。综合步骤是一个屏障:它会等待所有扇出智能体完成,然后将它们的结构化输出合并成一个结果。
对抗式验证
对每个已生成的智能体,再运行一个单独生成的智能体,依据评分标准或准则对其输出进行对抗式验证。
生成并筛选
针对某个主题生成多个想法,然后依据评分标准或通过验证来筛选它们,删除重复项,只返回质量最高且经过测试的想法。
锦标赛
不拆分任务,而是让智能体相互竞争。生成 N 个智能体,让它们各自用不同的方法尝试同一项任务。然后由提示词或模型以两两对比的方式评判结果,再由一个评审智能体持续评判,直到选出胜者。
循环直到完成
对于工作量未知的任务,持续循环并生成智能体,直到满足停止条件(例如没有新发现,或日志中不再出现错误),而不是预先设定固定的轮数。
使用场景
积极思考何时以及如何让 Claude Code 创建动态工作流。我发现,工作流有时甚至对非技术工作更有用。
迁移和重构
Bun 使用工作流从 Zig 重写成了 Rust。你可以在 Jarred 的帖子中了解更多,也可以看看我们如何在百万行代码库中运行 AI 代码迁移。
关键是把任务拆成一系列需要处理的步骤,例如调用点、失败的测试、模块等。针对每个修复,在一个工作树中生成一个子智能体来完成修复,再让另一个智能体进行对抗式审查,然后合并结果。可以考虑告诉智能体不要使用资源密集型命令,这样你就能尽可能多地并行处理任务,而不必担心耗尽机器资源。
深度研究
我们在 Claude Code 中发布了一个深度研究技能(/deep-research),它使用动态工作流。具体来说,它会扇出网络搜索、获取来源、对来源中的声明进行对抗式验证,并综合生成一份附有引用的报告。
不过,这类研究不只适用于网络搜索。例如,你可以让 Claude 根据 Slack 中的上下文编写一份状态报告,或者让它通过深入探索代码库来研究某项功能的工作方式。
深度核验

图 D 深度核验:每项事实声明都对应一个核查智能体;每个核查智能体后面还可以再跟一个来源审查智能体。
另一方面,如果你有一份报告,想要检查并追溯其中引用的每一项事实声明,你可能会想生成一个工作流:先让一个智能体识别所有事实声明,再为每项声明生成一个子智能体进行详细核查。你还可以让一个核验智能体检查来源子智能体,确认其来源质量足够高。
排序

图 E 锦标赛排序:每次比较都使用一个全新的智能体,因此没有任何单个上下文需要容纳全部 1,000 个项目。
你可能有一份项目列表,希望按照你认为 Claude Code 擅长评估的定性标准进行排序,例如按 bug 严重程度对支持工单排序。但如果试图在一个提示词中对 1,000 多行进行排序,质量会下降,而且内容也放不进上下文。此时可以运行锦标赛,即由一系列两两比较的智能体组成的流水线(比较式判断比绝对评分更可靠);也可以并行分桶排序,然后合并结果。每次比较都由一个独立智能体完成,因此确定性的循环负责保存对阵表,上下文中只需保留当前运行顺序。
记忆和规则遵循

图 F 逐条规则审查:每条规则都由一个处于干净上下文中的核验器负责,然后由一个质疑者筛查标记结果。
如果你有一组特定规则,发现 Claude 即使看到这些规则(即使把它们写进 CLAUDE.md)也会漏掉或难以遵循,就可以创建一个包含这些规则的工作流,并要求核验智能体逐条检查,每条规则对应一个核验器。再创建一个“质疑者”角色的子智能体来审查这些规则,确保它们本身合理,这样有助于避免过多误报。
反向做法也行:从你最近的会话和代码审查评论中找出你反复提出的纠正意见,让并行智能体对它们进行聚类,再对每个候选规则进行对抗式验证(这条规则能否避免一个真实错误?),最后把通过验证的规则提炼回 CLAUDE.md。
根因调查
调试最适合通过提出几种彼此独立的假设并逐一测试来完成;但如果你只使用一个上下文窗口,Claude 可能会出现自我偏好偏差。工作流可以通过结构设计来防止这种偏差:让智能体基于互不重叠的证据提出假设。例如,分别安排智能体分析日志、文件和数据。随后,每个假设都可以交由一组核验者和反驳者审查。
这不只适用于代码。工作流也可用于销售(为什么 3 月的销售额下降了?)、数据工程(这条流水线为什么失败了?)或任何复盘工作。
大规模分流

图 G 先隔离,再行动:读取智能体在没有权限的情况下处理不可信内容;执行智能体只会看到它们的摘要。
每个团队都有支持队列、错误报告或其他无法由人类完全处理的积压事项。
分流工作流会对每个条目进行分类,与已有跟踪事项去重,并采取行动。这可能意味着尝试修复问题,或将问题升级给人工用户处理。
分流工作流有一种实用模式叫作隔离。它会禁止读取不可信公开内容的智能体执行高权限操作;这些操作改由负责根据信息采取行动的智能体执行。
将分流工作流与 /loop 配合使用,让 Claude 持续执行这项工作。
探索和品味
在探索问题解决方案的不同方法时,工作流会很有用;尤其是对于设计或命名这类依赖品味、适合用评分标准评估的任务。
可以尝试让 Claude 探索一系列解决方案,再为评审智能体提供一套标准,用来定义什么样的方案才算好。评审智能体认为方案符合标准时,任务就完成了。也可以依据评分标准,通过锦标赛对方案进行排序或选择。
评测
你可以通过在工作树中生成独立智能体,再生成比较智能体,依据评分标准比较并评分具体输出,从而针对特定任务运行轻量评测。例如,可以依据某项特定标准,评估并改进你创建的技能。
模型和智能水平路由
创建一个针对你的任务进行调优的分类器智能体,由它来决定使用哪个模型。如果你的任务会涉及许多工具调用,那么在执行之前先开展研究,就能确定最适合该任务的模型;在这种情况下,这种做法会很有帮助。
例如,对于“解释 auth 模块的工作原理”这项任务,最佳模型取决于 auth 模块中有多少文件,以及代码库的结构。分类器智能体可以先进行这项研究,然后根据预期复杂度将任务分派给 Sonnet 或 Opus。
何时不该使用动态工作流
工作流是新事物。虽然在许多用例中,它们能带来显著成效,但并非每项任务都需要工作流,而且工作流最终可能会使用多得多的 token。
最好创造性地使用工作流,以突破你此前使用 Claude Code 的方式。对于常规编程任务,不妨问问自己:它真的需要更多计算资源吗?例如,大多数传统编程任务都不需要一个由 5 位评审者组成的评审组。
在更高一层的架构层面,同样的判断也适用:选择多智能体还是单智能体,也要遵循类似逻辑——并行化和专业化必须值得付出协调成本。
构建动态工作流的技巧
提示
详细提示,并使用我们上面介绍的具体技巧,能让动态工作流产生最佳结果。
工作流不只适用于大型任务。你可以提示模型使用“快速工作流”。例如,你可以快速对某个假设进行对抗式审查。
与 /goal 和 /loop 结合
使用可以重复执行的工作流时,例如用于分流、研究或核验的工作流,可以配合 /loop 让它定期运行,并配合 /goal 设置硬性的完成要求。
Token 使用预算
你可以为动态工作流设置明确的 token 使用预算,限制任务会使用多少 token。你可以提示它设置类似“使用 10k token”的预算,从而设定上限。
保存和分享动态工作流
在工作流菜单中按“s”,即可保存工作流。你可以把它们保存到 ~/.claude/workflows,也可以通过技能进行分发。

图 H 动态工作流面板——按 s 将一次运行保存为可复用的工作流。
若要通过技能分享工作流,请将 JavaScript 工作流文件放入技能文件夹,并在 SKILL.md 中引用它们。为了提高灵活性,你可能需要提示 Claude 把技能中的工作流视为模板,而不是必须原样运行的脚本。

探索的新起点
工作流是扩展 Claude Code 的一种实用新方式。我鼓励你把它们视为探索新方法的起点,用 Claude 帮你完成任务。关于如何最好地使用它们,还有很多有待发现。欢迎告诉我你的发现。
关于哪些内容最初应该放进 harness 的原则,请参阅我们关于使用 Claude 构建时的三种 harness 设计模式。
本文由 Anthropic 技术团队成员 Thariq Shihipar 和 Sid Bidasaria 撰写,他们的工作方向是 Claude Code。