第1章:什么是 AI Agent?

📌 本章目标

  • 理解 AI Agent 是什么,它和普通 Chatbot 有什么本质区别
  • 理解 Agent 的三大核心组件
  • 理解 ReAct(推理+行动)工作模式
  • 对你的第一个 Agent 代码建立感性认识

1.1 从一个场景说起

假设你问 ChatGPT:“帮我查一下北京明天的天气,如果下雨就提醒我带伞,如果是晴天就建议我去爬山。”

普通 Chatbot 的回答

抱歉,我无法获取实时天气数据。建议你查看天气预报 App。
(为什么会导致这种情况呢?原因很简单传统大模型属于离线知识库,仅学习训练数据集内的历史信息,不具备主动联网、获取实时动态数据的能力。天气预报属于时效性极强的外部实时信息,模型无法调取,因此不能完成条件判断与后续提醒。)

想要实现「查实时天气 + 条件判断提醒」的完整流程,就需要结合联网工具调用、流程编排能力,这也是 AI Agent 区别于传统对话大模型的核心能力之一。

一个 AI Agent 的行为

  1. 🤔 思考:用户想知道北京明天的天气,我需要先获取天气数据
  2. 🔧 行动:调用天气查询工具,传入参数 city="北京"
  3. 👀 观察:得到了结果"明天北京晴,25°C"
  4. 🤔 思考:天气是晴天,用户说晴天就建议爬山
  5. 📝 回答:“明天北京是晴天,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 ❌ 遇到意外就崩 能观察结果并重试
适用场景 闲聊、问答 固定流程(如审批) 开放任务(如"帮我写报告")
开发难度 中高

📝 本章小结

  1. Agent 的本质:一个能自主"思考→行动→观察→再思考"的 AI 程序
  2. 三大组件:LLM(大脑)+ Tools(手脚)+ Memory(记事本)
  3. ReAct 模式:Reasoning + Acting,走一步看一步
  4. 核心循环:调用 LLM → 解析意图 → 执行工具 → 观察结果 → 继续循环
    部分内容由AI生成,代码均可运行。

✏️ 练习题

  1. 思考题:如果让 Agent 帮你订机票,它需要哪些工具?试着列出至少 3 个。

  2. 改代码:在上面的天气 Agent 中,把 get_weather 函数里的城市数据多加几个城市(杭州、成都、广州),然后测试。

  3. 进阶思考:如果 Agent 调用了 get_weather("北京"),但工具返回了错误信息"API 超时",Agent 应该怎么做?试着在你的代码里加一个错误返回,看看 Agent 的反应。


下一章预告第2章:环境搭建与 DeepSeek API 入门 —— 我们会手把手配好所有环境,写出第一个完整的 API 调用!

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