Skip to content

Python Agentic RAG 实战教程写作契约

本文是后续实战系列的唯一写作基准,并随仓库版本管理。正式章节开写前必须先核对本文;如果项目范围、技术栈或章节目标发生变化,先修改本文,再修改教程。不能一边写一边临时扩展范围。

一、为什么先写这份契约

这个系列不是再补一组零散的 Agent 文章,而是把全栈之路已有的 Python、后端、RAG、Agent、数据库、异步任务和部署知识组合成一个可以运行的项目。

它需要同时达成三个目标:

  1. 是完整教程:读者能从空目录开始,按顺序得到一套可运行、可测试、可部署的系统。
  2. 体现 AI 应用开发思路:正文把篇幅留给切分、检索、状态编排、权限、可靠性和评测等关键决策,不逐行讲普通 CRUD。
  3. 能支持求职:读者做完后能演示项目、解释架构、展示实验记录,并如实写成个人实战项目。

任何章节如果只满足其中一项,都不能算完成。

二、目标读者

读者已经具备

  • 有前端、Node.js 或普通全栈开发经验。
  • 理解 HTTP、REST、SQL、Git 和 Docker 的基本用法。
  • 学过 Python 基础,能够读懂函数、类、类型标注和异步代码。
  • 看过或愿意按链接补充本站的 Agent 与 RAG 原理文章。

读者希望获得

  • 从普通全栈开发转向 AI 应用、AI 全栈或 Agent 工程岗位。
  • 不再停留在调用一次模型 API 的 Demo 阶段。
  • 拥有一个能运行、能演示、能测试、能解释的个人实战项目。
  • 能回答面试官对检索、引用、状态机、权限、失败恢复和效果评测的连续追问。

本教程不承担

  • 从变量、循环开始教授 Python。
  • 训练或微调基础模型。
  • 讲解向量和 Transformer 的数学推导。
  • 模拟无法验证的商业数据或虚构上线效果。
  • 把购买的 NestJS 项目逐文件翻译成 Python。

三、读完后的可执行结果

读者完成全部章节后,应当能够独立完成下面的动作:

  1. 在本地用 Docker Compose 启动整套系统。
  2. 创建用户、团队和知识库,上传并审核一份真实文档。
  3. 查看解析、切分、Embedding 和索引任务的执行进度。
  4. 对文档进行普通 RAG 问答,获得可以定位到原文的引用。
  5. 对比较、多跳和证据不足的问题启动 Agentic RAG。
  6. 在页面或 API 客户端中看到 Agent 的流式执行过程。
  7. 验证不同用户无法召回无权访问的文档。
  8. 注入任务失败并观察重试、补偿和索引恢复。
  9. 运行离线评测,比较修改前后的检索与回答指标。
  10. 根据真实代码、测试和实验记录整理项目介绍。

四、项目画像

项目名称

企业知识库 Agentic RAG 平台。

核心业务

企业将制度、产品资料、项目文档和技术手册上传到知识库。文档经过审核、解析和索引后,员工可以获得带原文引用的回答。简单问题走固定 RAG;比较、多跳和证据不足的问题由 Agent 改写查询、拆分问题、多轮检索并检查证据。所有检索必须遵守用户、团队、知识库和文档状态权限。

技术栈基线

2026-09 修订:为了让读者零外部依赖跑通、把学习重心放在链路与决策上,配套项目把“教学基线”与“生产迁移目标”分开声明。本次先更新契约,各章再同步边界声明。

教学基线(当前实际交付):

  • Python 3.12(uv 管理)
  • FastAPI、Pydantic
  • SQLAlchemy 2(async,默认 aiosqlite,asyncpg 驱动已声明)
  • 进程内向量索引(查询前重建,教学取舍)
  • SQLite 任务表(入库队列)
  • 本地文件系统对象存储(MinIO 客户端可切换)
  • OpenAI-compatible 模型接口(httpx 直连,未引入 LangChain)
  • LangGraph
  • Python Worker、SSE、Docker Compose

生产迁移目标(出现在各章边界声明中的“后续方向”,不是当前交付):

  • PostgreSQL + pgvector、Redis 队列、MinIO、Alembic 迁移
  • 持久化 Checkpoint、租约与共享队列、OpenTelemetry

技术栈不是展示清单。新增 Elasticsearch、消息队列、图数据库或其他基础设施之前,必须先有当前方案无法满足的可复现问题,并在正文比较新增后的收益和运维代价。

与参考项目的关系

