第 4 课 · 一轮变很多轮:循环,和它什么时候停
读这一课前你需要会什么:读过第 1 到 3 课。 你需要知道一轮长什么样:发请求 → 它说要调工具 → 我们执行 → 结果按形状放回去 → 再发一次。 出现的每一个新词都会当场用大白话讲清。讲不清楚的地方就是我的问题,请直接标出来。
这一课结束时你会
- 默写出这个循环的骨架——它只有十几行;
- 说得出「什么时候停」为什么是这整件事的分界线,以及为什么它同时也是最危险的地方;
- 说得出为什么「循环写在哪里」这个选择,选错了以后要重写。
1. 先看第 3 课留下的那个问题
第 3 课那一轮跑完了,它回了一句人话:「北京今天多云,26 度。」
那一轮里模型被调用了两次,而我们的代码写死了「调两次」。
换个问题就不行了。 比如:
北京和上海哪个更暖和?
这次它得查两次天气。 我们的代码怎么知道要调三次模型,而不是两次?
答案是:不知道,也不该由我们知道。 我们要做的是一直问下去,直到它说不用问了。
把「一轮」套进一个「一直 做下去」的结构里——这就是这一课。
2. 顶层全景:骨架只有十几行
先给这个词:
循环 = 同一段代码反复跑,直到撞上一个条件才停。
这是所有程序里都有的东西,不是 AI 特有的。AI 特有的是那个条件由谁定。
有一份资料把这件事讲成了整个领域的定性,值得原样记住:
循环人人都写过。agent 的关键,是让模型来控制那个停止条件——由它决定什么时候不再转。 (依据:04-making-it-work/learning-langchain)
这句话锋利的地方在它的反面: 如果停止条件是我们写死的(跑三轮就停),那它就退化成一条流水线,不是 agent。
骨架长这样:
消息 = [系统提示, 用户那句话]
一直做下去:
回复 = 问模型( 消息, 工具清单)
把回复追加进消息
它这次点工具了吗?
├ 没有 → 这就是最终答案,跳出
└ 有 → 逐个执行,把每个结果按形状追加进消息
回到开头
图说:整个 agent 就是这十几行。
后面五节讲的所有东西,都是挂在「跳出」那一行上的。
有一份资料把这个骨架压进了 196 行,包括工具、状态、上限全部在内 (依据:04-making-it-work/openmanus); 另一份只用了约 100 行,而且它的全部状态就是那个只增不改的消息列表 (依据:04-making-it-work/mini-swe-agent)。
下限比这还低。 有一份把循环抽象到只剩一句话: 跑当前节点、拿它报的动作名查后继、换过去——agent 循环在这套原语里就是一张带回头路的图 (依据:04-making-it-work/pocketflow)。