图工程是循环工程(loop engineering)的继任者:不再把步骤排成一条线,而是设计"工作的形状"——什么先跑、什么同时跑、什么得等,让 agent 跑宽 10 倍。核心工具是 Claude Code 的动态工作流(dynamic workflows)。
图工程是什么
单循环有一个已知的失败方式:某个支持团队把反馈循环绑在"工单解决率"上,数字连涨几个月,用户满意度却一路走低——机器人学会了快关工单,而不是解决问题。这就是古德哈特定律(Goodhart’s law):循环只能看见自己的指标,没法问目标对不对。
答案不是更好的循环,而是由循环组成的图:一张网络,里面的循环互相盯、互相纠。对 agent 而言,这意味着——不要再写一个把所有事排成一条线的 agent,去设计工作的形状。
核心概念:节点与边
- 节点(node):一个工作单元——一个 agent、一个任务、一个输入、一个输出。
- 边(edge):一段依赖——这个节点的输出,喂给那个节点的输入。
所有人都会犯的错,是把"然后"当成一条边。“总结这个文件,然后告诉我天气”——天气根本不读那个总结。每碰到一个"然后"就问:下一步真的会读上一步的输出吗?
- 会 → 真边,保留顺序。
- 不会 → 没有边,那个等是白等,让它们并排跑。
两个盒子之间没有数据穿越,它们就是独立的。普通 agent 其实已经是一张图,只是最寒酸的单链:C 一堵,D 永远不会发生。
第 1 步:看见那些不存在的边
(即上面的节点/边判断法——“然后"不等于依赖,挖出隐藏的独立性是整份指南的地基。)
第 2 步:搭起你的第一张图
前置条件:
- Claude Code v2.1.154+(用
claude --version查看) - 付费套餐:Max/Team/Enterprise 上 workflows 默认开启;Pro 需在
/config打开 Dynamic workflows。
搭建流程:
- 打开一个你熟悉的真实仓库。
- 粘贴 Anthropic 提供的 prompt,例如:
Create a workflow to audit every route file under src/routes/ for missing auth checks. Spawn one agent per file, then run an independent verifier on each finding before reporting. Analyze a maximum of 20 files to start.——把路径换成自己的,max 20让首次试跑别花太多。 - 看 “workflow” 亮起来:Claude Code 高亮提示 “Dynamic workflow requested.",这就是正在搭图的信号。
- 批准计划:Claude 会写一段 JavaScript 编排脚本并先展示各阶段,读一遍,点 “Yes, run it."。
- 让舰队开跑:一个文件一个 agent,并行跑。输入
/workflows看实况:scope(范围)、fan-out(扇出)、verify(验证)、synthesize(合成)。 - 读那一个答案:不是二十个分开的对话,而是一份报告——中间结果活在脚本变量里,不占你的上下文。
关于"零 token"的说法
协调脚本是代码,agent 之间传结果不会像对话交接那样重新吃一遍上下文。但 agent 本身还是要花用量的:一次 workflow 的成本明显高于一次普通会话。省的是协调开销,不是干活的开销。先小范围起步,盯用量,再放开。
把它变成你的 & 扩展上限
某次跑得好,按 s,会存到 ~/.claude/workflows,可按名字复跑——改任务、保形状。一次 workflow 最多扇出到 1,000 个 agent,同时干活 16 个;“同时 16 个"只是舰队分波次推进,全程不用盯任何一个。
第 3 步:真正会塌的地方
两种失败最要命:
- 失败一:图跟自己附和。 当 agent 检查自己的活,它对自己下不去手——模型偏爱自己产出的东西。解法是加一个独立的验证器(verifier)节点:把执行节点那段对话原样塞给它,它就不是在验证,而是换了个字体跟自己附和。一群共享同一上下文的 agent 组成的图,就是穿了马甲的单循环。验证器必须是全新节点、自己的上下文,检查真实信号(“测试真的过了”,不是"agent 说了算”)。
- 失败二:agent 互相踩脚。 Bun 团队第一次把大型移植任务扇开时工程上失败了——多个 agent 在同一工作区用相同 git 命令互相覆盖。修法是结构性的:禁掉不安全命令,给每组 agent 各自隔离的 worktree。
扇开之前回答三个问题:每个 agent 在哪儿干活?结果怎么合?两个 agent 起冲突时怎么办?
第 4 步:本周可搭的六张图
同一个形状,对准新活儿:
- 安全扫描——一个文件一个 agent 找缺失的 auth,验证器确认每条命中。
- 带引用的报告——
/deep-research:拆成多个角度并行检索,agent 互相反驳后写。 - 移植一个模块——一个文件一个文件,测试当闸门,失败回环。
- 对抗式 diff 评审——按体量路由:小改动一轮,大改动全量并行审计。
- 定时生态扫描——存一次,按名字复跑。
- 未知规模的探查——finder 并行跑,每个结果对照已见过的所有结果,循环到连续两轮没新东西。
真实天花板:Bun 的 Zig → Rust 移植
Simon Willison 的报道:Bun 的 Zig → Rust 移植跑的就是这套机器——约 50 个 workflow,峰值 64 个 agent 并行,约 53.5 万行 Zig 变成超一百万行 Rust,11 天,花费约 16.5 万美元用量。规模是真的,代价和所需的人力盯防也是真的。
第 5 步:让图保持诚实的锚点
光靠拓扑买不来真相。图需要锚点(anchors)——那些没法被反驳的节点:
- 真的跑过的测试——不是"应该过”,是"过了”。
- 看证据、不凭感觉的验证器。
- 冻结的规则——agent 永远不许动它们,因为正是这些规则最容易被优化器悄悄削弱。
一张图有多诚实,取决于里面那些拒不挪窝的东西。
什么时候不该用图
- 任务小或独立:加一个函数、修一个 bug,workflow 是纯粹额外开销——一个 agent 更快更便宜。
- 你要盯得很紧:想每一步都读了批了再跑下一步,图"不用盯就能跑得很宽"的设计反而对着干。
- 还没搞清楚在找什么:探索性活儿要能随时掰方向的 agent,不是钉死在计划上的舰队。
- 各步骤确确实实相互依赖:每一步都读上一步的输出,就是真正的链,并行无处下口,硬套只多协调开销、零加速。
判断诀窍就是第 1 步:连两个之间没有箭头的盒子都找不到,就没什么图可搭。那就是个循环,而循环挺好的。
转变
提问者问问题,架构师画图。线性 agent 只是第一个形状——因为它和我们打字的方式对得上。一旦看见节点和边:活儿独立的地方扇出去,可信度要紧的地方给边把关,冻住握着真相的节点。
原文:公众号「AI领先趋势」图工程:一个 prompt、一个窗口,跑起 1000+ 个 agent 循环(完整 5 步教程)