> ## Content Index
> Fetch the complete content index at: https://www.hubwiz.com/blog/llms.txt
> Use this file to discover other available public pages before exploring further.

# 别再逐步盯 Agent：循环负责做对，图决定哪几步该存在
- URL: https://www.hubwiz.com/blog/loops-inside-nodes-graph-between-them/
- Published: 2026-11-01T16:40:35.000Z
- Updated: 2026-11-01T16:43:42.000Z
- Description: 你会逐步盯 agent，不是因为想盯，是因为没别的东西在盯。循环让它自己变对，图决定哪几个单元存在——剩下的活只剩最后一次审批。
- Author: admin
- Tags: AI Agent, 多 Agent, 循环工程, 图工程, 代码评审

你会逐步检查 agent 干的每一件事，原因不是你想检查，而是**没有别的东西在检查**。

想从那张椅子上站起来，需要两样东西，而几乎所有人只建了其中一样：**循环**让一个工作单元在你不在场时自己变对；**图**决定到底有哪些单元存在。

这篇讲那个分界、几个不显眼的机制，以及你最终只批一件事、而不是批所有事的那一点。

## 循环的本质：一条能失败的检查

剥掉所有装饰，循环只有四个部件：**产出、检查、纠正、重复到绿**。

检查就是全部。

如果你手上没有一样东西能在你出门的时候判定这份工作不合格，你拥有的不是循环，是**调度器**。

这听起来很显然，但几乎没人先写检查。他们的顺序总是：先干活，再在末尾挂一个"评审"，而那个评审就是另一个模型被告知"看看这个输出怎么样"。

两个乐观主义者互相点头。

所以先写条件，而且写成**程序能判**的形式：

- 绿：测试套件退出码 0
- 绿：每条断言都带来源行号
- 绿：diff 只碰计划里列出的文件
- **不是检查**：输出看起来不错
- **不是检查**：模型说它很有信心
- **不是检查**：没有报错

最后那条专门坑细心的人。**没有报错不是正确性的证据。** 在它上面建一个循环，你得到的系统会自信地把一个错误重复到预算耗尽，一路日志干净漂亮。

## 没人提醒你的天花板

循环让**一个**工作单元变好。这是它的全部职责，而它非常擅长。

它没法决定有哪些单元、它们的顺序是什么，也注意不到五个步骤里有两个从来不需要互相等待。

于是你得到一个非常好的 agent，用错的顺序、一个一个地跑错的那三步。每一步都正确，结果照样又慢又形状错，而且**调循环修不好它**——因为故障不在任何一个单元内部。

那一刻人们开始怪模型。也正是那一刻，下一层开始给自己回本。

