📋 AI Agent 学习路线验收标准文档

本文档详细说明每个练习项目的验收标准、验证方法和预期结果。


📅 Day 1:异步编程核心

练习项目:异步批量调用多个 API(模拟 Agent 多工具并发调用)

✅ 验收标准(6 条)

序号 验收标准 验证方法 分值
1 使用了 async/await 语法 代码中用 async def 定义函数,用 await 调用异步操作 20 分
2 使用了 asyncio.gather()create_task() 并发执行多个任务,不是逐个 await 20 分
3 异步版本比同步版本快至少 30% 运行同步和异步两个版本,对比耗时 20 分
4 有错误处理(try/except 捕获可能的异常(超时、网络错误等) 15 分
5 有超时控制(asyncio.timeout 使用 async with asyncio.timeout(秒数): 15 分
6 没有在异步函数中误用 time.sleep() 全文搜索 time.sleep,如果和 async 同时出现则扣分 10 分

总分:100 分 - 80-100 分:✅ 验收通过,继续 Day 2 - 60-79 分:⚠️ 基本通过,但有改进空间 - 60 分以下:❌ 未通过,需要重做

🔍 验收方式

# 方式 1:自动验收脚本(推荐)
python day01_practice_validator.py

# 方式 2:手动运行你的练习代码
python your_file.py
# 观察输出:异步总耗时应明显小于同步总耗时

📊 预期性能指标

调用方式 5 个 API 的延迟 预期总耗时 性能提升
同步(逐个) 1s × 5 ~5s -
异步(并发) 最长的延迟 ~1s ~80%

💡 完整标准答案

参考文件 tutorial_02_async.py(运行它跟着学)


📅 Day 2:类型系统与装饰器进阶

练习项目:用 Pydantic 定义 Tool Schema,并用装饰器实现工具注册机制

✅ 验收标准(8 条)

序号 验收标准 验证方法 分值
1 使用 Pydantic v2 定义输入/输出 Schema 定义了继承 BaseModel 的类 15 分
2 实现了 @工具 装饰器(三层嵌套) 装饰器工厂函数,接受名称/描述参数 15 分
3 装饰器内正确使用 @functools.wraps 保留原函数的 __name____doc__ 15 分
4 装饰器将函数注册到全局工具注册表 存在 工具注册表 字典,有注册逻辑 10 分
5 注册了至少 3 个不同功能的工具 @工具 装饰了至少 3 个函数 15 分
6 包装函数内有输入/输出 Pydantic 验证 模型.model_validate() 或类似方法 10 分
7 代码有类型注解 函数有 -> 返回值类型注解 10 分
8 代码可运行,工具可被调用 运行 python 你的文件.py 无报错 10 分

总分:100 分 - 80-100 分:✅ 验收通过 - 60-79 分:⚠️ 基本通过 - 60 分以下:❌ 未通过

🔍 验收方式

# 自动验收脚本
python day02_practice_validator.py

# 指定文件
python day02_practice_validator.py --file my_practice.py

💡 关键检查点

# ✅ 正确的装饰器写法
def 工具(名称, 描述):
    def 装饰器(func):
        @functools.wraps(func)   # ← 必须有!
        def 包装(**kwargs):
            # 输入验证
            输入 = 输入模型(**kwargs)
            # 调用原函数
            结果 = func(**输入.model_dump())
            # 输出验证
            return 输出模型(**结果)
        # 注册
        工具注册表[名称] = {"函数": 包装, "描述": 描述}
        return 包装
    return 装饰器

💡 完整标准答案

参考文件 tutorial_01_decorators.py(第 8 步:AI Agent 实战)


📅 Day 3:生成器、迭代器与上下文管理器

练习项目:实现一个流式 LLM 响应的异步生成器包装器

✅ 验收标准(8 条)

序号 验收标准 验证方法 分值
1 实现了同步生成器(def + yield 函数内用 yield 产出值,不是 return 10 分
2 实现了异步生成器(async def + yield 异步函数内用 yield 15 分
3 流式输出:多次 yield,不是一次返回 生成器函数内有至少 2 个 yield 15 分
4 实现了同步上下文管理器(__enter__/__exit__ 定义了包含这两个方法的类 10 分
5 或使用了 @contextmanager 实现上下文管理器 函数用 @contextmanager 装饰 10 分
6 实现了异步上下文管理器(__aenter__/__aexit__ 定义了包含这两个方法的类 15 分
7 或使用了 @asynccontextmanager 异步函数用 @asynccontextmanager 装饰 10 分
8 代码可运行,生成器可被 for/async for 迭代 运行无报错 15 分

总分:100 分

🔍 验收方式

python day03_practice_validator.py

💡 关键代码示例

# 异步生成器(核心)
async def 流式输出(提示词: str) -> AsyncGenerator[str, None]:
    for chunk in ["我", "喜欢", "写代码"]:
        await asyncio.sleep(0.2)   # 模拟延迟
        yield chunk                     # ← 多次 yield

# 使用
async for chunk in 流式输出("Hello"):
    print(chunk, end="")

📅 Day 4:LLM API 调用与 Prompt 工程

练习项目:实现支持 Function Calling 的 LLM 客户端

✅ 验收标准

序号 验收标准 验证方法
1 能调用 LLM API(OpenAI 兼容格式) aiohttp/httpx 发送异步 HTTP 请求
2 请求格式正确:包含 messagesmodel 字段 检查请求体结构
3 能解析 LLM 返回的 JSON 响应 response.json() 解析
4 实现了 Function Calling:发送 tools 参数 请求体包含 tools 字段(OpenAI 格式)
5 能解析 LLM 的 tool_calls 响应 从响应中提取 function.namefunction.arguments
6 能根据 tool_calls 执行对应函数 调用本地 Python 函数,传入解析后的参数
7 将函数执行结果返回给 LLM(追加 role: tool 消息) 构造正确的消息格式
8 有错误处理:JSON 解析失败重试 try/except + 重试逻辑

🔍 验收方式

# 需要有 API Key 才能完整测试
# 可以先用 mock 模式测试逻辑

python your_day04_practice.py
# 预期:LLM 会选择调用工具 → 执行工具 → LLM 根据结果生成最终回答

💡 关键流程

用户提问
  
构造 messages + tools,调用 LLM API
  
LLM 返回 tool_calls?(是/否)
  ├─   解析 tool_calls  执行对应函数  结果追加到 messages  再次调用 LLM
  └─   返回最终回答

📅 Day 5:阶段一实战——命令行 AI 助手

练习项目:综合练习,集成异步 + Pydantic + Function Calling + 流式输出

✅ 验收标准(手动检查清单)

  • [ ] 用户在命令行输入自然语言,程序能理解意图
  • [ ] 支持至少 2 个工具调用(如:计算器、天气查询)
  • [ ] 工具调用使用 Function Calling 机制(不是关键词匹配)
  • [ ] 异步并发处理多个工具调用(asyncio.gather
  • [ ] LLM 响应支持流式输出(yield chunk by chunk)
  • [ ] 所有数据结构用 Pydantic 定义
  • [ ] 有基本的错误处理(API 失败、工具执行失败)
  • [ ] 代码有类型注解

🔍 验收方式

# 运行命令行助手
python your_cli_agent.py

# 测试对话
> 帮我计算 3 + 5 * 2
# 预期:Agent 调用计算器工具,返回 13

> 北京今天天气怎么样?
# 预期:Agent 调用天气查询工具,返回天气信息

📅 Day 6:Agent 架构原理(核心!)

练习项目:不依赖框架,纯 Python 手写一个 ReAct Agent 循环

✅ 验收标准(8 条)

序号 验收标准 验证方法 分值
1 实现了 ReAct 主循环(for/while + max_steps) 有循环结构,有步数上限 15 分
2 循环内正确构建 ReAct Prompt Prompt 包含 Thought/Action/Action Input/Observation 格式说明 10 分
3 能解析 LLM 返回的 ReAct 格式 用正则或字符串方法提取 Action 和 Action Input 15 分
4 能根据 Action 执行对应工具 execute_tool() 函数 10 分
5 工具执行结果加入下一步的 Prompt 拼接 Observation 到下一次请求 10 分
6 能识别"Final Answer"并终止循环 解析到 Final Answer 后 return 15 分
7 使用了 async/await(异步 LLM 调用) 主函数是 async def,内部用 await 15 分
8 代码可运行,Agent 能完成多步推理任务 运行后 Agent 能正确使用工具并给出答案 10 分

总分:100 分

🔍 验收方式

python day06_practice_validator.py

💡 ReAct 循环伪代码

async def react_agent(user_input: str, max_steps: int = 10):
    messages = [{"role": "system", "content": SYSTEM_PROMPT}]
    messages.append({"role": "user", "content": user_input})

    for step in range(max_steps):
        # 1. 调用 LLM
        response = await llm_chat(messages)

        # 2. 解析响应
        thought, action, action_input = parse_react_response(response)

        # 3. 如果是 Final Answer,返回
        if not action:
            return action_input  # 最终答案

        # 4. 执行工具
        observation = await execute_tool(action, action_input)

        # 5. 把结果加入 messages
        messages.append({"role": "assistant", "content": response})
        messages.append({"role": "user", "content": f"Observation: {observation}"})

    return "达到最大步数限制"

📅 Day 7:LangGraph 入门

练习项目:用 LangGraph 实现带条件分支的 ReAct Agent

✅ 验收标准(手动检查清单)

  • [ ] 使用 StateGraph 定义 Agent 状态
  • [ ] 定义了至少 2 个 Node(如:call_modelcall_tool
  • [ ] 定义了 Edge(如:call_modelcall_toolEND
  • [ ] 使用了 add_conditional_edges(条件路由)
  • [ ] State 类型用 TypedDict 或 Pydantic 模型定义
  • [ ] Agent 能完成多步推理(和 Day 6 功能相同,但用 LangGraph 实现)
  • [ ] 代码可运行

🔍 验收方式

python your_day07_practice.py

# 预期输出类似 Day 6,但内部是用 LangGraph 驱动的

💡 关键代码框架

from langgraph.graph import StateGraph, END

class AgentState(TypedDict):
    messages: list
    # 其他状态字段

graph = StateGraph(AgentState)
graph.add_node("call_model", call_model)
graph.add_node("call_tool", call_tool)
graph.add_conditional_edges("call_model", should_continue)
graph.add_edge("call_tool", "call_model")

📅 Day 8:工具系统与 MCP 协议

练习项目:写一个简单的 MCP Server,在 Agent 中调用

✅ 验收标准(手动检查清单)

  • [ ] 使用 mcp Python SDK 创建 MCP Server
  • [ ] 定义了至少 2 个 Tool(用 @server.tool() 装饰器)
  • [ ] Tool 有清晰的 namedescriptioninputSchema
  • [ ] MCP Server 能独立启动(用 mcp run 或代码启动)
  • [ ] Agent 能连接到 MCP Server 并列出工具
  • [ ] Agent 能调用 MCP 工具并获取结果
  • [ ] 工具函数有超时控制

🔍 验收方式

# 终端 1:启动 MCP Server
mcp run your_mcp_server.py

# 终端 2:运行 Agent(连接到 MCP Server)
python your_day08_agent.py

📅 Day 9:记忆系统与 RAG

练习项目:实现能记住对话历史、并能从文档库检索知识的 Agent

✅ 验收标准(手动检查清单)

  • [ ] 实现了短期记忆(最近 N 轮对话历史)
  • [ ] 对话历史超出限制时,有裁剪/压缩策略(滑动窗口或摘要)
  • [ ] 实现了长期记忆(向量存储,如 ChromaDB/FAISS)
  • [ ] 能对新输入做向量检索,找到相关历史记忆
  • [ ] RAG:能从文档库检索相关知识,注入到 Prompt
  • [ ] Embedding 使用合理(中文用 bge-large-zh 或 OpenAI embedding)
  • [ ] 多轮对话测试:Agent 能"记住"之前说过的话

🔍 验收方式

python your_day09_agent.py

# 测试多轮对话
> 我叫张三
✅ Agent:你好张三!

> 我叫什么名字?
✅ Agent:你叫张三。(从对话历史检索到)

📅 Day 10:阶段二实战——多工具 Agent

练习项目:用 LangGraph 构建多工具 Agent

✅ 验收标准(手动检查清单)

  • [ ] 集成了至少 4 个工具(计算器、网页搜索、文件读写、代码执行)
  • [ ] 使用 LangGraph 的 ToolNode 或手写的工具执行节点
  • [ ] ReAct 循环 + 条件路由(继续推理 or 调用工具 or 结束)
  • [ ] 对话记忆:短期(最近 10 轮)+ 长期(向量存储)
  • [ ] 流式输出(用 astream_events() 或类似方法)
  • [ ] 错误恢复:工具调用失败自动重试或降级
  • [ ] Token 消耗有记录(每次 LLM 调用记录 token 数)

📅 Day 11-15:完整项目实战

项目:智能开发助手 Agent

✅ 验收标准(项目交付清单)

Day 11-12:核心开发 - [ ] 项目有清晰的目录结构 - [ ] FastAPI 后端框架搭建完成 - [ ] Agent 核心循环实现(ReAct 或 LangGraph) - [ ] 工具系统:至少 4 个可用工具

Day 13:Web UI - [ ] FastAPI + SSE(Server-sent Events)实现流式 API - [ ] 简单 Web 前端(Streamlit / Gradio / 纯 HTML+JS) - [ ] Agent 思考过程可视化(显示 Thought、Action、Observation)

Day 14:测试与部署 - [ ] 单元测试(pytest + pytest-asyncio) - [ ] Token 消耗统计与优化 - [ ] Docker 容器化(Dockerfile + docker-compose.yml) - [ ] 部署到云服务器或本地运行

Day 15:文档 - [ ] README.md:项目介绍、安装步骤、使用方法 - [ ] 架构图(可以用 Markdown 画图或贴图) - [ ] 示例代码


📊 综合评分标准

阶段 天数 通过分数 目标
阶段一 Day 1-5 每 day ≥ 60 分 掌握 Python 高级特性 + LLM API
阶段二 Day 6-10 每 day 完成检查清单 掌握 Agent 架构
阶段三 Day 11-15 项目交付清单完成 ≥ 80% 完整可部署的 Agent

🔧 使用验收脚本

脚本名称 对应日期 功能
day01_practice_validator.py Day 1 自动检查异步代码质量、性能对比
day02_practice_validator.py Day 2 检查 Pydantic Schema + 装饰器注册
day03_practice_validator.py Day 3 检查生成器 + 上下文管理器
day04_practice_validator.py Day 4 检查 Function Calling 流程
day05_practice_validator.py Day 5 检查命令行 AI 助手综合实现
day06_practice_validator.py Day 6 检查 ReAct Agent 循环逻辑 ⭐
day07_practice_validator.py Day 7 检查 LangGraph 图结构

使用方法

# 先用模板创建你的练习代码
# (模板文件:day01_practice_template.py 等)

# 编辑模板,完成所有 TODO

# 运行验收脚本
python day01_practice_validator.py
python day01_practice_validator.py --file my_code.py  # 指定文件

💡 常见问题

Q1:验收脚本报错了,怎么办?

A:仔细阅读脚本输出的"改进建议"部分,逐项修改你的代码,然后重新运行验收脚本。

Q2:我的代码能运行,但验收脚本不给满分?

A:验收脚本不仅检查"能运行",还检查"最佳实践"(类型注解、错误处理、代码规范等)。根据建议改进即可。

Q3:Day 8/9/10 没有自动验收脚本?

A:这些天的练习更综合,难以完全自动化验收。请按照文档中的"手动检查清单"逐项自查。

Q4:我可以参考标准答案吗?

A:可以!每个 Day 的 tutorial_xx.pyACCEPTANCE_CRITERIA.md 里都有标准答案。但建议先自己尝试,卡住了再看。


祝你学习顺利!遇到任何问题,随时问我! 🚀