Agent Loop 深度理解

20 行代码的循环,为什么是 LLM 时代的发动机?

🧠 Think
🔧 Act
👁 Observe
↑ 循环,直到目标达成 ↑

为什么必须是 loop?

LLM 本身是无状态的一次性函数,而真实任务是"边做边看"的过程。loop 是粘合这两者的唯一方式 —— 五个底层原因:

loop 是被谁"发现"的?

没有某一个人发明。这是一条多源汇流的演化线 —— 从机器人到认知科学,最后在 2022 年的 ReAct 论文定型。

1960s — 1990s · 远古思想源

Sense → Plan → Act 的几十年铺垫

从 Shakey 机器人到强化学习,"用循环解决序列决策"在 AI 界早已是常识。下一节会详细讲这段血脉。

2021.12

WebGPT (OpenAI)

最早让 LLM 在浏览器里循环执行动作,拉开 LLM agent 的序幕。

2022.05

MRKL Systems (AI21)

提出 LLM + 外部模块路由的范式,Karpas 等人给出概念框架。

2022.10 ⭐ 里程碑

ReAct — Shunyu Yao 等 (Princeton + Google)

第一次清晰提出 Thought → Action → Observation 交替循环。这被公认为现代 agent loop 的教科书形态。

2022.10 — 2023.03

工程化爆发

LangChain(Harrison Chase)把 ReAct 变成人人可调;AutoGPT(Toran Richards)让大众第一次看到全自动 loop;BabyAGI(Yohei Nakajima)把 loop 拆成任务队列。

2024.12 — 至今

Harness 沉淀

Anthropic 《Building Effective Agents》区分 workflow vs agent;Claude Code、Cursor、aider 把 loop 做成基础设施。loop 从论文走进生产。

远古思想源:loop 的六条血脉

今天的 agent loop 不是 2022 年凭空发明的。从 1960 年代的机器人到 1990 年代的强化学习,"感知→规划→行动"这个结构被反复验证过六次 —— ReAct 只是把它搬到了 LLM 上。理解这六条源流,才能看清 loop 的本质不是"循环调用",而是带反馈的决策过程

1966 — 1972 · Stanford Research Institute

Shakey 机器人 · 世界第一台"思考型"移动机器人

Nils Nilsson, Charles Rosen 等

拿着摄像头在走廊里推箱子,第一次把"感知-建模-规划-执行"做成可运行系统。它用的 STRIPS 规划器(前置条件 + 动作 + 后置效果)至今仍是所有 AI 规划的语法基础。

Shakey 一次完整任务内部就是一个大 loop:拍照 → 更新世界模型 → 求解 STRIPS → 执行动作 → 再拍照。

perceive → model → plan → act → perceive ...
1970s · 经典 AI 范式

Sense-Plan-Act (SPA) 三段论

经典人工智能学派的通用骨架

把智能体拆成三个独立阶段:Sense(传感器读入)→ Plan(符号推理生成动作序列)→ Act(执行器输出)。每一轮结束后,新感知反哺模型,下一轮重新规划。

这是现代 agent loop 的直系祖先。ReAct 的 Thought/Action/Observation 本质上就是 Plan/Act/Sense 换了个马甲。

sense → plan → act → (loop)
1986 · MIT CSAIL

Subsumption Architecture · 反 SPA 的叛逆

Rodney Brooks (iRobot 创始人)

Brooks 的著名论文 "Intelligence Without Reason" 抨击 SPA 太慢太脆 —— 机器人还没想完,老鼠已经跑了。他提出反应式分层架构:多个感知-动作 loop 并行运行,底层反射快,高层规划慢,高层压制低层。

这对今天多 agent、subagent、并行 loop 的架构思想影响深远。

多个 sense→act loop 并行 · 分层压制
1983 — 至今 · CMU

SOAR · 统一认知架构

Allen Newell, John Laird, Paul Rosenbloom

图灵奖得主 Newell 的毕生心血:把所有认知活动统一为一个 decide cycle(决策周期)。每个 cycle 包含:阐述状态 → 提议算子 → 评估 → 选择 → 应用。目标栈遇到僵局就自动生成子目标 —— 这就是 subagent 的原型

elaborate → propose → decide → apply → (impasse → subgoal)
1993 — 至今 · CMU

ACT-R · 产生式规则的循环触发

John R. Anderson

