跳到正文
AI 知识地图 0.18 · 2026-07-30
关于与纠错文字目录 / Search
理解原理

Agent 循环

把一次回答变成可观察、可校验、能停下来的状态机

Agent Loop · Observe–Decide–Act · 感知—行动循环

建议 30–40 分钟 · 中级 · 需要:LLM、工具调用、AI Agent

核心命题 Agent 循环不是让模型‘多想几次’,而是由控制器反复执行读取受保护状态 → 让模型提出动作 → 校验并执行 → 接收真实观察 → 验证进展或终止。模型负责不确定判断,宿主负责状态、权限、预算和完成判据;两者分开,循环才既能适应反馈又不会无限失控。
读完这一页,你应该能自己回答:
  • 循环比普通多轮聊天多了哪些机器状态?
  • 模型、控制器、工具和验证器分别负责什么?
  • 一次观察怎样改变下一轮动作?
  • 怎样判断循环有进展、卡住或已经完成?
  • 为什么终止、权限和预算必须由模型外的代码强制?
  1. 一次生成只能依据行动前上下文猜测环境状态。(§1)
  2. 把模型、控制器、工具和验证器分开,才有可强制的责任边界。(§2)
  3. 动作产生观察,观察更新事实和计划,但不覆盖受保护目标与授权。(§3)
  4. 逐轮新证据减少未满足条件,循环因此比重复生成更有价值。(§4)
  5. 计划维持方向,循环适应变化,验证器裁决完成。(§5)
  6. 成功、预算、无进展、依赖失败和待授权都是合法出口。(§6)
  7. 所以可靠 Agent 循环本质上是受约束、可观测、可终止的状态机。(§7)

1为什么一次生成不够直觉

模型完全有能力在单次回答里写出一段看起来完整的补丁,这也正是"既然能一次写完,为什么还要来回循环"这个问题的由来。但"看起来完整"与"实际可用"之间,隔着模型在生成时看不到的一整层事实。生成之前,模型并不知道仓库的真实目录结构、确切的函数签名,也不知道测试此刻会输出什么;生成之后,它同样不知道这份补丁是否真的能应用、测试是否真的通过。一次长回答只能把这些未知量当作猜测写进文本:无论文本写得多详细,猜测依然是猜测。

循环改变的是获取信息的方式。它不再要求模型在行动前一次性"想"出所有事实,而是先采取一个小动作,让环境返回新的事实,再根据事实选择下一步。于是,"也许文件在这里"变成了目录命令返回的真实列表,"也许修好了"变成了测试进程的真实退出码。文本里的假设被环境的观察逐条替换——这正是单次生成做不到的事:一次生成看不到动作之后的真实结果,循环却通过小动作逐轮取得新事实,把不确定性一点点缩小。

判断循环是否在推进,标准是信息增益。每一轮都应追问:是否获得了新的观察?是否缩小了候选原因的范围?是否改变了可验证的状态?如果三者皆无,多跑一轮只是在重复采样——输出文本或许不同,但确定性没有增加,这不是进展,只是昂贵地重新抽了一次签。反之,只要某一轮带来了新观察、减少了候选,或改变了可验证状态,循环就完成了单次生成无法替代的工作。

把循环的接口摊开来看:输入是目标、未知的环境状态、可用的动作集合和验收标准;输出是逐轮的观察、动作与验证状态。目标与验收标准贯穿始终,环境状态随每轮观察持续更新,动作则依据当前已知在每轮重新选择。这个结构解释了循环与一次生成的根本差别:一次生成把环境状态当作文本里的假设,循环把环境状态当作可以逐轮询问的对象。

适用的边界同样清楚。循环不承诺更快,也不承诺更省。当任务的全部关键事实在生成前就已确定、动作结果完全可以预测时,循环提供不了信息增益,单次生成就足够;循环的价值恰恰落在环境状态未知、动作结果不可预测的场景。反过来,在这样的场景里靠无信息增益的重复调用来"多试几次",并不会比单次生成更接近答案。

2四个角色,不是一颗万能大脑工程

