【智能体】Loop 的四种设计模式之:Agent Loop(2026 最新版)

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博客专家;
  • 企业认证金牌面试官;
  • 多个名企认证&特邀讲师等;
  • 名企签约职场面试培训、职场规划师;
  • 多个国内主流技术社区的认证专家博主;
  • 多款主流产品(阿里云等)评测一等奖获得者;

关注小鱼,学习【人工智能与大模型】最新最全的领域知识。

相关推荐
Geeys1 小时前
拼多多店铺怎么运营才能有订单?新手低成本出单攻略
大数据·网络·人工智能
艾莉丝努力练剑1 小时前
【AI大模型接入SDK】ChatSDK架构设计与实现
网络·c++·人工智能·学习·语言模型
Data-Miner1 小时前
做表格数据分析的AI工具怎么选?先对一下这三个真实需求,再看哪些真能落地
人工智能·数据分析·excel
闭包不眠1 小时前
网站支持HEIC上传要多大解码器?gzip后510KB
图像处理·人工智能·计算机视觉
Leo.yuan2 小时前
从 DataX 到 Informatica,再到国产一体化平台:2026 年企业数据集成平台怎么选
人工智能
叠层归一研究院2 小时前
区分预算与通道诱导:Ω–L叠层体系的观测赋值与定量验证
人工智能·算法
知几蜗牛2 小时前
AI权限写进JSON就安全了吗?真正缺的是配置生效验证
人工智能
知几蜗牛2 小时前
大模型会规划,为什么人形机器人还站不稳?关键是双层控制
人工智能
爱签AI电子合同2 小时前
电子合同上手成本怎么测?易用性维度专项测评
服务器·人工智能·智能合约·企业微信