认知心理学建模的标杆。核心是产生式规则(IF pattern THEN action)不断匹配工作记忆并触发。每一次触发就是一轮 loop,触发结果更新工作记忆,引发下一轮匹配。

ACT-R 明确区分程序性记忆(规则)与陈述性记忆(事实)—— 这正是今天 agent 的"工具" vs "上下文"。

match → select → fire → update memory → (loop)
1998 · 强化学习奠基作

Agent-Environment Loop · loop 的数学定义

Richard Sutton & Andrew Barto

《Reinforcement Learning: An Introduction》把 agent 抽象为数学对象:
每个 timestep t,agent 观察状态 sₜ,选择动作 aₜ,环境反馈奖励 rₜ₊₁ 和新状态 sₜ₊₁。目标是最大化累积奖励。

这是今天所有 agent loop 的数学骨架。当你把 LLM 的 "Thought/Action/Observation" 映射到 "policy/action/reward",它们其实是同一个东西。

sₜ → π(aₜ|sₜ) → env → rₜ₊₁, sₜ₊₁ → (loop)
Yao 等人 2022 写 ReAct 的时候,并不是"发明"了一个新的循环。他们只是把一个已经跑了 60 年的结构,第一次用自然语言 prompt 表达出来,让 LLM 也能加入这个古老的游戏。

控制流:loop 里流动的是什么?

每轮 loop 把 assistant turn + tool_result 追加进对话历史,再整个喂回模型。状态 = messages 数组,不是变量。

消息流:越转越长的对话历史

模型只负责"想下一步",不负责"把下一步跑起来"。harness 做调度、LLM 做决策。

上下文工程:loop 每转一圈就变贵一次

关键不是"窗口多大",而是每一轮 loop 都会把上一轮的 tool_result 追加进来,context 单调递增。一次调用的成本 = 当前累积 token × 单价。所以 loop 跑得越深,单步越贵、模型越容易开始"遗忘目标"。

已跑 0 轮 · 累积 0 tokens

每点一次按钮 = loop 再转一轮:prompt + assistant + tool_result 追加到历史。看四种模型分别在第几轮撑爆。

工具设计:给什么工具 ≈ 决定 loop 有多长

"工具粒度决定 loop 长度" 想说的是:同一个任务能不能一步到位,完全取决于 harness 给 LLM 暴露了什么 API。工具太碎,LLM 要跑十几轮拼装;工具太粗,LLM 又容易失控。这是 harness 设计最重要的 API 决策,直接决定了成本、延迟、可靠性。

任务:"把 config.json 里的 port 从 3000 改成 8080" — 两套工具 API,loop 长度相差 5 倍。

🧩 细粒度工具集

list_dir · read_file · edit_text · write_file · run_test
5 轮 loop · 每轮都带全部历史回模型

🔨 粗粒度工具

run_bash (任意 shell 命令)
1 轮 loop · 一条命令搞定
粗工具不是总赢:run_bash 可以一步改文件,也可以一步 rm -rf /。粒度 = 效率 vs 安全的平衡点。这就是 Claude Code 为什么默认给细粒度工具 + 可选 bash。

子 agent:嵌套 loop 的通信

主 loop 调子 loop,是隔离 context 污染、实现并行的关键模式。Claude Code 的 Agent tool 就是这么做的。

失败模式:loop 会在哪里死?

必须亲手观察过这些病症,才算真正懂 loop。

何时该用 agent loop?

不是所有任务都适合 loop。Anthropic 的建议:能用预编排 workflow 解决的,不要动 agent。

Workflow vs Agent:一眼看清差异

两者都用 LLM,但控制权归属完全不同。选错模式 = 要么束手束脚、要么失控烧钱。

学习路线:6 步打透 loop(约 3 周)

"只读不动"学不会 agent loop。每一步都给了要读的材料要动手做的事验收产出。按顺序走,每步产出叠加到下一步,到 Step 6 你手里就有一个能跑 SWE-bench 的完整 agent。

01

入门 · 亲手实现 ReAct

目标:从 0 写出一个能 Think→Act→Observe 的 loop,体会"状态 = messages 数组"
难度 · 初 ⏱ 1–2 天
  • ReAct 原论文 arxiv 2210.03629(重点 §3-4)
  • Anthropic Cookbook · Tool Use 章节
  • LangChain 官方 ReAct agent quickstart
  • 用 Python + Anthropic SDK 写 ~60 行的 ReAct loop
  • 提供两个假工具:calculatorsearch(mock 数据即可)
  • 让它答:"《三体》作者出生那年中国 GDP 多少"
