ZBStream
Insights · Graph engineering

图工程详解:它是什么、何时该用、何时不该用

ZBStream · 2026-08-18 · Guide

大多数人对 AI 的使用,只发挥出了它实际能力的 5% 到 10%。存在一条更快的路,而且它看上去比实际更庞大。学会它,你就能优化庞大的流程,而不只是个人琐事。

这是大公司里那些真实岗位背后的技能——区别在于:是亲自做一件事,还是设计一百件事如何被完成。

我很早就幸运地接触到了它。当我在丹麦一所顶尖大学求学时,我们有一整门课只讲一件事:如何把一个流程画成图,并让它尽可能高效。

当时它感觉很抽象。如今,它正是你时间线上那些顶级 AI 工程师争论的焦点。

读完这篇文章,你会比你关注的大多数人都更懂图工程:图到底是什么、一个能立刻让你的 AI 变快的测试、那个能收回成本的单一模式、这些方法在哪里悄悄失效、什么时候图是错误工具,以及如何用几分钟亲手构建一个真正的图。

1它到底是从哪来的 Where this even came from

一个月前,整个领域都在谈论“循环(loop)”。接着 Peter Steinberger 发了一句上面那句话,而互联网上那批刚学完循环的人,一夜之间就宣布循环过时了。

这个玩笑之所以成立,是因为它有一半是真的。如果你读过我的《循环(Loops)》一文,你就已经掌握了基础。循环,是一个智能体反复改进某件事:尝试、检查、调整、再来一次。那是上个月的技能。

现在大家转向的,并不是一个更好的循环,而是循环的图(graph of loops)——一张由循环组成的网络,其中的环互相监视、互相纠正,而不是一个智能体孤零零地去追一个数字。

而工程师们在几小时内就对这股热潮泼了冷水,指出这是一个披着新名字的、几十年前的老想法。他们说得对,而这是好消息。一个能稳定运行关键系统三十年的模式,正是你愿意把工作托付给它的那种东西。

2图到底是什么 What a graph actually is

图,其实就是你 AI 工作的一份计划,把它画出来,让你看得见。它回答两个问题:哪些任务需要发生,以及哪个任务必须等待哪个任务。

它只有两个组成部分,把这两点搞清楚,就能解决大部分困惑。

一个方框,叫做节点(node)。它代表一件工作:一个智能体做一项任务,有一个输入、一个输出。例如调研竞争对手、起草一版稿件、核实一个说法。

一个箭头,叫做边(edge)。它只表示:一件工作需要另一件工作产出的东西,所以它必须等待。而且,只有当有真实的东西真正沿着箭头传递时,这条边才算数。

节点负责思考,边负责传递结果。这就是全部的词汇。一旦你掌握了它,就再也不需要任何定义。

让一个节点在图里真正可用的,是一份契约(contract):一件有边界的任务、一个明确的输入、一个明确的输出。一个输出是整墙自由文本的节点,只有人类才读得懂;而一个输出形状固定的节点,下一个节点无需猜测就能消费它——而这正是全部意义所在。

3找出“假边”的测试 The test that finds the fake edges

看着你今天运行的 AI 工作流,一步一步地走一遍。在每一步,只问一件事:这一步,真的需要上一步的结果吗?

如果需要,那么这条边是真的,保持这个顺序。如果不需要,那就不存在这条边,等待就是浪费。这两件工作可以同时运行。

举个简单的例子:“先审查文件 A 的 bug,再审查文件 B 的 bug。”它读起来像是一个顺序,但对文件 B 的检查,永远不看文件 A 返回了什么。它们之所以一个接一个地运行,只是因为你是按这个顺序输入的。让它们并行运行,整个过程会在较慢的那个单文件所需时间内完成,而不是两者相加。

在你画出的几乎任何工作流里,你都会找到两三条这样的假边。每一条,都是你白白扔掉的时间。

4你现在的配置,本身就已经是一张图 Your current setup is already a graph

当你把一个智能体写成“先做 A,再做 B,再做 C,再做 D”时,你在技术上其实已经画了一张图。只是它是最可悲的那种:一条笔直的单链,每个节点都只有一个进箭头和一个出箭头。

