从零写一个智能体:最核心的“化身” —— 循环(Agent Loop)

这是《手把手写一个AI智能体》系列的第一篇。

别怕,我们不聊高深理论,只看一段不到100行的 Python 代码,就能让你搞懂"智能体"到底在做什么。


🎯 一句话总结:智能体 = 机器人 + 脑子 + 循环

想象一下,你让一个AI助手 帮你写代码、查文件、运行命令。

它不会一次就搞定所有事,而是"想一步 → 做一步 → 再想下一步"......直到完成。

这个"想→做→想 "的循环,就是所有智能体的灵魂

在代码里,它长这样:

python 复制代码
while stop_reason == "tool_use":
    response = LLM(messages, tools)   # 🤔 思考
    execute tools                      # 🛠️ 行动
    append results                     # 📝 反馈

我们把这个模式叫作 Agent Loop (智能体循环)。

今天,我们就用一段真实的代码,把这个循环拆开、揉碎,讲给你听。


🧱 总结构:代码长什么样?

我们先看一眼整体结构(完整代码在文末),它只有三个核心部分:

  1. 工具定义TOOLS)------ 告诉AI它能做什么,比如运行 bash 命令。

  2. 工具执行函数run_bash)------ 真正去执行命令,并返回结果。

  3. 核心循环agent_loop)------ 不断调用LLM,根据结果决定下一步。

整体流程就像打电话

  • 用户说一句话 → AI 思考 → 如果AI觉得需要"动一下",就调用工具 → 把结果告诉AI → AI继续思考 → 直到AI说"好了,我回答你"。

🔁 核心循环:while 里的秘密

让我们逐行看 agent_loop 函数:

python 复制代码
def agent_loop(messages: list):
    while True:
        response = client.chat.completions.create(...)   # 1. 问AI
        assistant_message = response.choices[0].message
        messages.append(assistant_message)               # 2. 记录AI的回答

        if not assistant_message.tool_calls:             # 3. 检查是否需要工具
            return                                       # 不需要 → 结束循环

        for tool_call in assistant_message.tool_calls:   # 4. 执行每个工具
            output = run_bash(command)                   # 🛠️ 执行
            messages.append({"role": "tool", ...})       # 5. 把结果放回对话

每轮循环做了三件事:

  • :把当前所有对话历史(包括之前的工具结果)发给LLM。

  • :如果LLM返回了 tool_calls,说明它想干点活;如果没有,说明它已经给出最终答案。

  • :执行每一个工具调用,把结果放回对话,然后继续循环

这就是"由工具结果驱动模型继续推理 "的核心机制。

如果没有这个循环,AI就只能回答一次,无法"边做边想"。


🛠️ 工具:bash 命令的"挡板"

代码中定义了一个 bash 工具,LLM 可以随时调用它。

但注意,执行之前有一个安全检查

python 复制代码
dangerous = ["rm -rf /", "sudo", "shutdown", "reboot", "> /dev/"]
if any(d in command for d in dangerous):
    return "Error: Dangerous command blocked"

为什么要这样做?

因为LLM有时候会"发疯",万一它想删掉你的整个系统......

所以我们加了

python 复制代码
text
s01 >> 帮我看看当前目录下有哪些文件

一个简单但有效的防火墙

另外,它还限制了输出长度(50000字符)和超时(120秒),防止AI卡死。


🧪 跑起来:一个真实的交互例子

假设你运行这个脚本,输入:

python 复制代码
text
s01 >> 帮我看看当前目录下有哪些文件
复制代码
看看当前目录下有哪些文件

发生了什么(大概流程):

  1. 用户问题 → 加入对话历史。

  2. 调用LLM → LLM 发现需要执行 ls -la,于是返回一个 tool_call

  3. 执行工具 → 运行 ls -la,输出文件列表。

  4. 把输出放回对话 → 变成一条 role="tool" 的消息。

  5. 再次调用LLM → LLM 看到工具结果,回答:"当前目录下有这些文件:......"

  6. 没有新的工具调用 → 循环结束,输出最终答案。

整个过程就像是AI一边动脑,一边动手,而且每次动手的结果都会被"喂"回给它,让它知道下一步该做什么。


🧩 为什么这是"最基础的设计"?

很多高级智能体框架(比如 LangChain、AutoGPT)都在这个模式上加了更复杂的东西:

  • 多工具注册

  • 记忆管理

  • 递归子任务

  • 用户确认

最底层的骨架 永远是这个 while 循环。

学会它,你就学会了所有智能体的原子操作

用一句话来记住:
工具调用是AI的"手",循环是AI的"呼吸"。

相关推荐
海兰2 分钟前
【插件】OpenClaw 上下文引擎指南
人工智能·agent·openclaw
Rocky Ding*4 分钟前
【三年面试五年模拟】2026-08-18_哔哩哔哩AI应用岗Agent开发一面面经全解析(含完整答案)
论文阅读·人工智能·深度学习·机器学习·aigc·ai-native·ai agent
geneculture9 分钟前
基于融智学框架的领军人才实训实操示范基地建设: 课题、课程与项目的系统工程(人机三双协同即人机双脑双智双语协同)
人工智能·融智学的重要应用·哲学与科学统一性·融智时代(杂志)·序位逻辑的实例化·人机三双协同
key_3_feng10 分钟前
智能体 Loop 工程:循环架构与状态机
人工智能·loop·智能体
冬奇Lab11 分钟前
Code Agent 解剖(08):一个任务太复杂,怎么拆给子 agent 做?
人工智能·开源
冬奇Lab11 分钟前
开源项目第195期:OpenTelemetry Demo(Astronomy Shop)— 官方出品的分布式系统可观测性实战教材
人工智能·开源·前端工程化
海兰12 分钟前
【原理】OpenClaw Agent 运行时回顾一文清
人工智能·agent
民乐团扒谱机13 分钟前
【微实验】物理启发神经网络(PINN):当AI学会遵守物理定律(附matlab代码))
人工智能·神经网络·matlab
极客互动API26 分钟前
企业微信 iPad 协议消息接口开发:文本 / 图片 / 群发消息的统一封装
人工智能·ios·微信·机器人·企业微信·ipad
达子66632 分钟前
AI训练师图解_6.1_6.2_五大行业应用_NLP
人工智能·自然语言处理