Agent Loop
- 1、引言
- [2、Agent Loop 到底怎么工作?](#2、Agent Loop 到底怎么工作?)
- [3、Agent Loop 核心原理](#3、Agent Loop 核心原理)
-
- [3.1 状态机:一个 while(true) 的正经写法](#3.1 状态机:一个 while(true) 的正经写法)
- [3.2 与 ReAct 的关系:父子不是兄弟](#3.2 与 ReAct 的关系:父子不是兄弟)
- [4、生产级实现(LangGraph 1.x + MCP)](#4、生产级实现(LangGraph 1.x + MCP))
- [5、2026 年的关键改进点](#5、2026 年的关键改进点)
-
- [5.1 从"正则扒 JSON"到原生 Structured Tool Calling](#5.1 从"正则扒 JSON"到原生 Structured Tool Calling)
- [5.2 Step Budget 与重复动作检测](#5.2 Step Budget 与重复动作检测)
- [5.3 Prefix KV-Cache:把循环里的固定前缀缓存住](#5.3 Prefix KV-Cache:把循环里的固定前缀缓存住)
- 6、适用场景与性能基准
- 7、总结
1、引言
小屌丝:鱼哥,我昨天上线了一个 Agent,让它"帮我把这周的周报整理出来发群里"。结果你猜怎么着?
小鱼:它给你把周报写得天花乱坠?
小屌丝:它写了三行字,说"已完成",就跑路了。我打开群一看------周报没发,邮件没存,我还得自己重干一遍。更气人的是,我另一个 Agent 让它"查一下这只股票最近的研报",它在 search 和 fetch 之间来回横跳了 47 次,Token 烧了我 30 刀,最后告诉我"网络不好,明天再试"。
小鱼 :(喝口水)兄弟,你这两个事故,一个叫"提前下班",一个叫"原地踏步"。本质是同一个病------你没给它装循环。
小屌丝:循环?for 循环那个循环?
小鱼 :差不多,但不是你写 for i in range(10) 那种死循环。是 Agent Loop:模型在一个闭环里,观察 → 想下一步 → 调工具 → 拿结果 → 再想,直到它自己判断"活干完了"才退出。它不提前下班,也不许原地踏步。
小屌丝:哦?那这玩意儿跟我之前学的 ReAct 是一个东西吗?
小鱼 :ReAct 是"怎么想"的方法论,Agent Loop 是"怎么把这个方法跑起来直到结束"的运行时。2026 年了,LangGraph、OpenAI Agents SDK、Claude Agent SDK 底层全是这套 Loop。今天我给你掰开揉碎,看看这个看起来人畜无害的 while,到底凭什么是下一代软件的核心竞争力。

2、Agent Loop 到底怎么工作?
Agent Loop(执行循环)是所有 Agent 设计模式里最底层的那一层------对应你素材里的"循环 1"。
它的核心思想一句话:
模型在循环中反复调用工具,观察结果,更新上下文,自己判断任务是否完成,没完就接着转,完了才吐最终答案。
完整闭环长这样:
用户任务(提出目标)
↓
┌──────────────────────────────┐
│ Agent (LLM) │
│ 理解任务 → 制定计划 → │
│ 决定下一步干啥 │
└──────────────┬───────────────┘
↓
选择并调用工具(MCP / Function Call)
↓
拿到结果,塞进上下文
↓
任务完成了吗?
├─ 是 → 返回最终结果,收工
└─ 否 → 回到 Agent,再来一圈
它跟传统"调一次 LLM 出一次结果"的最大区别:
| 维度 | 单次 Prompt 调用 | Agent Loop |
|---|---|---|
| 交互次数 | 一次进一次出 | N 次模型调用,N 次工具调用 |
| 退出条件 | 模型生成完就结束 | 模型自己判断"任务完成"才结束 |
| 错误恢复 | 错了就错了 | 工具返回报错 → 换个工具/换个参数再来 |
| 上下文 | 静态 | 每圈都把 Observation 塞回去动态更新 |
| 典型故障 | 一本正经地编 | 提前下班 / 死循环 / 烧钱 |
一句话总结:Agent Loop = 模型驱动 + 工具执行 + 观察回灌 + 自判完成,让 AI 从"回答问题"升级成"把活干完"。
3、Agent Loop 核心原理
3.1 状态机:一个 while(true) 的正经写法
很多人第一次写 Agent Loop,是这样写的:
python
# ❌ 2024 年的野生写法
while True:
action = llm.predict(context)
if action.type == "final":
return action.content
result = run_tool(action.tool, action.args)
context.append(result)
能跑,但生产上会死得很难看:没有步数上限、没有超时、没有 trace、上下文炸了也不知道。2026 年的工程实现,每一圈都被结构化成一条带元数据的记录:
json
{
"step_id": 7,
"trace_id": "tr_01J9X...",
"thought": "用户要北京天气+穿衣建议,天气已拿到,需要换算成穿搭建议",
"tool_calls": [
{ "name": "weather.get", "args": {"city": "北京"}, "id": "call_abc" }
],
"observation": "{\"temp\":28,\"condition\":\"多云\",\"aqi\":45}",
"tokens_in": 12430,
"tokens_out": 320,
"latency_ms": 1820,
"is_final": false
}
这种结构化 trace 是后面第 2 篇(Verification Loop)和第 4 篇(Hill Climbing Loop)的数据基础------你没把每一圈记下来,后面想优化都没东西可分析。
3.2 与 ReAct 的关系:父子不是兄弟
很多人会问:"这跟 ReAct 不是一回事吗?"
不是。区别看这张表:
| 维度 | ReAct | Agent Loop |
|---|---|---|
| 本质 | 一种"思考格式"(Thought/Action/Observation) | 一个"运行时"(状态机 + 调度 + 边界控制) |
| 关心什么 | 模型每一步怎么写 | 这一圈怎么调度、怎么停、怎么防炸 |
| 谁在实现 | Prompt 层约定 | LangGraph / OpenAI Agents SDK 这种框架 |
| 能否并行工具调用 | 原始 ReAct 不支持 | 现代 Loop 原生支持 parallel tool calls |
| 能否挂 Sub-Agent | 不行 | Loop 里可以把一整棵子图当成一个 tool |
打个比方:ReAct 是"员工怎么想问题"的职业素养,Agent Loop 是"公司打卡、工时审批、离职流程"这套 HR 系统。 你光有素养没有系统,员工要么提前下班要么原地加班。
4、生产级实现(LangGraph 1.x + MCP)
下面这套是 2026 年的主流写法:LangGraph 1.x 的 create_react_agent 作为 Loop 内核,MCP 协议接工具,Pydantic 做结构化输出,自带 step budget 和循环检测。
python
# agent_loop_prod.py
# 2026 年生产级 Agent Loop:LangGraph 1.x + MCP + OpenAI Structured Output
from __future__ import annotations
import operator
from typing import Annotated, Sequence, TypedDict
from datetime import datetime, timezone
from langgraph.graph import StateGraph, END
from langgraph.prebuilt import create_react_agent
from langgraph.checkpoint.memory import InMemorySaver
from langchain_openai import ChatOpenAI
from pydantic import BaseModel, Field
import structlog
logger = structlog.get_logger()
# ---------- 1. 状态:这就是 Loop 里"在转的那个球" ----------
class AgentState(TypedDict):
messages: Annotated[Sequence[dict], operator.add]
steps: int
max_steps: int # Step Budget:硬上限
trace_id: str
started_at: str
# ---------- 2. 完成判定:让模型自己结构化地说"干完了" ----------
class FinalAnswer(BaseModel):
is_done: bool = Field(description="是否已经拿到足以回答用户的结果")
summary: str = Field(description="给用户的最终答复,没干完就留空")
# ---------- 3. 工具:通过 MCP 接进来,不在代码里硬编码 ----------
# mcp_tools() 返回一组 @tool 装饰的函数,这里略掉具体接入,
# 真实项目里用 mcp.client.stdio 起子进程,挂 weather / search / db.query 等。
# ---------- 4. 构建 Loop ----------
def build_agent_loop(model_name: str = "gpt-5", max_steps: int = 12):
llm = ChatOpenAI(model=model_name, temperature=0)
# 2026 年的 prebuilt agent 已经把"调工具 → 回喂观察 → 再决策"这圈
# 封装好了,我们只需要在外面包一层步数预算和 trace。
agent = create_react_agent(
model=llm,
tools=[], # 真实项目里替换成 MCP 工具列表
response_format=FinalAnswer, # 强制结构化收尾
checkpointer=InMemorySaver(), # 支持断点续跑 / HITL
)
def guardrail(state: AgentState) -> AgentState:
# 每转一圈就 +1,到 max_steps 强制 END,防止烧钱
if state["steps"] >= state["max_steps"]:
logger.warning("step_budget_exceeded",
steps=state["steps"], trace_id=state["trace_id"])
return {"messages": [{"role": "assistant",
"content": "已达最大步数,任务未完成,已安全退出。"}],
"steps": state["steps"]}
return {"steps": state["steps"] + 1}
return agent, guardrail
# ---------- 5. 跑一个任务 ----------
def run(task: str):
app, guardrail = build_agent_loop()
initial: AgentState = {
"messages": [{"role": "user", "content": task}],
"steps": 0,
"max_steps": 12,
"trace_id": f"tr_{datetime.now(timezone.utc):%Y%m%d%H%M%S}",
"started_at": datetime.now(timezone.utc).isoformat(),
}
result = app.invoke(initial, config={"recursion_limit": 24})
return result["messages"][-1].content
if __name__ == "__main__":
print(run("帮我查一下北京今天天气,并给出今天穿什么的建议"))
这套实现和 2024 年野生 while 的区别:
- 工具调用走原生 Tool Calling,不用正则扒
Action: {...}; - 有 checkpointer,挂了能从断点续跑,也能塞 human-in-the-loop;
response_format=FinalAnswer强制模型用结构化方式说"我干完了",杜绝"写三行就跑路";max_steps+recursion_limit双保险,原地横跳最多烧 12 步就被踢出来。
5、2026 年的关键改进点
5.1 从"正则扒 JSON"到原生 Structured Tool Calling
2024 年写 Agent,十个人有八个在写正则:
python
# 😭 考古代码
m = re.search(r'Action:\s*(\{.*?\})', content, re.DOTALL)
args = json.loads(m.group(1))
2026 年,三家模型厂商已经把工具调用做进了协议层:
- OpenAI:
tools=[...]+ 原生tool_calls字段,配合response_format=json_schema; - Anthropic:Tool Use Block,参数直接是结构化 JSON,不用 XML 标签手抠;
- 国产模型(Qwen / DeepSeek / 豆包):Function Calling 协议对齐 OpenAI。
结论:再写正则解析 Action 的,可以退休了。
5.2 Step Budget 与重复动作检测
生产上最贵的死法不是"答错",是"在两个工具之间反复横跳"。2026 年的标配防御有两层:
python
def detect_oscillation(tool_calls: list[str], window: int = 4) -> bool:
"""最近 window 步如果在同一对工具间来回切,判定震荡"""
if len(tool_calls) < window * 2:
return False
recent = tool_calls[-window:]
return len(set(recent)) == 2 and recent == tool_calls[-window*2:-window]
def exponential_backoff(attempt: int, cap: float = 30.0) -> float:
return min(2 ** attempt, cap)
两个阈值要一起设:Step Budget 是"硬墙",震荡检测是"软刹车"。硬墙防烧钱,软刹车防那种"其实快对了,再退一步就好"的情况被一刀切掉。
5.3 Prefix KV-Cache:把循环里的固定前缀缓存住
Agent Loop 有个被忽略的事实:每一圈发出去的 Prompt,前面几千 token 的系统提示、工具描述、Few-shot 例子是一模一样的,只有最新一条 Observation 在变。
2026 年的推理引擎(vLLM、SGLang、TensorRT-LLM、OpenAI 服务端自动开 Prefix Cache)会把这部分 KV-Cache 复用,实测在 10 步以上的 Loop 里:
- 首 token 延迟降低 40%--60%;
- 每步边际成本下降 30% 左右;
- 长任务(>20 步)从"按次计费"变成"按增量计费"。
工程上你要做的只有一件事:把系统提示和工具描述放在最前面,把动态变化的 Observation 放在最后面------顺序错了,缓存就命中不上。
6、适用场景与性能基准
| 场景 | 推荐度 | 原因 |
|---|---|---|
| 实时问答 / 查数据 | ⭐⭐⭐⭐⭐ | 一次工具调用基本搞定,Loop 是天然形态 |
| 多跳检索 + 汇总 | ⭐⭐⭐⭐⭐ | 边搜边看边补搜,Loop 比写死流水线灵活 |
| 代码小修改 / 跑脚本 | ⭐⭐⭐⭐ | 配合沙箱执行,错误能自己修 |
| 长周期任务(>30 步) | ⭐⭐⭐ | 必须上 Plan-and-Execute 子图,单 Loop 会迷路 |
| 高并发在线请求 | ⭐⭐ | 延迟不可控,要做异步 + 流式 |
2026 年一组参考数字(GPT-5 级别模型,LangGraph 1.x,MCP 工具):
- 简单任务平均步数:3--5 步;
- 中等任务平均步数:8--15 步;
- 单步 P50 延迟:1.5--3 秒(命中 Prefix Cache 后);
- 单任务 Token 开销:比单次问答高 200%--300%;
- 任务完成率:简单任务 ~88%,复杂多步任务 ~65%;
- 平均单任务成本:0.05 -- 0.15。
记住一句话:Agent Loop 不是越转得多越厉害,而是该停的时候能停。
7、总结
Agent Loop 是 Loop Stack 最底下那一层------没有它,上面的验证、事件、自优化都无从谈起。它看起来就是个 while,但 2026 年的生产实现已经把这个 while 做成了带状态、带预算、带追踪、带缓存的工程系统。
核心记忆点:
- Agent Loop = 观察 → 决策 → 调工具 → 回灌 → 自判完成,缺一不可;
- 退出条件必须结构化(
is_done),别让模型写三行字就"已完成"; - Step Budget 是硬墙,震荡检测是软刹车,两个都要有;
- 每一圈都要落 trace,这是后面 Verification / Hill Climbing Loop 的口粮;
- 系统提示放最前、动态观察放最后,Prefix Cache 才能命中;
- 超过 20 步还在转的任务,该上 Plan-and-Execute 子图,别硬撑。
下一篇我们往上爬一层,聊聊 Verification Loop------当 Agent 学会了"把活干完",你会发现它干的活经常不能直接用,于是 AI 开始检查 AI 自己。
我是小鱼:
- CSDN 博客专家;
- AIGC 技术MVP专家;
- 阿里云 专家博主;
- 51CTO博客专家;
- 企业认证金牌面试官;
- 多个名企认证&特邀讲师等;
- 名企签约职场面试培训、职场规划师;
- 多个国内主流技术社区的认证专家博主;
- 多款主流产品(阿里云等)评测一等奖获得者;
关注小鱼,学习【人工智能与大模型】最新最全的领域知识。