文章目录
-
- 一、前言
- [二、概念对齐:LLM vs Agent](#二、概念对齐:LLM vs Agent)
-
- [2.1 一张表看清区别](#2.1 一张表看清区别)
- [2.2 Agent 的"组装公式"](#2.2 Agent 的"组装公式")
- 三、开工准备:从注册到第一次调用
-
- [3.1 注册 DeepSeek + 充值 + 创建 API Key](#3.1 注册 DeepSeek + 充值 + 创建 API Key)
- [3.2 Python 环境检查](#3.2 Python 环境检查)
- [3.3 虚拟环境:为什么要单独建](#3.3 虚拟环境:为什么要单独建)
- [3.4 跑通第一行代码](#3.4 跑通第一行代码)
- 四、跑起来:第一次模型调用的实际体验
-
- [4.1 核心代码就一行](#4.1 核心代码就一行)
- [4.2 三个预设问题:感受 LLM 的能力边界](#4.2 三个预设问题:感受 LLM 的能力边界)
- [4.3 交互模式:为什么不用内置 input](#4.3 交互模式:为什么不用内置 input)
- [4.4 三个埋伏笔的问题](#4.4 三个埋伏笔的问题)
- 五、执行脚本
- 六、总结
一、前言
最近在折腾 Agent,刚开始就被两道门槛卡得怀疑人生:
- 概念门槛:LLM 和 Agent 到底差在哪?学 Agent 是不是得先把 LLM 啃透?
- 操作门槛 :API Key 上哪买?代码跑不起来报一堆
ModuleNotFoundError怎么办?
本人不才,踩了一圈坑之后总算把第一期的环境跑通了。这一篇文章把概念讲清楚、把操作步骤拆明白,看完你就能:
- 一句话讲清 LLM vs Agent
- 注册 DeepSeek、拿到自己的 API Key
- 跑通第一次模型调用,看到模型回你一句话
本文是 Agent 教学系列第 01 期的实战笔记,干货为主,偶尔自嘲,各位看官将就着看。

二、概念对齐:LLM vs Agent
2.1 一张表看清区别
先上一张我反复念叨的对照表,看完基本就懂了:
| LLM | Agent | |
|---|---|---|
| 本质 | 大语言模型,输入文本/图像/音频输出文本(现已多模态) | 以 LLM 为大脑,能调用工具、保持记忆、自主循环 |
| 能力边界 | 只会"生成内容"(说、写、画),不能主动行动 | 能"说"也能"做"(调工具、读写文件、上网) |
| 类比 | 一个博学但无手脚的顾问 | 一个有手有脚的助理 |
翻译成人话:LLM 是"会说不会做",Agent 是"能说也能做"。
你问 LLM"现在几点",它会一本正经地胡编;你让 LLM 帮你订个外卖,它也只能嘴上答应,手是伸不出去的。Agent 就是给这个顾问装上手脚和脑子,让它真能干点活。
2.2 Agent 的"组装公式"
记住这一行:
Agent = LLM(大脑) + 工具(手脚) + 记忆(脑子) + 循环(意志)
后续 14 期,我们就是给 LLM 一件一件地装"装备":
- 工具:让模型能查时间、读文件、上网搜
- 记忆:让模型记住你上一句说了啥
- 循环:让模型自己决定下一步干啥,而不是问一句答一句
所以学 Agent 这事,本质上不是"学一个新东西",而是"给 LLM 加装备"。先把第一期的环境跑通,后面的事都好办。
三、开工准备:从注册到第一次调用
3.1 注册 DeepSeek + 充值 + 创建 API Key
三步走,简单粗暴:
- 注册账号:访问 https://platform.deepseek.com/,手机号注册,完成实名认证
- 充值额度:DeepSeek 按 token 计费,1 元约能买 100 万 token,先充 10 元够学完整套课程
- 创建 API Key:控制台 → API Keys → 创建新 Key
踩坑提醒 :API Key 只显示一次!复制好立刻存起来,丢了就只能重建。命名建议 teaching-course,以后好认。
3.2 Python 环境检查
课程代码需要 Python 3.10 及以上。先在终端确认:
bash
python3 --version # macOS / Linux
python --version # Windows
- 输出版本号 ≥ 3.10:跳过安装,直接到 3.3
- 提示
command not found或版本过低:按下面装
macOS(系统自带 Python 通常偏低,建议另装):
- 访问 https://www.python.org/downloads/ 下载最新 3.x 安装包,双击安装
- 或用 Homebrew:
brew install python@3.13 - 装完重开终端,再次确认版本
Windows:
- 访问 https://www.python.org/downloads/ 下载安装包
- 安装时务必勾选 "Add python.exe to PATH" ,否则命令行找不到
python - 装完重开 PowerShell / cmd,执行
python --version确认
3.3 虚拟环境:为什么要单独建
为什么要虚拟环境? 虚拟环境(venv)给当前项目单独装一套依赖,和系统、其他项目互不污染。本课程从 01 期用到 15 期,依赖覆盖 openai / mcp / fastapi 等多个大库,不隔离的话版本会互相打架。删项目时只要删 .venv 目录即可干净卸载。
类比一下:就像给你的厨房单独配一套锅,别和邻居共用,不然今天他炖了辣的,你明天煮个甜汤都得串味。
macOS / Linux:
bash
# 1. 创建虚拟环境(只需一次)
python3 -m venv .venv
# 2. 激活(每次开新终端都要做一次)
source .venv/bin/activate
# 3. 安装依赖(激活后 pip 会装到 .venv 里,不污染全局)
pip install -r requirements.txt
# 4. 配置 API Key
cp .env.example .env
# 用文本编辑器打开 .env,把 DEEPSEEK_API_KEY 改成你刚才复制的真实 Key
Windows(PowerShell):
powershell
# 1. 创建虚拟环境(只需一次)
python -m venv .venv
# 2. 激活(每次开新终端都要做一次)
.venv\Scripts\activate
# 3. 安装依赖
pip install -r requirements.txt
# 4. 配置 API Key
copy .env.example .env
# 用记事本打开 .env,把 DEEPSEEK_API_KEY 改成你刚才复制的真实 Key
激活成功后,终端提示符前面会出现 (.venv),说明你已经在虚拟环境里。此时 python 和 python3 都指向虚拟环境里的 Python。
Windows 常见报错 :首次激活若提示 无法加载文件......因为在此系统上禁止运行脚本,在 PowerShell 管理员模式执行一次:
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
然后重试激活即可。
3.4 跑通第一行代码
环境装好,跑一下:
bash
python code/step01_hello_agent.py
没激活虚拟环境直接跑会报
ModuleNotFoundError: No module named 'dotenv',因为依赖没装进来。看到这个报错就回到 3.3 激活环境。
程序会自动问三个问题,然后进入交互模式。
四、跑起来:第一次模型调用的实际体验
4.1 核心代码就一行
把所有花架子去掉,第一次调用就靠这一段:
python
client = OpenAI(
api_key=os.environ["DEEPSEEK_API_KEY"],
base_url="https://api.deepseek.com", # 关键:指向 DeepSeek
)
为什么用 openai SDK 而不是官方 deepseek SDK?
答案很朴素:DeepSeek 没有独立 SDK,官方推荐用 openai SDK + 改 base_url。这样做的好处是代码几乎零成本切换到 OpenAI、Moonshot、智谱等兼容厂商------以后想换厂商,改一行 URL 就行,不用重写。
调用流程长这样:
你的代码 → openai SDK → HTTPS 请求 → DeepSeek 服务器 → 模型推理 → 返回 JSON → SDK 解析 → 你拿到文本
4.2 三个预设问题:感受 LLM 的能力边界
程序跑起来会自动问三个问题:
- "你好,请用一句话介绍你自己" ------ 感受模型自我描述
- "用 Python 写一个冒泡排序,只要代码不要解释" ------ 感受代码生成能力
- "帮我算一下 17 * 23 等于多少" ------ 感受数学能力(顺带看看它会不会算错)
这三个问题不是随便挑的,每个都在"摸一下 LLM 的底"。跑完你会对它能干什么、不能干什么有个直观感受。
4.3 交互模式:为什么不用内置 input
进入交互模式后,程序用的是 prompt_toolkit 而不是内置的 input()。原因很实在:
- 完整退格:长文本和中文都能删到行首(
input()在某些系统上中文会删一半卡住) ← / →移动光标:改字不用从头重打↑ / ↓翻历史:上一句问过啥能直接翻回来Ctrl-C作废当前行而不退出程序:手滑了不丢会话
这种小细节看着不起眼,真正用起来体验差一大截。
4.4 三个埋伏笔的问题
我在程序里埋了三个"伏笔",专门让你踩一踩,然后引出后续课程:
| 你问的问题 | 模型的回答 | 后面哪期解决 |
|---|---|---|
| "现在几点?" | 答不准,它不知道当前时间 | 第 05 期 Tool Use |
| 连续问三次同样问题 | 每次回答略有不同 | 第 03 期 history |
| "我叫张三" → "我姓什么" | 它答不上来 | 第 02 期连续对话 |
这就是这套课程的节奏:先让你发现"模型哪里不行",再告诉你"后面怎么让它行"。
五、执行脚本
python
#!/usr/bin/env python3
"""step01_hello_agent.py --- 第 01 期:认识 Agent + 开工准备
本期目标:
1. 配置好 DeepSeek API Key
2. 能跑通第一次模型调用
3. 理解 LLM 和 Agent 的区别(为后续铺垫)
运行:
python code/step01_hello_agent.py
"""
import os
from dotenv import load_dotenv
from openai import OpenAI
from prompt_toolkit import prompt
from prompt_toolkit.history import InMemoryHistory
load_dotenv()
# ============ 1. 初始化客户端 ============
# DeepSeek 兼容 OpenAI 协议,所以直接用 openai SDK
# 关键配置:
# - api_key:你在 platform.deepseek.com 创建的 Key
# - base_url:固定为 https://api.deepseek.com
client = OpenAI(
api_key=os.environ["DEEPSEEK_API_KEY"],
base_url=os.environ.get("DEEPSEEK_BASE_URL", "https://api.deepseek.com"),
)
MODEL = os.environ.get("DEEPSEEK_MODEL", "deepseek-chat")
def chat(user_input: str) -> str:
"""单次对话:输入一句话,返回模型回答。"""
response = client.chat.completions.create(
model=MODEL,
messages=[{"role": "user", "content": user_input}],
max_tokens=1000,
)
return response.choices[0].message.content
def main():
print("=" * 60)
print("第 01 期:Hello Agent --- 你的第一次模型调用")
print("=" * 60)
print(f"当前模型: {MODEL}")
print(f"API 地址: {client.base_url}")
print("=" * 60)
# 试试三个问题,感受 LLM 的能力边界
questions = [
"你好,请用一句话介绍你自己",
"用 Python 写一个冒泡排序,只要代码不要解释",
"帮我算一下 17 * 23 等于多少",
]
for i, q in enumerate(questions, 1):
print(f"\n[问题 {i}] {q}")
try:
answer = chat(q)
print(f"[回答] {answer}")
except Exception as e:
print(f"[出错] {e}")
print("→ 请检查 .env 里的 DEEPSEEK_API_KEY 是否正确")
return
# 交互式对话
print("\n" + "=" * 60)
print("现在可以自由对话,输入 quit 退出")
print("←/→ 移动光标,↑/↓ 翻历史,Ctrl-C 作废当前行重输")
print("=" * 60)
history = InMemoryHistory()
while True:
try:
user_input = prompt("\n你: ", history=history).strip()
except (EOFError, KeyboardInterrupt):
# Ctrl-D / Ctrl-C:作废当前行,继续下一轮(不退出程序)
print(" (本行作废,重新输入)")
continue
if user_input.lower() in ("quit", "exit", "q"):
print("再见!")
break
if not user_input:
continue
try:
print(f"Alex: {chat(user_input)}")
except Exception as e:
print(f"[出错] {e}")
if __name__ == "__main__":
main()
六、总结
一句话回顾:LLM 是"会说不会做",Agent 是"能说也能做"。Agent = LLM + 手脚 + 脑子 + 意志。
三个关键动作记牢:
- 注册 DeepSeek → platform.deepseek.com,手机号 + 实名
- 创建 API Key → 只显示一次,保存好
- 配置
.env→ 把 Key 填进去,跑通第一次调用
一行代码记住本期:
python
client = OpenAI(api_key=KEY, base_url="https://api.deepseek.com")
DeepSeek 兼容 OpenAI 协议,改
base_url即可。
适用场景:这篇适合零基础入门 Agent 的人------概念模糊、环境没搭、第一次跑模型调用。已经能熟练用 OpenAI SDK 的可以跳到第 05 期 Tool Use。
下一期预告:第 02 期------单次调用 → 连续对话。你会发现这一期的程序"金鱼记忆",问完就忘,敬请期待。
感谢各位看官的一路陪伴,大家都再接再厉!