它运行得没错。但它的运行也很慢,而且容易崩溃,因为一条链没有任何冗余。如果 C 卡住了,D 永远不会发生,而 A 的工作会被困在上游,无处可去。

图工程的第一项真正的技能,就是重画这条链。拿你的线性工作流,对每个箭头,都问一遍那个“假边问题”。砍掉那些不承载数据的箭头,这条线就会塌缩成一个更宽的形状:几个彼此独立的任务,可以同时运行,然后汇入一个需要它们全部结果的任务。

这之所以重要,不是因为表面美观。一个有 40 步的线性工作流,有 40 个串行失败点,延迟也是 40 步的总和。而同样的 40 个工作,画成图后,只拥有实际存在的那些真实依赖——通常只有三到五个——并以你最慢那一层的速度完成,而不是所有东西的总和。这就是一个需要五分钟的任务和一个需要十五秒的任务之间的差别,而它们运行的,是完全相同的工作。

模型从来都不是瓶颈。你画的那条线,才是。

5那个能回本的单一模式:菱形 The one pattern that pays: the diamond

你不需要一百种形状。观察任何严肃的智能体系统是如何工作的,你会发现同一个画面反复出现:工作被拆分,几个工人并排挖掘,有东西检查他们找到的东西,然后所有结果合并成一个答案。

这个画面叫做菱形(diamond),它几乎是你今年唯一需要掌握的模式。它的正式名称值得你记住:扇出(fan out)、归约(reduce)、综合(synthesize)

扇出以获得广度,用普通代码做归约以压缩,用最后的智能体做综合来写出答案。

Claude 内部的“研究(Research)”功能,在生产环境中跑的就是这个。一个负责人规划角度,工人们并行收集,发现被核实,然后只有一份报告送达你手中。一旦你能看见菱形,你就会停止问“怎么让我的智能体多做几步”,转而开始问“拆分在哪里,汇合在哪里”。后一个问题,才是能够扩展的那个。

下面就是菱形在引擎盖下的真实样子。当你说“workflow(工作流)”时,Claude 会自己写一段这样的小脚本,并以代码的形式运行协调过程——这就是为什么在智能体之间传递结果不会多消耗任何上下文。

读一遍,整个门道就尽收眼底:在独立之处扇出、用免费代码做归约、在一个全新的上下文中做验证、在无聊的节点上用便宜的模型,而在需要判断力的地方用强大的模型,最后在结尾做一次综合。无论是市场扫描、代码审查还是研究报告,背后的骨架都一样。换掉角度和提示词即可。

6检查者才是全部的关键 The checker is the whole trick

现在到了几乎人人都会跳过、却把真正的图与昂贵的玩具区分开来的部分。

每一项严肃的 AI 自我审查测试都说的是同一件事:模型会漏掉自己大部分的失误。一个给自己的作业打分的模型,对自己实在太宽松了。

所以,你永远不要让做了那项工作的智能体去检查那项工作。

你要在边上放一个独立的节点。它唯一的任务,就是在这份发现继续前进之前,试着干掉它。如果它扛住了,就通过;如果没扛住,它就当场死在那里。

这里有一个没人点破的陷阱:那个检查者需要一个干净的上下文。

把工人用过的同一个聊天给它,它根本不是在检查任何东西,它只是在用一种不同的字体,跟着自己点头附和。一个共享同一上下文的智能体图,不过是一个穿了戏服的单个循环,而且它会以同样的方式崩溃——只是更晚、更贵。

所以要让验证者保持全新。拥有自己的上下文。检查的是真实的信号,不是“智能体说它做完了”,而是“那个测试是否真的通过了”。

然后把检查拆成三路。它正确吗?它是最新的吗?那个来源到底是真是假?三个不同的视角,能捕捉到十个相同视角都会漏掉的东西。

要记住的规则是:一个工人和它的验证者,绝不能共享上下文。一旦它们共享了,你就又回到了一个给自己的家庭作业打分的循环,只是账单更大了。

