第一章 什么是Agent
第1章:什么是 AI Agent?
📌 本章目标
- 理解 AI Agent 是什么,它和普通 Chatbot 有什么本质区别
- 理解 Agent 的三大核心组件
- 理解 ReAct(推理+行动)工作模式
- 对你的第一个 Agent 代码建立感性认识
1.1 从一个场景说起
假设你问 ChatGPT:“帮我查一下北京明天的天气,如果下雨就提醒我带伞,如果是晴天就建议我去爬山。”
普通 Chatbot 的回答:
抱歉,我无法获取实时天气数据。建议你查看天气预报 App。
(为什么会导致这种情况呢?原因很简单传统大模型属于离线知识库,仅学习训练数据集内的历史信息,不具备主动联网、获取实时动态数据的能力。天气预报属于时效性极强的外部实时信息,模型无法调取,因此不能完成条件判断与后续提醒。)
想要实现「查实时天气 + 条件判断提醒」的完整流程,就需要结合联网工具调用、流程编排能力,这也是 AI Agent 区别于传统对话大模型的核心能力之一。
一个 AI Agent 的行为:
- 🤔 思考:用户想知道北京明天的天气,我需要先获取天气数据
- 🔧 行动:调用天气查询工具,传入参数
city="北京" - 👀 观察:得到了结果"明天北京晴,25°C"
- 🤔 思考:天气是晴天,用户说晴天就建议爬山
- 📝 回答:“明天北京是晴天,25°C,非常适合户外活动!建议你去香山爬山,记得带瓶水~”
看出区别了吗?Agent 能主动调用工具、观察结果、调整行动,而 Chatbot 只能基于训练数据"硬猜"。
1.2 Agent 的三大核心组件

🧠 LLM(大脑)
大语言模型是 Agent 的"大脑",负责:
- 理解用户意图
- 推理下一步该做什么
- 决定调用哪个工具、传什么参数
🔧 Tools(手脚)
工具让 Agent 能与外部世界交互,比如:
- 搜索网页 / 查询数据库
- 发送邮件 / 操作文件
- 调用计算器 / 运行代码
📝 Memory(记事本)
记忆让 Agent 能记住上下文,比如:
- 这次的对话历史(短期记忆)
- 用户的偏好和习惯(长期记忆)
- 上次任务的结果
1.3 ReAct 模式:Agent 的工作方式
ReAct = Reasoning + Acting(推理 + 行动),这是目前最主流的 Agent 工作模式。

