[控场AI]
· 10 分钟阅读· 5,022 字

AI Agent本质解析:50行代码实现ReAct循环

AI Agent本质解析:50行代码实现ReAct循环

Agent本质是模型加工具加循环,模型只写请求,代码执行工具,步数限制是必备安全阀。

文章从Claude经营商店的实验出发,拆解了AI Agent的真实工作机制。Agent的本质是模型、工具与循环三要素的组合,核心循环模式ReAct来自2022年论文,让模型交替进行推理与行动。工具调用机制(如function calling)解决了模型如何可靠请求工具的问题,但关键认知是:模型不执行工具,它只输出请求,由代码执行并写回结果。模型只依赖上下文窗口中的内容,缺少观察写回会导致无限重复同一调用。四个主流框架均内置步数限制作为安全阀。文章还澄清了三个常见误解:Agent不是特殊模型、自主性并非越高越好、框架并非必需——约50行代码即可实现一个可运行的Agent。

一个AI店主引发的思考

2025年,Anthropic与AI安全公司Andron Labs让Claude Sonnet 3.7经营一家迷你办公室商店,为期约一个月。它自主决定进货和定价,结果却令人哭笑不得:员工开玩笑要一块钨立方,它真进了货,还引发了一波特种金属订单潮;定价不做调研,部分商品售价低于成本;甚至免费送出薯片和钨立方。Anthropic的结论很直接——「如果那天我们招店主,我们不会雇Claude。」

这个实验暴露了Agent的核心问题:它如何做决策?为何重复犯错?又是什么阻止它无限循环?本文基于一档技术视频的拆解,从原理到50行代码实践,还原Agent的真实工作机制。

Agent的本质:模型+工具+循环

Agent的组成:模型、工具与循环

视频给出了一个简洁定义:Agent = 模型 + 工具 + 循环。模型的职责是写文本,工具是外部函数,循环则是“思考-行动-观察”的重复过程。OpenAI的Agent构建指南将核心三要素列为模型、工具、指令,而Anthropic工程师的描述更直白:Agent就是LLM在环境反馈中循环使用工具。

你可以把它想象成第一天上班的实习生:拿到任务和清单,思考下一步,执行一个动作(打电话、开表格),查看结果,再回到清单,直到任务完成或主动求助。实习生的大脑是模型,电话和表格是工具,清单是指令——三者缺一不可。

这个循环有一个专门的名字:ReAct(Reason and Act)。它来自2022年10月普林斯顿大学与Google Brain团队的一篇论文。当时模型被分开训练“逐步推理”和“执行动作”,研究者提出让两者交替进行:想一句,做一个动作,读回结果,再想下一句。他们给模型配了一个简易维基百科工具,仅支持搜索、查找和填空三个动作。

论文中的一个例子是:米豪斯(Millhouse)这个辛普森角色名字从何而来?模型先搜索“Millhouse”,再查找“named after”,读到它得名于美国总统理查德·尼克松,最后输出答案。在两个测试环境中,ReAct仅需一两个示例提示,成功率就比模仿学习和强化学习方法分别高出34和10个点;在需要查资料的问题上,它把纯推理产生的编造事实减少了约一半。八周后,ChatGPT发布。

ReAct 是 Reasoning and Acting 的缩写,核心思想是让大语言模型交替进行“推理轨迹”和“动作执行”。在 ReAct 之前,主流方法要么只做链式推理(Chain-of-Thought),模型在内部独白但不与外部交互;要么只做动作预测(Act-only),模型直接输出动作但缺乏推理支撑。ReAct 将两者交织:模型先输出一段思考(Thought),再输出动作(Action),环境返回观察(Observation),模型再基于观察继续思考。这种设计让模型能动态调整计划、纠正错误,并利用外部工具弥补自身知识盲区。论文在 HotpotQA 和 FEVER 等任务上验证了其有效性,尤其适合需要多步推理和外部信息检索的场景。ReAct 已成为当前 Agent 架构的事实基础,后续的工具调用协议(如 function calling)本质上是对“动作”部分的标准化。

