Skip to content

第 4 章:当一个 Loop 不够用——进入 Graph Engineering

本章解锁:你能识别单 Agent Loop 力不从心的信号,理解 Graph 的三要素(节点、边、共享状态),并区分 Loop、Graph、Harness 各自的定位。
预计时间:20 分钟


起点与环境

前置章节:第 3 章(设计你的第一个 Agent Loop)

你已经能设计包含四步骨架、停止条件和 Maker-Checker 模式的 Agent Loop 了。在你的代码审查 Loop 中,explorer、reviewer、verifier 三个 sub-agent 在一个 loop 内部协同工作,由主 agent 统一调度。

但这里有一个重要的限制:这三个 sub-agent 不是独立的 agent,它们是主 agent 的"手臂"。它们没有自己的循环,没有自己的记忆,没有自己的判断权——一切由主 agent 说了算。

当场景进一步复杂,这种"中心化调度"模式会遇到墙。


为什么现在做

想象这样一个场景:你的团队要做一次技术方案评审。

  • 架构师 Agent 需要评估方案的系统设计是否合理
  • 安全专家 Agent 需要检查是否有安全隐患
  • 性能专家 Agent 需要评估是否有性能瓶颈
  • 产品经理 Agent 需要判断方案是否满足产品需求

这四个 Agent 各自有独立的知识体系、独立的评审标准、独立的执行逻辑。架构师关心模块划分和接口设计,安全专家关心认证授权和数据流转,性能专家关心热路径和资源占用——它们的"观察-规划-执行-验证"完全不同。

你能把这四个角色塞进一个 Loop 的 sub-agent 里吗?技术上可以。但你会遇到几个问题:

  1. 上下文爆炸:主 agent 需要同时理解四个领域的上下文,上下文窗口很快不够用
  2. 调度僵化:主 agent 必须决定四个 sub-agent 的执行顺序,但实际上架构评审和安全评审可以并行
  3. 结论冲突:架构师说"用微服务",性能专家说"微服务增加延迟不可接受"——谁来仲裁?sub-agent 模式下只有主 agent 能仲裁,但主 agent 可能不具备仲裁的专业能力
  4. 记忆隔离:每个专家的评审经验应该独立积累。安全专家积累的漏洞模式库对性能专家没有意义,反而会干扰

这就是从 Loop 到 Graph 的跃迁点


动手实践

4.1 识别"需要 Graph"的四个信号

通过上面的场景,我们可以提炼出四个信号。当它们出现时,说明单 Loop 不够用了:

信号描述Loop 中的症状
角色独立性不同角色需要独立的知识体系和决策权主 agent 的 prompt 变得极长,试图同时扮演多个专家
并行需求多个任务可以同时进行,不需要串行等待明显可以并行的步骤被迫排队
结论冲突不同角色可能产生矛盾的结论,需要仲裁主 agent 在矛盾面前随机选择,或者总是偏向某一方
记忆分化不同角色的经验积累应该独立Memory 文件变成了各种不相关信息的大杂烩

你的实践任务:回顾你在第 3 章设计的代码审查 Loop,判断它是否出现了上述信号。大多数情况下,简单的代码审查 Loop 不会出现这些信号——这恰恰说明它不需要 Graph。

4.2 Peter Steinberger 的那个问题

2026 年 7 月 18 日,PSPDFKit 创始人 Peter Steinberger 在推特上发了一句简短的话:

"Are we still talking loops or did we shift to graphs yet?"
— Peter Steinberger, 290 万浏览量

这句话之所以引爆讨论,是因为它精准地捕捉到了社区的集体困惑:当 Agent 系统变得越来越复杂,Loop 这个抽象够用吗?

Josh Simmons 随后发文回应,把演进阶梯讲得更清楚:

每一层都是更高的抽象,更少的"whispering",更多的"architecture"。
— Josh Simmons

"Whispering"——低声耳语——是一个精准的比喻。Prompt Engineering 是你对着模型耳语;Loop Engineering 是你设计系统让系统对着模型耳语;Graph Engineering 是你不再关心谁对谁耳语,你设计的是整个对话的拓扑结构

4.3 Graph 的三要素

Graph Engineering 的核心思想可以用三个要素概括:

要素 1:节点(Nodes)

节点是 Graph 中的执行单元。每个节点可以是:

  • 一个独立的 Agent(有自己的 prompt、工具和记忆)
  • 一个功能模块(非 LLM,如代码编译器、测试运行器)
  • 一个人工确认点(Human-in-the-loop)

