这是《手把手写一个AI智能体》系列的第一篇。
别怕,我们不聊高深理论,只看一段不到100行的 Python 代码,就能让你搞懂"智能体"到底在做什么。
🎯 一句话总结:智能体 = 机器人 + 脑子 + 循环
想象一下,你让一个AI助手 帮你写代码、查文件、运行命令。
它不会一次就搞定所有事,而是"想一步 → 做一步 → 再想下一步"......直到完成。
这个"想→做→想 "的循环,就是所有智能体的灵魂 。
在代码里,它长这样:
python
while stop_reason == "tool_use":
response = LLM(messages, tools) # 🤔 思考
execute tools # 🛠️ 行动
append results # 📝 反馈
我们把这个模式叫作 Agent Loop (智能体循环)。
今天,我们就用一段真实的代码,把这个循环拆开、揉碎,讲给你听。
🧱 总结构:代码长什么样?
我们先看一眼整体结构(完整代码在文末),它只有三个核心部分:
-
工具定义 (
TOOLS)------ 告诉AI它能做什么,比如运行bash命令。 -
工具执行函数 (
run_bash)------ 真正去执行命令,并返回结果。 -
核心循环 (
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 >> 帮我看看当前目录下有哪些文件
看看当前目录下有哪些文件
发生了什么(大概流程):
-
用户问题 → 加入对话历史。
-
调用LLM → LLM 发现需要执行
ls -la,于是返回一个tool_call。 -
执行工具 → 运行
ls -la,输出文件列表。 -
把输出放回对话 → 变成一条
role="tool"的消息。 -
再次调用LLM → LLM 看到工具结果,回答:"当前目录下有这些文件:......"
-
没有新的工具调用 → 循环结束,输出最终答案。
整个过程就像是AI一边动脑,一边动手,而且每次动手的结果都会被"喂"回给它,让它知道下一步该做什么。
🧩 为什么这是"最基础的设计"?
很多高级智能体框架(比如 LangChain、AutoGPT)都在这个模式上加了更复杂的东西:
-
多工具注册
-
记忆管理
-
递归子任务
-
用户确认
但最底层的骨架 永远是这个 while 循环。
学会它,你就学会了所有智能体的原子操作。
用一句话来记住:
工具调用是AI的"手",循环是AI的"呼吸"。