在一次循环里,究竟是谁在思考、谁在动手、谁最终说"通过"?把 Agent 想象成一颗无所不能的大脑会掩盖答案:循环内部其实是四个各持状态、各守边界的角色在接力,每个角色能做一类事,也有一类事被明确禁止。

模型持有目标摘要、历史观察与可用工具清单,职责是提出候选动作及其参数;它的边界是不能直接写文件,也不能自行授予权限。控制器持有轮次计数、预算、受保护约束与动作历史,负责解析动作、调度执行、暂停和终止整个循环;它的边界是不能把模型文本当作授权证据。工具执行器持有实际的文件与 API 状态,按 schema 和权限执行动作;它的边界是不能接受未经校验的自由文本命令。验证器持有测试、策略和验收规则,给出可复现的通过或失败证据;它的边界是不能由候选解随意改弱。

这个分工的因果链指向同一个结论:模型说"完成了"只是一项预测。完成状态不由任何单一角色宣布,而必须由控制器观察到受保护测试通过、工作树差异符合预期范围、并且没有待确认的副作用之后,才真正进入。为什么必须如此?因为模型持有的只是目标摘要、观察和工具清单,而不是实际的文件与 API 状态,也没有写入权限;它对自己输出的判断与验证器基于受保护标准得出的结论是两回事,预测需要证据来裁决。控制器握着预算和约束,是唯一同时掌握动作历史与验证结果的角色;执行器提供真实状态;验证器用不可被候选改弱的标准给出证据。四者各自的"不能",正是为了把提议、授权、执行、裁决四件事分开。

从接口看,这套角色架构的输入是受保护目标、候选动作、实际资源状态和验收规则,输出是模型提议、控制决定、工具结果与验证结论。模型不直接写资源,控制器管理预算授权,执行器按 schema 操作,验证器用不可被候选改弱的标准裁决。四类输出首尾相接:模型提议经控制器裁决后才被执行器落地,执行结果成为验证器的输入,验证结论又回到控制器,决定下一步动作还是终止循环。

角色拥有的状态能做什么不能越过的边界
模型目标摘要、观察、可用工具提出候选动作与参数不能直接写文件或自授权限
控制器轮次、预算、受保护约束、动作历史解析动作、调度、暂停和终止不能把模型文本当授权证据
工具执行器实际文件/API 状态按 schema 与权限执行动作不能接受未校验的自由文本命令
验证器测试、策略和验收规则给出可复现的通过/失败证据不能由候选解随意改弱

3把循环写成状态转移形式化

自然语言 Agent 的隐患在于:如果每轮都让模型自由发挥,目标、预算、授权这些约束会随对话漂移甚至丢失。把它落成一个状态机,就是给循环一个显式的状态定义和一条确定的转移规则。

状态由五个分量组成:受保护的目标与验收条件 G、最新观察 O、压缩后的动作/结果历史 H、剩余步数与费用预算 B、当前授权 A。第 t 轮的状态写作

Sₜ = (G, Oₜ, Hₜ, Bₜ, Aₜ)

其中每个分量各有归属:G 连同验收条件一旦设定,就不再由循环内的任何动作修改;Oₜ 是环境最近一次返回的事实;Hₜ 是动作与结果的压缩记录;Bₜ 是尚未消耗的步数与费用;Aₜ 是当前生效的权限。

转移分三步。第一步是提议:策略只从当前状态提出动作,即 aₜ = policy(Sₜ)。模型在此只产生候选动作,不能直接把 aₜ 送进执行;在 execute 之前,候选还要经过一次权限校验,确认它落在 Aₜ 的授权范围内。第二步是执行与观察:工具执行器按 schema 落地动作,环境返回结果 rₜ。第三步是更新:update 用 aₜ 与 rₜ 刷新观察和历史,得到下一状态

S₍ₜ₊₁₎ = update(Sₜ, aₜ, rₜ)

工具返回的内容永远不能覆盖 G、B 或 A。这是状态机不丢约束的关键:无论模型说什么、工具返回什么,受保护目标、预算和授权都只能由控制器按自己的规则修改。

图 1 展示了这条状态、决策、执行、验证路径:模型位于控制环之内,但并不是控制器本身。外部观察可以更新事实和计划,却不能重写目标、预算或授权。也就是说,环境信息可以改变"下一步做什么",但改变不了"为什么做",也改变不了"能走多远"。

