系列简介 :从零搭建一个多 Agent AI 助手,覆盖原理、实现、部署全链路。不讲空话,每篇都有可运行的代码。
项目地址 :github.com/CodeMomentY...
本篇目标:搞清楚 Agent 的本质,手写一个最简单的 Agent 循环。

前言
大家好,我是一名前端工程师。都说前端"已死",那与其担心被 AI 替代,不如打入敌人内部,于是我开始折腾 Agent 开发。
折腾下来发现,Agent 的核心不是算法,而是"工程能力"(怎么设计架构、怎么串联服务、怎么把 LLM 的能力落地成产品)。这些恰好是我们擅长的事。
这个系列记录我从零搭建多 Agent 系统的完整过程。只聊技术知识和设计思路,代码交给 AI 写。如果你也想从应用层切入 AI,希望这个系列对你有帮助。
读完本篇你将学到:
- Agent 和普通 ChatBot 的本质区别;
- Agent 的核心循环:感知 → 思考 → 行动;
- 手写一个不依赖任何框架的 Agent(30 行代码);
- 接入 LLM 后 Agent 能做什么;
背景与动机
2024年开始,"Agent" 这个词被各种文章和产品反复提及。但大部分内容要么太学术,要么太营销("AI Agent 将取代所有工作")。
我的困惑很简单:Agent 和我直接调 ChatGPT API 有什么区别?
带着这个问题,我花了几周时间从零学习并实现了一个完整的多 Agent 系统。这个系列就是我的实战记录,不是翻译论文,而是一个前端工程师视角的动手笔记。
核心概念
Agent ≠ ChatBot

看一下详细对比:
| ChatBot | Agent | |
|---|---|---|
| 能力 | 接收问题,返回回答 | 接收目标,自主完成任务 |
| 工具 | 没有 | 有(搜索、API、数据库...) |
| 决策 | 无(问什么答什么) | 有(判断要不要用工具、用哪个) |
| 循环 | 单轮(一问一答) | 多轮(思考→行动→观察→再思考) |
一句话总结:ChatBot 是问答机器,Agent 是能干活的助手。
Agent 的核心公式

简单介绍一下:
- LLM:负责理解问题、做决策、生成回答;
- Tools:Agent 能调用的外部能力(查天气、搜网页、读数据库);
- Memory:记住之前聊过什么、做过什么;
- Loop:不断循环"思考 → 行动 → 观察"直到任务完成;
核心循环

这个循环有个学术名字叫 ReAct(Reasoning + Acting),但本质就是:想一想,干一下,看看结果,再想想够不够,最终再组织话术把完整的信息输出给用户。
动手实现
先说明一下这里为什么用 Python?
AI 生态几乎全在 Python 上------LangChain、LangGraph、OpenAI SDK、向量数据库,全是 Python 优先。当然用 Node.js 也能做,但会花大量时间在"找替代库"上。所以我们不妨让 AI 带着我们一起来熟悉一下 Python 的用法。
Step 1:最简 Agent(不用 LLM)
先不接大模型,用硬编码逻辑模拟 Agent 的决策过程。这样能看清 Agent 的骨架:
python
"""
最简 Agent:手动模拟 思考→行动→观察 循环
不依赖任何框架,不调用 LLM
"""
# 工具定义
def get_weather(city):
"""模拟天气查询"""
data = {"北京": "晴, 25°C", "上海": "多云, 22°C"}
return data.get(city, f"暂无 {city} 的天气数据")
TOOLS = {"get_weather": get_weather}
# Agent 核心循环
def run_agent(user_input):
print(f"[用户] {user_input}")
print("=" * 50)
# 第 1 步:思考(这里用规则模拟,后面会换成 LLM)
if "天气" in user_input:
# 提取城市名(简单粗暴)
for city in ["北京", "上海", "深圳"]:
if city in user_input:
# 第 2 步:行动
print(f"Thought: 用户问天气,需要调用工具")
print(f"Action: get_weather({city})")
result = TOOLS["get_weather"](city)
print(f"Observation: {result}")
# 第 3 步:基于观察生成回答
answer = f"{city}今天的天气是{result},适合出门。"
print(f"Answer: {answer}")
return answer
# 不需要工具,直接回答
print("Thought: 普通问题,直接回答")
answer = "你好!有什么可以帮你的?"
print(f"Answer: {answer}")
return answer
# 测试
run_agent("北京今天天气怎么样?")
print()
run_agent("你好")
运行输出:
plain
[用户] 北京今天天气怎么样?
==================================================
Thought: 用户问天气,需要调用工具
Action: get_weather(北京)
Observation: 晴, 25°C
Answer: 北京今天的天气是晴, 25°C,适合出门。
[用户] 你好
==================================================
Thought: 普通问题,直接回答
Answer: 你好!有什么可以帮你的?
看到了吗?这就是 Agent 的全部秘密:判断要不要用工具,用了之后看结果,再决定下一步。
Step 2:接入 LLM
上面的"思考"是硬编码的 if-else。真正的 Agent 用 LLM 来做决策------它能理解任何问题,自己判断该调什么工具。
我在实现的时候使用的是小米当时免费赠送的Token,这里直接用了mimo-v2.5-pro作为 LLM 来搭建我们的 Agent。有条件的可以购买DeepSeek,也可以找一找免费的,比如「硅基流动 SiliconFlow」。
注:不同的 LLM 提供商可能调用用的接口协议不一样(使用之前可以看一下接入文档),这里小米是支持兼容 OpenAI 接口协议的。
python
"""
接入 LLM 的 Agent
LLM 负责:理解问题 → 决定是否调工具 → 基于结果生成回答
"""
from openai import OpenAI
client = OpenAI(
api_key="your-key",
base_url="https://token-plan-cn.xiaomimimo.com/v1"
)
TOOLS = {"get_weather": get_weather} # 复用上面的工具
SYSTEM_PROMPT = """你是一个助手。你有以下工具可用:
- get_weather(city): 查询城市天气
规则:
- 如果用户问天气,输出格式:Action: get_weather(城市名)
- 如果不需要工具,直接回答
"""
def call_llm(messages):
resp = client.chat.completions.create(
model="mimo-v2.5-pro",
messages=messages,
temperature=0
)
return resp.choices[0].message.content
def run_agent_with_llm(user_input):
messages = [
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": user_input}
]
for round in range(5): # 最多循环 5 轮
response = call_llm(messages)
print(f"LLM: {response}")
# 检查是否要调工具
if "Action: get_weather(" in response:
city = response.split("get_weather(")[1].split(")")[0]
result = TOOLS["get_weather"](city)
print(f"Tool Result: {result}")
# 把工具结果告诉 LLM,让它继续
messages.append({"role": "assistant", "content": response})
messages.append({"role": "user", "content": f"工具返回:{result}"})
else:
# 没有工具调用,说明 LLM 直接给出了最终回答
return response
return "抱歉,处理超时了。"