工具调用:从论文到产品

ReAct解决了“怎么循环”,工具调用解决了“怎么让模型可靠地请求工具”。2023年2月,Meta AI团队指出一个悖论:大模型在算术和查事实等基础任务上表现不佳,而更小的专用模型反而更擅长。他们的方案是训练模型决定何时调用哪个工具、输入什么参数,比如计算器。

2023年6月,OpenAI推出function calling:你描述函数,模型回复一个JSON对象,标明函数名和参数。例如“波士顿天气如何”转化为对天气函数的调用。2024年5月,Anthropic在Claude 3系列全面开放tool use。Google Gemini文档中称之为function calling或tool use。2024年7月,可在笔记本运行模型的Ollama也加入支持。到2025年3月,OpenAI发布开源Agents SDK,Google推出开源Agent Development Kit,LangChain有LangGraph,CrewAI专注多Agent协作,微软有Agent Framework(AutoGen的继任者)。

这些框架风格各异,但其中四个都内置了同一个安全机制——后文会揭晓。

Function calling(函数调用) 是一种让大语言模型以结构化格式(通常是 JSON)输出工具调用请求的机制。在此之前,让模型调用工具通常依赖提示工程或微调,输出格式不稳定,难以可靠解析。Function calling 的核心在于:开发者用 JSON Schema 描述每个函数的名称、用途和参数类型,模型在需要时输出一个符合该 Schema 的 JSON 对象,而非自然语言。运行时系统解析该对象,执行对应函数,并将结果回传给模型。这一机制将“模型输出”与“程序执行”解耦,使工具调用变得可验证、可编排。OpenAI 于 2023 年 6 月推出该能力,随后 Anthropic 的 tool use、Google 的 function calling 均采用类似设计。它也是现代 Agent 框架能够标准化循环流程的关键前提。

关键认知:模型不执行工具

模型只写请求,代码执行工具

回到开头的问题:一个只会写文本的程序,如何改商店里的价格?答案是:它不改,它写请求,你的代码去改。

完整循环是:

  • 思考:模型收到任务和工具列表(含简短描述),回复最终答案或工具请求(名称+参数)。
  • 行动:你的程序(不是模型)执行该工具。
  • 观察:结果被回传给模型。
  • 重复:带着结果进入下一轮。

商店AI也是如此。网页搜索、邮件、与客户沟通的Slack、改价工具——每个都是人写的函数,模型只负责写请求。模型只依赖对话中的内容,那段消息列表就是它的笔记本,没写进去的它一概不知。这也是商店AI需要记录工具的原因:完整运营历史会超出上下文窗口。

上下文窗口(context window) 是模型在单次推理中能“看到”的全部文本范围,包括系统提示、对话历史、工具定义和工具返回结果。模型没有持久记忆,每次调用都是无状态的——它只能基于当前上下文窗口中的内容做决策。因此,Agent 的“记忆”本质上是对上下文窗口的管理:哪些信息写回、哪些丢弃、何时压缩摘要。商店 AI 实验中的学习和记忆挑战正源于此:完整运营历史很快超出窗口容量,模型无法记住几天前的定价决策,导致重复犯错。这也是为什么 Agent 工程中常需要外部记忆存储(如向量数据库)或滚动摘要机制,来弥补上下文窗口的物理限制。

50行代码跑通一个Agent

视频作者用约50行Python、一个在笔记本上运行的小模型(Qwen 2.5,约5亿参数)和Ollama(支持工具调用)构建了一个Agent。工具只有两个:计算器和天气查询(仅Pune和London,假数据)。顶部设一条规则:最多5步。

第一个任务:23乘47等于多少。第1步,模型思考并请求计算器,参数23和47;代码执行,返回1081;第2步,模型给出最终答案。模型从未做数学,计算器做的——这正是Meta团队思路的体现。

下一个任务:London和Pune的天气。模型一步内同时请求两个城市,得到12°C雨和31°C晴,然后作答。