最后一条工程要求:状态必须版本化。只有每个 Sₜ 都带有可追溯的版本,才能回到历史中的某一轮,复现当时那次决策的依据。没有版本化的状态机只能向前跑,出了错也无法定位是从哪一轮开始偏离的。

受保护状态 Sₜ目标 · 预算 · 授权模型候选动作 aₜ执行器schema · 权限真实工具结果验证停 / 继续观察回流并更新状态;受保护目标不由观察覆盖
图 1 模型位于控制环内,但不是控制器本身。外部观察可以更新事实和计划,不能重写目标、预算或授权。
St=(G,Ot,Ht,Bt,At);at=policy(St);St+1=update(St,execute(at))

4运行示例:四轮修复怎样推进案例推演

同一个测试失败摆在面前,盲目改代码只会制造新噪声;四轮修复的区别在于每一轮都用新证据收窄不确定性。下面这组运行记录展示了状态如何逐轮更新。

轮 0 里,模型拿到的只有目标 G、一条失败签名 100 ≠ 90 和 6 轮预算。它没有直接改代码,而是先搜索折扣计算的位置和相关测试,得到两个新事实:可疑公式是 price * (1-discount),测试输入是 discount=10。

轮 1 把这两个事实拼起来:discount=10 与失败签名中的 90 同时出现,说明 10 很可能表示"百分之十",而代码却把它当作 0–1 之间的小数——把 price=100 代入 price*(1-discount) 会得到 100*(1-10)=-900,这个非法负结果被代码的守卫拦下、原样返回价格,测试看到的实际输出 100 正是这条兜底路径,期望值 90 则对应 price=100 的九折。模型据此提出把公式改为 1-discount/100,使 100*(1-10/100)=90 与期望闭合。补丁成功应用;与此同时授权只允许修改源文件,这为后面的验证划定了范围——测试文件碰不得。

轮 2 看到工作树里只有一处源代码差异,于是运行目标测试。退出码为 0,目标测试 1/1 通过。但这只证明被修复的那条断言现在成立,还没有证明其他地方没有回归,因此不确定性只是缩小,没有消除。

轮 3 在目标测试通过、剩余预算还有 3 轮的条件下,运行完整测试并检查 diff:48/48 全部通过,测试文件未被改动,随后生成补丁摘要,循环停在"等待发布确认"。

把进展量化,可以数未满足条件数 Uₜ:初始为 3——目标测试未通过、全量测试未通过、diff 范围未确认;轮 2 之后从 3 降到 2;轮 3 之后降到 0。只有 Uₜ 减少,或者获得能改变诊断的新证据,才算可测进展;发布授权并不在这三个技术条件之内,不能由"测试全绿"自动推导出来。这一点在例子里很清楚:48/48 通过后循环仍然停在"等待发布确认",而不是宣布已发布。

这个案例的完整接口是:输入为失败签名 100 ≠ 90、六轮预算、禁止修改测试以及发布需另行确认;输出为定位结论、最小补丁、目标测试通过、全量回归通过和待发布状态。每轮都靠新事实降低 Uₜ,从 3 一路降到 0;技术验收全部转绿,却依然推导不出发布授权。反过来说,如果某一轮既没有让 Uₜ 下降,也没有带来能改变诊断的新证据,那么这一轮就没有进展。

轮次进入模型的关键状态候选动作真实观察与状态变化
0目标 G;失败 100 ≠ 90;预算 6 轮搜索折扣计算和相关测试定位 price * (1-discount),测试输入 discount=10
1发现单位可能是“百分数”而非 0–1把公式改为 1-discount/100补丁成功应用;授权仅允许改源文件
2工作树有一处源代码差异运行目标测试退出码 0,目标测试 1/1 通过;但尚未证明无回归
3目标测试通过,剩余预算 3运行完整测试并检查 diff48/48 通过;测试未改;产生补丁摘要,停在“等待发布确认”

5计划、循环和验证器的分工消歧

三个问题把三个机制区分开:计划回答"依赖是什么,大致按什么顺序做",循环回答"新观察是否要求修改下一步",验证器回答"结果是否满足外部可检查的条件"。它们各补一个缺口,也各有一个缺失时的典型病征。

