""" 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()