关键点:Agent 不是一次性规划好所有步骤,而是走一步看一步——每执行一个动作后,观察结果再决定下一步。
1.4 你的第一个 Agent 代码(先跑起来再说)
💡 看不懂没关系!这里只是让你对 Agent 代码长什么样有个感觉。后面每一章都会详细拆解。
增加了对话循环对话功能,来运行你的第一个Agent吧!!!
"""
=============================================================================
第1章:你的第一个 Agent —— 天气查询助手
=============================================================================
功能:演示 Agent 的"思考→行动→观察"循环 + 支持多轮连续对话
使用前:
1. pip install openai python-dotenv
2. 在同目录下创建 .env 文件,写入: DEEPSEEK_API_KEY=sk-你的密钥
3. python chapter_01_first_agent.py
=============================================================================
"""
import os
import json
from openai import OpenAI
from dotenv import load_dotenv
load_dotenv() # 自动加载 .env 文件中的 DEEPSEEK_API_KEY
# ============================================
# 第1步:配置 DeepSeek 客户端
# ============================================
client = OpenAI(
api_key=os.getenv("DEEPSEEK_API_KEY"), # 从环境变量读取密钥
base_url="https://api.deepseek.com/v1" # DeepSeek API 地址
)
# ============================================
# 第2步:定义一个工具函数
# ============================================
def get_weather(city: str) -> str:
"""查询天气(演示用,返回模拟数据)"""
weather_db = {
"北京": "晴,25°C,适合户外活动",
"上海": "多云,28°C,有点闷热",
"深圳": "阵雨,30°C,记得带伞",
}
return weather_db.get(city, f"抱歉,没找到{city}的天气数据")
# ============================================
# 第3步:用自然语言描述工具(告诉模型怎么用)
# ============================================
TOOLS = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询指定城市的天气情况",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称,例如:北京、上海、深圳"
}
},
"required": ["city"]
}
}
}
]
# ============================================
# 第4步:Agent 主循环 —— 这就是 Agent 的核心!
# 修复:支持多轮工具调用、完整消息上下文、多 tool_calls
# ============================================
def run_agent(messages, max_steps: int = 5) -> tuple[str, list]:
"""
Agent 主循环:思考 → 行动 → 观察 → 再思考...
:param messages: 全局对话上下文
:param max_steps: 最大工具调用步数
:return: 回答内容, 更新后的对话上下文
"""
for step in range(max_steps):
print(f"\n--- 第 {step + 1} 步 ---")
# 调用 DeepSeek
response = client.chat.completions.create(
model="deepseek-chat",
messages=messages,
tools=TOOLS
)
msg = response.choices[0].message
# 情况A:模型直接给出最终回答,结束流程
if not msg.tool_calls:
print(f"✅ Agent 给出最终回答")
return msg.content, messages
# 情况B:存在工具调用,遍历所有 tool_call(支持一次调用多个工具)
print(f"🔧 开始执行工具调用")
# 先把 assistant 工具调用消息加入上下文(必须)
messages.append(msg)
for tool_call in msg.tool_calls:
func_name = tool_call.function.name
func_args = json.loads(tool_call.function.arguments)
tool_id = tool_call.id
print(f"🔧 Agent 决定调用工具: {func_name}({func_args})")
# 执行对应工具
if func_name == "get_weather":
result = get_weather(**func_args)
print(f"👀 工具返回结果: {result}")
# 逐条追加 tool 响应消息,绑定对应 tool_call_id(核心修复点)
messages.append({
"role": "tool",
"tool_call_id": tool_id,
"name": func_name,
"content": result
})
return "达到最大步数限制,任务未完成", messages
# ============================================
# 第5步:运行程序(新增多轮连续对话)
# ============================================
if __name__ == "__main__":
print("===== 天气查询Agent(支持连续对话,输入 quit 退出)=====")
# 全局对话上下文,多轮对话共用
chat_messages = []
# 示例1:单次查询(原有用例)
print("\n【示例1:单城市查询】")
user_text = "帮我查一下北京今天的天气"
print(f"用户:{user_text}")
chat_messages.append({"role": "user", "content": user_text})
res, chat_messages = run_agent(chat_messages)
print(f"\n最终结果:{res}")
print("\n" + "=" * 60 + "\n")
# 示例2:多工具调用(北京+深圳对比)
print("【示例2:多城市对比查询】")
user_text = "查一下北京和深圳的天气,告诉我哪个城市更适合出门玩"
print(f"用户:{user_text}")
chat_messages.append({"role": "user", "content": user_text})
res, chat_messages = run_agent(chat_messages)
print(f"\n最终结果:{res}")
print("\n" + "=" * 60 + "\n")
# 新增:交互式连续对话
print("【进入连续对话模式,输入 quit 结束对话】")
while True:
user_input = input("请输入你的问题:")
if user_input.strip().lower() == "quit":
print("对话已结束!")
break
# 将用户提问加入上下文
chat_messages.append({"role": "user", "content": user_input})
# 执行Agent逻辑
answer, chat_messages = run_agent(chat_messages)
print(f"Agent回复:{answer}")
运行这个代码,你会看到类似这样的输出:
--- 第 1 步 ---
🔧 Agent 决定调用工具: get_weather({'city': '北京'})
👀 工具返回结果: 晴,25°C,适合户外活动
--- 第 2 步 ---
🔧 Agent 决定调用工具: get_weather({'city': '深圳'})
👀 工具返回结果: 阵雨,30°C,记得带伞
--- 第 3 步 ---
✅ Agent 给出最终回答
最终结果:北京今天晴天,25°C,非常适合出门玩!
深圳有阵雨,30°C,建议改天再去。
============================================================
【进入连续对话模式,输入 quit 结束对话】
请输入你的问题:北京天气怎么样
--- 第 1 步 ---
✅ Agent 给出最终回答
Agent回复:从刚才查询的结果来看,北京今天的天气情况如下:
☀️ **天气**:晴
🌡️ **温度**:25°C
👍 **建议**:适合户外活动
整体来说北京今天天气非常不错,阳光明媚、温度舒适,很适合出门游玩哦!相比之下,深圳今天有阵雨,温度也较高(30°C),所以**北京更适合出门玩**~
看到没?Agent 自己决定了要查两个城市,自己比较了结果,自己给出了最终建议。这就是 Agent 的魔力!
1.5 Agent vs Chatbot vs 工作流:一张表说清楚
| 特性 | 普通 Chatbot | 硬编码工作流 | AI Agent |
|---|---|---|---|
| 决策方式 | 无决策,一问一答 | 程序员预先写好 | LLM 自主决策 |
| 工具使用 | ❌ 不支持 | ✅ 按固定顺序 | ✅ 自主选择何时用 |
| 容错能力 | N/A | ❌ 遇到意外就崩 | ✅ 能观察结果并重试 |
| 适用场景 | 闲聊、问答 | 固定流程(如审批) | 开放任务(如"帮我写报告") |
| 开发难度 | 低 | 中 | 中高 |
📝 本章小结
- Agent 的本质:一个能自主"思考→行动→观察→再思考"的 AI 程序
- 三大组件:LLM(大脑)+ Tools(手脚)+ Memory(记事本)
- ReAct 模式:Reasoning + Acting,走一步看一步
- 核心循环:调用 LLM → 解析意图 → 执行工具 → 观察结果 → 继续循环
部分内容由AI生成,代码均可运行。
✏️ 练习题
-
思考题:如果让 Agent 帮你订机票,它需要哪些工具?试着列出至少 3 个。
-
改代码:在上面的天气 Agent 中,把
get_weather函数里的城市数据多加几个城市(杭州、成都、广州),然后测试。 -
进阶思考:如果 Agent 调用了
get_weather("北京"),但工具返回了错误信息"API 超时",Agent 应该怎么做?试着在你的代码里加一个错误返回,看看 Agent 的反应。
下一章预告:第2章:环境搭建与 DeepSeek API 入门 —— 我们会手把手配好所有环境,写出第一个完整的 API 调用!
更多推荐



所有评论(0)