7图到底在哪里崩坏 Where graphs actually break

  1. 上下文坍缩(Context collapse)。

    扇出上千个节点,然后试图把这一千个输出全部喂进最后一步,你会在综合还没开始之前就冲破了上下文窗口。

    解决办法:给你的汇入分层。分批处理结果,先总结每一批,再合并这些总结——绝不要合并原始的大堆数据。

  2. 假独立(False independence)。

    两个节点看起来彼此独立,因为它们的提示词从没提到对方,但它们却写入同一个文件,或命中同一个限速的 API。那就是一条隐藏的边。

    当 Bun 团队第一次把一项大任务扇出到很多智能体时,他们共享一个工作区,结果互相覆盖了对方的东西。

    解决办法:给每个工人一个完全隔离的空间,并且要审计共享的资源,而不仅仅是共享的数据。

  3. 节点静默失败(Silent node failure)。

    在一条链里,一个失败会停止一切,烦人但显而易见。而在一个图里,两百个节点中死掉一个,可能悄悄溜进一份看起来已经完整的报告里。

    解决办法:每一个合并步骤,都要把它的输入数量与它预期的数量比对,一旦有缺口就标记出来,而不是在只用了半份数据的情况下悄悄继续。

8你真的需要一张图吗 Do you even need one?

按照我文章的传统,让我们诚实地弄清楚,这到底对谁有用。

图买来的是广度。它买不来更好的判断力。

它是为“宽度”服务的工具,为可以同时进行的独立工作而生。当工作并不宽时,那条线从来就不是问题。

在这些情况下,跳过图:

  • 任务很小或彼此隔离。添加一个函数、修复一个 bug。这种协调纯粹是开销,单个智能体更快也更便宜。
  • 你想审批每一步。图的全部意义就在于,在没有你的情况下并行运行,所以一条勒得很紧的缰绳会与它背道而驰。
  • 你还不清楚自己在找什么。探索性的工作,要的是一个你能引导的智能体,而不是一支被计划锁死的舰队。
  • 这些步骤真正地彼此依赖。强行给真正串行的工作套上图,只是为那一点加速为零的收益白白增加成本。
  • 关键信号就是那个“假边测试”。如果你找不到两件彼此之间没有边的工作,那就没有图可建。它是一个循环,而循环也很好。

9没人愿意听的部分:锚点 The part nobody wants to hear: anchors

这里有一个更深的陷阱,而这才是这场转变真正的教训。

想象你构建了完整的图。配对的检查者、审计节点、用来调校其他节点的元节点。每个节点都在监视另一个节点,而且每一个都在读一份报告。

审计用财务数字去核对那些数字,而这些数字一开始就来自同一个系统。

一切都是一致的。但没有任何东西被真正核实过。

这张图的失败方式,和那个单独的循环一模一样——只是更晚、更贵,而且在坠落途中还亮着多得多的绿灯。

拓扑结构本身,买不来真相。图需要锚点(anchors):那些无法被争辩的节点。

真正运行过、而不是“应该能通过”的测试——通过了。真正到账的收入。真正留住的客户。

而且有些规则必须被冻结——那些优化器会忍不住削弱的规则,之所以被锁在禁区之外,恰恰因为它们正是优化器为了取胜而会去弯曲的那些。

一张图有多诚实,取决于它内部那些拒绝移动的东西。

用无法反驳的数字去评判它,它就保持接地。让它给自己的报告打分,它就会自信地犯错。

10在 Claude Code 里亲手构建一个 Build one yourself in Claude Code

理论够了。如果你已经决定这适合你,或者你只是想试试,那我们来构建一个。你可以用几分钟构建一个真正的图,因为 Claude Code 直接提供了这个工具,叫做动态工作流(dynamic workflows)

归根结底,就是一个词:“workflow(工作流)”。

把它放进你的提示词里,Claude 就不再沿着单行步骤工作了。相反,它会写一小段编排脚本,然后启动一支协调好的子智能体舰队去运行它。

重要的一点是:这种协调是代码,不是对话。在智能体之间传递结果,不会像聊天交接那样重新消耗你的上下文——这正是让一次运行能扩展成整支舰队、却不会淹没会话的原因。

