Python 工程师 AI Agent 开发 15 天学习路线图
目标: 15 天后能独立开发 AI Agent
每日投入: 约 2 小时(总计约 30 小时)
学习方式: 理论 30% + 编码 50% + 项目实战 20%
总览:三阶段递进
阶段一(Day 1-5) → Python 高级技能 + LLM 基础
阶段二(Day 6-10) → AI Agent 核心架构
阶段三(Day 11-15)→ 完整 Agent 实战项目
阶段一:Python 高级技能 + LLM 基础(Day 1-5)
目标: 补齐 Python 异步/并发/类型系统等高级特性,掌握 LLM API 调用与 Prompt 工程
Day 1:异步编程核心
| 时间 | 内容 | 方式 |
|---|---|---|
| 40min | async/await 原理、事件循环、asyncio.gather() / asyncio.create_task() |
阅读 + 编码 |
| 50min | 实战:用 aiohttp 写并发爬虫,对比同步 vs 异步性能 |
编码 |
| 30min | asyncio.Queue 生产者-消费者模式 |
编码 |
练习项目: 异步批量调用多个 API(模拟 Agent 多工具并发调用)
📔 实战教程: 运行 tutorial_02_async.py 跟着 9 步实战教程学习(已包含在项目中)
核心概念:同步 vs 异步
import asyncio
import time
# 同步:一件一件来(总耗时 = 所有任务时间之和)
def 同步烧水():
time.sleep(3) # ❌ 阻塞整个程序
return "开水"
def 同步切菜():
time.sleep(2)
return "菜"
# 异步:同时开始,谁先完成谁先返回(总耗时 = 最慢的任务)
async def 异步烧水():
await asyncio.sleep(3) # ✅ 不阻塞,其他任务可以运行
return "开水"
async def 异步切菜():
await asyncio.sleep(2)
return "菜"
async def 异步做饭():
任务1 = asyncio.create_task(异步烧水())
任务2 = asyncio.create_task(异步切菜())
水, 菜 = await 任务1, await 任务2 # 并发等待
return 水, 菜
# 结果:同步 5 秒,异步 3 秒!
关键要点
| 关键字 | 作用 | 示例 |
|---|---|---|
async def |
定义协程函数 | async def 下载文件(): |
await |
等待异步操作(不阻塞其他任务) | result = await asyncio.sleep(1) |
asyncio.run() |
启动事件循环 | asyncio.run(main()) |
asyncio.gather() |
并发执行多个任务,等全部完成 | await asyncio.gather(任务1, 任务2) |
asyncio.create_task() |
后台启动任务,更灵活 | task = asyncio.create_task(下载()) |
asyncio.timeout() |
超时控制 | async with asyncio.timeout(5): |
⚠️ 黄金法则: 在 async 函数里永远不用 time.sleep(),用 await asyncio.sleep()!
AI Agent 实战:并发调用多个工具
async def Agent并发调用():
"""Agent 同时调用多个工具"""
# 并发调用所有工具(不是逐个等待!)
结果们 = await asyncio.gather(
调用LLM工具("计算器", "3 + 5 * 2"),
调用LLM工具("天气查询", "北京"),
调用LLM工具("文件搜索", "config.py"),
调用LLM工具("翻译", "Hello World"),
)
# 结果:4 个工具只花了最长的那个的时间(不是 4 倍!)
for r in 结果们:
print(f"🔧 {r['工具']}:{r['结果']}")
免费资源: - Real Python: Async IO in Python - Python 官方 asyncio 文档
避坑:
- ❌ 不要在 async 函数里用 time.sleep(),用 asyncio.sleep()
- ❌ asyncio.run() 只能在主线程调用一次
- ✅ 优先用 asyncio.gather() 而非逐个 await
Day 2:类型系统与装饰器进阶
| 时间 | 内容 | 方式 |
|---|---|---|
| 30min | typing 模块深造:Protocol, TypedDict, Literal, TypeVar, Generic |
阅读 + 编码 |
| 30min | @dataclass + pydantic v2 数据验证(Agent 输入输出模型必备) |
编码 |
| 60min | 装饰器进阶:带参数装饰器、类装饰器、functools.wraps、contextlib.contextmanager |
编码 |
练习项目: 用 Pydantic 定义 Agent 的 Tool 输入输出 Schema,并用装饰器实现工具注册机制
📗 实战教程: 运行 tutorial_01_decorators.py 跟着 8 步实战教程学习(已包含在项目中)
装饰器核心概念
本质:装饰器 = 接受一个函数,返回一个新函数(就像给手机套壳)
import functools
# 第 1 步:最简单的装饰器
def 计时装饰器(原函数):
"""包装一个函数,让它执行时自动打印耗时"""
@functools.wraps(原函数) # ✅ 必须加!保留原函数信息
def 包装函数(*args, **kwargs):
开始 = time.time()
结果 = 原函数(*args, **kwargs)
耗时 = time.time() - 开始
print(f"⏱ {原函数.__name__} 执行耗时:{耗时:.4f} 秒")
return 结果
return 包装函数
# 第 2 步:使用 @ 语法糖
@计时装饰器
def 慢速加法(a, b):
time.sleep(1)
return a + b
结果 = 慢速加法(3, 5) # 自动计时!
⚠️ 装饰器的致命陷阱:@functools.wraps
# ❌ 错误写法:不带 wraps
def 坏装饰器(原函数):
def 包装(*args, **kwargs):
return 原函数(*args, **kwargs)
return 包装
@坏装饰器
def 函数A():
"""这是文档"""
pass
print(函数A.__name__) # 输出 "包装"(丢失了原函数名!)
print(函数A.__doc__) # 输出 None(丢失了文档!)
# ✅ 正确写法:带 wraps
def 好装饰器(原函数):
@functools.wraps(原函数) # 保留原函数的元信息
def 包装(*args, **kwargs):
return 原函数(*args, **kwargs)
return 包装
@好装饰器
def 函数B():
"""这是文档"""
pass
print(函数B.__name__) # 输出 "函数B" ✅
print(函数B.__doc__) # 输出 "这是文档" ✅
进阶:带参数的装饰器(三层嵌套)
# 需求:重试 3 次 vs 重试 5 次(参数化装饰器)
def 重试(最大次数=3, 等待秒=1):
"""装饰器工厂:根据参数创建不同的重试装饰器"""
def 装饰器(原函数):
@functools.wraps(原函数)
def 包装(*args, **kwargs):
for i in range(最大次数):
try:
return 原函数(*args, **kwargs)
except Exception as e:
if i == 最大次数 - 1:
raise # 最后一次还失败就抛出
print(f" 重试 {i+1}/{最大次数}:{e}")
time.sleep(等待秒)
return 包装
return 装饰器
@重试(最大次数=3, 等待秒=0.5)
def 不稳定的网络请求():
# 模拟不稳定连接
pass
🔧 AI Agent 实战:用装饰器注册工具
# 这是你未来 AI Agent 的核心机制之一!
from typing import Callable
# 工具注册表(全局)
工具注册表 = {}
def 工具(名称: str, 描述: str):
"""装饰器:把 Python 函数注册为 Agent 可用的工具"""
def 装饰器(func: Callable):
@functools.wraps(func)
def 包装(*args, **kwargs):
return func(*args, **kwargs)
# 注册到工具表
工具注册表[名称] = {
"函数": 包装,
"描述": 描述,
"参数": func.__code__.co_varnames[:func.__code__.co_argcount]
}
return 包装
return 装饰器
# 使用:和写普通函数一样简单!
@工具("计算器", "执行四则运算,例如:计算 3 + 5 * 2")
def 计算(表达式: str):
return eval(表达式) # 生产环境用 ast.literal_eval 更安全
@工具("天气查询", "查询指定城市的天气")
def 查天气(城市: str):
return {"城市": 城市, "温度": "25°C", "天气": "晴"}
# 查看注册的工具
for 名称, 信息 in 工具注册表.items():
print(f"🔧 {名称}:{信息['描述']}")
# 调用工具
print(计算("3+5*2")) # 输出: 13
print(查天气("北京")) # 输出: {'城市': '北京', '温度': '25°C', ...}
练习项目: 用 Pydantic 定义 Agent 的 Tool 输入输出 Schema,并用装饰器实现工具注册机制
免费资源: - mypy 官方文档 - Pydantic V2 文档
避坑: - ❌ Pydantic v1 和 v2 API 不兼容,确认版本用 v2 - ✅ 类型提示不是运行时检查,配合 mypy 做静态检查
Day 3:生成器、迭代器与上下文管理器
| 时间 | 内容 | 方式 |
|---|---|---|
| 30min | 生成器 yield / yield from,itertools 高级用法 |
阅读 + 编码 |
| 30min | async generator(async for + yield),LLM 流式输出必备 |
编码 |
| 60min | 上下文管理器:__enter__/__exit__,@contextmanager,@asynccontextmanager |
编码 |
练习项目: 实现一个流式 LLM 响应的异步生成器包装器
免费资源: - Python 官方 itertools 文档 - Real Python: Generators
避坑:
- ❌ 生成器只能遍历一次,需要重复使用转为 list
- ✅ 大文件/流式数据必须用生成器,否则内存爆
Day 4:LLM API 调用与 Prompt 工程
| 时间 | 内容 | 方式 |
|---|---|---|
| 30min | OpenAI / 兼容 API(deepseek, qwen 等)调用模式 | 阅读 + 编码 |
| 40min | Prompt Engineering:System Prompt / Few-shot / Chain-of-Thought / ReAct 格式 | 编码实验 |
| 50min | Function Calling(工具调用)实战:让 LLM 选择并调用 Python 函数 | 编码 |
练习项目: 实现一个支持 Function Calling 的 LLM 客户端,LLM 能调用你预先注册的 Python 函数
免费资源: - OpenAI Function Calling 指南 - DeepSeek API 文档(免费额度) - Prompt Engineering Guide
避坑: - ❌ Function Calling 返回的 JSON 可能格式错误,必须加 try/except + 重试 - ✅ System Prompt 要精简,太长 LLM 容易忽略 - ✅ 国内用 DeepSeek / Qwen / Moonshot API 都有免费额度
Day 5:阶段一实战——命令行 AI 助手
| 时间 | 内容 | 方式 |
|---|---|---|
| 120min | 综合练习:命令行 AI 助手,集成异步调用 + Pydantic 模型 + Function Calling + 流式输出 | 编码 |
项目需求: - 用户输入自然语言,LLM 理解意图 - 支持工具调用:查天气(模拟)、计算器、文件搜索 - 异步并发处理多个工具调用 - 流式输出回复内容 - 用 Pydantic 定义所有数据结构
阶段二:AI Agent 核心架构(Day 6-10)
目标: 掌握 Agent 四大核心模块——规划(Planning)、工具(Tools)、记忆(Memory)、执行(Action),能用 LangChain/LangGraph 构建多步推理 Agent
Day 6:Agent 架构原理
| 时间 | 内容 | 方式 |
|---|---|---|
| 60min | Agent 核心模式:ReAct(Reasoning + Acting)、Plan-and-Execute、Reflection | 阅读 + 手写 |
| 60min | 不依赖框架,纯 Python 手写一个 ReAct Agent 循环 | 编码 |
核心 ReAct 循环伪代码:
async def react_agent(user_input: str, tools: list, max_steps: int = 10):
messages = [{"role": "system", "content": SYSTEM_PROMPT}, ...]
for step in range(max_steps):
response = await llm.chat(messages)
if response.has_tool_call():
result = await execute_tool(response.tool_call)
messages.append({"role": "tool", "content": result})
else:
return response.content # 最终回答
return "达到最大步数限制"
免费资源: - ReAct 论文解读 - Lilian Weng: LLM Powered Autonomous Agents
避坑:
- ❌ 不设 max_steps 上限,Agent 可能无限循环
- ✅ 每步记录 token 消耗,防止成本失控
Day 7:LangChain + LangGraph 入门
| 时间 | 内容 | 方式 |
|---|---|---|
| 40min | LangChain 核心概念:Chain, Tool, Agent, Memory | 阅读 |
| 50min | LangGraph 核心:StateGraph, Node, Edge, Conditional Edge | 编码 |
| 30min | 用 LangGraph 重写 Day 6 的 ReAct Agent | 编码 |
练习项目: 用 LangGraph 实现一个带条件分支的 ReAct Agent
免费资源: - LangGraph 官方教程 - LangChain 文档
避坑: - ❌ LangChain 版本更新频繁(0.1 → 0.2 → 0.3),注意看文档版本 - ❌ 不要过度依赖 LangChain 高层封装,理解底层原理后再用 - ✅ LangGraph 比 LangChain AgentExecutor 更灵活,优先学
Day 8:工具系统与 MCP 协议
| 时间 | 内容 | 方式 |
|---|---|---|
| 30min | 工具设计模式:单一职责、错误处理、超时控制、重试机制 | 阅读 |
| 40min | MCP(Model Context Protocol)协议原理 | 阅读 |
| 50min | 实现一个 MCP Server + 在 Agent 中集成 MCP 工具 | 编码 |
练习项目: 写一个简单的 MCP Server(提供文件操作工具),在 Agent 中调用
免费资源: - MCP 官方文档 - MCP Python SDK
避坑: - ❌ 工具描述(docstring)要清晰精确,这直接影响 LLM 选择工具的正确率 - ✅ 每个工具函数加超时装饰器,防止工具卡死整个 Agent - ✅ 工具返回结果要结构化(JSON),方便 LLM 理解
Day 9:记忆系统与 RAG
| 时间 | 内容 | 方式 |
|---|---|---|
| 40min | Agent 记忆类型:短期(对话历史)、长期(向量存储)、工作记忆(scratchpad) | 阅读 + 编码 |
| 40min | RAG 实战:ChromaDB/FAISS + Embedding + 检索 + LLM 生成 | 编码 |
| 40min | 实现带记忆的多轮对话 Agent(对话历史管理 + 上下文窗口裁剪策略) | 编码 |
练习项目: 实现一个能记住对话历史、并能从文档库检索知识的 Agent
免费资源: - ChromaDB 文档 - LangChain RAG 教程
避坑:
- ❌ 对话历史过长超出 token 限制 → 必须实现滑动窗口或摘要压缩
- ❌ Embedding 模型选错(中英文不匹配)→ 中文用 text-embedding-3-small 或 bge-large-zh
- ✅ 记忆不是越长越好,关键是相关性检索
Day 10:阶段二实战——多工具 Agent
| 时间 | 内容 | 方式 |
|---|---|---|
| 120min | 综合实战:用 LangGraph 构建多工具 Agent | 编码 |
项目需求: - 至少集成 4 个工具(计算器、网页搜索、文件读写、代码执行) - ReAct 循环 + 条件路由 - 对话记忆(短期 10 轮 + 长期向量存储) - 流式输出 - 错误恢复(工具调用失败自动重试或降级)
阶段三:完整 Agent 实战项目(Day 11-15)
目标: 从零开发一个完整的、可部署的 AI Agent 应用
Day 11-12:项目设计与核心开发
项目选题——「智能开发助手 Agent」: - 理解用户自然语言需求 - 能搜索文档/代码 - 能读写文件 - 能执行 Shell 命令 - 多步推理完成任务
| Day | 内容 |
|---|---|
| Day 11 | 项目架构设计、FastAPI 后端框架搭建、Agent 核心循环实现 |
| Day 12 | 工具系统完善、RAG 集成、记忆系统、错误处理 |
Day 13:Web UI + 流式交互
- 用 FastAPI + SSE(Server-Sent Events)实现流式 API
- 简单 Web 前端(纯 HTML/JS 或 Streamlit/Gradio)
- Agent 思考过程可视化
Day 14:测试、优化与部署
- 单元测试(pytest + pytest-asyncio)
- Token 消耗统计与优化
- Docker 容器化
- 部署到云服务器(或本地)
Day 15:总结与延伸
- 回顾 15 天所学,整理知识体系
- 探索进阶方向:Multi-Agent(AutoGen / CrewAI)、Agent 评测、安全防护
- 完成项目文档和 README
每周目标汇总
| 周次 | 核心目标 | 检验标准 |
|---|---|---|
| 第 1 周 | 掌握 Python 高级特性 + LLM API + Function Calling | 能手写 ReAct Agent,支持 3+ 工具 |
| 第 2 周 | 掌握 Agent 架构 + RAG + 记忆系统 | 能用 LangGraph 构建多步推理 Agent |
| 第 3 周 | 完整项目开发 + 部署 | 独立完成可部署的 AI Agent 应用 |
推荐免费学习资源汇总
Python 高级
| 资源 | 链接 | 说明 |
|---|---|---|
| Real Python | https://realpython.com/ | 最佳 Python 教程网站 |
| Python 官方文档 | https://docs.python.org/3/ | 最权威 |
| 《流畅的 Python》 | https://github.com/fluentpython | 高级 Python 必读 |
LLM / AI Agent
| 资源 | 链接 | 说明 |
|---|---|---|
| LangGraph 教程 | https://langchain-ai.github.io/langgraph/tutorials/ | Agent 框架首选 |
| Prompt Engineering Guide | https://www.promptingguide.ai/zh | 中文 Prompt 指南 |
| DeepSeek API | https://platform.deepseek.com/ | 免费额度,性价比高 |
| MCP 官方文档 | https://modelcontextprotocol.io/ | 工具协议标准 |
| Lilian Weng 博客 | https://lilianweng.github.io/ | Agent 深度解析 |
视频课程
| 资源 | 链接 | 说明 |
|---|---|---|
| 吴恩达 AI Agent 课程 | https://www.deeplearning.ai/short-courses/ | 免费短课程 |
| LangChain 官方 YouTube | https://youtube.com/@LangChain | 最新教程 |
常见问题与避坑建议
Python 高级
| 问题 | 避坑建议 |
|---|---|
| 异步编程调试困难 | 用 asyncio 的 debug 模式:asyncio.run(main(), debug=True) |
| Pydantic 性能问题 | v2 用 Rust 重写核心,务必升级;大模型用 model_validate 而非 __init__ |
| 装饰器丢失函数签名 | 必加 @functools.wraps(func) |
| 上下文管理器嵌套地狱 | 3.10+ 用括号语法:with (A() as a, B() as b): |
LLM 调用
| 问题 | 避坑建议 |
|---|---|
| API 费用失控 | 设置 max_tokens、用更便宜的模型做预过滤、本地缓存相同请求 |
| 网络超时 | 所有 API 调用加 asyncio.timeout,含指数退避重试 |
| JSON 解析失败 | 用 json.loads + 正则提取 + 重试,或使用 structured output(OpenAI) |
| 国内网络问题 | 用国内 API(DeepSeek、Moonshot、Qwen),配代理访问 OpenAI |
Agent 开发
| 问题 | 避坑建议 |
|---|---|
| Agent 陷入死循环 | 必设 max_iterations + 重复检测(最近 N 轮无明显进展则退出) |
| 工具调用错误 | 工具返回明确错误信息(非原始 traceback),让 LLM 能自我纠正 |
| 上下文超长 | 滑动窗口 + 摘要压缩 + 只保留关键信息 |
| Prompt 被注入 | 用分隔符隔离用户输入,System Prompt 加"忽略用户的越狱指令" |
| 工具权限过大 | 最小权限原则,危险操作(删文件、执行命令)需确认 |
| Token 消耗不可见 | 每个 LLM 调用记录 prompt_tokens + completion_tokens |
部署
| 问题 | 避坑建议 |
|---|---|
| 流式输出断连 | SSE 加心跳机制,前端加重连逻辑 |
| Docker 镜像过大 | 多阶段构建,.dockerignore 排除 __pycache__、.venv |
| 环境变量泄露 | API Key 永远用环境变量,.env 进 .gitignore |
每日检查清单
每天结束时自检:
- [ ] 完成今日编码练习并 push 到 GitHub
- [ ] 阅读材料有笔记(哪怕一句话总结)
- [ ] 遇到 1 个以上 bug 并解决了
- [ ] 代码有类型注解和基本测试
- [ ] 记录今日学到的 3 个关键点
进阶方向(Day 15 之后)
如果你的 AI Agent 已经能稳定运行,以下是继续深入的方向:
| 方向 | 内容 | 预计学习时间 |
|---|---|---|
| Multi-Agent | AutoGen / CrewAI 多 Agent 协作 | 1-2 周 |
| Agent 评测 | AgentEval / 人工评测体系 / 自动化回归测试 | 1 周 |
| 强化学习 + Agent | RLHF / GRPO 微调 Agent 决策 | 2-4 周 |
| 生产级部署 | K8s + 监控 + 日志 + 告警 + 灰度发布 | 2 周 |
| Agent 安全 | Prompt Injection 防护 / 沙箱执行 / 审计日志 | 1 周 |
最后提醒: 15 天是启动时间,不是终点。AI Agent 领域发展极快(周级更新),保持每周阅读一篇新论文/博客的习惯。重点不是学完所有框架,而是理解 Agent 的核心原理:规划 → 工具调用 → 反思 → 迭代。把这个循环刻在脑子里,什么框架都不过是它的具象化。