关键区别:Graph 中的节点是独立的。它们有自己的执行循环(可能就是一个完整的 Loop)、自己的记忆、自己的专业知识。这和 Loop 中的 sub-agent 根本不同——sub-agent 是主 agent 的延伸,节点是独立的实体。

要素 2:边(Edges)

边定义了节点之间的任务流转逻辑——谁把什么传给谁、什么条件下触发下游节点。

边不只是"连线"。边上传递的内容至关重要。我们在第 5 章会详细展开,这里先建立一个关键认知:

边上需要传递结构化产物,而不是无差别转发全部对话。
— Josh Simmons, Graph Engineering 讨论

一个好的边传递的是:节点的结论、依据和置信度。而不是把节点内部所有的思考过程和中间对话全部转发给下游。

要素 3:共享状态(Shared State)

共享状态是 Graph 中所有节点都可以读写的全局数据。它独立于任何单个节点的聊天记录。

共享状态包含什么

  • 任务的原始输入(如被评审的方案文档)
  • 各节点已确认的决策
  • 尚未解决的争议
  • 证据链(谁基于什么做了什么判断)

为什么需要独立的共享状态? 因为节点之间的对话是断裂的。架构师 Agent 和安全专家 Agent 各自有自己的对话历史,它们不能直接看到对方"想了什么"。共享状态是它们的公共白板。

4.3.1 用代码感受 Graph 的结构

三要素讲完了,现在把它们写成代码。先定义共享状态——Graph 中所有节点读写的"公共白板":

python
# shared_state.py — Graph 共享状态定义
from dataclasses import dataclass, field

@dataclass
class ReviewState:
    """方案评审 Graph 的共享状态,所有节点可读写。"""
    proposal: str = ""                        # 待评审的方案原文
    reports: dict[str, str] = field(default_factory=dict)  # 各节点的评审报告
    conflicts: list[str] = field(default_factory=list)     # 尚未解决的争议
    final_verdict: str = ""                   # 仲裁节点的最终结论

然后用 Python 字典定义 Graph 的拓扑——节点、边、以及它们如何连接到共享状态:

python
# review_graph.py — 最小 Graph 定义
review_graph = {
    "name": "proposal-review",
    "shared_state": "ReviewState",           # 引用上面的共享状态类

    "nodes": {
        "arch_review":  {"agent": "架构评审专家", "writes": "reports.arch"},
        "sec_review":   {"agent": "安全评审专家", "writes": "reports.security"},
        "perf_review":  {"agent": "性能评审专家", "writes": "reports.performance"},
        "arbitrator":   {"agent": "综合仲裁者",   "writes": "final_verdict"},
    },

    "edges": [
        # 三个评审节点可以并行执行
        {"from": "arch_review",  "to": "arbitrator", "artifact": "reports.arch"},
        {"from": "sec_review",   "to": "arbitrator", "artifact": "reports.security"},
        {"from": "perf_review",  "to": "arbitrator", "artifact": "reports.performance"},
    ],
}

对比第 3 章的 Loop 配置:Loop 只有"步骤的顺序"(观察 -> 规划 -> 执行 -> 验证),所有 sub-agent 共用主 agent 的上下文;而 Graph 多了两个关键维度——边上定义了传递什么产物(不是转发全部对话),共享状态独立于任何节点的聊天记录。这正是 Graph 能处理"独立角色 + 结论冲突"场景的结构基础。

4.4 Loop、Graph、Harness 的定位辨析

现在让我们厘清三个容易混淆的概念:

  • Loop 是时间结构:一个 Agent 如何持续推进任务
  • Graph 是组织结构:多个 Agent 如何分工、交接、审核和收敛
  • Harness 是运行系统:怎样让 Loop 和 Graph 在真实环境中可靠运行

用建筑来类比(注意,类比只用于建立直觉,不要过度延伸):

  • Harness 是建筑工地的基础设施——脚手架、安全网、供电供水
  • Loop 是单个工人的工作流程——砌一层砖、检查水平、不平就调整、继续砌
  • Graph 是整个工程的组织结构——哪些工种先进场、谁的工作完成了才能交给下一个工种、出了分歧谁来协调

三者缺一不可,也不存在"用 Graph 就不需要 Loop"的说法——Graph 中的每个节点,内部可能就是一个完整的 Loop

4.5 一个关键判断:你的任务需要 Graph 吗?

在进入第 5 章(设计 Graph)之前,先做一个冷静的判断。因为 Graph 也可能是过度设计。

你的实践任务:用下面的决策树判断你手头的某个任务是否需要 Graph。