产出
  • 一个 react_loop.py,能看到 Thought/Action/Observation 交替
  • 能打印完整 messages 历史
02

工程 · 解剖真实 harness

目标:看懂从 LLM 输出到工具执行到 result 回填的完整链路
难度 · 中 ⏱ 3–5 天
  • Anthropic《Building Effective Agents》2024.12
  • MCP 官方规范 modelcontextprotocol.io
  • Simon Willison 关于 agentic coding 的系列博客
  • clone aidersweep 任一开源 harness,本地跑通
  • 在主循环打断点,追一次 tool call 的完整生命周期
  • 自己实现一个最小 MCP server(暴露 1 个读文件工具)
产出
  • 一张主循环伪代码图(500 字以内)
  • 可用的 MCP server 能被 Claude Code 调用
03

上下文 · 对抗 context rot

目标:亲自测出"loop 越长越笨",并用工程手段救回来
难度 · 中 ⏱ 2–3 天
  • Chroma Research《Context Rot》实验报告
  • MemGPT / Letta 论文 arxiv 2310.08560
  • Anthropic Prompt Caching 文档(5 分钟 TTL)
  • 给 Step 1 的 loop 加一个 summarization:历史 > 5 轮就压缩前文
  • 开启 prompt caching,测 TTFB 和成本差异
  • 做 A/B:无压缩 vs 有压缩 跑 20 个多步任务
产出
  • 一张 token × 成功率 对比图
  • 一段 200 字结论:什么时候该压、什么时候该 off-load
04

规划 · 从 reactive 升级到 reflective

目标:让 agent 从失败中学习,而不是反复踩同一个坑
难度 · 中高 ⏱ 2–3 天
  • Reflexion arxiv 2303.11366
  • Tree of Thoughts arxiv 2305.10601
  • Voyager (Minecraft agent) arxiv 2305.16291
  • 在 loop 里加"反思步":失败后让模型写一条 lesson,存到 memory
  • 下一次开局把 memory 里相关 lesson 拼到 system prompt
  • 观察同样任务第 2 次尝试的成功率提升
产出
  • 一个能自我修正的 agent demo
  • 一张"反思前/后"成功率对比表
05

安全 · 给自己的 agent 红队攻击

目标:亲眼看到 prompt injection 怎么让 loop 失控
难度 · 中 ⏱ 2–3 天
  • Simon Willison · Prompt Injection 系列(按时间顺序)
  • "Lethal Trifecta" 文章
  • Anthropic Responsible Scaling Policy
  • 设计 3 个恶意工具结果:泄密型、提权型、外发型
  • 跑你自己 Step 1-4 的 agent,看它在哪种 payload 下上当
  • 加一层 output sanitizer + 权限白名单,重跑
产出
  • 一份红队报告:10 个 payload × 防御前后对比
  • 知道 lethal trifecta 在你场景里具体怎么触发
06

评测 · 跑 SWE-bench 亲眼看 agent 怎么挂

目标:用工业基准做毕业答辩 —— 你的 agent 的真实分数
难度 · 高 ⏱ 3–7 天
  • SWE-bench 论文 arxiv 2310.06770 + SWE-bench Verified
  • τ-bench 论文(工具调用评测)
  • 排行榜前 3 方案的技术 blog
  • clone SWE-bench-Lite(~300 题),Docker 里跑通评测流水线
  • 用 Step 1-5 搭建的 agent 跑前 30 题
  • 对失败样本分类:context / tool / planning / 其他
产出
  • 一张 pass@1 分数(你的基线)
  • 一份失败分析报告 —— 这就是你下个迭代的 roadmap
为什么是这 6 步? 每一步都在解决一个具体的认知瓶颈
① 看不见 loop → 手写 · ② 不懂 harness → 读源码 · ③ 被 context 撑爆 → 加压缩 · ④ 学不会失败 → 加反思 · ⑤ 被注入 → 做红队 · ⑥ 不知道好坏 → 跑基准。
跳过任何一步都行,但每一步省下的时间都会在后面的工程里还回来 —— 尤其是 Step 2 和 Step 6。

一句话抓手

Loop 本身是 20 行代码

真正的学问在 loop 周围的四个约束:
① context(能塞多少)· ② tools(能做什么)· ③ planning(怎么决定下一步)· ④ safety(做错了谁兜底)

这四条任何一条松掉,loop 就变成玩具。