先看为什么有了计划仍要循环。计划提供的是方向和大致的顺序,它诞生于环境信息不完整的时刻;真实环境一旦返回与预期不符的观察,僵硬地照原计划执行下去只会越偏越远。循环的职责就是吸收这些反馈,让后续动作响应环境:新观察出现了,就修改下一步;观察与预期一致,才继续沿原方向走。所以计划与循环不是替代关系,而是"计划给方向、循环吸收反馈"。

再看为什么有了循环仍要独立验证。循环可以让动作越来越贴近环境,却不能回答"结果是否真的满足契约"——模型完全可能给出流畅的解释来代替实际通过。验证器的作用是对结果做出外部可检查的裁决,而不是相信模型的自述。

三者缺一,病征各不相同:没有计划,Agent 只做局部反应,容易绕路和漏步骤;没有循环,计划遇到真实环境变化仍僵硬执行;没有验证器,模型用流畅解释代替实际通过。稳健模式是把三者串起来:计划给方向,循环吸收反馈,验证器裁决。

验证器还必须受保护。如果 Agent 可以删除失败的测试,或者把通过阈值从 100% 改成 50%,它就能通过修改裁判而不是完成任务——评测被污染,裁决形同虚设。因此验证标准必须放在循环之外,Agent 只能接受裁决,不能改写标准。

把分工的接口收拢:输入是任务依赖、新观察和外部验收,输出是计划方向、循环调整与验证裁决。计划说明大致顺序,循环让后续动作响应环境,验证器判断结果是否满足契约;任一环节缺失,分别对应绕路、僵化或伪完成。

机制回答的问题缺失时会怎样
计划依赖是什么,大致按什么顺序做?只做局部反应,容易绕路和漏步骤
循环新观察是否要求修改下一步?计划遇到真实环境变化仍僵硬执行
验证器结果是否满足外部可检查条件?模型用流畅解释代替实际通过

6五种终止,不只是“成功”工程

循环不能只由"成功"和"继续跑"两种状态构成。停止的原因有五类,每类都由明确的条件触发,并且由控制器裁决,而不是由模型自己决定。

成功终止:机器可检验的验收条件全部满足。这是唯一以目标达成为原因的出口,裁决依据是验证器给出的可复现证据。

预算终止:步数、时间、token 或费用达到硬上限。预算从设计上就不可协商——它不是建议值,而是控制器强制执行的硬边界,模型不能自行忽略。

无进展终止:连续 k 轮的状态摘要和动作等价,或进展指标不再改善。它对应前文的信息增益标准:没有新观察、没有候选减少、没有可验证状态变化,循环就不该继续消耗资源。

依赖失败:工具不可用、测试环境损坏,且重试也无法产生新信息。此时问题不在 Agent 的策略,而在环境本身;继续循环得不到任何增量,只能退出并把依赖状态报告出去。

授权暂停:发布、删除、付款或扩权需要用户作新的决定。这类动作超出了本轮授权的范围,循环必须停下来等待用户,而不是试图用"测试全绿"之类的技术结论去替代授权决定。

把五种出口并排,就能看清一个共同原则:"再试一次"本身不是终止策略。重试只有在携带新参数、退避、替代工具或新证据时才值得进行;否则它只是把同一失败复制到下一轮。相应地,硬预算与授权门必须由控制器计数和强制——控制器的动作历史里记录着轮次与预算,它同时负责检测等价动作循环,在连续 k 轮没有实质变化时触发无进展终止。

终止策略的接口是:输入为验收条件、步数/时间/token/费用、进展历史、依赖状态和授权需求;输出为五种出口之一——成功、预算结束、无进展、依赖失败或授权暂停。模型可以在状态摘要里建议"应该停了",但不能自行忽略这些出口;是否离开循环、以哪种方式离开,始终是控制器的决定。

7失败模式与诊断信号失败边界

循环卡住时,坏点可能藏在决策、工具、状态或验证中的任何一环。区分它们的办法是看轨迹里的可观察信号,再对每种失败施加针对性修复。

