news 2026/9/4 5:12:36

一篇文章教会你什么事Agent Loop

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一篇文章教会你什么事Agent Loop

一句话概括:Agent 的本质,就是「让模型反复思考 → 调用工具 → 观察结果 → 再思考」,直到不需要工具为止。


一、什么是 Agent Loop

传统的大语言模型(LLM)是「一次性」的:你问一句,它答一句,回答完就结束了。它只能靠训练时学到的知识回答问题,无法获取新信息,也无法执行任何动作

而 Agent(智能体)不一样。它把模型从「对话机器人」变成了「能行动、能使用工具的智能体」,靠的就是一个循环——Agent Loop(智能体循环)

在循环中,模型不再是一次性输出答案,而是每一步都在做决策:

  1. 我能回答吗?

  2. 如果不能,我需要调用哪个工具?

  3. 调用工具后得到了什么结果?

  4. 基于这个结果,我现在能回答了吗?

  5. ……继续循环,直到能回答为止。

这个「思考 → 行动 → 观察 → 再思考」的过程,让模型能够解决单次推理无法解决的问题,比如查数据库、算数学题、操控浏览器、读写文件等。


二、核心伪代码

下面这段伪代码几乎概括了所有 Agent 循环的精髓:

while True: # 1. 把到目前为止的对话(包括工具返回的结果)交给模型 Model(messages) ​ # 2. 看模型这次有没有想调用工具 if tool_calls: # 3. 有 → 执行工具,把结果追加到对话里 execute tool_calls append result to messages ​ # 4. 带着新结果继续循环,让模型再判断一次 continue else: # 5. 没有 → 说明模型认为可以回答问题了,结束循环 return answer

别看它只有短短几行,这里面蕴含了整个 Agent 架构的核心机制。


三、逐行拆解原理

1.Model(messages)—— 模型负责「思考」

每次循环,模型都会拿到完整的对话历史,包括:

  • 用户的原始问题

  • 模型自己上一步说的话

  • 工具返回的结果(观察结果)

模型读完后,会输出两种内容之一:

  • 一段最终回答文本 → 表示它准备收尾

  • 一个「工具调用请求」(tool_calls)→ 表示它想使用某个工具

关键点:模型本身不会真正执行工具,它只是「提出请求」。执行是循环体里其它代码的事。

2.if tool_calls:—— 判断是否需要行动

如果模型输出了tool_calls,说明它认为:仅凭现有信息还不够,需要借助外部工具才能回答。

比如用户问「北京现在天气怎么样?」,模型没有实时天气数据,它就会发出一个工具调用请求:

调用工具: get_weather 参数: { "city": "北京" }

3.execute+append result—— 执行与观察

这是循环最关键的一步:

  • 执行:调用真实的函数/API,拿到返回数据(比如天气接口返回的 JSON)。

  • 追加:把工具返回结果以「工具消息」的形式,写回messages

这相当于模型在「睁开眼看世界」。工具的结果成为了模型的新的观察,为下一步推理提供依据。

messages = [ ... (之前的对话), { role: "assistant", tool_calls: [get_weather(北京)] }, { role: "tool", content: "{ 'temp': 25, 'weather': '晴' }" } ]

4.continue—— 进入下一轮思考

带着工具结果,循环回到第 1 步。模型再次阅读全部历史,这次它知道了「北京 25°C,晴」,就能组织出最终回答:

「北京今天 25°C,天气晴朗,适合出门。」

如果这次模型仍然觉得信息不够,它会继续调用工具,循环往复。

5.return answer—— 终止条件

当模型不再产生tool_calls,而是直接输出答案文本时,循环结束,返回答案。

注意:循环的终止条件是「模型不再想用工具」。这是由模型自主判断的,不是我们预先规定要循环几次。


四、一个完整例子

把上面的天气例子串成完整流程:

用户: "上海今天适合穿什么?" ​ Round 1: Model 思考 → 发出 tool_calls: get_weather("上海") 执行工具 → 返回 { temp: 32, weather: "多云" } ↓ Round 2: Model 看到结果 → 认为信息足够,输出答案: "上海今天 32°C,多云较闷热,建议穿短袖,注意防晒。" → 没有 tool_calls → 循环结束,返回答案

如果是更复杂的任务,比如「对比两家公司的财报」,循环可能是这样的:

Round 1: 调 search_web 搜索公司信息 Round 2: 调 fetch_url 打开财报页面 Round 3: 调 analyze_document 分析数据 Round 4: 信息齐全,输出对比报告

每一轮都让模型「更进一步」,最终完成一个单次调用根本无法完成的复杂任务。


五、为什么需要循环?

单次调用Agent Loop
模型只靠「记忆」回答模型可以「查阅」实时信息
无法执行动作可以操作工具/外部系统
一步到位,容易出错分步推进,可观察、可纠错
回答完就结束可以反复验证、补充信息

简单说:循环赋予了模型「行动力」和「纠错能力」,让它能解决开放式、需要多步推理的真实任务。


六、几个需要留意的设计点

1. 防止无限循环

如果模型反复调用工具却始终不给出答案,循环会无限进行下去。实际工程中通常要加保护:

while attempts < MAX_ATTEMPTS: ... raise AgentLoopLimit("循环次数超限")

常见的保护措施有:最大轮数限制、超时时间、token 预算

2. 错误处理

工具执行可能失败(网络超时、参数错误)。此时应把错误信息也当作工具结果写回 messages,让模型自行调整策略,而不是直接崩溃:

{ role: "tool", content: "Error: 查询超时,请稍后重试" }

3. 工具定义

为了让模型知道有哪些工具可用,我们需要把工具的名称、参数、用途描述告诉模型(通常通过 API 的tools参数传入)。工具的「说明书」写得越清楚,模型的调用越准确。


七、总结

Agent Loop 的核心思想只有一句话:

让模型自己决定「要不要用工具、用什么工具、用几次」,直到它能回答为止。

while True: Model(messages) if tool_calls: execute append result continue else: return answer

这段伪代码里,while True持续推理的骨架,tool_calls模型与外部世界交互的通道,append result让模型「看见」行动结果的关键。理解了这三者,你就理解了现代 Agent(ReAct、OpenAI Function Calling、LangChain Agent 等)底层共同的运行机制。


参考与延伸

  • ReAct:Synergizing Reasoning and Acting in Language Models

  • OpenAI Function Calling / Tool Use 文档

  • Anthropic Claude Tool Use 文档

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/4 5:12:01

Cadence Allegro装配视图BOM生成:从EDA设计到生产制造的精准数据流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/4 5:09:42

SOT-23 P沟道MOS管选型:从场景判断到散热实测的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/4 5:06:14

从零构建STM32智能家居系统:端云APP一体化实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/4 5:04:31

高效数据统计:从SQL COUNT到应用层聚合的完整实践指南

最近在整理项目文档时&#xff0c;发现一个有趣又普遍的问题&#xff1a;随着项目迭代&#xff0c;我们常常需要快速统计某个特定类型的资源数量&#xff0c;比如“当前系统里有多少个状态为‘进行中’的任务”&#xff0c;或者“数据库里有多少个用户ID以‘001’结尾的记录”。…

作者头像 李华
网站建设 2026/9/4 5:04:29

Boost电路原理与Simulink开环仿真建模:从公式到波形验证全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华