再难一点:Pune天气多少华氏度?天气工具返回31°C,模型直接输出“31°F”。错了,31°C约88°F,计算器就在手边,它却只换了标签。这个迷你模型的教训是:循环只检查模型决定检查的东西。作者注:在温度0、固定种子下做了8次完整运行(另有2次侧边故障),每次步骤和答案完全一致,但换模型或设置可能不同。

故意破坏:无限循环的诞生

观察缺失导致的死循环

现在故意埋一个bug:每步之后不写回任何内容——不写模型请求,也不写结果。模型每次都看到同样的笔记本,温度0下做出同样请求。

同样问Pune天气:第1步调用天气工具,观察31°C晴;第2步再次调用;第3步、第4步、第5步……同样的调用、同样的结果。它看不到结果,就不知道自己已经拿到了。第5步触发上限,终止,无最终答案。

那行步数限制是它停下的唯一原因。没有它,循环会一直跑到别的东西坏掉。每一步都是一次模型调用,付费服务上每一步都花钱——5次调用,0个答案。

这正是商店AI问题的漫画版。它宣布取消折扣码,几天后又开始发;Anthropic记录称“学习和记忆是那次实验的重大挑战”。后续用更新的Claude模型时商店表现更好,但讨好用户的倾向仍让它在对抗性测试者面前吃亏。ReAct论文也报告过类似常见错误:模型重复之前的思考与行动,无法跳出循环;无效搜索占其错误案例的23%。Anthropic坦言,自主性意味着更高成本和错误累积的可能。

修复很朴素:把每个结果都写回对话。OpenAI Agents SDK正是这样描述:执行工具调用,追加结果,再跑循环,直到达到停止条件(如最大步数)。Anthropic称步数限制是常见实践,OpenAI指南视其为正常运行结束方式。

最大步数限制(max steps / max turns) 是 Agent 循环中最基础也最重要的安全机制。由于模型每次调用都是无状态的,它无法感知自己已经重复了多少次相同动作——除非代码主动把历史写回上下文或强制终止。最大步数限制在框架层面硬性截断循环,防止因观察缺失、工具故障或模型陷入重复模式而导致的无限调用。不同框架命名各异(max_turns、recursion_limit、max_iterations),但逻辑一致:设定一个上限,达到后强制结束并返回当前最佳结果或报错。这一机制不仅控制成本(每次模型调用都计费),也避免 Agent 在无人监督下持续产生副作用。生产环境中,步数上限通常还需配合超时、人工审批和异常回滚等机制共同使用。

安全阀:四个框架同一个答案

最终答案

什么能阻止失控的Agent?就是那个安全阀:

  • OpenAI Agents SDK:max_turns,超过即报错。
  • LangGraph:recursion_limit,自1.0.6版本起默认1000步。
  • Google ADK:限制单次运行的模型调用数,默认500。
  • CrewAI:max_iterations,默认20,之后Agent必须给出最佳答案。

四个工具包,四个名字,同一个安全阀。如果每一步都花钱,上线前先检查这个设置。

三个常见误解

误解一:Agent是更聪明的特殊模型。 错。视频里的Agent用的就是你聊天时那个小模型,工具和循环让它成为Agent。

误解二:自主性越高越好。 OpenAI指南建议团队逐步构建,Anthropic推荐能用的最简单方案,有时根本不需要Agent。Agent适合“固定规则不够用”的场景。

误解三:必须用框架。 50行代码就够。Google ADK和LangGraph确实提供中断恢复、故障处理、人工审批等实际好处,但也可能隐藏底层提示、增加调试难度。这是取舍,不是对错。

结语

Agent就是一个拿着清单的实习生:模型、工具、指令,在循环中思考、行动、观察、重复。模型只写请求,你的代码执行工具;它只知道笔记本里写了什么;它需要步数限制,因为有时它不会自己停下。理解这三件事,你就理解了当下所有Agent框架的底层逻辑。

#AI Agent#ReAct循环#Agentic AI#工具调用#function calling#AI Agent框架#LLM
分享:

相关推荐