购买的 NestJS 知识库项目只作为业务流程和工程问题的参考素材。教程使用 Python 重新建模和实现,并补齐 Agentic RAG、权限下推、可靠性、评测、可观测性与测试。

私人的面试答辩材料不是教程实现依据。教程不能继承其中的公司名称、任职时间、职责边界和占位数字。所有教程指标必须由配套项目实际运行得到。

配套代码与当前进度

配套代码统一放在 projects/agentic-rag/,正式文章放在 guide/。每章只能在同一个配套项目上继续演进。

章节状态已验证产物
第 1 章:项目目标与架构已完成业务场景、5 份样例文档、11 条验收问题、一致性校验脚本和 4 个边界测试
第 2 章:最小 RAG 闭环已完成FastAPI 上传与问答、Markdown 切分、可替换模型接口、内存向量检索、来源返回和 10 个测试
第 3 章:用户、团队与权限已完成开发 JWT、服务端用户目录、资源级写权限、检索前权限与状态过滤、固定样例加载和 Alice/Bob 对照测试
第 4 章:文件存储与文档生命周期已完成SQLAlchemy 文档元数据、文件系统与 MinIO 对象存储适配器、草稿/待审核/发布/归档状态、乐观锁发布和版本归档测试
第 5 章:多格式解析与结构化切分已完成PDF、Word、PPT、Excel、Markdown 与文本的统一解析入口,保留页/幻灯片/工作表定位标题,以及多格式解析测试
第 6 章:异步入库与任务状态已完成持久化任务表、独立 Worker、进度查询、取消、失败重排队和单任务条件领取测试
第 7 章:混合召回与 Rerank已完成权限内向量与关键词召回、RRF、确定性 Rerank、Profile 和管理员检索调试测试
第 8 章:上下文、引用与拒答已完成Evidence 预算、请求内来源 ID、Claim 与数值支持校验、可解释拒答和 API 测试
第 9 章:问题分类与执行路线已完成确定性路由、敏感请求拒绝、受限历史版本入口、显式降级和路由测试
第 10 章:LangGraph 多轮检索状态机已完成LangGraph 规划、受限多轮检索、预算退出、节点轨迹和跨轮权限范围测试
第 11~17 章:完整教程路线核心本地链路已完成,生产扩展进行中工具、会话摘要、发布提案、SSE、Outbox 记录、健康探针、本地评测 Runner 与求职复盘已落地;持久化 Checkpoint、Redis Relay、租约索引切换、OpenTelemetry 和真实多服务部署仍标为规划项

五、写作与实现的不可变规则

1. 始终按一个项目向前建设

每章必须基于上一章的可运行代码继续修改。不能为了讲一个知识点,另起一套与主项目无关的示例代码。

2. 第二章就交付最小闭环

读者不能连续阅读多章配置和 CRUD 才看到 AI 效果。第二章结束时必须能够上传一份样例文档,并得到一条带来源的回答。后续章节再逐步替换其中的简化实现。

3. 正文重点是关键决策

普通路由、DTO、Repository 和重复性模型代码应当完整存在于配套仓库,但正文只解释其项目约定。正文重点包括:

  • 文档结构如何保留。
  • Chunk 为什么这样切。
  • 检索失败发生在哪里。
  • 为什么需要混合召回或 Rerank。
  • Agent 为什么进入或退出循环。
  • 权限在哪一层过滤。
  • 失败后如何恢复。
  • 如何证明修改有效。

4. 每个能力都要有业务入口

不能单独写“接入 Redis”“接入 LangGraph”或“增加 Rerank”。必须先说明它解决哪条项目链路中的具体问题,再实现和验证。

5. 先固定 RAG,后 Agentic RAG

先建立可以评测的固定 RAG 基线,再升级复杂问题。不能一开始就把所有逻辑交给 Agent,也不能为了展示框架而制造无意义的自主决策。

6. 思路必须落到代码和证据

每个核心设计至少包含:实现代码、运行方法、一个正常样例和一个失败或边界样例。涉及效果提升时必须给出同一数据集上的前后对比。

7. 面试整理不能侵入教程主线

正文按项目建设展开,不写成高频问答。面试表达集中放在阶段复盘和最终章,内容必须来自已经实现和验证的功能。

8. 不虚构生产结果

可以给出本地实验指标、测试结果和容量估算,但必须写清环境、样本量和口径。没有运行证据时只能写目标或预期,不能写成已经达成。

六、正式章节路线

第一阶段:先交付最小产品

