1261 lines
67 KiB
Python
1261 lines
67 KiB
Python
"""
|
||
generate_readmes.py
|
||
|
||
为 code/ 下的每个学习子目录生成 README.md:
|
||
- 占位文件,让 git 能跟踪空目录(跨设备同步时结构不丢)
|
||
- 写清楚每个章节的学习目的 / 要求 / 主要内容 / 对应 docs / 建议练习
|
||
|
||
运行:
|
||
uv run python code/_tools/generate_readmes.py
|
||
"""
|
||
from __future__ import annotations
|
||
|
||
from pathlib import Path
|
||
|
||
CODE_ROOT = Path(__file__).resolve().parent.parent
|
||
DOCS_ROOT = CODE_ROOT.parent / "docs"
|
||
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# 元数据:每个 phase 的标题 + 阶段目标 + 子目录列表
|
||
# ---------------------------------------------------------------------------
|
||
|
||
PHASES: list[dict] = [
|
||
{
|
||
"code_dir": "001_phase1_foundations",
|
||
"phase_title": "阶段一 · 前置核心基础",
|
||
"phase_doc_dir": "01-阶段一-前置核心基础",
|
||
"phase_goal": (
|
||
"把 Python 高级语法 / 大模型基础与 Prompt 工程 / 软件工程基础设施打牢,"
|
||
"为后续 Agent 开发提供语言、工具与工程地基。"
|
||
),
|
||
"topics": [
|
||
{
|
||
"code": "01_python_advanced_basics",
|
||
"title": "Python 高级编程之基础巩固",
|
||
"purpose": "巩固 Python 类型注解、dataclass、异常处理、上下文管理器等基础功底,是后续所有阶段的语言基座。",
|
||
"prerequisites": "已完成 Python 入门语法(变量 / 函数 / 类),能独立写 100 行左右的脚本。",
|
||
"content": [
|
||
"类型注解:`typing` / `TypeAlias` / `NewType` / `Optional` / `Union`",
|
||
"`dataclass` 数据类(含 `field`、`frozen`、`post_init`)",
|
||
"异常处理:`try/except/else/finally` + 异常链 `raise from` + 自定义异常层级",
|
||
"上下文管理器:`with` 协议 / `@contextmanager` / `contextlib`",
|
||
"模块与包:`__init__.py` 的语义 / 相对导入 / 命名空间包",
|
||
],
|
||
"exercises": [
|
||
"写一个支持嵌套的 `dataclass` 配置加载器(含默认值校验)",
|
||
"实现可复用的计时 / 临时目录上下文管理器",
|
||
"构造「连接池用完即抛」的自定义异常链路",
|
||
],
|
||
"done": [
|
||
"能熟练使用类型注解与 dataclass 定义数据结构",
|
||
"能用上下文管理器封装任意资源的获取与释放",
|
||
"能写出层级清晰的自定义异常体系",
|
||
],
|
||
},
|
||
{
|
||
"code": "02_python_advanced_syntax",
|
||
"title": "Python 高级编程之进阶语法",
|
||
"purpose": "掌握装饰器、生成器、描述符、元类等进阶特性,能写出「抽象可复用」而非「复制粘贴」的代码。",
|
||
"prerequisites": "已完成「01_python_advanced_basics」。",
|
||
"content": [
|
||
"装饰器:函数装饰器 / 类装饰器 / 带参装饰器 / `functools.wraps`",
|
||
"生成器与 `yield` / `yield from` / `async for`",
|
||
"描述符协议:`__get__` / `__set__` / `__delete__`(理解 `@property` 底层)",
|
||
"迭代器协议:`__iter__` / `__next__` / `itertools`",
|
||
"元类基础:`type` / `__init_subclass__` / `ABCMeta`",
|
||
],
|
||
"exercises": [
|
||
"实现一个带超时与缓存的函数装饰器",
|
||
"写一个分批读取大文件的生成器",
|
||
"用描述符实现一个类型校验的字段系统(类 `pydantic.Field`)",
|
||
],
|
||
"done": [
|
||
"能写任意结构的装饰器并理解闭包变量捕获",
|
||
"能用生成器改造长列表为流式处理",
|
||
"能解释描述符与 property 的关系",
|
||
],
|
||
},
|
||
{
|
||
"code": "03_python_concurrency_async",
|
||
"title": "Python 高级编程之并发与异步",
|
||
"purpose": "理解多线程 / 多进程 / 协程三种并发模型,能为 IO 密集 vs CPU 密集任务选对工具。",
|
||
"prerequisites": "已完成「01_python_advanced_basics」与「02_python_advanced_syntax」。",
|
||
"content": [
|
||
"GIL 的影响与绕过(多进程 vs C 扩展)",
|
||
"`threading` 线程池 / `concurrent.futures`",
|
||
"`multiprocessing` 进程池与共享状态",
|
||
"`asyncio`:事件循环 / `async/await` / Task / gather",
|
||
"异步上下文与同步代码互操作:`asyncio.to_thread` / `run_in_executor`",
|
||
],
|
||
"exercises": [
|
||
"用线程池并发抓取 10 个 URL 的标题并计时",
|
||
"用 `asyncio.gather` 并发调用 5 个模拟 LLM 接口",
|
||
"对比多线程 / 多进程 / 协程在 IO 密集任务上的耗时差异",
|
||
],
|
||
"done": [
|
||
"能说清 IO 密集用 asyncio,CPU 密集用 multiprocessing",
|
||
"能写正确的 `async/await` 代码并处理并发异常",
|
||
"能将同步阻塞调用丢进线程池不阻塞事件循环",
|
||
],
|
||
},
|
||
{
|
||
"code": "04_python_core_toolkits",
|
||
"title": "Python 高级编程之核心工具库",
|
||
"purpose": "掌握 pydantic / loguru / tenacity / python-dotenv / pandas 这五个几乎每个 Agent 项目都用得到的库。",
|
||
"prerequisites": "已完成「01_python_advanced_basics」。",
|
||
"content": [
|
||
"`pydantic v2`:`BaseModel` / `model_validate` / `model_json_schema` / 脏 JSON 兜底",
|
||
"`loguru`:结构化日志 / `logger.exception` / 日志分级",
|
||
"`tenacity`:重试三要素(何时停 / 等多久 / 重试什么)+ 指数退避",
|
||
"`python-dotenv`:`.env` 加载 / 环境变量管理 / `.gitignore`",
|
||
"`pandas` / `numpy`:选列 / 过滤 / groupby 聚合 / 只喂摘要控 token",
|
||
],
|
||
"exercises": [
|
||
"用 pydantic 校验并恢复模型输出的脏 JSON(```json 包裹 / 注释 / 截断)",
|
||
"用 loguru 给「LLM 调用 → 工具执行」全链路打 INFO 日志",
|
||
"写一个带指数退避的 tenacity 重试装饰器,只重试网络异常",
|
||
],
|
||
"done": [
|
||
"能用 pydantic 校验模型 JSON 输出 + 失败兜底",
|
||
"能用 tenacity 重试网络异常,参数错误 fail-fast",
|
||
"能搭好分层项目骨架 + pytest + ruff + mypy 质量门禁",
|
||
],
|
||
},
|
||
{
|
||
"code": "05_llm_fundamentals",
|
||
"title": "大模型基础原理",
|
||
"purpose": "建立对 LLM 的应用层认知:能看懂模型能力边界、合理设置采样参数、理解上下文窗口限制。",
|
||
"prerequisites": "无(概念为主),可与「06_llm_api_in_practice」并行。",
|
||
"content": [
|
||
"LLM / Token / 上下文窗口与计费",
|
||
"采样参数:`temperature` / `top_p` / `top_k` 与工具调用场景推荐 0~0.3",
|
||
"Embedding:把文本映射成向量,语义相近则向量距离近",
|
||
"Function Calling:模型按 tools Schema 输出「调用哪个工具、传什么参数」",
|
||
"幻觉与 RAG 抑制思路",
|
||
],
|
||
"exercises": [
|
||
"用同一 prompt 在不同 temperature 下生成 3 次,对比随机性",
|
||
"用 sentence-transformers 把 5 条相似语料烤成 embedding 并算两两余弦相似度",
|
||
"画一张「输入 → 上下文窗口 → 输出」的 token 流转图",
|
||
],
|
||
"done": [
|
||
"能说清 Token / 上下文窗口 / 采样的语义",
|
||
"能给工具调用场景合理设置 temperature",
|
||
"能区分 Embedding 与 Function Calling 的用途",
|
||
],
|
||
},
|
||
{
|
||
"code": "06_llm_api_in_practice",
|
||
"title": "主流模型 API 实战",
|
||
"purpose": "能用一套代码对接 OpenAI / Claude / DeepSeek / Ollama 等多家模型,并掌握流式调用与错误码处理。",
|
||
"prerequisites": "已完成「05_llm_fundamentals」。",
|
||
"content": [
|
||
"OpenAI 兼容生态:换 base_url 即换模型(DeepSeek / Ollama / vLLM)",
|
||
"Claude 原生 SDK 与 OpenAI 格式的三处差异(system 位置 / content blocks / tool_calls)",
|
||
"流式调用:`stream=True` / `chunk.choices[0].delta.content` 过滤",
|
||
"错误码处理:429 / 401 / 404 / 5xx 的语义与处置",
|
||
"本地部署:Ollama 调试 / vLLM 生产推理",
|
||
],
|
||
"exercises": [
|
||
"用 OpenAI SDK 对接 DeepSeek(仅改 base_url)",
|
||
"实现一个流式接口:逐 chunk 拼接并打印",
|
||
"写一个分类处置 429/401/404/5xx 的重试函数",
|
||
],
|
||
"done": [
|
||
"能用同一套代码切换不同模型(含流式)",
|
||
"能用 Ollama 本地部署并完成一次工具调用全流程",
|
||
"能为 429/5xx 写退避重试,对 401/404 直接 fail-fast",
|
||
],
|
||
},
|
||
{
|
||
"code": "07_prompt_engineering",
|
||
"title": "Prompt 工程核心",
|
||
"purpose": "掌握让模型稳定输出符合要求结果的提示设计技巧。",
|
||
"prerequisites": "已完成「05_llm_fundamentals」。",
|
||
"content": [
|
||
"指令设计:角色 + 任务 + 约束 + 输出格式",
|
||
"Few-shot:放若干「输入→输出」示例让模型模仿",
|
||
"CoT(思维链):引导模型先逐步推理再给答案",
|
||
"结构化输出:要求 JSON / YAML 输出 + pydantic 兜底",
|
||
"ReAct Prompt:思考 → 行动 → 观察 三段式",
|
||
],
|
||
"exercises": [
|
||
"用 Few-shot 写一个稳定的「意图分类器」prompt",
|
||
"写一个 CoT prompt,让模型拆解数学题步骤",
|
||
"设计一个 ReAct prompt,约束模型按 思考/工具/观察 三段回答",
|
||
],
|
||
"done": [
|
||
"能用 Few-shot / CoT 显著提升模型输出稳定性",
|
||
"能让模型稳定按 JSON / 表格等结构化格式输出",
|
||
"能写出清晰的 ReAct 风格 prompt",
|
||
],
|
||
},
|
||
{
|
||
"code": "08_software_engineering_basics",
|
||
"title": "软件工程与基础设施",
|
||
"purpose": "补上 Git、FastAPI、Docker、PostgreSQL、Redis 这四根工程地基,让 Agent 能从「跑通」变成「可维护」。",
|
||
"prerequisites": "已完成阶段一前 7 个小点中的任意 4 个。",
|
||
"content": [
|
||
"Git 进阶:rebase vs merge / 分支流 / cherry-pick",
|
||
"FastAPI:路由 / Pydantic 模型 / SSE 流式 / Depends 依赖注入",
|
||
"容器化:Dockerfile 分层 / docker-compose 一键拉起",
|
||
"数据库:PostgreSQL 事务 / Redis TTL / SQLAlchemy 2.x",
|
||
],
|
||
"exercises": [
|
||
"实现一个带 SSE 流式的 FastAPI 接口并 curl 测试",
|
||
"写一个多阶段 Dockerfile,按「先拷依赖再拷源码」分层",
|
||
"用 SQLAlchemy 写一段「写任务 + 写明细」的事务代码",
|
||
],
|
||
"done": [
|
||
"能用 FastAPI 实现 SSE 流式接口并跑通",
|
||
"能编写多阶段 Dockerfile 并 compose 拉起应用 + Redis",
|
||
"会用 Redis TTL 与 PostgreSQL 事务",
|
||
],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
"code_dir": "002_phase2_agent_theory",
|
||
"phase_title": "阶段二 · AI Agent 核心理论与基础范式",
|
||
"phase_doc_dir": "02-阶段二-AI-Agent核心理论与基础范式",
|
||
"phase_goal": (
|
||
"先理解 Agent 是什么、为什么需要它,以及 ReAct / Plan-and-Execute / Reflexion 三大经典范式;"
|
||
"在不依赖框架的前提下,手写一个完整的 Agent。"
|
||
),
|
||
"topics": [
|
||
{
|
||
"code": "01_agent_basics",
|
||
"title": "Agent 基础认知",
|
||
"purpose": "建立 Agent 的基础认知:什么是 Agent、与 Chatbot 的本质区别、能干什么不能干什么。",
|
||
"prerequisites": "无。",
|
||
"content": [
|
||
"Agent 的「感知 → 规划 → 调用工具 → 反馈迭代」闭环",
|
||
"Agent vs Chatbot:被动应答 vs 主动完成任务",
|
||
"Agent 的能力边界:能调什么工具、能跑多长",
|
||
"Bad-case:效果差的输入样本的归类",
|
||
],
|
||
"exercises": [
|
||
"用一段话向完全不懂的人解释「Agent 是什么」",
|
||
"列出 5 个 Agent 能落地的真实场景,并标注每场景的核心工具",
|
||
],
|
||
"done": [
|
||
"能一句话定义 Agent 并与 Chatbot 区分",
|
||
"能给出 Agent 的能力边界判断标准",
|
||
],
|
||
},
|
||
{
|
||
"code": "02_agent_core_components",
|
||
"title": "Agent 四大核心组件",
|
||
"purpose": "拆解 Agent 的四大核心组件:规划、记忆、工具、行动。",
|
||
"prerequisites": "已完成「01_agent_basics」。",
|
||
"content": [
|
||
"规划(Planning):目标拆解 / 子任务依赖图",
|
||
"记忆(Memory):短期 / 工作 / 长期 三层",
|
||
"工具(Tools):函数调用的「声明 / 调用 / 结果回传」三段",
|
||
"行动(Action):执行单元 + 异常处理 + 超时",
|
||
],
|
||
"exercises": [
|
||
"把「帮我订明天去上海的机票」拆成规划 + 工具调用序列",
|
||
"为一个 Agent 画一张四大组件的协作图",
|
||
],
|
||
"done": [
|
||
"能拆出任意 Agent 的四大组件对应到代码模块",
|
||
"能解释「记忆」为什么必须分层",
|
||
],
|
||
},
|
||
{
|
||
"code": "03_agent_paradigms",
|
||
"title": "经典 Agent 工作范式",
|
||
"purpose": "掌握 ReAct / Plan-and-Execute / Reflexion 三大基础范式的实现思路。",
|
||
"prerequisites": "已完成「02_agent_core_components」。",
|
||
"content": [
|
||
"ReAct:思考 → 行动 → 观察 循环",
|
||
"Plan-and-Execute:先生成完整计划再逐步执行",
|
||
"Reflexion:失败后反思错误再重试",
|
||
"ToT / GoT / MAS:思维树 / 思维图 / 多智能体(了解即可)",
|
||
],
|
||
"exercises": [
|
||
"用伪代码写一个 ReAct 主循环(带最大轮次限制)",
|
||
"用 Plan-and-Execute 写「查天气 → 算温差 → 建议穿衣」流程",
|
||
"在 ReAct 基础上加一层反思:「失败时让模型先总结原因」",
|
||
],
|
||
"done": [
|
||
"能用伪代码写出三大范式的主循环",
|
||
"能区分何时用 ReAct、何时用 Plan-and-Execute",
|
||
],
|
||
},
|
||
{
|
||
"code": "04_agent_framework_selection",
|
||
"title": "Agent 框架选型决策",
|
||
"purpose": "理解手写 vs 框架的权衡,掌握选型矩阵,能根据场景决定要不要引入 LangGraph 等框架。",
|
||
"prerequisites": "已完成「03_agent_paradigms」。",
|
||
"content": [
|
||
"手写 Agent 的好处:可控 / 轻量 / 学习价值高",
|
||
"框架的好处:状态管理 / 持久化 / 可视化 / 生态",
|
||
"选型矩阵:场景 × 团队规模 × 维护周期",
|
||
"何时不要上框架:极简单任务 / 一次性脚本",
|
||
],
|
||
"exercises": [
|
||
"为三个真实场景分别给出「手写 / LangGraph / 其他」的选型建议",
|
||
"画一张「场景复杂度 × 维护周期」的选型决策图",
|
||
],
|
||
"done": [
|
||
"能根据场景复杂度判断是否需要引入框架",
|
||
"能说清 LangGraph 比手写的具体收益",
|
||
],
|
||
},
|
||
{
|
||
"code": "99_capstone_handcrafted_agent",
|
||
"title": "阶段二综合实战 · 手写完整 Agent",
|
||
"purpose": "不依赖任何 Agent 框架,从零实现一个支持 ReAct / Plan-and-Execute / Reflexion 的完整 Agent。",
|
||
"prerequisites": "已完成阶段二前 4 个小点。",
|
||
"content": [
|
||
"MockLLM:用脚本模型替代真实 API,方便离线调试",
|
||
"ReAct 主循环 + 工具调用 + tool_call_id 配对",
|
||
"Plan-and-Execute:先生成 todo list 再逐步执行",
|
||
"Reflexion:失败后让模型反思错误再重试",
|
||
"最大轮次 + Token 限流防失控",
|
||
],
|
||
"exercises": [
|
||
"实现一个支持两个工具(如搜索 + 计算)的 ReAct Agent",
|
||
"为同一个 Agent 增加 Plan-and-Execute 模式开关",
|
||
"实现 Reflexion:失败时让模型先总结原因,再重试一次",
|
||
],
|
||
"done": [
|
||
"能在不依赖框架的前提下跑通 ReAct / Plan-and-Execute / Reflexion",
|
||
"能解释每一段代码对应框架/Agent 的哪一层",
|
||
"能识别手写 Agent 的能力边界与失控点",
|
||
],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
"code_dir": "003_phase3_frameworks",
|
||
"phase_title": "阶段三 · 主流 Agent 开发框架",
|
||
"phase_doc_dir": "03-阶段三-主流Agent开发框架",
|
||
"phase_goal": (
|
||
"以 LangGraph 为核心,掌握生产级 Agent 框架的使用;"
|
||
"LlamaIndex 用于 RAG 数据接入;CrewAI / AutoGen / 其他方案了解选型。"
|
||
),
|
||
"topics": [
|
||
{
|
||
"code": "01_langchain_basics",
|
||
"title": "LangChain 基础",
|
||
"purpose": "掌握 LangChain 的 ChatModel / PromptTemplate / LCEL / @tool 四件套。",
|
||
"prerequisites": "已完成阶段一「06_llm_api_in_practice」。",
|
||
"content": [
|
||
"ChatModel:ChatOpenAI / ChatDeepSeek / ChatOllama 切换仅改 import",
|
||
"PromptTemplate / ChatPromptTemplate + Few-shot",
|
||
"LCEL:`prompt | llm | parser` 表达式语言",
|
||
"@tool 装饰器:自动生成 JSON Schema / `bind_tools` / `AIMessage.tool_calls`",
|
||
],
|
||
"exercises": [
|
||
"用 LCEL 拼一条 `prompt | llm | parser` 管道",
|
||
"写一个 @tool 函数并解释 docstring 对模型调用决策的影响",
|
||
"实现 RunnableParallel:检索 + 问题改写两路并发",
|
||
],
|
||
"done": [
|
||
"能用 ChatPromptTemplate + LCEL 组装管道",
|
||
"能用 @tool 定义工具并解释 bind_tools 的作用",
|
||
"能说清为什么 Chain 做不了 Agent、必须上 LangGraph",
|
||
],
|
||
},
|
||
{
|
||
"code": "02_langgraph_core",
|
||
"title": "LangGraph 核心(生产级事实标准)",
|
||
"purpose": "用 LangGraph 把 Agent 画成一张图,掌握 State / Node / Edge / ConditionalEdge / Checkpointer。",
|
||
"prerequisites": "已完成「01_langchain_basics」+ 阶段二所有小点。",
|
||
"content": [
|
||
"StateGraph:State 是全局背包,Node 是一次动作,Edge 决定下一步",
|
||
"`add_messages` reducer:消息追加而非覆盖",
|
||
"ToolNode:预置的工具执行节点",
|
||
"Checkpointer / thread_id:状态持久化与中断恢复",
|
||
"interrupt:人在环路审批",
|
||
],
|
||
"exercises": [
|
||
"用 StateGraph 搭一个最小 ReAct 循环(含条件边)",
|
||
"加 Checkpointer,实现「对话中断后从上次继续」",
|
||
"实现 Supervisor 多智能体主管模式",
|
||
],
|
||
"done": [
|
||
"能用 StateGraph 搭建任意结构的 Agent",
|
||
"能用 Checkpointer 持久化与恢复会话状态",
|
||
"能解释为什么生产首选 LangGraph 而非 LCEL",
|
||
],
|
||
},
|
||
{
|
||
"code": "03_llamaindex",
|
||
"title": "LlamaIndex(RAG 数据接入与检索)",
|
||
"purpose": "掌握 LlamaIndex 的 Document / Node / Index / QueryEngine 四件套,专门做 RAG 数据接入与检索。",
|
||
"prerequisites": "已完成「01_langchain_basics」+ 阶段四「02_vector_db_and_memory」(如顺序学习可先看)。",
|
||
"content": [
|
||
"Document / Node:文档加载与切块",
|
||
"Index:VectorStoreIndex / SummaryIndex / KeywordTableIndex",
|
||
"QueryEngine:检索入口,可与 Agent 工具融合",
|
||
"LlamaIndex 与 LangGraph 组合:检索 vs 编排分工",
|
||
],
|
||
"exercises": [
|
||
"用 LlamaIndex 加载一份 PDF 并做问答",
|
||
"把 QueryEngine 包成 LangGraph 的工具节点",
|
||
"对比 LlamaIndex 与 Chroma 原生 API 的异同",
|
||
],
|
||
"done": [
|
||
"能用 LlamaIndex 完成文档接入 → 索引 → 检索",
|
||
"能把 QueryEngine 与 LangGraph 配合使用",
|
||
"能解释 LlamaIndex 与 LangGraph 的分工",
|
||
],
|
||
},
|
||
{
|
||
"code": "04_crewai",
|
||
"title": "CrewAI(角色化多智能体,了解选型)",
|
||
"purpose": "了解 CrewAI 的角色化多智能体模式,能判断什么场景适合用它。",
|
||
"prerequisites": "已完成「02_langgraph_core」(先掌握 Supervisor 多智能体)。",
|
||
"content": [
|
||
"Agent / Task / Process 三个核心抽象",
|
||
"角色化分工:每个 Agent 一个明确角色",
|
||
"CrewAI 与 LangGraph 多智能体的对比",
|
||
],
|
||
"exercises": [
|
||
"用 CrewAI 搭一个「策划 + 写作 + 评审」三人组",
|
||
"对比 CrewAI 与 LangGraph Supervisor 模式的代码差异",
|
||
],
|
||
"done": [
|
||
"能用 CrewAI 跑通一个最小多 Agent 示例",
|
||
"能说清何时选 CrewAI、何时选 LangGraph",
|
||
],
|
||
},
|
||
{
|
||
"code": "05_autogen",
|
||
"title": "AutoGen(微软多 Agent,了解选型)",
|
||
"purpose": "了解 AutoGen 的自然语言对话协作模式,知道它的现状(已并入 MAF 进入维护模式)。",
|
||
"prerequisites": "已完成「02_langgraph_core」。",
|
||
"content": [
|
||
"AutoGen 的 Agent 间自然语言对话协作",
|
||
"现状:已并入 Microsoft Agent Framework(MAF)",
|
||
"何时考虑 AutoGen、何时直接上 LangGraph",
|
||
],
|
||
"exercises": [
|
||
"用 AutoGen 跑通一个最小多 Agent 对话",
|
||
"查阅 MAF 官方文档,对比 AutoGen 与 LangGraph 现状",
|
||
],
|
||
"done": [
|
||
"能说清 AutoGen 的定位与现状",
|
||
"能判断新项目是否还要选 AutoGen",
|
||
],
|
||
},
|
||
{
|
||
"code": "06_other_frameworks",
|
||
"title": "其他主流方案",
|
||
"purpose": "横向了解 Semantic Kernel / Assistants API / Dify 等方案,建立选型视野。",
|
||
"prerequisites": "已完成「01_langchain_basics」~「05_autogen」。",
|
||
"content": [
|
||
"Semantic Kernel:微软插件化框架(适合 Python/.NET 混合团队,已并入 MAF)",
|
||
"OpenAI Assistants API:托管式 Agent(快速原型,逻辑黑盒)",
|
||
"Dify:低代码 Agent 平台(业务验证)",
|
||
"选型矩阵:自研 vs LangGraph vs Assistants API vs Dify",
|
||
],
|
||
"exercises": [
|
||
"用 Assistants API 跑通一个最小 Agent",
|
||
"用 Dify 搭建一个零代码知识库问答",
|
||
],
|
||
"done": [
|
||
"能横向对比四大方案的优劣",
|
||
"能根据场景选择最合适的方案",
|
||
],
|
||
},
|
||
{
|
||
"code": "99_capstone_langgraph_agent",
|
||
"title": "阶段三综合实战 · LangGraph + LangChain 完整 Agent",
|
||
"purpose": "用 LangGraph + LangChain 搭建一个生产级 Agent,覆盖工具调用、状态持久化、消息流式。",
|
||
"prerequisites": "已完成阶段三前 6 个小点。",
|
||
"content": [
|
||
"StateGraph 完整搭建:LLM 节点 + ToolNode + 条件边",
|
||
"Checkpointer:thread_id 持久化与会话恢复",
|
||
"Stream:消息按 token 流式输出",
|
||
"错误重试:tenacity 装饰器 + 异常包装",
|
||
],
|
||
"exercises": [
|
||
"实现一个支持多工具、多轮对话的 LangGraph Agent",
|
||
"加入 Checkpointer 并验证中断恢复",
|
||
"用 FastAPI 暴露 SSE 流式接口",
|
||
],
|
||
"done": [
|
||
"能用 LangGraph 搭建任意结构的 Agent",
|
||
"能解释 StateGraph / ToolNode / Checkpointer 的协作",
|
||
"能将 Agent 暴露成 SSE 流式 API",
|
||
],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
"code_dir": "004_phase4_tool_ecosystem",
|
||
"phase_title": "阶段四 · 工具生态与外围组件集成",
|
||
"phase_doc_dir": "04-阶段四-工具生态与外围组件集成",
|
||
"phase_goal": (
|
||
"掌握 Agent 工具调用生态、向量数据库、RAG 全流程、MCP 协议;"
|
||
"把知识库封装成 Agent 工具,让 Agent 既「检索」又「做事」。"
|
||
),
|
||
"topics": [
|
||
{
|
||
"code": "01_tool_calling_ecosystem",
|
||
"title": "工具调用生态(工具工厂五要素)",
|
||
"purpose": "掌握工具开发五要素(校验 / 超时 / 权限 / 异常包装 / 结果精简)和工具工厂模式。",
|
||
"prerequisites": "已完成阶段三「01_langchain_basics」+ 阶段一「04_python_core_toolkits」。",
|
||
"content": [
|
||
"工具五要素:pydantic 校验 / 超时 / 权限白名单 / 异常包装 / 结果精简",
|
||
"工具工厂模式:业务只写纯函数,五要素自动继承",
|
||
"搜索工具:Tavily / SerpAPI / DuckDuckGo",
|
||
"代码执行沙箱:本地 / Docker 容器 / E2B 云沙箱三档位",
|
||
"文件处理:PDF(PyMuPDF)/ Excel(openpyxl)/ OCR",
|
||
],
|
||
"exercises": [
|
||
"实现一个带工具工厂的搜索工具(含超时与白名单)",
|
||
"用 Docker 跑一段用户生成的 Python 代码(断网 + 限内存)",
|
||
"用 PyMuPDF 解析一份 PDF 并截断返回前 2000 字",
|
||
],
|
||
"done": [
|
||
"能说清工具五要素并落地一个带工厂的工具",
|
||
"能区分代码执行的三档位适用场景",
|
||
"能写出带重试 + 降级的搜索/外部接口封装",
|
||
],
|
||
},
|
||
{
|
||
"code": "02_vector_db_and_memory",
|
||
"title": "向量数据库与记忆存储",
|
||
"purpose": "掌握向量基础、主流向量库选型、混合检索与 Rerank,能搭一个生产级记忆存储组合。",
|
||
"prerequisites": "已完成阶段一「05_llm_fundamentals」。",
|
||
"content": [
|
||
"Embedding:把文本映射成高维向量 / 余弦相似度",
|
||
"轻量方案:Chroma / FAISS",
|
||
"生产方案:Qdrant / Milvus / Pinecone / pgvector",
|
||
"检索进阶:元数据过滤 / 稠密+稀疏双路召回 / Rerank 精排",
|
||
"生产记忆组合:会话缓存 Redis + 语义库 Qdrant + 结构化 PG",
|
||
],
|
||
"exercises": [
|
||
"用 Chroma 完成增删改查 + 元数据过滤",
|
||
"用 Qdrant 实现混合检索 + Rerank",
|
||
"画一张「Redis + Qdrant + PG」三件套的记忆架构图",
|
||
],
|
||
"done": [
|
||
"能区分轻量 vs 生产向量库的取舍",
|
||
"能用 Chroma / Qdrant 实现混合检索 + Rerank",
|
||
"能讲清「稠密 BM25 + RRF + Rerank」的完整链路",
|
||
],
|
||
},
|
||
{
|
||
"code": "03_rag_technique",
|
||
"title": "RAG 技术体系",
|
||
"purpose": "掌握 RAG 流水线、chunking 选型、查询改写 / Rerank / 引用溯源等高级技术,能把 RAG 封装成 Agent 工具。",
|
||
"prerequisites": "已完成「02_vector_db_and_memory」+ 阶段三「02_langgraph_core」。",
|
||
"content": [
|
||
"RAG 七环节:加载 → 清洗 → 分块 → 向量化 → 检索 → 生成",
|
||
"chunking 策略:固定长度 / 递归字符 / 标题感知 / 语义 / 父子",
|
||
"高级 RAG 四件套:查询改写 / 多轮迭代 / Rerank / 引用溯源",
|
||
"Agent-RAG:把知识库封装成 kb_search 工具",
|
||
"LlamaIndex 检索 + LangGraph 编排的黄金组合",
|
||
],
|
||
"exercises": [
|
||
"用 RAG 完整流程做一份知识库问答",
|
||
"对比固定长度 / 递归字符 / 父子分块的 recall@5",
|
||
"把 QueryEngine 包成 @tool 并接入 LangGraph Agent",
|
||
],
|
||
"done": [
|
||
"能说清 RAG 七环节及每个环节的常见故障",
|
||
"能实现带查询改写 + 缓存 + 溯源的知识库检索工具",
|
||
"能区分普通 RAG 与 Agent-RAG 的适用场景",
|
||
],
|
||
},
|
||
{
|
||
"code": "04_mcp_protocol",
|
||
"title": "MCP 协议与工具接入",
|
||
"purpose": "理解 MCP 协议定位、最小实战把工具暴露成 MCP Server,以及 Agent 接入 MCP 客户端。",
|
||
"prerequisites": "已完成「01_tool_calling_ecosystem」+ 阶段三「02_langgraph_core」。",
|
||
"content": [
|
||
"为什么需要 MCP:N×M 集成爆炸 → 一套标准协议",
|
||
"核心概念:Host / Client / Server 与三大原语(tools / resources / prompts)",
|
||
"传输与部署:stdio(本地) / Streamable HTTP(远程)",
|
||
"最小实战:用 FastMCP 把工具工厂的工具暴露成 MCP Server",
|
||
"Agent 接入 MCP:LangChain / OpenAI Agents SDK",
|
||
],
|
||
"exercises": [
|
||
"用 FastMCP 把一个搜索工具暴露成 MCP Server",
|
||
"用 LangChain MCP 客户端接入并调用",
|
||
"对比 MCP 与工具工厂的分工",
|
||
],
|
||
"done": [
|
||
"能用 FastMCP 暴露一个最小 MCP Server",
|
||
"能解释 MCP 三大原语与安全边界",
|
||
"能判断什么场景该上 MCP、什么场景继续用工具工厂",
|
||
],
|
||
},
|
||
{
|
||
"code": "99_capstone_rag_tool_agent",
|
||
"title": "阶段四综合实战 · RAG 工具 Agent",
|
||
"purpose": "综合阶段四所有知识,搭一个支持知识库检索 + 工具调用的完整 Agent。",
|
||
"prerequisites": "已完成阶段四前 4 个小点。",
|
||
"content": [
|
||
"工具工厂 + @tool:所有外部能力统一封装",
|
||
"向量库 + RAG:把公司文档接入 Agent",
|
||
"kb_search + 改写 + 缓存 + 引用溯源",
|
||
"LangGraph 编排:模型自主决定何时检索",
|
||
],
|
||
"exercises": [
|
||
"实现一个支持「kb_search + 计算 + 联网」三件套的 Agent",
|
||
"为 kb_search 加查询改写 + 缓存 + 引用溯源",
|
||
"用 LangGraph 编排「思考 → 检索 → 汇总」完整链路",
|
||
],
|
||
"done": [
|
||
"能搭建一个企业内问应答的最小可用 Agent",
|
||
"能解释 RAG 与工具调用的边界与协作",
|
||
"能给出 Bad-case 的归因与修法",
|
||
],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
"code_dir": "005_phase5_advanced",
|
||
"phase_title": "阶段五 · 进阶技术",
|
||
"phase_doc_dir": "05-阶段五-进阶技术",
|
||
"phase_goal": (
|
||
"掌握多智能体协作、规划能力增强、记忆系统优化、Agent 评估与安全对齐,"
|
||
"让 Agent 从「能用」变成「可靠」。"
|
||
),
|
||
"topics": [
|
||
{
|
||
"code": "01_multi_agent_systems",
|
||
"title": "多智能体系统进阶",
|
||
"purpose": "掌握多智能体系统的四种模式(流水线 / 分层管控 / 辩论校验 / 黑板),能选型。",
|
||
"prerequisites": "已完成阶段三「02_langgraph_core」。",
|
||
"content": [
|
||
"流水线模式:每步一个 Agent,按顺序接力",
|
||
"分层管控:Supervisor 主管分发任务",
|
||
"辩论校验:两个 Agent 互相审核",
|
||
"黑板模式:共享状态空间,多 Agent 协同写入",
|
||
],
|
||
"exercises": [
|
||
"实现一个 Supervisor 主管 + 三个 Worker 的分层架构",
|
||
"实现一个「写 → 审 → 改」的辩论校验流水线",
|
||
"对比四种模式的代码复杂度与适用场景",
|
||
],
|
||
"done": [
|
||
"能区分四种多智能体模式的优劣",
|
||
"能用 LangGraph 实现 Supervisor 模式",
|
||
"能判断什么场景适合多智能体、什么场景单 Agent 就够",
|
||
],
|
||
},
|
||
{
|
||
"code": "02_planning_capability",
|
||
"title": "规划能力增强",
|
||
"purpose": "掌握子目标分解、任务图、Plan-and-Execute 进阶,让 Agent 能处理长周期任务。",
|
||
"prerequisites": "已完成阶段二「03_agent_paradigms」+ 阶段三「02_langgraph_core」。",
|
||
"content": [
|
||
"子目标分解:把复杂任务拆成可独立完成的子任务",
|
||
"任务图:子任务之间的依赖关系建模",
|
||
"Plan-and-Execute 进阶:先生成完整计划 + 每步验证 + 失败重规划",
|
||
"任务进度持久化:Checkpointer 与任务进度回溯",
|
||
],
|
||
"exercises": [
|
||
"实现一个「订机票 + 订酒店 + 排行程」的多步规划 Agent",
|
||
"为任务图加失败重规划(某步失败时让模型重新拆解)",
|
||
"用 Checkpointer 持久化任务进度,支持中断后续跑",
|
||
],
|
||
"done": [
|
||
"能实现子目标分解 + 任务图建模",
|
||
"能让 Agent 在长周期任务中失败重规划",
|
||
"能用 Checkpointer 持久化任务进度",
|
||
],
|
||
},
|
||
{
|
||
"code": "03_memory_system",
|
||
"title": "记忆系统优化",
|
||
"purpose": "掌握短期 / 工作 / 长期三层记忆的存储组合与读写策略。",
|
||
"prerequisites": "已完成阶段四「02_vector_db_and_memory」。",
|
||
"content": [
|
||
"短期记忆:当前会话上下文(Redis + TTL)",
|
||
"工作记忆:当前任务的中间态(Checkpointer)",
|
||
"长期记忆:跨会话持久化(向量库 + PG)",
|
||
"记忆读写策略:摘要压缩 / 重要度评分 / 自动归档",
|
||
],
|
||
"exercises": [
|
||
"实现一个三层记忆读写结合的 Agent",
|
||
"state_dict + Redis + 向量库的协同处理。",
|
||
"用重要度评分自动规划长期记忆的保留与剔除",
|
||
],
|
||
"done": [
|
||
"能区分三层记忆的职责与存储后端",
|
||
"能让 Agent 跨会话记住用户特征",
|
||
"能避免记忆爆炸(会期过期 / 重要度评分)",
|
||
],
|
||
},
|
||
{
|
||
"code": "04_agent_evaluation",
|
||
"title": "Agent 评估与评测",
|
||
"purpose": "掌握五大核心指标、LLM-as-judge、Ragas、LangSmith/Langfuse,构建回归测试闭环。",
|
||
"prerequisites": "已完成阶段三任意 Agent 综合实战。",
|
||
"content": [
|
||
"五大指标:任务成功率 / 工具调用准确率 / 步骤数 / 幻觉率 / 平均耗时",
|
||
"自建评测集:输入 + 期望要点(工具名 / 关键词 / 来源)",
|
||
"LLM-as-judge 三原则:裁判强 / 标准固定 / 抽人复核",
|
||
"Ragas:faithfulness / answer_relevancy / context_precision / context_recall",
|
||
"Bad-case 闭环:归类 → 修法 → 重跑 → 指标回升",
|
||
],
|
||
"exercises": [
|
||
"造一个 5 条用例的评测集并跑出五大指标",
|
||
"用 Ragas 评估一个 RAG Agent 的检索质量",
|
||
"接入 LangSmith 或 Langfuse 查看 trace 全链路",
|
||
],
|
||
"done": [
|
||
"能造评测集并跑出五大指标",
|
||
"能用 Ragas 拆解「检索 vs 生成」的锅",
|
||
"能用 Bad-case 闭环驱动迭代",
|
||
],
|
||
},
|
||
{
|
||
"code": "05_safety_and_alignment",
|
||
"title": "安全与对齐",
|
||
"purpose": "掌握 Agent 的注入防护、工具权限、输出审计、Human-in-the-loop 高危节点审批。",
|
||
"prerequisites": "已完成阶段四「01_tool_calling_ecosystem」。",
|
||
"content": [
|
||
"提示词注入:间接诱导 / 越权指令 / 身份混淆",
|
||
"工具权限:白名单 + 角色 + 代码层拦截",
|
||
"输出审计:危险动作必须可追溯、可回滚",
|
||
"Human-in-the-loop:高危节点 interrupt 审批",
|
||
],
|
||
"exercises": [
|
||
"为一个 Agent 写一个注入测试集(10 个 bad prompt)",
|
||
"为「转账」类工具加 Human-in-the-loop 审批",
|
||
"实现一个工具调用审计日志模块",
|
||
],
|
||
"done": [
|
||
"能识别主流的提示词注入攻击并防护",
|
||
"能设计高危工具的审批闸门",
|
||
"能写出可追溯的工具调用审计日志",
|
||
],
|
||
},
|
||
{
|
||
"code": "99_capstone_multi_agent_workflow",
|
||
"title": "阶段五综合实战 · 多智能体工作流 Agent",
|
||
"purpose": "综合阶段五所有能力,搭建一个多智能体工作流 Agent,覆盖分工协作 / 断点恢复 / 记忆 / 评估 / 注入检测。",
|
||
"prerequisites": "已完成阶段五前 5 个小点。",
|
||
"content": [
|
||
"Supervisor 主管 + 多 Worker 分工",
|
||
"Checkpointer 持久化 + 断点恢复",
|
||
"三层记忆协同(Redis + Qdrant + PG)",
|
||
"Ragas 评估 + Bad-case 闭环",
|
||
"注入检测 + Human-in-the-loop 审批",
|
||
],
|
||
"exercises": [
|
||
"实现一个「调研 → 写作 → 评审 → 发布」的四 Agent 流水线",
|
||
"为流水线加入注入检测与人手审批闸门",
|
||
"为流水线接 Ragas 评估 + LangSmith 追踪",
|
||
],
|
||
"done": [
|
||
"能搭建多智能体工作流并验证分工",
|
||
"能接入评估与安全防护",
|
||
"能说清多智能体 vs 单 Agent 的取舍",
|
||
],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
"code_dir": "006_phase6_vertical_apps",
|
||
"phase_title": "阶段六 · 垂直领域 Agent 落地实践",
|
||
"phase_doc_dir": "06-阶段六-垂直领域Agent落地实践",
|
||
"phase_goal": (
|
||
"把 Agent 落到真实垂直领域:代码开发、数据分析、内容创作、智能客服、办公自动化,"
|
||
"每领域都有独立的能力栈与陷阱。"
|
||
),
|
||
"topics": [
|
||
{
|
||
"code": "01_coding_agent",
|
||
"title": "代码开发 Agent",
|
||
"purpose": "掌握仓库级检索 / AST 分块 / 多文件读写 / 沙箱执行,能在真实代码库里改代码。",
|
||
"prerequisites": "已完成阶段四「03_rag_technique」+ 阶段三「02_langgraph_core」。",
|
||
"content": [
|
||
"仓库级检索:全库建索引(按函数 / 类切块)",
|
||
"AST 分块:`ast` 模块按函数 / 类边界切",
|
||
"多文件读写:diff 预览 + 限根目录",
|
||
"长上下文管理:符号表常驻 + 按需拉取",
|
||
"沙箱执行:Docker 隔离跑生成代码",
|
||
],
|
||
"exercises": [
|
||
"用 AST 把一个 Python 文件按函数切块",
|
||
"实现一个仓库符号表(函数名 → 文件/行号)",
|
||
"实现「定位 → 改 → 跑测试」三步 Agent",
|
||
],
|
||
"done": [
|
||
"能用 AST 分块实现仓库级检索",
|
||
"能管理多文件 diff 与根目录限制",
|
||
"能在沙箱中安全执行 Agent 生成的代码",
|
||
],
|
||
},
|
||
{
|
||
"code": "02_data_analysis_agent",
|
||
"title": "数据分析 Agent",
|
||
"purpose": "掌握 Text-to-SQL / Schema Prompt / 五道防线,能把自然语言问题翻译成 SQL 并出图。",
|
||
"prerequisites": "已完成阶段四「03_rag_technique」+ 阶段一「04_python_core_toolkits」(pandas)。",
|
||
"content": [
|
||
"Text-to-SQL:Schema Prompt 是第一杠杆",
|
||
"五道防线:只读账号 / SQL 白名单 / 参数化 / 结果校验 / 报错自修正",
|
||
"语义层:业务口径沉淀到中间表 / 视图",
|
||
"图表工具:把查询结果转可视化",
|
||
],
|
||
"exercises": [
|
||
"写一份高质量的 Schema Prompt",
|
||
"实现五道防线的 SQL 安全验证",
|
||
"让 Agent 自动选择图表类型(柱 / 折线 / 饼)",
|
||
],
|
||
"done": [
|
||
"能用 Schema Prompt 显著提高 SQL 准确率",
|
||
"能落地五道防线防止 SQL 注入与越权",
|
||
"能让 Agent 把查询结果转成可视化",
|
||
],
|
||
},
|
||
{
|
||
"code": "03_content_creation_agent",
|
||
"title": "内容创作 Agent",
|
||
"purpose": "掌握多 Agent 写作流水线、风格控制、人工反馈机制。",
|
||
"prerequisites": "已完成阶段三「02_langgraph_core」+ 阶段五「01_multi_agent_systems」。",
|
||
"content": [
|
||
"流水线:策划 → 写作 → 评审 → 校对",
|
||
"风格控制:Few-shot + System Prompt 约束",
|
||
"人工反馈:Human-in-the-loop 评审 + 编辑",
|
||
"多模态扩展:图片 / 表格 / 引用自动配齐",
|
||
],
|
||
"exercises": [
|
||
"搭一个「策划 + 写作 + 评审」三人组",
|
||
"加入风格 Few-shot 让 Agent 稳定产出某种文风",
|
||
"接入 Human-in-the-loop 审批闸门",
|
||
],
|
||
"done": [
|
||
"能搭多 Agent 内容流水线",
|
||
"能用风格控制稳定输出",
|
||
"能接入人工反馈闭环",
|
||
],
|
||
},
|
||
{
|
||
"code": "04_customer_service_agent",
|
||
"title": "智能客服与运维 Agent",
|
||
"purpose": "掌握工单 / 知识库 / 多轮上下文 / 升级人工的全链路。",
|
||
"prerequisites": "已完成阶段四「03_rag_technique」+ 阶段三「02_langgraph_core」。",
|
||
"content": [
|
||
"工单系统集成:开单 / 关单 / 升级流转",
|
||
"知识库检索:常见问题自动答",
|
||
"多轮上下文:会话状态持久化",
|
||
"升级人工:识别兜不住的问题并转人工",
|
||
"SLA 与响应时效监控",
|
||
],
|
||
"exercises": [
|
||
"实现一个支持多轮对话 + 知识库的客服 Agent",
|
||
"为 Agent 加工单开/关工具",
|
||
"实现「识别兜不住 → 升级人工」逻辑",
|
||
],
|
||
"done": [
|
||
"能搭多轮对话 + 知识库的客服 Agent",
|
||
"能集成工单系统",
|
||
"能识别兜不住的问题并升级人工",
|
||
],
|
||
},
|
||
{
|
||
"code": "05_office_automation_agent",
|
||
"title": "办公自动化 Agent(Agent + RPA)",
|
||
"purpose": "掌握 Agent + RPA 协作、流程编排、审批中断、幂等防重发。",
|
||
"prerequisites": "已完成阶段三「02_langgraph_core」+ 阶段五「05_safety_and_alignment」。",
|
||
"content": [
|
||
"Agent 动脑 vs RPA 动手的分工",
|
||
"流程编排:串行 + 审批 + 分支",
|
||
"审批中断:LangGraph interrupt",
|
||
"幂等防重发:不幂等操作必须用幂等键",
|
||
],
|
||
"exercises": [
|
||
"实现一个「报销邮件 → 提取要素 → 校验 → 审批 → 回执」流水线",
|
||
"为金额超限分支加 Human-in-the-loop 审批",
|
||
"为不幂等操作(发券)设计防重发机制",
|
||
],
|
||
"done": [
|
||
"能搭 Agent + RPA 协作的办公自动化流水线",
|
||
"能用 interrupt 实现审批中断",
|
||
"能为不幂等操作设计幂等键",
|
||
],
|
||
},
|
||
{
|
||
"code": "99_capstone_data_analysis_agent",
|
||
"title": "阶段六综合实战 · 数据分析 Agent",
|
||
"purpose": "搭建一个支持自然语言查询 + 自动出图 + 报告输出的数据分析 Agent。",
|
||
"prerequisites": "已完成阶段六前 5 个小点。",
|
||
"content": [
|
||
"Schema 元数据自动接入",
|
||
"五道防线保障 SQL 安全",
|
||
"自动出图(柱 / 折线 / 饼)",
|
||
"自动写报告(结论 + 数据 + 引用)",
|
||
],
|
||
"exercises": [
|
||
"为「上季度北京区域销售」自动生成 SQL + 柱状图",
|
||
"为 Agent 加自动报告生成(结论 + 数据)",
|
||
"用 Ragas 评估 Agent 的查询准确率",
|
||
],
|
||
"done": [
|
||
"能搭支持自然语言查询 + 自动出图的数据分析 Agent",
|
||
"能解释五道防线的关键作用",
|
||
"能评估 Agent 的查询质量",
|
||
],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
"code_dir": "007_phase7_engineering",
|
||
"phase_title": "阶段七 · 工程化部署与运维",
|
||
"phase_doc_dir": "07-阶段七-工程化部署与运维",
|
||
"phase_goal": (
|
||
"把 Agent 从「我本机能跑」扩展到「生产可扩、长期可观测」,"
|
||
"覆盖四层架构、状态持久化、容错降级、Docker / K8s 部署、监控告警与上线迭代闭环。"
|
||
),
|
||
"topics": [
|
||
{
|
||
"code": "01_agent_engineering_best_practices",
|
||
"title": "Agent 工程化最佳实践",
|
||
"purpose": "掌握四层架构(接入 / 编排 / 工具 / 存储)、状态持久化、重试·降级·熔断、成本优化。",
|
||
"prerequisites": "已完成阶段三「02_langgraph_core」+ 阶段一「08_software_engineering_basics」。",
|
||
"content": [
|
||
"四层架构:API 接入层 / Agent 编排层 / 工具服务层 / 存储层",
|
||
"插件化工具注册中心:新增工具零改动核心代码",
|
||
"状态持久化:临时 vs 持久 / Checkpointer 选 PG",
|
||
"三大保护:重试(救抖动)/ 降级(兜底)/ 熔断(防雪崩)",
|
||
"成本优化:Token 统计 / 语义缓存 / 步骤限流",
|
||
],
|
||
"exercises": [
|
||
"按四层架构搭一个最小 Agent 服务",
|
||
"为外呼工具加重试 + 降级 + 熔断三件套",
|
||
"实现 Token 统计 + 语义缓存 + 步骤限流",
|
||
],
|
||
"done": [
|
||
"能说清四层架构与各自职责",
|
||
"能实现熔断 + 降级 + Token 统计 + 步骤限流的工程化骨架",
|
||
"能判断一个状态该不该持久化",
|
||
],
|
||
},
|
||
{
|
||
"code": "02_deployment_and_scaling",
|
||
"title": "部署与伸缩(Docker / Compose / K8s)",
|
||
"purpose": "掌握容器化、Compose 一键全家桶、K8s 部署、HPA、任务队列、优雅停机。",
|
||
"prerequisites": "已完成「01_agent_engineering_best_practices」+ 阶段一「08_software_engineering_basics」。",
|
||
"content": [
|
||
"Dockerfile 多阶段构建 / 镜像分层缓存",
|
||
"docker-compose:app + worker + Redis + PG + Qdrant 全家桶",
|
||
"K8s:Deployment + Service + HPA",
|
||
"任务队列:API 入队即返回 / worker 消费(arq)",
|
||
"优雅停机:SIGTERM → 停接新请求 → 等存量 → 落盘 → 退出",
|
||
],
|
||
"exercises": [
|
||
"用 docker-compose 拉起 app + worker + Redis + PG + Qdrant",
|
||
"为长任务 Agent 接 arq 任务队列",
|
||
"实现优雅停机(preStop hook + 状态持久化)",
|
||
],
|
||
"done": [
|
||
"能用 docker-compose 拉起 Agent 全栈",
|
||
"能用 K8s 部署并配置 HPA",
|
||
"能实现优雅停机",
|
||
],
|
||
},
|
||
{
|
||
"code": "03_observability_and_ops",
|
||
"title": "监控与运维",
|
||
"purpose": "掌握三大监控支柱(Logs / Metrics / Traces)、黄金四指标、告警分级、上线迭代闭环。",
|
||
"prerequisites": "已完成「01_agent_engineering_best_practices」。",
|
||
"content": [
|
||
"三大支柱:Logs(明细) / Metrics(聚合数值) / Traces(跨节点路径)",
|
||
"黄金四指标:P95 延迟 / QPS / LLM 调用失败率 / token 消耗速率",
|
||
"Agent 特有的第五维度:成本指标",
|
||
"告警分级:P0 / P1 / P2 + SLO 反推阈值",
|
||
"上线迭代闭环:Bad-case 收集 → 归类 → 修复 → 回归",
|
||
],
|
||
"exercises": [
|
||
"用 loguru + OpenTelemetry 打全链路 trace_id",
|
||
"为 Agent 服务暴露 Prometheus 指标",
|
||
"搭一个 Bad-case 队列并跑通归类 → 修复 → 回归闭环",
|
||
],
|
||
"done": [
|
||
"能搭起 Logs / Metrics / Traces 三大支柱",
|
||
"能用 P95 / QPS / 失败率 / token 消耗四项指标定告警阈值",
|
||
"能跑通 Bad-case 闭环",
|
||
],
|
||
},
|
||
{
|
||
"code": "99_capstone_monitoring_agent",
|
||
"title": "阶段七综合实战 · 监控与运维 Agent",
|
||
"purpose": "搭一个覆盖三大支柱、黄金四指标、告警分级、Bad-case 闭环的完整监控 Agent。",
|
||
"prerequisites": "已完成阶段七前 3 个小点。",
|
||
"content": [
|
||
"三大支柱:loguru + Prometheus + OpenTelemetry",
|
||
"黄金四指标 + 成本指标",
|
||
"告警分级:SLO 反推阈值 + 分级响应",
|
||
"Bad-case 队列:从告警到归类到修复到回归",
|
||
],
|
||
"exercises": [
|
||
"为已有 Agent 服务接入三大支柱",
|
||
"为 P95 延迟 / 失败率 / token 消耗设分级告警",
|
||
"搭一个 Bad-case 队列并跑通归类 → 修复 → 回归",
|
||
],
|
||
"done": [
|
||
"能搭建生产级 Agent 监控体系",
|
||
"能用 SLO 反推告警阈值",
|
||
"能用 Bad-case 闭环驱动长期迭代",
|
||
],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
"code_dir": "008_phase8_projects",
|
||
"phase_title": "阶段八 · 实战项目路线(Level 1~5)",
|
||
"phase_doc_dir": "08-阶段八-实战项目路线",
|
||
"phase_goal": (
|
||
"通过 Level 1~5 五级递进项目,把前面所有阶段的能力串成完整的、可上线的端到端 Agent 系统。"
|
||
),
|
||
"topics": [
|
||
{
|
||
"code": "01_level1_react_qa_agent",
|
||
"title": "Level 1 · ReAct 智能问答 Agent",
|
||
"purpose": "最小可行 Agent:单智能体 + 1~2 个工具,能跑通 ReAct 主循环。",
|
||
"prerequisites": "已完成阶段二 + 阶段三「01_langchain_basics」。",
|
||
"content": [
|
||
"单智能体 + ReAct 主循环",
|
||
"1~2 个工具(如搜索 + 计算)",
|
||
"FastAPI 暴露 + Streamlit 前端",
|
||
"Mock LLM 演示,不需要真实 API Key",
|
||
],
|
||
"exercises": [
|
||
"搭一个支持「查 + 算」二语工具的 ReAct Agent",
|
||
"用 FastAPI + SSE 暴露为 Web 服务",
|
||
"用 Streamlit 做一个简单聊天前端",
|
||
],
|
||
"done": [
|
||
"能用 ReAct 跑通最小 Agent",
|
||
"能用 FastAPI + Streamlit 暴露为 Web",
|
||
"能解释主循环的每一步",
|
||
],
|
||
},
|
||
{
|
||
"code": "02_level2_rag_knowledge_agent",
|
||
"title": "Level 2 · 知识库 RAG Agent",
|
||
"purpose": "在 Level 1 基础上加知识库检索能力,能基于 RAG 做企业内问答。",
|
||
"prerequisites": "已完成 Level 1 + 阶段四「03_rag_technique」。",
|
||
"content": [
|
||
"向量库接入(Chroma / Qdrant)",
|
||
"文档加载 → 清洗 → 分块 → 向量化",
|
||
"RAG 检索 + 引用溯源",
|
||
"Agent-RAG:把 kb_search 接入主循环",
|
||
],
|
||
"exercises": [
|
||
"为 Agent 接入一份公司制度文档知识库",
|
||
"实现带引用溯源的 RAG 问答",
|
||
"对比普通 RAG vs Agent-RAG 的差异",
|
||
],
|
||
"done": [
|
||
"能搭一个支持 RAG 的 Agent",
|
||
"能解释 RAG 七环节 + 每环节的故障排查",
|
||
"能区分普通 RAG vs Agent-RAG",
|
||
],
|
||
},
|
||
{
|
||
"code": "03_level3_multi_role_creator",
|
||
"title": "Level 3 · 多角色内容创作团队",
|
||
"purpose": "在 Level 2 基础上做多 Agent 协作,覆盖内容创作全流程。",
|
||
"prerequisites": "已完成 Level 2 + 阶段五「01_multi_agent_systems」。",
|
||
"content": [
|
||
"角色化分工:策划 / 写作 / 评审 / 校对",
|
||
"多智能体协作(流水线 / 分层管控)",
|
||
"风格控制 + Few-shot",
|
||
"内容追踪 / 反馈 / 迭代",
|
||
],
|
||
"exercises": [
|
||
"搭一个「策划 + 写作 + 评审」三人组",
|
||
"为流水线加入风格 Few-shot",
|
||
"用 Ragas 评估内容质量",
|
||
],
|
||
"done": [
|
||
"能搭多角色内容创作流水线",
|
||
"能用风格控制稳定输出",
|
||
"能用评估闭环迭代内容质量",
|
||
],
|
||
},
|
||
{
|
||
"code": "04_level4_data_analysis_agent",
|
||
"title": "Level 4 · 数据分析 Agent",
|
||
"purpose": "在 Level 3 基础上加 Text-to-SQL,让 Agent 能基于数据库做交互式查询。",
|
||
"prerequisites": "已完成 Level 3 + 阶段六「02_data_analysis_agent」。",
|
||
"content": [
|
||
"Schema Prompt 自动生成",
|
||
"五道防线保障 SQL 安全",
|
||
"查询结果自动可视化(柱 / 折线 / 饼)",
|
||
"自动写报告(结论 + 数据 + 引用)",
|
||
],
|
||
"exercises": [
|
||
"为一份示例数据库写 Schema Prompt",
|
||
"实现五道防线的 SQL 安全验证",
|
||
"让 Agent 自动选择图表并出报告",
|
||
],
|
||
"done": [
|
||
"能搭一个支持自然语言查询的数据分析 Agent",
|
||
"能落地五道防线",
|
||
"能让 Agent 自动出图与报告",
|
||
],
|
||
},
|
||
{
|
||
"code": "05_level5_enterprise_cs_agent",
|
||
"title": "Level 5 · 企业智能客服 Agent",
|
||
"purpose": "完整的企业级客服系统,覆盖多租户 / 工单 / 知识库 / 升级人工的全链路。",
|
||
"prerequisites": "已完成 Level 4 + 阶段六「04_customer_service_agent」+ 阶段七前 3 个小点。",
|
||
"content": [
|
||
"多租户隔离:tenant_id 索引 / 检索过滤",
|
||
"工单系统集成:开 / 关 / 升级流转",
|
||
"知识库 + RAG + 多轮上下文",
|
||
"升级人工 + Human-in-the-loop 审批",
|
||
"全链路可观测(LangSmith / Langfuse)",
|
||
],
|
||
"exercises": [
|
||
"搭一个支持多租户的客服 Agent",
|
||
"为 Agent 接入工单系统",
|
||
"为 Agent 接入 LangSmith / Langfuse",
|
||
"为 Agent 加 SLA 与响应时效监控",
|
||
],
|
||
"done": [
|
||
"能搭企业级智能客服系统",
|
||
"能落地多租户 + 工单 + 升级人工",
|
||
"能用全链路可观测驱动迭代",
|
||
],
|
||
},
|
||
{
|
||
"code": "99_capstone_project_roadmap",
|
||
"title": "阶段八综合实战 · 五级项目路线导航",
|
||
"purpose": "用代码 / CLI 把 Level 1~5 五级项目的递进关系、能力覆盖、进度跟踪、排期映射串起来。",
|
||
"prerequisites": "已完成阶段八前 5 个 Level。",
|
||
"content": [
|
||
"五级项目递进关系图",
|
||
"能力覆盖矩阵(每级覆盖了哪些阶段能力)",
|
||
"进度跟踪:每级的「自检」与「达成标准」",
|
||
"排期映射:每级与 16 周学习计划的对应",
|
||
],
|
||
"exercises": [
|
||
"用 Python 写一个项目路线导航器(CLI / Web)",
|
||
"为导航器加进度跟踪(哪些 Level 已完成)",
|
||
"为导航器加排期映射(剩余多少周)",
|
||
],
|
||
"done": [
|
||
"能用代码呈现五级项目的递进关系",
|
||
"能用工具跟踪学习进度",
|
||
"能用工具评估学习投入产出",
|
||
],
|
||
},
|
||
],
|
||
},
|
||
]
|
||
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# 渲染单个 README
|
||
# ---------------------------------------------------------------------------
|
||
|
||
def render_readme(phase: dict, topic: dict) -> str:
|
||
"""根据 phase + topic 渲染一个 README.md 的内容。"""
|
||
phase_title = phase["phase_title"]
|
||
phase_doc_dir = phase["phase_doc_dir"]
|
||
title = topic["title"]
|
||
purpose = topic["purpose"]
|
||
prereq = topic["prerequisites"]
|
||
content = topic["content"]
|
||
exercises = topic["exercises"]
|
||
done = topic["done"]
|
||
code = topic["code"]
|
||
|
||
# 推断 doc 文件名(去掉中文序号)
|
||
# 比如 "01-LangChain基础.md" 会映射到一个 md 文件
|
||
# 由于 docs 实际文件名包含中文,这里直接给出相对路径让用户自查
|
||
# 用「同目录 + 第 N 篇」的语义提示
|
||
md_link = f"[`docs/{phase_doc_dir}/`](../../docs/{phase_doc_dir}/)(按目录名里的 `第 X 篇` 对应)"
|
||
|
||
lines: list[str] = []
|
||
lines.append(f"# {title}")
|
||
lines.append("")
|
||
lines.append(f"> 所属:{phase_title}")
|
||
lines.append(f"> 目标:{purpose}")
|
||
lines.append("")
|
||
lines.append("---")
|
||
lines.append("")
|
||
lines.append("## 📌 学习目的")
|
||
lines.append("")
|
||
lines.append(purpose)
|
||
lines.append("")
|
||
lines.append("## ✅ 学习要求(前置条件)")
|
||
lines.append("")
|
||
lines.append(prereq)
|
||
lines.append("")
|
||
lines.append("## 📚 主要学习内容")
|
||
lines.append("")
|
||
for item in content:
|
||
lines.append(f"- {item}")
|
||
lines.append("")
|
||
lines.append("## 📖 对应 docs")
|
||
lines.append("")
|
||
lines.append(f"- 目录:{md_link}")
|
||
lines.append("- 在 docs 目录里找到对应的小点 markdown 文件阅读详细理论。")
|
||
lines.append("")
|
||
lines.append("## 🛠️ 建议练习")
|
||
lines.append("")
|
||
for ex in exercises:
|
||
lines.append(f"- [ ] {ex}")
|
||
lines.append("")
|
||
lines.append("## 🏁 完成后达成标准")
|
||
lines.append("")
|
||
for d in done:
|
||
lines.append(f"- [ ] {d}")
|
||
lines.append("")
|
||
lines.append("---")
|
||
lines.append("")
|
||
lines.append("## 🚀 运行提示")
|
||
lines.append("")
|
||
lines.append("```bash")
|
||
lines.append(f"# 激活根目录的虚拟环境")
|
||
lines.append(f"cd /Users/jack/source/Demo/py/demo_python_agent")
|
||
lines.append(f"source .venv/bin/activate # 或直接用 uv run ...")
|
||
lines.append("")
|
||
lines.append(f"# 进入本章目录")
|
||
lines.append(f"cd code/{phase['code_dir']}/{code}")
|
||
lines.append("")
|
||
lines.append(f"# 跑你的练习文件")
|
||
lines.append(f"uv run python your_exercise.py")
|
||
lines.append("```")
|
||
lines.append("")
|
||
return "\n".join(lines)
|
||
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# 主流程
|
||
# ---------------------------------------------------------------------------
|
||
|
||
def main() -> None:
|
||
created = 0
|
||
skipped = 0
|
||
for phase in PHASES:
|
||
phase_dir = CODE_ROOT / phase["code_dir"]
|
||
if not phase_dir.is_dir():
|
||
print(f"[skip] phase dir missing: {phase_dir}")
|
||
continue
|
||
for topic in phase["topics"]:
|
||
topic_dir = phase_dir / topic["code"]
|
||
if not topic_dir.is_dir():
|
||
print(f"[skip] topic dir missing: {topic_dir}")
|
||
continue
|
||
readme = topic_dir / "README.md"
|
||
if readme.exists() and readme.stat().st_size > 0:
|
||
skipped += 1
|
||
continue
|
||
readme.write_text(render_readme(phase, topic), encoding="utf-8")
|
||
created += 1
|
||
print(f"[ok] {readme.relative_to(CODE_ROOT.parent)}")
|
||
print()
|
||
print(f"created={created}, skipped={skipped}")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main() |