你的任务需要多个独立角色吗?
├── 否 → 不需要 Graph,一个 Loop 足够
└── 是 → 这些角色需要各自独立的知识体系和记忆吗?
    ├── 否 → 不需要 Graph,在 Loop 中用 sub-agent 即可
    └── 是 → 角色之间需要交接、仲裁或审批流程吗?
        ├── 否 → 不需要 Graph,多个独立 Loop 并行即可
        └── 是 → 考虑使用 Graph

注意最后一个判断:如果多个角色完全独立、互不依赖,那你需要的只是多个并行的 Loop,不是 Graph。Graph 的价值在于处理角色之间的交互——交接、冲突解决和收敛


理解检查

  1. 辨析题:Loop 中的 sub-agent 和 Graph 中的节点,最本质的区别是什么?(提示:不是数量多少的问题)

  2. 判断题:以下哪个场景适合用 Graph?

    • A. 一个 Agent 每天自动更新项目依赖并提交 PR
    • B. 三个 Agent 分别负责代码质量、安全审计和性能测试,最终需要综合出一个"是否可以上线"的结论
    • C. 一个 Agent 写代码,另一个 Agent 审查代码
  3. 应用题:Peter Steinberger 的推文获得 290 万浏览量,说明社区对 Graph Engineering 有强烈兴趣。但 Josh Simmons 也指出"何时不该用 Graph"。描述一个看起来像需要 Graph 但实际上不需要的场景。

参考答案

  1. 独立性。Sub-agent 没有自己的执行循环和决策权,由主 agent 调度和控制;Graph 节点是独立的实体,有自己的循环、记忆和决策权。打个比方:sub-agent 是你的手(你指挥它动),Graph 节点是你的同事(你只能和它协商)。

  2. B。A 是单 Agent 的 Loop 任务(只需要一个角色)。C 是 Maker-Checker 模式,可以在 Loop 内用 sub-agent 解决。B 需要三个独立专业领域的 Agent 各自做判断,然后交给一个仲裁者综合——有独立角色、有交接流程、有结论冲突可能,符合 Graph 的使用条件。

  3. 典型例子:一个"微服务风格"的 AI 系统,把翻译、摘要、格式化三个步骤分给三个 Agent。这看起来像 Graph(三个节点,串行连接),但实际上三个步骤之间没有冲突、没有仲裁需求、没有共享状态——这只是一个串行 pipeline,用一个 Agent 的三步 prompt 就能解决,或者用 Loop 的三步执行即可。拆成 Graph 只增加了延迟和复杂性。


发生了什么

这一章你建立了从 Loop 到 Graph 的认知桥梁。

核心概念回顾:

  • 四个需要 Graph 的信号:角色独立性、并行需求、结论冲突、记忆分化
  • Graph 三要素:节点(独立执行单元)、边(任务流转逻辑)、共享状态(公共白板)
  • 三者定位:Loop 是时间结构,Graph 是组织结构,Harness 是运行系统
  • Graph 中的节点可能就是一个完整的 Loop
  • 不是所有多 Agent 场景都需要 Graph——没有交互需求的多角色,多个独立 Loop 就够了

常见误区

误区纠正
"多个 Agent = Graph"不是。多个 Agent 并行运行但互不依赖,不是 Graph。Graph 的核心是节点之间的交互和协调。
"Graph 比 Loop 高级"不是"高级",是解决不同的问题。简单任务用 Graph 是过度设计。
"Graph Engineering 是全新的技术"Josh Simmons 明确指出:"名字是新的,问题早就存在。"微服务编排、工作流引擎、分布式系统协调——这些问题计算机科学讨论了几十年。Graph Engineering 是把这些思想应用到 Agent 协作领域。
"有了 Graph 就不需要 Loop 了"Graph 的每个节点内部可能就是一个 Loop。Graph 不替代 Loop,而是在 Loop 之上增加了一层组织结构。
"共享状态 = 把所有对话历史合并"共享状态应该是结构化的、有意义的信息(决策、结论、证据),不是对话历史的无差别堆砌。

本章检查点

完成以下清单后,你可以进入下一章:

  • [ ] 我能说出四个"需要 Graph"的信号
  • [ ] 我能画出 Graph 的三要素关系图
  • [ ] 我能区分 Loop、Graph、Harness 各自的定位
  • [ ] 我能用决策树判断一个任务是否需要 Graph
  • [ ] 我理解"Graph 中的节点可能就是一个 Loop"

下一章预告:你已经知道什么时候需要 Graph 了。下一章我们深入到 Graph 的设计细节——边上传递什么、共享状态怎么设计、节点失败怎么处理、人工确认节点怎么嵌入。我们会设计一个完整的多 Agent 方案评审系统的 Graph 拓扑。


← 上一章:设计你的第一个 Agent Loop | 下一章:设计可靠的 Agent Graph →