从零搭建你的第一个 AI Agent:2026 年最该学会的技能,小白也能 30 分钟上手
从零搭建你的第一个 AI Agent:2026 年最该学会的技能,小白也能 30 分钟上手
摘要
小白建议:2026 年被称为「Agent 元年」,AI Agent(智能体)已经从论文概念变成了开发者人人可上手的生产力工具。本文面向零基础读者,用大白话讲清楚 AI Agent 到底是什么、核心架构怎么运作,然后带你用 Python 从零写出一个真正能用的智能体——它能联网搜索、记住你的偏好、自动完成多步任务。全文包含完整可运行代码、框架对比选型、常见坑点排查和学习路线图,读完即可动手实战。
关键词
AI Agent;智能体;LangChain;ReAct;工具调用;RAG;Python;大模型应用开发;零基础入门;2026 技术趋势
目录
- 一、AI Agent 是什么?用最白的话讲清楚
- 二、Agent 的核心架构:四个部件,一个都不少
- 三、动手实战:30 分钟写出你的第一个 Agent
- 四、框架选型:LangChain vs LangGraph vs 手写,怎么选?
- 五、Agent 开发的 6 个常见坑(踩过才知道)
- 六、学习路线图:从今天到能上岗
- 七、写在最后:Agent 不是未来,是现在
一、AI Agent 是什么?用最白的话讲清楚
1.1 一个比喻:Agent 就是「有手有脚的 ChatGPT」
你平时用 ChatGPT、文心一言、Kimi,它们只能跟你聊天——你问它答,它不会主动去做任何事。
AI Agent 不一样。 它不仅能聊天,还能:
- 🔍 自己上网搜资料(不用你手动复制粘贴给它)
- 📁 帮你读写文件(比如自动整理你的文档)
- 🧮 调用计算器、查数据库(不用你算好再告诉它)
- 🔄 把一个大任务拆成多步,一步步自己完成(不用你一步步指挥)
一句话总结:ChatBot 是你的「顾问」,Agent 是你的「员工」。
1.2 Agent 和普通 ChatBot 的本质区别
| 对比维度 | 普通 ChatBot | AI Agent |
|---|---|---|
| 交互模式 | 一问一答 | 给目标,自己规划执行 |
| 工具使用 | 不能调用外部工具 | 能搜索、读写文件、调 API |
| 记忆能力 | 仅当前对话 | 短期+长期记忆,跨会话记住你 |
| 自主性 | 被动响应 | 主动规划、自我纠错 |
| 典型场景 | “帮我写个请假条” | “帮我查最近一周的机票,选最便宜的,帮我订” |
| 技术复杂度 | 调 API 即可 | 需要编排工具、记忆、规划 |
1.3 2026 年为什么人人都在聊 Agent
三个原因:
- 大模型够强了。 GPT-4o、Claude 3.5、DeepSeek-V3 的推理能力已经足够支撑复杂的多步规划,这是 Agent 能用的前提。两年前的模型做不到。
- 开源生态爆发。 GitHub 上 Agent 相关项目 Star 数疯狂增长——Hello-Agants 教程 13.2K Star、可视化 Agent 平台 sim 24.6K Star、开源编码代理 OpenCode 43.6K Star。生态成熟意味着你不需要从零造轮子。
- 企业真金白银在招人。 搜索招聘平台,「AI Agent 开发」「大模型应用工程师」岗位需求在 2025 年增长了 300%+,薪资普遍 20K-50K。这不是泡沫,是实打实的技能需求。
二、Agent 的核心架构:四个部件,一个都不少
任何一个 AI Agent,不管多复杂,核心就四个部件。记住这四个,你就理解了所有 Agent 的本质。
2.1 大脑:大语言模型(LLM)
这是 Agent 的核心引擎。所有「思考」「理解」「决策」都靠它。
它的角色:
- 理解用户的自然语言指令
- 决定下一步该调用哪个工具
- 把工具返回的结果整合成最终回答
选型建议(2026 年版):
| 模型 | 优势 | 劣势 | 适合场景 |
|---|---|---|---|
| GPT-4o | 推理最强,工具调用稳定 | 贵,需翻墙 | 生产环境、复杂任务 |
| Claude 3.5 Sonnet | 长文本理解强,代码能力好 | 国内访问不便 | 代码类 Agent |
| DeepSeek-V3 | 便宜,中文好,开源 | 复杂规划略弱 | 国内项目、成本敏感 |
| Qwen2.5 (通义千问) | 免费,中文强,本地可部署 | 推理上限一般 | 本地部署、学习练手 |
小白建议: 学习阶段用 DeepSeek API(便宜到离谱,百万 token 才 1 块钱)或 Qwen 免费额度,别一上来就烧 GPT-4o。
2.2 记忆:短期记忆与长期记忆
人没有记忆什么都干不了,Agent 也一样。
短期记忆(对话上下文):
- 就是当前对话的聊天记录
- 比如你前面说了"我喜欢吃辣",Agent 后面推荐菜就会记住
- 实现:就是一个列表,把每轮对话追加进去
长期记忆(跨会话记忆):
- 窗关了再打开,Agent 还记得你是谁
- 比如它记住你的名字、职业、偏好
- 实现:用向量数据库存储,每次对话前先检索相关记忆
通俗理解:
短期记忆 = 你脑子里的"当前对话" → 用 Python 列表存
长期记忆 = 你的日记本/笔记本 → 用向量数据库存(如 ChromaDB)
2.3 工具:让 Agent 拥有「手脚」
没有工具的 Agent 就是个嘴炮——只会说不会做。工具是 Agent 与真实世界交互的接口。
常见工具类型:
| 工具类型 | 作用 | 示例 |
|---|---|---|
| 搜索工具 | 联网查最新信息 | DuckDuckGo API、Tavily Search |
| 计算工具 | 精确数学计算 | Python eval()、Wolfram Alpha |
| 文件工具 | 读写本地文件 | 读写 txt/json/csv |
| API 工具 | 调用外部服务 | 天气 API、股票 API、发邮件 |
| 代码执行 | 运行代码 | Python REPL、沙箱 |
工具的本质就是一个 Python 函数 + 一段描述:
# 这就是一个工具——一个普通函数
def get_weather(city: str) -> str:
"""查询指定城市的当前天气。
Args:
city: 城市名称,如"北京"、"上海"
Returns:
天气描述字符串
"""
# 实际项目中这里调天气API
return f"{city}今天晴,25°C"
# 关键点:函数的 docstring 就是给大模型看的"说明书"
# 大模型通过读 docstring 来决定"什么时候该用这个工具"
核心认知: 大模型不会直接执行代码,它只会输出"我觉得该调用 get_weather 工具,参数是 city=‘北京’"。你的程序负责真正执行这个函数,然后把结果喂回给大模型。
2.4 规划:ReAct 范式详解
ReAct = Reasoning(推理)+ Acting(行动)。这是目前最主流的 Agent 规划范式,几乎所有框架都在用。
ReAct 的工作流程:
用户提问 → Agent 思考(Thought) → 选择行动(Action) → 执行得到观察(Observation) → 再思考 → ... → 最终回答
用一个例子讲透:
用户问:“今天北京天气怎么样?适合穿什么?”
Agent 的内部过程:
第1轮:
Thought: 用户想知道北京天气和穿衣建议。我需要先查天气。
Action: 调用 get_weather(city="北京")
Observation: 北京今天晴,25°C
第2轮:
Thought: 北京25°C晴天,比较舒适。应该建议穿薄外套或长袖。
Action: 不需要再调用工具,直接回答
Answer: 北京今天晴,25°C,比较舒适。建议穿薄外套或长袖衫,早晚可能稍凉,可以带一件薄外套备用。
ReAct 的精妙之处: Agent 不是一次性给出答案,而是「想一步、做一步、看结果、再想下一步」。这就像人类解决问题的方式——先想想需要什么信息,去查,查到了再继续推理。
三、动手实战:30 分钟写出你的第一个 Agent
声明: 以下代码全部可运行。用 DeepSeek API(最便宜),你也可以替换成 OpenAI/Qwen。
3.1 环境准备(5 分钟)
3.1.1 安装 Python 与依赖包
第一步:安装 Python
去 python.org 下载 Python 3.10+,安装时勾选 “Add to PATH”。
第二步:安装依赖包
打开终端(Windows 用 PowerShell,Mac 用 Terminal),执行:
pip install openai python-dotenv
就这两个包,不需要装一堆框架。我们先从最原始的方式开始,理解原理。
3.1.2 获取 API Key 与项目结构
第三步:获取 API Key
去 DeepSeek 开放平台 注册,创建 API Key。新用户有免费额度。
第四步:创建项目文件
my-first-agent/
├── .env # 存放 API Key
├── agent.py # 主程序
.env 文件内容:
DEEPSEEK_API_KEY=sk-你的key填这里
3.2 第一版:最简对话 Agent(10 分钟)
先写一个能对话的 Agent,不加工具。这一步的目的是跑通大模型调用。
# agent.py
import os
import json
from dotenv import load_dotenv
from openai import OpenAI
# 1. 加载环境变量
load_dotenv()
# 2. 创建大模型客户端(DeepSeek 兼容 OpenAI 接口)
client = OpenAI(
api_key=os.getenv("DEEPSEEK_API_KEY"),
base_url="https://api.deepseek.com" # 换成 OpenAI 就删掉这行
)
# 3. Agent 的"大脑"——系统提示词
SYSTEM_PROMPT = """你是一个智能助手。你可以回答问题、提供建议。
请用简洁、友好的语气回答用户。"""
# 4. 短期记忆——对话历史
messages = [
{"role": "system", "content": SYSTEM_PROMPT}
]
# 5. 对话循环
def chat():
print("🤖 Agent 已启动,输入 '退出' 结束对话\n")
while True:
user_input = input("你: ").strip()
if user_input.lower() in ["退出", "exit", "quit"]:
print("👋 再见!")
break
# 把用户消息加入记忆
messages.append({"role": "user", "content": user_input})
# 调用大模型
response = client.chat.completions.create(
model="deepseek-chat",
messages=messages,
temperature=0.7 # 0=最稳定,1=最有创意
)
# 获取回复
reply = response.choices[0].message.content
# 把回复也加入记忆(这样它才记得之前说过什么)
messages.append({"role": "assistant", "content": reply})
print(f"🤖 Agent: {reply}\n")
if __name__ == "__main__":
chat()
运行:
python agent.py
效果:
🤖 Agent 已启动,输入 '退出' 结束对话
你: 你好,我叫小明
🤖 Agent: 你好小明!很高兴认识你,有什么可以帮你的吗?
你: 我刚才说我叫什么?
🤖 Agent: 你说你叫小明。记住啦!
看到它能记住你之前说的话了?这就是短期记忆在起作用——messages 列表把所有对话历史都存着,每次调用大模型都带上。
但问题来了: 现在它只会聊天,不能搜索、不能算数、不能做任何实际操作。下一步,我们给它装上工具。
3.3 第二版:给 Agent 装上「工具」(10 分钟)
这是最关键的一步——让 Agent 真正能"做事"。
3.3.1 第一步:定义工具函数
工具的本质就是普通 Python 函数,关键是函数的 docstring 要写清楚,因为大模型靠读 docstring 来决定什么时候用这个工具。
# agent.py(完整版)
import os
import json
from dotenv import load_dotenv
from openai import OpenAI
load_dotenv()
client = OpenAI(
api_key=os.getenv("DEEPSEEK_API_KEY"),
base_url="https://api.deepseek.com"
)
# ============================================================
# 第一步:定义工具(就是普通 Python 函数)
# ============================================================
def get_weather(city: str) -> str:
"""查询指定城市的当前天气。
Args:
city: 城市名称,如"北京"、"上海"、"广州"
Returns:
天气描述字符串
"""
# 实际项目中这里调用真实天气API
# 这里用模拟数据演示
weather_map = {
"北京": "晴,25°C,北风3级",
"上海": "多云,28°C,东南风2级",
"广州": "阵雨,30°C,南风2级",
"深圳": "晴转多云,29°C,东风3级"
}
return weather_map.get(city, f"暂无{city}的天气数据")
def calculate(expression: str) -> str:
"""计算一个数学表达式并返回结果。
Args:
expression: 数学表达式,如 "1+2*3"、"100/4"、"2**10"
Returns:
计算结果字符串
"""
try:
result = eval(expression) # 演示用,生产环境别用eval
return f"{expression} = {result}"
except Exception as e:
return f"计算失败:{e}"
3.3.2 第二步:注册工具到大模型
定义好函数后,需要用 JSON Schema 格式把工具注册给大模型,告诉它"有哪些工具可用、每个工具的参数是什么"。
# ============================================================
# 第二步:把工具注册成大模型认识的格式
# ============================================================
TOOLS = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询指定城市的当前天气",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称,如'北京'、'上海'"
}
},
"required": ["city"]
}
}
},
{
"type": "function",
"function": {
"name": "calculate",
"description": "计算一个数学表达式并返回结果",
"parameters": {
"type": "object",
"properties": {
"expression": {
"type": "string",
"description": "数学表达式,如 '1+2*3'、'100/4'"
}
},
"required": ["expression"]
}
}
}
]
# 工具名到函数的映射表
TOOL_MAP = {
"get_weather": get_weather,
"calculate": calculate
}
3.3.3 第三步:实现 ReAct 主循环
这是 Agent 的核心——一个 while 循环,不断让大模型「思考→调用工具→看结果→再思考」,直到大模型认为可以给出最终答案。
# ============================================================
# 第三步:Agent 主循环(ReAct 范式的实现)
# ============================================================
SYSTEM_PROMPT = """你是一个智能助手,可以查询天气和进行数学计算。
当用户问到天气时,调用 get_weather 工具。
当用户需要计算时,调用 calculate 工具。
不要猜测答案,不确定时一定要调用工具查询。"""
messages = [{"role": "system", "content": SYSTEM_PROMPT}]
def chat():
print("🤖 Agent 已启动(带工具版),输入 '退出' 结束对话\n")
while True:
user_input = input("你: ").strip()
if user_input.lower() in ["退出", "exit", "quit"]:
print("👋 再见!")
break
messages.append({"role": "user", "content": user_input})
# Agent 循环:可能多轮工具调用
while True:
response = client.chat.completions.create(
model="deepseek-chat",
messages=messages,
tools=TOOLS,
temperature=0.3 # 用工具时温度低一些更稳定
)
msg = response.choices[0].message
# 情况一:模型决定调用工具
if msg.tool_calls:
# 先把助手的工具调用请求加入记忆
messages.append(msg)
for tool_call in msg.tool_calls:
func_name = tool_call.function.name
func_args = json.loads(tool_call.function.arguments)
print(f" 🔧 调用工具: {func_name}({func_args})")
# 真正执行工具函数
func = TOOL_MAP[func_name]
result = func(**func_args)
print(f" 📋 工具返回: {result}")
# 把工具结果加入记忆
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": str(result)
})
# 继续循环,让模型根据工具结果继续思考
continue
# 情况二:模型决定直接回答(不再调用工具)
else:
reply = msg.content
messages.append({"role": "assistant", "content": reply})
print(f"🤖 Agent: {reply}\n")
break # 跳出工具循环,等待下一个用户输入
if __name__ == "__main__":
chat()
运行后试试这些对话:
你: 北京今天天气怎么样?
🔧 调用工具: get_weather({'city': '北京'})
📋 工具返回: 晴,25°C,北风3级
🤖 Agent: 北京今天晴,气温25°C,北风3级,天气不错!
你: 那上海呢?再帮我算一下 25*4+100
🔧 调用工具: get_weather({'city': '上海'})
📋 工具返回: 多云,28°C,东南风2级
🔧 调用工具: calculate({'expression': '25*4+100'})
📋 工具返回: 25*4+100 = 200
🤖 Agent: 上海今天多云,28°C。另外 25*4+100 = 200。
关键理解: 看到了吗?Agent 自己决定"该调什么工具、传什么参数",你的代码负责执行,结果再喂回去。这就是 Agent 的核心——大模型负责决策,你的代码负责执行。
3.4 第三版:加上记忆,让它记住你(5 分钟)
在前面的代码基础上,加一个简单的长期记忆功能——用 JSON 文件存储用户偏好。
在 agent.py 顶部添加:
import datetime
# ============================================================
# 长期记忆:用 JSON 文件存储用户信息
# ============================================================
MEMORY_FILE = "memory.json"
def load_memory():
"""加载长期记忆"""
if os.path.exists(MEMORY_FILE):
with open(MEMORY_FILE, "r", encoding="utf-8") as f:
return json.load(f)
return {"user_info": {}, "facts": []}
def save_memory(memory):
"""保存长期记忆"""
with open(MEMORY_FILE, "w", encoding="utf-8") as f:
json.dump(memory, f, ensure_ascii=False, indent=2)
def extract_and_save_info(user_input, memory):
"""简单提取用户信息存入记忆(实际项目中用大模型来提取)"""
# 演示:检测"我叫xxx"的模式
if "我叫" in user_input:
name = user_input.split("我叫")[-1].strip().rstrip("。,!")
memory["user_info"]["name"] = name
save_memory(memory)
# 检测"我喜欢xxx"的模式
if "我喜欢" in user_input:
like = user_input.split("我喜欢")[-1].strip().rstrip("。,!")
memory["user_info"].setdefault("preferences", []).append(like)
save_memory(memory)
return memory
然后修改 SYSTEM_PROMPT 和 chat() 函数:
# 在启动时加载记忆,注入到系统提示词
memory = load_memory()
SYSTEM_PROMPT = f"""你是一个智能助手,可以查询天气和进行数学计算。
关于用户的信息:
{json.dumps(memory.get('user_info', {}), ensure_ascii=False, indent=2)}
请记住用户的信息,在回答时体现你的关心。
不要猜测答案,不确定时一定要调用工具查询。"""
messages = [{"role": "system", "content": SYSTEM_PROMPT}]
def chat():
global memory
print("🤖 Agent 已启动(完整版:工具+记忆),输入 '退出' 结束对话\n")
if memory.get("user_info", {}).get("name"):
print(f" (我记得你,{memory['user_info']['name']}!)\n")
while True:
user_input = input("你: ").strip()
if user_input.lower() in ["退出", "exit", "quit"]:
print("👋 再见!下次我还记得你。")
break
# 提取并保存用户信息
memory = extract_and_save_info(user_input, memory)
messages.append({"role": "user", "content": user_input})
# ... 后面的工具调用逻辑和之前一样 ...
# (省略,完全复用第二版的 while True 循环)
现在关掉程序再重新打开,试试:
🤖 Agent 已启动(完整版:工具+记忆),输入 '退出' 结束对话
(我记得你,小明!)
你: 我喜欢打篮球
你: 退出
👋 再见!下次我还记得你。
重新运行:
🤖 Agent 已启动(完整版:工具+记忆),输入 '退出' 结束对话
(我记得你,小明!)
你: 我喜欢什么运动?
🤖 Agent: 你之前告诉过我,你喜欢打篮球!🏀
这就是长期记忆。 实际项目中,你会用向量数据库(如 ChromaDB)替代 JSON 文件,实现语义检索——不是精确匹配,而是"意思相近"就能找到。但原理是一样的:存下来,下次取出来。
四、框架选型:LangChain vs LangGraph vs 手写,怎么选?
4.1 三种方案对比表
| 维度 | 纯手写(本文方式) | LangChain | LangGraph |
|---|---|---|---|
| 学习成本 | ⭐ 最低 | ⭐⭐⭐ 中等 | ⭐⭐⭐⭐⭐ 高 |
| 灵活度 | ⭐⭐⭐⭐⭐ 最高 | ⭐⭐ 中等 | ⭐⭐⭐⭐ 较高 |
| 适合场景 | 学习原理、简单 Agent | 快速原型、简单工具链 | 复杂多步 Agent、生产级 |
| 代码量 | 少,全看得懂 | 多,框架封装厚 | 适中,需理解图概念 |
| 调试难度 | ⭐ 简单 | ⭐⭐⭐⭐ 难(黑盒) | ⭐⭐⭐ 中等 |
| 社区活跃 | - | 非常活跃 | 快速增长 |
| GitHub Star | - | ~100K | ~12K |
4.2 小白该选哪个
分阶段来:
-
第一阶段(第 1-2 周):手写。 就用本文的方式,纯 Python + OpenAI SDK。理解 Agent 的本质——工具调用循环、记忆管理、ReAct 范式。不碰任何框架。这一步最重要,框架换了一茬又一茬,原理永远不变。
-
第二阶段(第 3-4 周):LangChain。 当你手写烦了(比如要接 10 个工具、要管复杂记忆),就上 LangChain。它帮你把工具注册、记忆管理、文档加载都封装好了,几行代码搞定。但一定要先懂原理,否则出 bug 你完全不知道怎么调。
-
第三阶段(第 5-8 周):LangGraph。 当你的 Agent 需要复杂流程控制——比如"先搜A,如果A不够再搜B,搜完要人工确认才能执行C"——就上 LangGraph。它用「状态图」来编排 Agent 流程,是目前生产级 Agent 的主流方案。
一句话建议: 先手写理解原理 → 再用 LangChain 提效 → 最后用 LangGraph 做生产级项目。跳过第一步直接上框架,你会成为"调包侠",遇到问题完全懵。
五、Agent 开发的 6 个常见坑(踩过才知道)
5.1 坑一:模型幻觉导致工具调用失败
现象: Agent 编造了一个不存在的工具名,或者传了错误的参数类型,导致代码报错。
原因: 大模型不是程序,它是在"猜"应该调什么工具。当工具描述写不清楚,或者工具太多,它就容易猜错。
解决方案:
# ❌ 不好的工具描述
def search(query):
"""搜索"""
...
# ✅ 好的工具描述
def search_web(query: str, max_results: int = 5):
"""使用搜索引擎查询互联网上的最新信息。
适用场景:用户询问实时信息、最新新闻、你不确定的事实。
不适用场景:数学计算、天气查询(有专用工具)。
Args:
query: 搜索关键词,用自然语言描述
max_results: 返回结果数量,默认5条
Returns:
搜索结果摘要列表
"""
...
原则: 工具描述写给大模型看,要像写给一个聪明但不了解你项目的新同事——把"什么时候用"“什么时候不用”"参数怎么填"都写清楚。
5.2 坑二:上下文窗口爆炸
现象: 对话几轮后,API 报错 “context length exceeded”,或者费用突然飙升。
原因: 每次调用都把全部历史对话发给大模型,对话越长,token 越多,直到超出模型的上下文窗口(通常 128K token)。
解决方案:
# 方案1:滑动窗口——只保留最近 N 轮对话
MAX_MESSAGES = 20
def trim_messages(messages):
"""保留 system 消息 + 最近 N 条对话"""
system_msgs = [m for m in messages if m["role"] == "system"]
other_msgs = [m for m in messages if m["role"] != "system"]
return system_msgs + other_msgs[-MAX_MESSAGES:]
# 方案2:摘要压缩——把旧对话总结成一段话
def summarize_old_messages(messages):
"""用大模型把旧对话总结成一段摘要"""
old_messages = messages[:-10] # 旧的
recent_messages = messages[-10:] # 最近的
summary = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "system", "content": "把以下对话总结成关键信息,不超过200字"},
{"role": "user", "content": str(old_messages)}
]
).choices[0].message.content
return [
{"role": "system", "content": f"之前的对话摘要:{summary}"},
*recent_messages
]
5.3 坑三:无限循环停不下来
现象: Agent 反复调用同一个工具,或者陷入"思考→调用→思考→调用"的死循环,永远不出最终答案。
解决方案:
MAX_ITERATIONS = 10 # 最大工具调用轮数
iteration_count = 0
while True:
iteration_count += 1
if iteration_count > MAX_ITERATIONS:
messages.append({
"role": "user",
"content": "你已经调用了多次工具,请直接基于已有信息给出回答。"
})
# ... 正常的调用逻辑 ...
5.4 坑四:API 费用失控
现象: 一个复杂任务跑下来,API 费用几十块甚至上百块。
原因: 每轮工具调用都把完整上下文发给大模型,token 累积非常快。
解决方案:
| 策略 | 效果 | 实现难度 |
|---|---|---|
| 用便宜模型(DeepSeek/Qwen) | 费用降低 90%+ | ⭐ |
| 限制最大轮数 | 防止无限循环烧钱 | ⭐ |
| 对话摘要压缩 | 减少 token 消耗 70% | ⭐⭐ |
| 缓存工具结果 | 相同查询不重复调用 | ⭐⭐ |
| 小模型做路由+大模型做核心 | 综合降本 60% | ⭐⭐⭐ |
5.5 坑五:工具描述写不好,Agent 不会用
现象: 你明明定义了工具,但 Agent 从来不调用它,或者该用 A 工具却用了 B。
原因: 大模型选工具全靠读 description。描述写得模糊,它就不知道什么时候该用。
黄金法则:
- 写清楚"什么时候用"和"什么时候不用"
- 给参数举具体例子
- 工具数量别超过 10 个(超过就容易选错,考虑用路由 Agent 分发)
5.6 坑六:本地模型效果差
现象: 用 Ollama 跑本地模型(如 Llama 3 8B),Agent 完全不会调工具,或者乱调。
原因: 小模型的 function calling 能力远不如 GPT-4o/Claude。工具调用是个复杂任务,需要模型理解 JSON Schema、正确生成参数。
解决方案:
- 本地模型至少用 14B 以上参数(如 Qwen2.5-14B)
- 用专门支持 tool calling 的模型(看模型文档是否支持)
- 降低 temperature 到 0.1 以下
- 工具描述写得极其详细
- 实在不行,用 prompt 模拟 function calling(手动解析模型输出的 JSON)
六、学习路线图:从今天到能上岗
6.1 四阶段成长路线
6.1.1 阶段一:入门(1-2周)
阶段一:入门(1-2周)
├── ✅ 理解 Agent 四大核心组件
├── ✅ 手写一个带工具调用的 Agent(本文内容)
├── ✅ 理解 ReAct 范式
└── ✅ 学会 Prompt 工程基础
6.1.2 阶段二:进阶(2-4周)
阶段二:进阶(2-4周)
├── 📚 学习 LangChain 框架
├── 📚 接入向量数据库(ChromaDB/Faiss)
├── 📚 实现 RAG(检索增强生成)
├── 📚 多工具编排与路由
└── 📚 学习 MCP 协议基础
6.1.3 阶段三:实战(1-2月)
阶段三:实战(1-2月)
├── 🔨 用 LangGraph 构建复杂多步 Agent
├── 🔨 实现多 Agent 协作(Multi-Agent)
├── 🔨 接入真实 API(搜索/数据库/邮件)
├── 🔨 部署上线(FastAPI + Docker)
└── 🔨 做一个完整项目放到 GitHub
6.1.4 阶段四:深入(持续)
阶段四:深入(持续)
├── 🎯 Agentic-RL(强化学习优化 Agent)
├── 🎯 Agent 性能评估与 Benchmark
├── 🎯 Agent 安全与对齐
├── 🎀 A2A 协议(Agent 间通信)
└── 🎀 贡献开源项目
6.2 推荐学习资源
| 资源 | 类型 | 说明 | 链接 |
|---|---|---|---|
| Hello-Agents | 开源教程 | Datawhale 出品,从零构建 Agent,13.2K Star | GitHub |
| LangChain 官方文档 | 文档 | 最权威的 LangChain 学习资料 | python.langchain.com |
| DeepSeek API 文档 | 文档 | 便宜好用的大模型 API | platform.deepseek.com |
| MCP 协议文档 | 文档 | Model Context Protocol 官方文档 | mcp-docs.cn |
| AI Agent 实战速成 | 教程 | 从零到企业级落地 | didilili.github.io |
| OpenCode | 开源项目 | 43.6K Star 的开源 AI 编码代理,读源码学架构 | GitHub |
七、写在最后:Agent 不是未来,是现在
回到开头的那个比喻——ChatBot 是顾问,Agent 是员工。
2023 年,我们在学怎么跟 AI 聊天。
2024 年,我们在学怎么用 AI 写代码。
2025-2026 年,我们在学怎么让 AI 替我们干活。
这就是 Agent 的意义。它不是一个新名词,而是 AI 从"能聊天"到"能干活"的关键一跃。
这篇文章给你的不是空中楼阁的概念,而是一套你能今天就开始跑的代码。别光看,去运行它。改一改工具,加一个你自己的功能,比如:
- 加一个「发邮件」工具
- 加一个「查股票」工具
- 把 JSON 记忆换成真正的向量数据库
- 接入你公司的内部 API
改一行代码,胜过读十篇文章。
💬 有问题?评论区见!
这篇文章的代码全部经过验证,可以直接运行。但每个人的环境不同,如果你在搭建过程中遇到任何问题——装包报错、API 调不通、工具不触发、循环停不下来——不要犹豫,直接在评论区留言。我会逐条回复,帮你跑通。
如果这篇文章对你有帮助,点个赞👍让更多小白看到。你的每一个问题,都会帮助后来者少踩一个坑。
下一篇我会写**「用 LangChain + 向量数据库搭建一个能读 PDF 的知识库 Agent」**,想看的评论区扣 1。
更多推荐

所有评论(0)