![一个完美的循环，一个错误的形状](https://www.hubwiz.com/blog/content/images/2026/11/host_HQZ4wCCWgAA5YYj.jpg)

## 图是上面那一层

图是工作的形状：什么跑、什么同时跑、什么等、什么根本不跑、结果回到哪里。

只有两样东西。**节点**是一个工作单元：一件有边界的事，一个输入进，一个输出出。**边**是一条依赖：这个节点的输出喂给那个节点的输入。

所有多余的等待都源于同一个错误——把"然后"当成一条边。

"总结这个文件，然后查天气"这两件事之间没有边，天气不消费那份总结。它们是两个独立节点，被一个线性脚本串起来，而串起来的原因只是你打字的顺序。

所以对你现有的每根箭头都跑一遍这个问题：**下一步真的读上一步的输出吗？** 如果你说不出穿过去的是哪个变量，就没有边，那段等待是纯浪费。

多数链条里有两三根这样的箭头，找出来通常就是当下能拿到的最大一次提速。

## 四类节点，其中一类不是模型

拆分器、工人、代码节点、闸门。词汇表就这些。

**拆分器**在最前面，把工作切成单元。它比任何其他节点决定得都多，因为按错的维度切会把下游全部浪费掉。

按文件夹切一个仓库，四个工人会去审同样那三个文件。按爆炸半径切，每个人看到的东西其他人都看不到。

**工人**各干一个单元，各带一个视角，各自拥有自己的上下文。最后那句经常被跳过。

给四个审计员一个共享窗口，他们会趋同：第一个写出一个发现，其余三个读到它，四份报告全部围着同一件事。你付了四份钱，买了一份意见加三声回声。

**代码节点**是大家忘了存在的那类：合并、排序、去重、比对前后的每次导出。这些都不是推理，每一个都只有一个正确答案，每一个都是几行代码。把它们塞进模型，就是给一个本来没有成本、没有延迟、没有方差的步骤，加上成本、延迟和方差。

判据：**如果你能不用"判断、决定、评估、总结"这几个词描述这个变换，它就是代码。**

一张每条边都是 agent 的图，在自己的接线上下租金。

## 循环到底活在哪

一句话解决全部混乱：**循环活在节点之内，图活在节点之间。**

单元之内：产出、检查、纠正、重复到绿。 单元之间：拆分、扇出、合并、过闸、退回。第二列没有一件事能在单元内部表达。

所以这不是二选一。一张节点里没有循环的图，会并行地产出未经验证的工作——比串行更糟，因为量更大。一个外面没有图的循环，是队列里一个非常好的步骤，而那个队列没人设计过。

## 两条回边，所有人都跳过第二条

一张没有回路的图就是条流水线：产出，然后忘记。下周它从同一个地方出发，带着同一个盲点。

能用的图有两条回边，干的是两种活。

**纠正边很短。** 闸门把一个单元退回给产出它的那一步，修的是**你正在跑的这一次**。

**学习边长。** 一个被接受的结果作为约束回到拆分器，修的是**之后每一次运行**。

几乎所有人都建了第一条，跳过了第二条。症状是：系统很快，而且从来不变聪明。

学习边运的不是输出，是从输出里提炼出来的约束：

- 已接受：utils 切片移植完成，一次通过
- 提炼：适配层必须原样保留关键字参数
- 落到：拆分器给之后每个切片的任务书

注意它落在哪。**不是**工人的指令里，而是决定工作怎么切的那份任务书里。一个被确认的成因变成一条规则，下一次断裂就从这一次结束的地方开始。

## 退回单元，别退回整批

这是回边上最贵的错误，值得说直白些。

四个切片移植完，其中一个测试失败。如果整批退回去，三个正确的切片会被重写。它们的新版本是"不一样"，不是"更好"——因为它们本来没有任何问题。

接下来你要重新验证四个，而那三个里任何一个都可能因为不相关的原因这次挂掉。你把一次失败变成四个不确定的结果，还为这个特权付了钱。一次运行里干两遍，它就永远收敛不了。

从外面看，这像是模型反复失败。实际上是回边在摧毁正确的工作。

每次退回要带四样东西，每样都在干活：

- 单元：handlers 切片
- 判定：红
- 原因：`test_auth_redirect` 失败
- 证据：期望 302，实际 200，`handlers/auth.py:88`
- 范围：只改这个文件，别碰其它切片

范围那一行比看上去重要。没有它，退回来的单元会膨胀：agent 打开文件，注意到旁边还有两个问题，顺手也修了，你的一次单切片纠正变成一个没人评审过的四文件 diff。

**上限三次。** 一个单元失败三次纠正，问题在产出它的计划里，而循环看不见计划。

## 闸门看爆炸半径，不看置信度

大多数写法会做一个置信度分数、设一个阈值，超过就放行。那是错的变量。

置信度是那个决定里最弱的输入，原因很容易漏掉：**它是模型唯一能影响的东西。**

强变量是"如果这次改错了会怎样"。按撤销错误有多贵来给工作分道：

1. **可逆且局部。** 一句文案、一个测试、一个带覆盖率的孤立函数。一次坏合并的代价是一次回退，所以这条道可以先开。
2. **可逆但面广。** 共享工具函数、给 schema 加字段、十几个调用方会碰到的任何东西。闸门看确定性检查加上干净的轨迹。
3. **难以逆转。** 迁移、删除、任何写生产数据或动钱的东西。**这条道不开**，不管分数多高。

第三行不是"阈值设得很高"，是**一条不开的道**。这个区别很重要：阈值会被调，关着的道不会。

![闸门看爆炸半径，不看置信度](https://www.hubwiz.com/blog/content/images/2026/11/host_HQZ5mTxXUAANsQt.jpg)

在开着的道里，闸门按顺序读证据：确定性结果 → 这次运行的轨迹 → 这个节点的产出以前被回退过几次 → 模型自己的评估（**放最后**）。

## 从你自己的活开始，怎么落地

挑一件你反复干的事。画出拆分器、车道、合并、一个闸门、一条回边。

**先建闸门。** 一旦有东西能大声地失败，其他一切都会变简单；而没有闸门的图，只是一条更快地产出未验证结果的路径。

然后是车道。学习边放最后，因为在你还没接受任何结果之前，没法从被接受的结果里提炼约束。

把人放在一步上：**后果最大、可逆性最低的那一步。** 批合并，决定哪些修复上线。不是评审中间输出，不是确认每一步。

处在一张图中段的人，会成为这张图里最慢的节点——图只能按一个人读东西的速度跑。

## 三句话

- 量路径，不只量它最后落在的答案。
- 一个不改变下一步跑什么的判定，只是一份报告。
- 任何你没有变成永久约束的失败，你都会再遇到一次。

大多数人会继续调那一个循环，并把它叫系统。在图外面画了一圈的人会开起一支舰队，并且始终不太明白为什么别人跟得这么吃力。

## 我们的整理

原文里最实用的其实是三张可以直接抄的模板，下面把它们摊平成能填的字段。

**GREEN 检查（写检查，不写愿望）**

| 该写                 | 不该写    |
| ------------------ | ------ |
| 退出码 0 / 断言通过       | 没有报错   |
| 每条断言带来源行号          | 模型说没问题 |
| diff 只碰计划内文件       | 看起来合理  |
| 期望值 vs 实际值（含文件:行号） | 置信度高   |

**退回单（五格，缺一格就会膨胀）**

| 字段 | 内容                 |
| -- | ------------------ |
| 单元 | 哪个切片               |
| 判定 | 红/绿                |
| 原因 | 具体哪个测试、哪个检查        |
| 证据 | 期望 X、实际 Y、位置 文件:行号 |
| 范围 | 只改这个文件             |

**车道表（按撤销成本分，不按信心分）**

| 车道    | 例子             | 闸门                 |
| ----- | -------------- | ------------------ |
| 可逆且局部 | 文案、测试、孤立函数     | 确定性检查通过即放行         |
| 可逆但面广 | 共享工具、schema 字段 | 确定性检查 + 轨迹干净 + 回滚史 |
| 难以逆转  | 迁移、删除、动钱       | 不开                 |

配套看两篇：形状怎么搭、扇出多大、天花板在哪（Bun 那次 11 天 / 16.5 万美元的账）见[一句提示词拉起 1000 个 agent：慢的不是模型，是你把图画成了直线](https://www.hubwiz.com/blog/graph-engineering-1000-agents-one-prompt/)；三层能力谁修谁的问题见[你的 Agent 并不自主：你就是它的循环](https://www.hubwiz.com/blog/agent-harness-loops-graphs-seven-levels/)。

## 来源

- 原文：Hanako, *Loops and Graphs: how to stop babysitting agents and only approve the last step (full course)*, X，2026-08-23。https://x.com/hanakoxbt/status/2091515787366306154
- 配图来自原文插图（作者自制示意）与 Unsplash（封面）。

本文由汇智网编译整理，转载请注明出处。

> **这是「Agent / MCP」专题的一部分。**完整地图见：[Agent / MCP / 自动化完全指南](https://www.hubwiz.com/blog/agent-stack/)