关键变化:"思考"这一步从 if-else 变成了 LLM 调用。 LLM 能理解"上海天气如何"、"明天北京冷不冷"这些问题,不需要我们穷举关键词来匹配天气。
Step 3:验证效果
python
run_agent_with_llm("上海今天天气怎么样?")
# LLM: Action: get_weather(上海)
# Tool Result: 多云, 22°C
# LLM: 上海今天多云,气温22°C,体感舒适,适合外出。
run_agent_with_llm("帮我对比一下北京和上海的天气")
# LLM: Action: get_weather(北京)
# Tool Result: 晴, 25°C
# LLM: Action: get_weather(上海)
# Tool Result: 多云, 22°C
# LLM: 北京晴天25°C,上海多云22°C。北京更暖和,两个城市都适合出门。
注意第二个例子:LLM 自己决定要调两次工具,先查北京再查上海,然后对比。这就是 Agent 的威力------你不需要写"如果用户问两个城市就调两次"的逻辑,LLM 自己会规划和决策。
刨根问底
| 序号 | 问题 |
|---|---|
| 1️⃣ | Q:LLM 和 Agent 到底什么关系? |
| **A:**LLM 是 Agent 的"大脑",但不是 Agent 本身。LLM 只能生成文本,不能查天气、不能读数据库、不能发邮件。Agent 是在 LLM 外面包了一层------给它工具、给它循环、给它记忆,让它从"只会说"变成"能干活"。 | |
| 2️⃣ | Q:为什么 LLM 每轮循环都会按照固定格式输出,并且告诉我们需要调用的工具? |
| **A:**因为在调用 LLM 的时候就给他约定了 SYSTEM_PROMPT,所以在每轮思考时都会按照这个约定来输出内容。 | |
| 3️⃣ | Q:在调 LLM 的时候,temperature 参数是什么? |
| **A:**控制 LLM 输出的"随机性"。temperature=0 时输出最确定(适合工具调用、分类判断),temperature=0.5-1 时输出更有创造力(适合写文案、聊天)。Agent 做决策时一般用 0,写作时用 0.5。 |
本篇小结
- Agent 的本质是 LLM + 工具 + 循环,30行代码就能写一个能用的 Agent,不是什么神秘的东西;
- 核心循环:思考(LLM)→ 行动(调工具)→ 观察(看结果)→ 再思考;
- LLM 的价值在于通用决策,只要你约定好了Prompt,它就能按照固定格式输出,告诉你需要调度什么工具,不需要为每种问题写 if-else;
写在最后
AI 发展太快,焦虑很正常。但与其焦虑,不如动手拆解它------你会发现 Agent 没有想象中那么神秘,本质就是一个循环加几个 API 调用。真正的门槛不在技术本身,而在于你愿不愿意花时间把它跑通一遍。
下一篇预告:Agent 有三种经典的工作模式(ReAct、Plan-and-Solve、Reflection),各有什么优劣?什么场景用哪种?