打开一个你熟悉的真实代码仓库,然后粘贴这段:

workflow: 审查这个仓库里的 20 个文件,每个文件用一个独立智能体,找出 bug,并生成一份综合报告

运行它,接下来会发生这些。

首先,Claude 会发出信号,表示它正在构建一个工作流,而不是在正常聊天里作答,并且在动手之前把计划展示给你。你读一遍,然后批准。

接着舰队开跑。每个文件一个智能体,全部同时进行,而你的会话自始至终保持空闲。

最后落到你手里的,不是二十个需要翻看的独立聊天,而是一份报告。中间那些结果都存在于脚本内部,从没进过你的上下文,所以你能真正看到的,只有最终答案。

这就是一张图。一句话,十二个智能体。当一次运行结果不错时,把它存下来,它就会变成一条你可以按名字永远重跑的命令。

注意那个提示词里的“20 文件”上限。它能让你的第一次运行保持便宜,也暗示了每个演示都会略过的那件事:账单。

11可以立刻粘贴的现成图 Ready graphs you can paste right away

下面每一个,都是同一个菱形对准了不同的任务。在一个真实文件夹里打开 Claude Code,把方括号里的部分换成你自己的,然后粘贴。“workflow(工作流)”这个词,就是告诉 Claude 去构建一支协调的舰队,而不是一行步骤。在任何东西上线之前,把自己留作最后一个“是”。

  • 一个可做决策级研究的工作台。取代一周的谷歌搜索,或一张昂贵的分析师账单。你的问题被拆成多个角度,研究人员同时深挖,一个怀疑论者攻击每一项发现,只有幸存者才能进入报告。
  • 一台 SEO 内容机器。每次运行写出一篇可排上名次的草稿,而且绝不未经你就发布。
  • 一套市场进入(go-to-market)工具包。一次运行交付完整的发布套装,每一件都经你批准。
  • 横跨整个仓库的重构清扫。这是任何单一上下文都无法容纳的广度。
  • 一个规模未知的探索循环。适用于那些你进去之前不知道工作有多大的任务,比如一次 bug 清扫——找到一个 bug,往往就牵出另外三个。

12成本与监督 The cost and the supervision

一张图比一次普通聊天贵。贵得多。变便宜的是协调,而不是工作本身。智能体照样会烧掉 token,而一整支舰队会烧掉一大把。

最清楚的例子是公开的。一位工程师用这套配置重写了 Bun 运行时,把大约 53.5 万行的一种语言,翻译成另一门语言的超过一百万行,用时大约十一天。靠手工,这差不多是近一年的工作量。

它运行了大约 50 个工作流,最多同时有 64 个智能体。

它还花费了大约 16.5 万美元的使用费用,需要一个人来设计和全程盯着它,而且它收到了真实的批评:这么多由 AI 写的代码,到底能不能被安全地审查。

这就是它诚实的样貌。一张图可以扇出到一千个智能体,啃完任何单一上下文都无法容纳的任务。它也可以,在你把它指向错误的任务、或跳过了锚点的时候,悄悄地在后台烧掉你的钱。

所以,重装版本是为那些有预算、有上限、有监控的团队准备的。如果你还不是那种团队,你并没有错过什么。从小处开始,盯住一次运行花了多少钱,只有在一张图证明了自己之后,再往宽处扩展。

13这对你而言到底意味着什么 What this actually means for you

这就是全貌。现在你知道图是什么、它在哪里发光、在哪里崩坏,以及它到底是为谁准备的。

你知道它的长处:广度,独立工作的一次性完成。你也知道它的弱点:它买来的是宽度,不是判断力,而且如果你把它指向错误的任务,它会烧掉你的钱。

所以,动作不是“把一切都图化”。而是要知道:什么时候工作足够宽,需要一张图;什么时候,一个简单的循环本来就是答案。

我的建议:今晚就学会那个“假边测试”。画出你当前的工作流,找出那些不承载数据的边,然后把它们删掉。就这一下,在你碰任何新工具之前,你就已经比大多数人更快了。

大多数人会继续把步骤排成一队。而少数学会画图的人,将开跑一整支舰队。