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

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

简单介绍一下:

这个循环有个学术名字叫 ReAct(Reasoning + Acting),但本质就是:想一想,干一下,看看结果,再想想够不够,最终再组织话术把完整的信息输出给用户。
先不接大模型,用硬编码逻辑模拟 Agent 的决策过程。这样能看清 Agent 的骨架:
"""
最简 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("你好")
运行输出:
[用户] 北京今天天气怎么样?
==================================================
Thought: 用户问天气,需要调用工具
Action: get_weather(北京)
Observation: 晴, 25°C
Answer: 北京今天的天气是晴, 25°C,适合出门。[用户] 你好
==================================================
Thought: 普通问题,直接回答
Answer: 你好!有什么可以帮你的?
看到了吗?这就是 Agent 的全部秘密:判断要不要用工具,用了之后看结果,再决定下一步。
上面的"思考"是硬编码的 if-else。真正的 Agent 用 LLM 来做决策——它能理解任何问题,自己判断该调什么工具。
我在实现的时候使用的是小米当时免费赠送的Token,这里直接用了mimo-v2.5-pro作为 LLM 来搭建我们的 Agent。有条件的可以购买DeepSeek,也可以找一找免费的,比如「硅基流动 SiliconFlow」。
注:不同的 LLM 提供商可能调用用的接口协议不一样(使用之前可以看一下接入文档),这里小米是支持兼容 OpenAI 接口协议的。
"""
接入 LLM 的 Agent
LLM 负责:理解问题 → 决定是否调工具 → 基于结果生成回答
"""
from openai import OpenAIclient = 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.contentdef 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 能理解“上海天气如何”、“明天北京冷不冷”这些问题,不需要我们穷举关键词来匹配天气。
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。 |
AI 发展太快,焦虑很正常。但与其焦虑,不如动手拆解它——你会发现 Agent 没有想象中那么神秘,本质就是一个循环加几个 API 调用。真正的门槛不在技术本身,而在于你愿不愿意花时间把它跑通一遍。
下一篇预告:Agent 有三种经典的工作模式(ReAct、Plan-and-Solve、Reflection),各有什么优劣?什么场景用哪种?