别把大模型当聊天机了:拆解 Agent 从“被动应答”到“自主做事”的核心闭环
上篇博客咱们聊了 Agent 的“四大硬件”(LLM 大脑、工具手脚、记忆硬盘、规划中枢)。有了这些零件,这个机器人是不是就能自己跑起来了?
并没有。
如果你按传统调用大模型的方式去用它,它依然只是个“算盘”——你拨一下,它动一下。今天咱们就来撕开框架的外衣,看看一个真正的 Agent 是如何运转的。它的核心其实就是一个词:闭环(Loop)。
理解了这个闭环,你才算真正跨过了 LLM 应用开发的门槛。
一、 “被动应答”的痛点:Vending Machine 模式
我们平常在网页上跟 ChatGPT 聊天,或者通过代码调用普通的 Chat API,本质上都是“自动售货机(Vending Machine)”模式。
你塞入一枚硬币(Prompt),它吐出一罐可乐(Text),然后流程就死死地结束了。 就算你接着问,它也是把之前的聊天记录打包再看一遍,然后再吐一段文字。
这种模式最大的致命伤在于:大模型永远在等待你的下一个指令。 它没有“内部驱动力”。当你扔给它一个宏大的任务(比如:“帮我排查一下今天线上服务器为什么报 502 错误”),它只能无奈地输出一篇《502 错误排查指南》给你,让你自己去干。
怎么让它自己去干?我们需要把“单次触发”改成“死循环”。
二、 化抽象为具象:Agent 的核心逻辑就是“高级研发修 Bug”
学术界有个很著名的概念叫 ReAct (Reasoning + Acting)。听起来很高大上,但你完全可以把它类比成你作为一个后端研发,去线上服务器排查 Bug 的过程。
你想想看,你是怎么修 Bug 的?
-
接需求(Goal): 老板说,线上服务挂了,赶紧看看。
-
想(Thought): 你摸了摸下巴:“服务挂了,我第一步应该先去看看 Nginx 的错误日志。”
-
做(Action): 你敲下命令,调用了你的“工具”:
tail -n 100 error.log。 -
看(Observation): 屏幕上滚出日志,你发现是数据库连接超时(Connection Timed Out)。
-
再想(Thought): “哦,既然是数据库超时,那我下一步得去看看 MySQL 的状态。”
-
再做(Action): ……
这个 想 -> 做 -> 看 -> 想 的循环,会一直持续,直到你找到最终原因,跟老板汇报(给出最终答案)。
Agent 的核心运行逻辑,跟这个过程一模一样! 它不再是一次性生成最终答案,而是开始生成自己的**“内心独白(Thought)”和“动作指令(Action)”**。
三、 剥洋葱:ReAct 闭环在代码里到底是怎么跑的?
在实际的工程代码中(不管你用的是 LangChain 还是手写的编排引擎),这个闭环是靠一段 while 循环撑起来的。
请看这段“灵魂伪代码”,它暴露了 Agent 运行的绝对本质:
Python
# 用户的初始目标
user_goal = "帮我查一下杭州今天的天气,并根据天气推荐穿搭。"
# Agent 的核心运作流
while True:
# 1. 喂给 LLM 当前的所有信息(包含历史动作和结果)
# 强制要求 LLM 输出 JSON,包含两个字段:thought(怎么想的)和 action(打算调什么工具)
llm_response = llm.generate(
prompt=user_goal,
history=memory.get_context()
)
# 2. 拿到 LLM 的内心独白(Thought)
print("Agent 的思考: ", llm_response.thought)
# 3. 检查 LLM 是不是觉得自己已经搞定了
if llm_response.action.name == "FINISH":
print("最终答案: ", llm_response.action.final_answer)
break # 任务完成,跳出死循环!
# 4. 如果没搞定,就去执行它要求的工具(Action)
tool_name = llm_response.action.name
tool_args = llm_response.action.args
print(f"执行工具: {tool_name},参数: {tool_args}")
# 注意!这里是你的宿主代码在干活,不是大模型在干活!
observation = tools.execute(tool_name, tool_args)
# 5. 把执行结果(Observation)存入记忆,进入下一轮循环
memory.add(
thought=llm_response.thought,
action=llm_response.action,
observation=observation
)
仔细看这 5 个步骤,这里有极其关键的权责划分:
-
大脑(LLM) 只负责:根据当前局势,推断出
Thought(思考)和Action(决策)。 -
双手(你的代码/框架) 负责:拿着决策去真正执行,获取
Observation(观察结果),并塞回给大脑。
只要 LLM 还没有输出 FINISH 这个动作,这个循环就会一直跑下去。这就是它能“自主做事”的底层秘密。
四、 带着泥土气息的工程体感:闭环里最容易踩的坑
理论很美好,但在真实业务里跑这个 while True 循环时,你绝对会遇到以下几个让人抓狂的坑:
1. 愚蠢的“死循环(Infinite Loop)” 有时候某个 API 挂了,或者 LLM 传错了参数,工具返回了 "Error: Invalid API Key"。 普通大模型看了之后,可能会疯狂道歉:“对不起,我弄错了”,然后在下一轮循环里,用一模一样的错误参数再调一次。
-
工程解法: 必须在代码里加上强硬的
max_iterations(最大循环次数)限制,比如最多跑 10 轮,跑不到终点直接强制熔断报错。同时,在 Prompt 里狠狠地加上一句:“如果工具调用失败,请务必分析错误原因并更换参数,绝对不要重复相同的动作!”
2. 记忆的“吃撑与幻觉” 你让 Agent 去查数据库,工具执行完毕后,啪的一下返回了 10 万字的 JSON 结果(Observation)。 下一轮循环把这 10 万字塞给大模型时,上下文窗口(Context Window)瞬间爆掉,或者直接触发长文本带来的“注意力涣散”,导致大模型完全忘了最初的目标是什么。
-
工程解法: 永远不要把原始的 Observation 直接塞给下一轮。在你的宿主代码里拦截一下,用一段截断逻辑,或者让一个小模型先做个 Summary(摘要),把“10万字的日志”浓缩成“没找到关键错误信息”,再扔给主循环。
3. 提前交卷 大模型有时候很“懒”,拿到一点点线索,还没验证真伪,就急匆匆地输出 FINISH。
-
工程解法: 使用强制验证的 Prompt,比如“在给出最终答案前,请在 thought 中证明你的证据链是完整的”。
总结
其实,把 Agent 神秘的面纱揭开,它不过就是一个巧妙利用了 LLM 推理能力的 while 循环。
从“被动应答”到“自主做事”,本质上是将大模型的角色从**“一次性文本生成器”,升级成了“循环状态机中的决策中枢”**。
以后当你在用 LangChain 的 AgentExecutor 或者开发自己的 AI 应用时,脑子里一定要浮现出那个不断在 想 -> 做 -> 看 中打转的齿轮。出了 Bug,别慌,看一眼日志,定位一下它到底是在“想”的阶段偏了,还是在“做”的阶段卡了,一切问题就都迎刃而解了。
更多推荐
所有评论(0)