标题项目增量完成标志
1项目效果、需求与架构展示最终产品,确定业务边界、技术基线、数据流和验收集读者知道最终要实现什么,以及如何判断完成
2从空目录跑通第一条 RAG 链路FastAPI 骨架、最小上传、最小切分、Embedding、检索和引用回答上传样例文档后能得到第一条带来源回答

第二阶段:建立企业知识库后台

标题项目增量完成标志
3用户、团队、知识库与权限模型JWT、团队成员、知识库角色和资源级权限两个用户能看到不同的知识库和文档
4文件存储、审核与文档生命周期MinIO、草稿、审核、发布、下架和版本未发布文档不可检索,新版本可以替换旧版本

第三阶段:把固定 RAG 做正确

标题项目增量完成标志
5多格式解析与结构化切分PDF、Word、PPT、Excel、页码/幻灯片/工作表定位标题;父子 Chunk 与坐标定位列为生产扩展可以查看并比较同一文档不同格式的解析输出
6异步入库与任务状态Worker、解析、切分、Embedding、索引、进度和失败信息大文件不阻塞接口,失败任务可以定位并重新执行
7向量、关键词、混合召回与 Rerank教学内存向量与关键词召回、RRF、确定性 Rerank;pgvector 与相邻块合并列为生产扩展在固定问题集上比较各阶段的召回与排序
8引用、拒答与上下文构造Token 预算、结构化答案、引用校验和证据不足拒答每条有效答案可定位原文,无证据问题不会编造来源

第四阶段:升级为 Agentic RAG

标题项目增量完成标志
9问题分类与执行路线闲聊、固定 RAG、总结、比较、多跳和敏感操作路由同一入口能选择简单链路或 Agentic 链路
10LangGraph 多轮检索状态机查询改写、问题拆解、证据判断、再次检索、循环与预算复杂问题能有限次补充检索,并且不会无限循环
11工具、记忆、Checkpoint 与人工介入历史版本工具、会话摘要、发布提案与人工确认工具和确认接口可运行;持久化 Checkpoint 明确列为后续扩展
12SSE 流式输出与事件协议版本化 Envelope、递增序号、节点、答案、引用和终态事件客户端能看到稳定、可解析的最小执行事件流

第五阶段:达到可交付标准

标题项目增量完成标志
13权限安全与越权检索测试JWT、检索权限下推、Prompt Injection、版本工具边界自动化测试证明用户无法召回或读取无权文档
14入库可靠性与索引一致性Outbox、幂等、重试、补偿和索引版本切换注入中断和重复消费后,文档最终状态仍一致
15RAG 与 Agent 离线评测固定 JSONL、路由、来源召回、拒答和越权泄漏指标可以用同一命令比较本地 Demo 版本;Token/成本/LLM Judge 仍待接入
16可观测性、测试与部署健康探针、Dockerfile、Compose 单机入口、测试与评测命令新环境可以启动本地 API/Worker,生产 Trace、备份和多服务拓扑明确标为待办
17项目复盘与求职材料基于当前代码、测试和本地基线整理演示脚本与简历边界已实现能力与生产规划项分开表述,每项结果可指向仓库证据

七、与全栈之路知识体系的映射

实战章节不重复完整讲授已有理论,而是在需要时简要回顾并链接原文,然后说明本项目如何应用和验证。

实战内容必须融合的已有知识
最小 RAG 与入库RAG 入库链路
切分与复杂文档多模态 RAG上下文工程
混合检索与排序混合检索与 Rerank
引用与拒答引用溯源与拒答
选择固定链路或 AgentAgent 工程总览Agent 范式与框架选型
多轮检索状态机LangGraph 状态机
工具和人工介入Tool Calling 与 MCPMulti-Agent 与人工兜底
SSEAgent 流式输出
权限与攻击面Agent 安全
失败恢复Agent 生产可靠性
效果证明Agent 与 RAG 评测
Trace、成本和容量Agent 可观测性

“融合”不等于在每章末尾放一个链接。正文必须明确指出:当前项目使用了哪条原则、对应哪段代码、通过什么样例验证。

八、每章统一结构

正式章节统一按下面顺序写。小节名称可以为可读性调整,但内容不能缺失。

1. 本章完成后的可见结果

先展示接口、页面、日志或指标结果,让读者知道本章会给项目增加什么。

2. 当前系统的缺口

说明上一章为什么还不能满足当前业务。缺口必须可以通过请求、数据或失败样例复现,不能只说“为了更完善”。

