上篇博客咱们聊了 Agent 的“四大硬件”(LLM 大脑、工具手脚、记忆硬盘、规划中枢)。有了这些零件,这个机器人是不是就能自己跑起来了?

并没有。

如果你按传统调用大模型的方式去用它,它依然只是个“算盘”——你拨一下,它动一下。今天咱们就来撕开框架的外衣,看看一个真正的 Agent 是如何运转的。它的核心其实就是一个词:闭环(Loop)

理解了这个闭环,你才算真正跨过了 LLM 应用开发的门槛。

一、 “被动应答”的痛点:Vending Machine 模式

我们平常在网页上跟 ChatGPT 聊天,或者通过代码调用普通的 Chat API,本质上都是“自动售货机(Vending Machine)”模式。

你塞入一枚硬币(Prompt),它吐出一罐可乐(Text),然后流程就死死地结束了。 就算你接着问,它也是把之前的聊天记录打包再看一遍,然后再吐一段文字。

这种模式最大的致命伤在于:大模型永远在等待你的下一个指令。 它没有“内部驱动力”。当你扔给它一个宏大的任务(比如:“帮我排查一下今天线上服务器为什么报 502 错误”),它只能无奈地输出一篇《502 错误排查指南》给你,让你自己去干。

怎么让它自己去干?我们需要把“单次触发”改成“死循环”。

二、 化抽象为具象:Agent 的核心逻辑就是“高级研发修 Bug”

学术界有个很著名的概念叫 ReAct (Reasoning + Acting)。听起来很高大上,但你完全可以把它类比成你作为一个后端研发,去线上服务器排查 Bug 的过程

你想想看,你是怎么修 Bug 的?

  1. 接需求(Goal): 老板说,线上服务挂了,赶紧看看。

  2. 想(Thought): 你摸了摸下巴:“服务挂了,我第一步应该先去看看 Nginx 的错误日志。”

  3. 做(Action): 你敲下命令,调用了你的“工具”:tail -n 100 error.log

  4. 看(Observation): 屏幕上滚出日志,你发现是数据库连接超时(Connection Timed Out)。

  5. 再想(Thought): “哦,既然是数据库超时,那我下一步得去看看 MySQL 的状态。”

  6. 再做(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,别慌,看一眼日志,定位一下它到底是在“想”的阶段偏了,还是在“做”的阶段卡了,一切问题就都迎刃而解了。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