很多人第一次接触 AI,是跟 ChatGPT 聊天。它能写诗、写代码、写周报,甚至能跟你辩论哲学。但你有没有发现一个现象:
它很聪明,但从不主动做事。
你问它"帮我查一下今天的天气",它会告诉你"我无法访问实时数据";你让它"帮我把这份 PDF 转成 Word",它会说"我无法直接操作文件"。
这不是它笨,而是它的设计目标就是对话 ,不是执行。
什么是 Agent?
Agent(智能体)的核心定义是:
一个能感知环境、做出决策、调用工具、执行动作并达成目标的自主系统。
拆解一下:
-
感知环境:接收输入(文字、图片、API 返回、传感器数据等)
-
做出决策:根据目标判断下一步该做什么
-
调用工具:不只是"说",而是"做"------查数据库、发邮件、调 API、写文件
-
执行动作:真正改变外部世界(哪怕只是生成一个文件)
-
达成目标:有明确的结果导向,比如"完成一份销售报告"、"订好明天上午的会议"
Chatbot 是"问答机器",Agent 是"任务执行者"。
Chatbot vs Agent:一张表看懂本质区别
| 维度 | Chatbot | Agent |
|---|---|---|
| 核心能力 | 回答提问 | 执行任务 |
| 交互模式 | 一问一答 | 多轮规划 + 工具调用 |
| 是否改变外部世界 | 否(仅输出文本) | 是(可写文件、调接口、发邮件) |
| 是否有记忆 | 通常无或极短 | 有短期+长期记忆 |
| 是否有目标 | 无 | 有(比如"完成周报") |
| 是否自主决策 | 否(被动响应) | 是(主动规划步骤) |
Agent 的最小骨架:用 50 行 Python 跑通你的第一个 Agent
我们不依赖任何框架,就用最原始的 Python + 大模型 API,写一个能"动手做事"的 Agent。
目标:
让 Agent 接收一个指令:"获取当前时间并告诉我",它能:
-
理解指令
-
决定调用哪个工具(get_current_time)
-
执行工具
-
返回结果
第一步:准备环境
你需要:
-
Python 3.10+
-
一个 DeepSeek / 通义千问 / GLM 的 API Key(任选其一)
-
安装 requests 库:
pip install requests
第二步:写代码
import requests
import json
# 配置你的 API Key 和基础 URL(这里以 DeepSeek 为例,其他平台类似)
API_KEY = "你的API_KEY"
BASE_URL = "https://api.deepseek.com/v1/chat/completions"
def get_current_time():
"""模拟一个工具:获取当前时间"""
from datetime import datetime
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
def call_llm(messages):
"""调用大模型 API"""
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
payload = {
"model": "deepseek-chat",
"messages": messages,
"temperature": 0.0
}
response = requests.post(BASE_URL, headers=headers, json=payload)
response.raise_for_status()
return response.json()["choices"][0]["message"]["content"]
def agent_run(user_input):
"""Agent 主循环:接收输入 → 决策 → 执行 → 返回结果"""
# 1. 初始化对话
messages = [
{"role": "system", "content": "你是一个能调用工具的智能体。你可以调用 get_current_time() 来获取当前时间。请用 JSON 格式返回你的决策:{\"action\": \"get_current_time\"} 或 {\"action\": \"none\"}"},
{"role": "user", "content": user_input}
]
# 2. 让模型做决策
decision = call_llm(messages)
print(f"[模型决策] {decision}")
try:
decision_json = json.loads(decision)
action = decision_json.get("action")
except:
action = "none"
# 3. 执行工具
if action == "get_current_time":
result = get_current_time()
print(f"[执行结果] {result}")
return f"当前时间是:{result}"
else:
return "抱歉,我没有理解你的指令,无法执行。"
# 测试
if __name__ == "__main__":
user_input = "获取当前时间并告诉我"
output = agent_run(user_input)
print(f"[最终输出] {output}")
第三步:运行看看
当你运行这段代码,你会看到:
[模型决策] {"action": "get_current_time"}
[执行结果] 2025-09-03 14:23:45
[最终输出] 当前时间是:2025-09-03 14:23:45
恭喜你!你已经写出了第一个能"动手做事"的 Agent。
它不是在跟你聊天,而是在执行一个任务------调用工具、获取结果、返回答案。
常见错误 & 排坑指南
-
模型返回的不是 JSON
→ 在 system prompt 里明确要求"必须用 JSON 格式返回",并设置
temperature=0.0降低随机性。 -
工具函数没定义或报错
→ 先确保工具函数能独立运行,再集成进 Agent。
-
**API 调用失败(401/429)**
→ 检查 API Key 是否正确,是否超限,是否需要设置代理。
-
模型"瞎编"工具名
→ 在 system prompt 里明确列出可用工具,不要用模糊描述。
课后作业
-
修改代码,让 Agent 能调用两个工具:
get_current_time()和send_email(to, subject, body)(模拟发送邮件,打印即可)。 -
尝试让 Agent 理解更复杂的指令,比如:"帮我查下现在几点,然后发邮件告诉老板我迟到了"(提示:你需要拆成两步)。
-
思考:如果模型决策错误,你怎么加入"人工确认"机制?
总结
这一讲我们学会了:
-
Agent ≠ Chatbot,它是能"做事"的系统
-
最小 Agent = 感知 → 决策 → 执行 → 反馈
-
用 50 行 Python + API 就能跑通一个能调用工具的 Agent
-
避坑关键:明确工具定义、控制输出格式、降低温度
下一讲,我们将深入 如何稳定调用大模型 API,包括流式输出、超时重试、token 统计、成本意识------这些都是生产级 Agent 的必备基本功。
🧰 开发之余,处理 Base64、JWT 解析、JSON 格式化、Crontab 计算、PDF 合并压缩这些碎片需求,我常用一个纯前端本地工具箱:zz365.top (子页 PDF 大师:PDF 大师 - zz365工具箱)。所有计算在浏览器完成,文件不上传服务器,关页即清。免费、无登录、无广告,适合开发者当常驻标签页。