Agent 到底是什么:ReAct 模式与工具调用的最小实现
Words: 1150Read Time: 3 minLast edited: 2026-8-4
Agent 元年,先别被概念吓到
2025 年开年,Agent(智能体)这个词彻底火了。三月初 Manus 刷屏,各种"AI 员工""全自动 Agent"的说法满天飞,好像一夜之间冒出了什么黑科技。我扒掉包装研究了一圈,结论可能让人失望:Agent 没有什么神秘配方,核心就是 LLM + 工具 + 一个循环。
这不算我的发现。2022 年那篇 ReAct 论文就把这个模式讲清楚了:让模型交替进行 Reasoning(思考)和 Acting(行动)——想一步、调个工具、观察结果、再想下一步,直到任务完成。
和单次调用差在哪
普通的 function calling 是一问一答:你问,它最多调一次工具就回答。Agent 的区别在于把流程控制权交给了模型:
- 它自己决定要不要调工具、调哪个、调几次。
- 每次工具返回的结果会改变它的下一步决策——一个观察影响下一个思考。
- 它自己判断任务什么时候算完成:不再请求工具,就是完成了。
说白了,单次调用是你牵着它走,Agent 是给它一个目标让它自己找路。像"查一下北京天气,温度超过 25 度就推荐穿搭"这种任务,单次调用搞不定,因为"查完→判断→再行动"需要多轮自主决策。
50 行最小实现
不看任何框架,用 function calling 手写一个 ReAct 循环,核心代码 50 行以内:
结构就这么点东西:一个循环,每轮把完整对话发给模型;返回 tool_calls 就执行工具、回填结果,继续循环;不再请求工具时返回最终文本。
跑一下"北京和上海哪个热,温差多少":它会先调两次 get_weather,再调 calc 算差值,最后给出结论。整个过程不需要你写任何流程控制——流程是模型自己想出来的,这就是 Agent 和写死 if-else 的本质区别。
工程上的坑:循环必须拴住
自由是有代价的。这个循环一旦失控就是烧钱机器,我踩过的和防住的:
- 必须设最大步数。模型偶尔会陷入"调用→结果不满意→换个参数再调"的死循环,MAX_STEPS 是最后的保险丝,我设 8 步。
- 每步打印日志。调了哪个工具、传的什么参数、返回什么结果,全部打出来,不然出了问题根本没法复盘。
- 工具要幂等,只读优先。让 Agent 调用有副作用的工具(写库、发消息)要格外小心,它的"自主决策"可能在你没预料的路径上执行写操作。
- 盯紧 token 消耗。每轮循环都携带完整历史,步数多了单轮成本翻倍涨,长任务要经常看账单。
框架(LangChain 之类)做的事本质上也是这个循环,只是加了状态管理、记忆、重试这些工程细节。手写一遍之后再去看它们,就没有黑盒了。
Loading...