☰
新手小白 Agent 开发第5课:手搓 Agent Loop,让 AI 自己循环干活
2026/9/29 22:55:17 网站建设 项目流程

上一课,我们的程序只会执行一次工具就结束。但真实任务往往需要多步:先搜索、再计算、再总结。这就需要 Agent 的「心脏」——Agent Loop。

这一课是整套系列最核心的一课。搞懂它,你就理解了所有 Agent 的底层运行方式。

一、问题:为什么一次工具调用不够?

我们的代码里有个if message.tool_calls:,意思是:

只执行一次工具,然后就结束。

但真正的 Agent 应该是这样的:

用户 ↓ LLM ↓ 需要搜索 → 搜索 → 看结果 ↓ LLM 再判断 ↓ 还需要计算 → 计算 → 看结果 ↓ LLM 再判断 ↓ 任务完成 → 输出答案

也就是说,模型需要反复看结果、反复决定下一步。这就要用到循环。

二、用 while 循环实现 Agent Loop

把main.py改成:

from openai import OpenAI import os import json from tools import calculator client = OpenAI( api_key=os.environ["DEEPSEEK_API_KEY"], base_url="https://api.deepseek.com" ) tools = [ { "type": "function", "function": { "name": "calculator", "description": "进行数学计算", "parameters": { "type": "object", "properties": { "a": {"type": "number", "description": "第一个数字"}, "b": {"type": "number", "description": "第二个数字"}, "operation": { "type": "string", "enum": ["add", "subtract", "multiply", "divide"], "description": "运算类型" } }, "required": ["a", "b", "operation"] } } } ] messages = [ {"role": "user", "content": "计算 12345 × 6789,然后告诉我结果。"} ] while True: response = client.chat.completions.create( model="deepseek-chat", messages=messages, tools=tools ) message = response.choices[0].message # 把 AI 的消息加入对话历史 messages.append(message) # 如果 AI 不需要工具,说明任务完成 if not message.tool_calls: print("AI:", message.content) break # 如果 AI 要调用工具 for tool_call in message.tool_calls: function_name = tool_call.function.name arguments = json.loads(tool_call.function.arguments) print("Agent 调用工具:", function_name) print("参数:", arguments) if function_name == "calculator": result = calculator( arguments["a"], arguments["b"], arguments["operation"] ) else: result = "未知工具" # 把工具执行结果告诉 AI messages.append({ "role": "tool", "tool_call_id": tool_call.id, "content": str(result) })

运行:

python main.py

你应该会看到:

Agent 调用工具: calculator 参数: {'a': 12345, 'b': 6789, 'operation': 'multiply'} AI:12345 × 6789 = 83810205

三、这段代码到底「循环」了什么?

关键就在那个while True:。它不断重复:

调用 LLM ↓ 检查 LLM 想干什么 ↓ 需要工具?→ 执行工具 → 把结果返回给 LLM ↓ 不需要工具?→ 输出最终答案,结束

一句话概括:Agent Loop 就是「问模型下一步做什么 → 执行 → 把结果告诉它 → 再问」这个循环。

四、最关键的一行代码

messages.append({ "role": "tool", "tool_call_id": tool_call.id, "content": str(result) })

这行的作用,是告诉模型:

「你刚才让我调用的工具执行完了,这是它返回的结果。」

于是模型才能接着判断下一步:

DeepSeek →「我要 calculator」 Python → calculator → 83810205 把结果告诉 DeepSeek DeepSeek →「好,我可以回答用户了」

少了这一行,Agent 就会「失忆」——它不知道工具执行了没有、结果是什么。

五、Agent 的核心模型:Think → Act → Observe

把整个循环抽象出来,就是所有 Agent 都遵循的三步:

Think(思考):我下一步该做什么? ↓ Act(行动):调用某个工具 ↓ Observe(观察):看工具返回的结果 ↓ 再次 Think … 直到完成
┌─────────────┐ │ 用户 │ └──────┬──────┘ ↓ ┌─────────────┐ │ DeepSeek │ └──────┬──────┘ ↓ 需要工具? ↙ ↘ 是 否 ↓ ↓ 调用 Python 最终回答 ↓ 结果 ↓ 返回给 DeepSeek │ └──────────→ 再次判断

一句话概括:Agent 不神秘,核心就是 Think → Act → Observe 的循环。

六、你现在拥有的东西,价值很大

注意:这一课的代码虽然简单,但它已经是后面所有 Agent 的骨架。无论你以后用 LangGraph、AutoGen 还是自己写,本质都逃不出这个循环。

以后再给它加工具,无非是:

DeepSeek │ ├── calculator ├── search ├── weather ├── database └── ...
现在具备的能力意味着什么
能循环执行可完成多步任务
能记住工具结果具备上下文连续性
由模型决定下一步具备自主性雏形

一句话概括:有了 Loop,你的程序第一次真正「自己动了起来」。

总结

这一课我们用一个while循环,做出了 Agent 的心脏。你现在应该真正理解了那句话——Agent 就是让大模型在「思考—行动—观察」中循环,直到完成目标。

但目前它只有一个计算器工具,还不够「能打」。下一课,我们给它装上联网搜索能力,让它第一次接触真实世界的信息。


下一课预告

第6课:给 Agent 装上联网搜索——Tavily 接入实战。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询