动作振荡的信号最直观:轨迹里 A→B→A 往复,文件被反复改回原样。这是决策层没有新信息却仍在采样,修复手段是状态去重、禁止重复的无收益动作——控制器据此把等价动作识别出来并阻止重放。

错误观察污染更隐蔽:工具超时被摘要成"没有结果",下一轮就把"没有结果"当事实继续推理。修复的关键是在进入模型之前保留结构化的原始信息:状态码、来源、时间与原始错误文本,而不是允许把失败压缩成一句无害的描述。

目标漂移表现为后续摘要悄悄遗漏关键约束,比如"不得改测试"从摘要里消失了。修复办法是把目标和约束放进不可压缩状态——它们不参与压缩历史,因此无论摘要怎么简写,约束都不会丢。

伪完成的信号是自然语言声称通过,但没有任何测试记录。修复办法是把终止条件绑定到验证器证据与产物哈希:没有可复现的通过证据,就不算完成,自述不能替代裁决。

权限升级表现为操作序列突变:一连串读操作之后,突然请求发布凭证。修复办法是按动作逐次授权,任何授权升级都触发暂停,等待用户决定。

从这五组对应关系可以归纳出调试循环所需的记录:状态版本—候选动作—校验决定—工具结果—验证结论。这条链足以复现每一轮决策、定位坏点在哪个环节;不必保存或展示完整的私有思维链。可观测性服务于复现和归因,而不是收集越多的自然语言越好。

诊断的接口是:输入状态版本、候选动作、校验决定、工具状态码、结果来源和验证证据;输出把故障归因到动作振荡、观察污染、目标漂移、伪完成或权限升级中的一类。归因之后,修复手段一一对应:状态去重、保留原始错误、不可压缩目标、证据绑定终止和逐次授权。整个过程不需要完整私有思维文本。

失败可观察信号针对性修复
动作振荡A→B→A,文件反复改回状态去重、禁止重复无收益动作
错误观察污染超时被摘要成“没有结果”保留状态码、来源、时间与原始错误
目标漂移后续摘要遗漏“不得改测试”目标和约束放入不可压缩状态
伪完成自然语言称通过但无测试记录终止绑定验证器证据与产物哈希
权限升级读操作后突然请求发布凭证按动作逐次授权,升级时暂停

8把因果链连起来综合

从"一次生成看不到真实结果"出发,可以一步步推出为什么可靠的 Agent 循环必须是受约束、可观测、可终止的状态机。

起点是单次生成的盲区:模型只能依据行动前的上下文猜测环境状态,无论文本多长,猜测无法变成事实。要打破这个盲区,就必须有人真正去执行、去观察,于是分化出四个角色:模型、控制器、工具执行器和验证器。把它们分开,责任边界才可强制——谁提议、谁授权、谁执行、谁裁决,各归其位。

角色分开之后,循环的运转规则随之确立:动作产生观察,观察更新事实和计划,但不能覆盖受保护的目标与授权。环境反馈可以改变下一步做什么,却改变不了为什么做、能走多远。这条不变量是循环不随迭代漂移的根基。

有了规则,循环的价值才真正超过重复生成:逐轮的新证据减少未满足条件——目标测试、全量测试、diff 范围逐个转绿,不确定性被一轮轮收窄;而重复生成只是对同一组未知量的昂贵重采样。

要让这一过程稳定运行,还需要三件事各司其职:计划维持方向,循环适应变化,验证器裁决完成。方向、反馈与裁决缺一不可,否则分别走向绕路、僵化与伪完成。

循环还必须有出口,而且出口不止"成功"一种:成功、预算耗尽、无进展、依赖失败和待授权都是合法出口。出口由控制器依据预算计数、进展历史和授权状态强制裁决,模型不能自行忽略,也不能用"再试一次"无限拖延。

把这条链串起来,结论自然浮现:可靠的 Agent 循环本质上是一个受约束、可观测、可终止的状态机。受约束,指目标、预算与授权不被循环内的动作改写;可观测,指状态版本、候选动作、校验决定、工具结果与验证结论都可追溯;可终止,指五类出口由控制器强制执行。三者同时成立,Agent 才谈得上可靠,而不只是一台会连续输出的模型。

资料来源与改编说明
访问日期:2026-07-22