3. 方案与取舍

给出选用方案、至少一个合理替代方案,以及本项目当前选择的依据。避免为尚未出现的问题提前堆基础设施。

4. 完成这一条纵向链路

按数据流讲解本章实现。只展开关键代码和状态变化,完整工程代码由配套项目承载。

5. 运行和观察

提供可复制的启动、请求或操作步骤,并给出预期结果。命令应在发布前实际执行。

6. 失败与边界验证

至少验证一个失败或边界场景,例如解析失败、证据不足、越权访问、重复消息、模型超时或客户端取消。

7. 本章小结与下一步

正文只总结读者完成了什么,以及下一章会在当前系统上增加什么。作者使用的完成清单、文件数量、内部校验命令和写作过程记录保留在项目规范或测试中,不能直接搬进公开教程。

阶段结束时可以增加一次项目复盘;普通章节不插入大段面试问答。

九、明确禁止的流水账写法

出现下面任一情况,应停止扩写并重构章节:

  1. 连续多页都在安装依赖、创建目录、声明 DTO 或粘贴配置。
  2. 用“第一步、第二步、第三步”罗列操作,却没有解释数据怎样流动以及为什么这样设计。
  3. 为展示技术而接入组件,正文没有可复现的问题和前后对比。
  4. 示例代码脱离主项目,章节结束后无法合并回完整系统。
  5. 只展示成功路径,没有错误、权限、超时或恢复验证。
  6. 声称性能、准确率或成本得到提升,却没有数据集、环境和测量口径。
  7. 重复抄写现有 Agent 理论,没有说明项目中的具体应用。
  8. 把教程写成面试问答,导致项目建设主线频繁中断。
  9. 一章引入过多新概念,读者无法判断真正需要掌握的核心变化。
  10. 每章都换一套示例数据,导致前后实验不能比较。

十、单章完成定义

一章只有同时满足下面条件才可以发布:

  • [ ] 在上一章代码基础上产生可见的项目增量。
  • [ ] 开头明确本章完成后的运行结果。
  • [ ] 使用统一的企业文档样例和评测问题集。
  • [ ] 至少解释一个关键设计取舍。
  • [ ] 关键代码已进入配套项目,不依赖文章中的残缺片段。
  • [ ] 提供读者可以执行的运行或调用步骤。
  • [ ] 至少验证一个正常场景和一个失败或边界场景。
  • [ ] 涉及效果时提供实际测量结果和口径。
  • [ ] 与相关的全栈之路知识文章建立具体联系。
  • [ ] 没有虚构公司经历、用户规模或线上指标。
  • [ ] 完成本章后,整个项目仍然可以启动。
  • [ ] 正文没有泄露作者工作流、写作契约或内部完成清单。
  • [ ] 文末只保留面向读者的小结和下一章连接,不堆面试题。

十一、系列级验收和防偏离机制

写每章之前

  1. 从第六节找到本章唯一的项目增量和完成标志。
  2. 从第七节确定要应用的已有知识。
  3. 写出本章正常样例、失败样例和验证命令。
  4. 如果这些内容写不出来,先补设计,不能直接开始填正文。

写每章之后

  1. 按第十节逐项验收。
  2. 重新运行项目和本章验证命令。
  3. 删除不能帮助读者完成项目的背景知识和重复代码。
  4. 检查有没有把计划、预期或估算写成既成结果。

每完成一个阶段

  1. 从空环境重新启动当前版本。
  2. 重跑固定样例和评测集。
  3. 检查后续目录是否仍与实际项目一致。
  4. 只有出现真实实现冲突时才调整目录;不能因为写作过程中想到新技术就自由扩展。

变更规则

  • 改变项目定位、核心技术栈、章节数量或 Agent 路线时,先更新本文并记录原因。
  • 小范围代码调整可以直接进行,但不能改变本章完成标志。
  • 新增组件必须同时记录它解决的问题、替代方案和验证方法。
  • 最终项目与本文不一致时,以经过更新并重新确认的本文为准,不能靠聊天上下文解释。

十二、写作停止条件

当第 17 章完成,并且下面四项都有实际证据时,系列才算结束:

  1. 可运行:新环境能按文档启动并完成端到端演示。
  2. 可验证:关键链路有自动化测试和固定评测集。
  3. 可解释:架构、状态流、权限边界和失败恢复都有明确记录。
  4. 可求职使用:项目描述中的每个功能和指标都能在仓库里找到实现或实验依据。