《AI Agent 工程实战》目录
这一页是全书的总入口。它不只列出章节标题,还交代本卷怎么读、贯穿项目 ResearchCopilot 的定位,以及每一章的一句话导读。如果你不确定从哪开始,先读「本卷怎么读」与「学习节奏」两节;如果你已经有明确目标,可以直接跳到「分部分章节」按编号定位。
全书结构是:目录 1 篇 + 正文 18 章 54 节,共 55 篇。正文按工程推进的顺序分为六个部分,每一部分解决一类问题,并围绕一个从卷一引擎长出来的研究助理服务 ResearchCopilot 逐步长大。
本卷怎么读
卷一是「把引擎造出来」,本卷是「把引擎装进一个能给别人用的产品」。这个转向意味着阅读方式要换:卷一每一节都能独立跑通,本卷则有前后依赖——第 5 章建的表,第 7 章的 worker 要用;第 3 章定的错误契约,第 4 章的认证要遵守。跳过中间章节直接读后面,会遇到「这个类型哪来的」。
环境前提。 主线语言仍是 Python 3.14(本机实测 3.14.6),配套虚拟环境位于 /tmp/agentbook/venv;TS 侧用 Node 26(本机实测 26.5.0),依赖装在 /tmp/agentbook/ts。与卷一不同,本卷放心使用工程库:pydantic-settings、FastAPI、psycopg、redis、mcp 等都会真正装、真正用,版本号在每一节里都标注为实测值。
两个本地服务。 本卷大量章节需要 Postgres 与 Redis。全卷统一用这两个连接串:
docker run -d --name ab-pg -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=research -p 15435:5432 postgres:17-alpine
docker run -d --name ab-redis -p 16380:6379 redis:7-alpine
注意端口是 15435 与 16380,不是默认的 5432 / 6379——本机这两个默认端口已被占用,用非默认端口是为了不和别的服务打架。每一节需要连库时都会重复给出这两条命令。
假模型仍然为主。 本卷不依赖真实模型 API 就能读完全部内容:所有演示默认走假模型路径,零凭据、零成本、结果确定。真实调用只出现在第 2 章的适配器写法与第 18.3 节的可选冒烟里,且需要你自备密钥、自行决定是否消耗额度。
需要卷一的底子。 本卷复用卷一立下的核心契约:Message / ToolCall / ModelResponse / Model 协议、Tool / ToolRegistry、run() 循环、FakeModel 脚本、AgentLoopError。这些名字在本卷出现时不再重新解释,只说明「服务层怎么用它」。如果这些名字对你陌生,先读卷一第 1、3、4 章。
贯穿项目:ResearchCopilot
ResearchCopilot 是一个研究助理服务:用户提问 → Agent 多跳检索本地语料 → 调用工具(含本地 Postgres 查询)→ 生成带引用的报告;后台 worker 周期跑语料更新与日报。
它被选作贯穿项目,是因为四个工程问题在它身上都自然出现:
- 工具调用天然分层——
search/read/calc只读,save_note/delete_run写入,读写分离不是硬凑的。 - 记忆天然有长短期之分——语料索引是长期,会话是短期,
recall正好可以做成「记忆即工具」。 - 编排天然是 DAG——规划 → 并行检索 → 综合 → 引用校验。
- 评测有客观信号——引用能不能在语料里找到、答案有没有被语料支持,是可以用代码判定的。
本卷每推进一章,ResearchCopilot 就多一块能力:第 3 章有了 API,第 5 章有了持久化,第 7 章有了异步执行,第 10 章有了外部工具生态,第 16 章能被打包部署。
学习节奏:建议 6–8 周
按每周 6–8 小时估算,本卷正文约需 6 周;如果每一节的代码都亲手跑一遍并做课后改动,8 周更从容。
一份可执行的六周计划
| 周 | 章节 | 本周结束时你手上应该有什么 |
|---|---|---|
| 第 1 周 | 第 1–3 章 | 仓库骨架 + 配置对象 + 能跑通的 session/run REST 与 SSE 接口 |
| 第 2 周 | 第 4–6 章 | 认证与租户隔离 + Postgres schema + 缓存与限流 |
| 第 3 周 | 第 7–9 章 | 异步队列与 worker + 并发控制 + TS 前端能流式显示 |
| 第 4 周 | 第 10–12 章 | MCP 工具接入 + 记忆服务 + 评测与质量门 |
| 第 5 周 | 第 13–15 章 | 追踪与指标 + 成本与容量结论 + 输入输出护栏 |
| 第 6 周 | 第 16–18 章 | 双栈镜像与 compose 编排 + 发布流水线 + 故障演练复盘 |
三条阅读路径:
- 系统通读(6–8 周):按顺序读完 18 章,每节代码都跑一遍。这是唯一能完整建立「Agent 服务怎么上线」心智模型的路径。
- 带问题速查(1–2 天):直接跳到「常见问题速查」表,按你的症状找到对应小节。
- 只补工程短板(2 周):如果你已经会写 Agent,但没做过服务化,重点读第 3、5、7、8、13、16 章;第 1、2、4 章可以略读。
与既有 AI 专题的分工
本站已有一批 AI 与 Agent 相关专题,本卷与它们是互补而非重复的关系,边界写在这里以免误读:
- 与 MCP 专题
的分工:该专题覆盖协议规范、Server 实现、传输与授权等完整内容。本卷只写一件事——
minagent作为 MCP client,把外部 Server 暴露的工具接进自己的工具注册表(第 10.1 节)。协议本身怎么写,本卷不碰。 - 与 LLM 专题 的分工:该专题讲 Agent 架构、工具调用、记忆、多 Agent 协作等概念与方法。本卷把这些概念落成可运行的服务代码,重点在工程约束:并发、事务、限流、灰度、故障演练。
- 与 LLMOps 专题 的分工:该专题讲模型侧的运维与部署。本卷讲的是应用侧的运维——评测门、追踪、SLO、成本治理。
- 与 可观测性专题 、Kubernetes 专题 的分工:那两个专题是通用基础设施知识。本卷只讲 Agent 服务在这两套体系里的特有之处:span 树怎么建、GenAI 语义约定填什么字段、队列积压怎么告警。
一句话概括:专题给你概念,本卷给你一台能跑起来的服务。
分部分章节
下面按六个部分列出全部 18 章 54 节,每一行给出编号、标题与一句话说明。
表格里的编号规则是「章.节」,例如 13.2 表示第 13 章第 2 节。点击标题即可进入该节正文。每个部分开头都有一段导读,说明这一部分在工程推进中的位置;如果你只想知道某节讲什么,直接看表格第三列的说明即可。
第一部分:项目地基(第 1–4 章)
这一部分解决「我们要造什么、怎么配、接口长什么样、谁能用」四个问题。读完能有一个跑得起来的 API 服务骨架,带认证与租户隔离。
节奏上这一部分刻意放慢。第 1 章定下的架构边界(引擎 / 服务 / worker / 存储)会约束后面每一章的代码往哪放;第 3 章定下的错误契约会被第 4、15 章反复引用。
| 编号 | 章节 | 说明 |
|---|---|---|
| 1.1 | 需求与用例:3 个核心用例与验收标准 | 定下三个用例与可判定的验收标准,明确「不做什么」 |
| 1.2 | 架构总览:引擎 / 服务 / worker / 存储边界 | 划清四层边界与依赖方向,走一遍请求的完整时序 |
| 1.3 | 仓库与工程骨架:monorepo + TS 包,CI 跑通 lint/test | 建 monorepo 目录树,本地跑通 pytest 与 node –test |
| 2.1 | 分层配置:pydantic-settings 加载与校验 | 四级来源合并与校验,配置对象靠注入而非全局读取 |
| 2.2 | 密钥管理:Anthropic key / DB / Redis 本地注入 | 密钥不落库不进镜像不进日志,缺失即 fail-fast |
| 2.3 | 模型路由与降级:真/假模型开关,离线默认假模型 | 默认假模型,主模型失败时按链降级且降级要透明 |
| 3.1 | REST 设计:session / run / message 资源建模 | 为什么 run 是独立资源,以及 OpenAPI 契约的形态 |
| 3.2 | 流式接口:SSE 推送事件 | 事件 envelope 设计与 SSE / WebSocket 取舍 |
| 3.3 | 幂等、分页与统一错误契约 | Idempotency-Key、游标分页与统一错误响应体 |
| 4.1 | 认证:JWT 与 API Key 中间件 | 两种凭证并行支持,过期与篡改各自返回什么 |
| 4.2 | 授权与租户隔离:workspace 行级隔离 | 跨租户访问返回 404 而非 403,以及 RLS 兜底 |
| 4.3 | 工具权限与审批:高危工具二次确认 | 工具分三档,危险调用挂起等人审批再继续 |
第二部分:数据与性能底座(第 5–6 章)
这一部分解决「状态存在哪、怎么保证不出错、怎么不被打爆」。它把服务从「内存里跑跑」推进到「重启不丢数据、并发不出错、滥用有上限」。
这是全卷最偏基础设施的一段,也是最容易被跳过的一段。但第 5.2 节的原子状态跃迁与第 6.3 节的配额,恰恰是后面第 7 章队列与第 14 章成本治理的地基。
| 编号 | 章节 | 说明 |
|---|---|---|
| 5.1 | Schema 设计:会话/消息/运行/记忆表 + 迁移 | 四张表的 DDL 与迁移版本表,消息体存原始 JSON |
| 5.2 | 事务与并发:run 状态机原子更新、行锁防重复执行 | 先查再改为什么会跑两遍,以及原子抢占怎么写 |
| 5.3 | 查询优化:EXPLAIN 定位慢查询并加索引 | 五万行数据上的真实执行计划对比与索引取舍 |
| 6.1 | Redis 缓存:检索结果与嵌入缓存命中率 | 缓存 key 必须带租户,以及穿透击穿雪崩的 Agent 形态 |
| 6.2 | 语义缓存:相似问题复用与错配检测 | 阈值为什么分不开对错,哪些问题绝不能走语义缓存 |
| 6.3 | 限流与配额:按租户 token 预算的令牌桶 | Lua 原子限流与 token 预算扣减,被限流时 Agent 怎么办 |
第三部分:异步与前端(第 7–9 章)
这一部分解决「长任务怎么跑、并发怎么控、结果怎么实时给人看」。读完服务能异步执行、能在压力下不崩、能给前端逐步显示过程。
第 7 章把「一次 run」从同步请求改造成异步任务,这是服务架构上的一次分水岭;第 9 章是本卷的 TS 落点,用 TypeScript 把事件消费掉、渲染出来、断线后接上。
| 编号 | 章节 | 说明 |
|---|---|---|
| 7.1 | 任务队列:run 丢给 worker 异步执行 | 可靠队列与裸队列的区别,以及 202 返回的完整生命周期 |
| 7.2 | 重试、死信与幂等 | 指数退避加抖动,超过上限进死信并记录原因 |
| 7.3 | 定时与延迟任务:周期语料更新与日报 | 分布式锁的 token 校验与续期,延迟任务用 ZSET |
| 8.1 | 引擎内并发:并行工具与并行子 Agent | TaskGroup 真并发与结果按调用顺序回填 |
| 8.2 | 背压与资源池:信号量限并发 | 并发上限怎么估,生产快于消费时怎么让上游慢下来 |
| 8.3 | 取消、超时与泄漏:慢工具注入验证止损 | 注入慢工具验证超时止损,以及游离任务的泄漏 |
| 9.1 | 事件协议:token/tool/step 统一 schema,TS 与 Python 共享类型 | 判别联合类型与三种共享类型做法的代价 |
| 9.2 | 前端渲染:TS 最小聊天 UI 逐步显示 | 纯函数归约器与渲染器,增量与全量重渲染的取舍 |
| 9.3 | 断线重连:Last-Event-ID 续传不丢步 | 服务端事件缓冲、缓冲淘汰后的 resync 降级 |
第四部分:生态、记忆与质量(第 10–12 章)
这一部分解决「能力从哪来、记住什么、怎么知道变没变差」。读完能接入外部工具生态、把记忆做成服务、用评测门拦住退化。
第 10 章的边界必须说清楚:MCP 在本卷里只作为工具来源被消费,协议与 Server 实现不在本卷范围。第 12 章的质量门是后面第 14、17 章反复引用的兜底机制。
| 编号 | 章节 | 说明 |
|---|---|---|
| 10.1 | MCP 客户端接入:minagent 作为 client 连本地 Server | 远程工具适配成 Tool、命名冲突与错误映射 |
| 10.2 | 工具设计模式:读写分离、幂等、可观测 | 描述即提示词、粒度、幂等键与调用留痕 |
| 10.3 | 工具沙箱:子进程/容器隔离高危工具 | 子进程只能隔离崩溃,容器才能隔离权限 |
| 11.1 | 写入流水线:抽取、去重、冲突消解 | 去重与冲突消解策略,以及重放两次不产生重复 |
| 11.2 | 检索注入:长期记忆接入 run 并量化收益 | 注入位置取舍,以及只改一个变量的对照实验 |
| 11.3 | 记忆治理:TTL、隐私与按用户删除 | 写入侧拒绝清单与级联删除的审计留痕 |
| 12.1 | 评测集与评分器:成功率/引用准确率/成本 | 可版本化评测集的维护纪律与三个评分器 |
| 12.2 | 离线回放与夹具:假模型 + 录制样本确定性回归 | 夹具失配必须报错而不是静默给错响应 |
| 12.3 | CI 质量门:分数下降即拦截 | 基线怎么维护,以及为什么要按样本看退化 |
第五部分:可观测、性能与安全(第 13–15 章)
这一部分解决「线上出问题怎么查、又贵又慢怎么办、被人钻空子怎么办」。读完能回答三个问题:慢在哪、贵在哪、错在哪。
第 13 章的 span 树是第 14 章成本剖析与第 18 章故障演练的数据来源;第 15 章的护栏与第 4 章的权限是一对——一个管「谁能做」,一个管「模型能不能被诱导去做」。
| 编号 | 章节 | 说明 |
|---|---|---|
| 13.1 | 结构化日志与追踪:OTel GenAI 语义约定埋点 | span 树与 contextvars 传播,字段对齐语义约定 |
| 13.2 | 指标与看板:延迟/成功率/成本/工具错误 | 为什么平均值会骗人,以及指标基数陷阱 |
| 13.3 | 告警与 on-call:从 trace 到告警演练 | 告警规则表、SLO 与错误预算、排查动作 |
| 14.1 | 延迟剖析:模型/检索/工具各占多少 | 分阶段计时,以及同步阻塞拖垮异步服务 |
| 14.2 | 成本优化:缓存、路由、小模型降级 + 评测兜底 | 三招降本与误判代价,降本必须过评测兜底 |
| 14.3 | 吞吐与并发压测:找容量上限与拐点 | 四档并发找拐点,以及超时后 QPS 虚高的假象 |
| 15.1 | 输入侧:提示注入与越权工具拦截 | 间接注入最危险,内容与指令必须分离 |
| 15.2 | 输出侧:敏感信息、越狱与幻觉引用校验 | 引用存在不等于引用支持,校验要回语料核对 |
| 15.3 | 审计与合规:不可篡改审计日志 | 哈希链审计日志,与「按用户删除」的张力 |
第六部分:交付(第 16–18 章)
这一部分把前面所有东西装进镜像、发上线、并在出故障时知道怎么办。读完能独立完成一次从构建到上线的完整交付。
第 16 章是本卷第二个 TS 落点(双栈镜像);第 17 章把第 12 章的评测接进流水线;第 18 章的故障演练是对全卷的一次反向检验——前面每一章的防护,都要在这里被主动打破一次。
| 编号 | 章节 | 说明 |
|---|---|---|
| 16.1 | TS 落点三:Python + Node 双栈镜像瘦身 | 多阶段构建与四个瘦身杠杆,为什么 latest 是坑 |
| 16.2 | 本地编排:compose 起 API/worker/postgres/redis | depends_on 不等于依赖就绪,healthcheck 才有用 |
| 16.3 | 配置注入、健康检查与优雅退出 | liveness 与 readiness 的区别,SIGTERM 后要做什么 |
| 17.1 | 流水线:lint/test/评测/构建串联 | 阶段顺序的代价权衡,以及评测必须在 CI 里跑 |
| 17.2 | 灰度与回滚:新提示/新模型小流量 | 提示词也是可发布配置,回滚必须演练过 |
| 17.3 | 版本与迁移:不中断 schema 迁移演练 | expand–contract 五阶段与长事务锁表风险 |
| 18.1 | 容量与架构评审清单 | 五组带通过标准的清单与一份容量估算 |
| 18.2 | 故障演练:模型超时/DB 宕机/队列积压 | 三个受控演练的注入方式与复盘问题 |
| 18.3 | 上线、观察与迭代 + 真实 API 端到端冒烟(可选) | 观察节奏、迭代闭环,以及可选的真实冒烟流程 |
常见问题速查
下表把工程里最常撞上的症状映射到对应小节。左列是「你遇到的现象」,右列是「去哪看」。
| 现象 | 去哪看 |
|---|---|
| 配置散落各处、改一个要改五个文件 | 2.1 分层配置 |
| 不小心把密钥打进了日志 | 2.2 密钥管理 |
| 模型挂了整个服务就挂 | 2.3 模型路由与降级 |
| 前端想边生成边显示 | 3.2 流式接口、9.2 前端渲染 |
| 用户刷新页面答案就重跑了一遍 | 3.3 幂等契约、7.2 重试与幂等 |
| 两个租户互相能看到数据 | 4.2 租户隔离 |
| 模型自己决定删了数据 | 4.3 工具权限与审批、15.1 输入护栏 |
| 服务重启后正在跑的 run 全丢了 | 5.1 Schema、7.1 任务队列 |
| 同一个 run 被执行了两次 | 5.2 原子状态跃迁、7.2 幂等 |
| 查询越来越慢 | 5.3 查询优化 |
| 模型 API 账单爆了 | 6.1 缓存、6.3 配额、14.2 成本优化 |
| 相似问题反复问、反复花钱 | 6.2 语义缓存 |
| 请求进来要等很久才有响应 | 7.1 异步队列 |
| 定时任务被跑了两次 | 7.3 分布式锁 |
| 并发一高服务就卡死 | 8.2 背压与资源池、14.3 压测 |
| 一个慢工具把整个 run 拖死 | 8.3 超时与取消 |
| 断线重连后少了一段回答 | 9.3 Last-Event-ID 续传 |
| 想让 Agent 用上外部工具生态 | 10.1 MCP 客户端接入 |
| 模型老是选错工具 | 10.2 工具设计模式 |
| 模型写出的代码执行了危险操作 | 10.3 工具沙箱 |
| Agent 记不住上次说过的偏好 | 11.1 写入流水线、11.2 检索注入 |
| 用户要求删除自己的数据 | 11.3 记忆治理 |
| 改了提示词不知道效果变好还是变差 | 12.1 评测集、12.3 质量门 |
| CI 里不敢调真模型 | 12.2 离线回放与夹具 |
| 线上报错但不知道慢在哪一步 | 13.1 追踪 |
| 告警太多、真的出事反而没人看 | 13.3 告警与 on-call |
| 不知道该扩几台机器 | 14.3 压测、18.1 容量估算 |
| 检索回来的文档里藏着指令 | 15.1 输入护栏 |
| 答案里的引用是编的 | 15.2 输出护栏 |
| 镜像太大、构建太慢 | 16.1 双栈镜像瘦身 |
| 容器起来了但连不上数据库 | 16.2 compose 编排、16.3 健康检查 |
| 发版后想快速回退 | 17.2 灰度与回滚 |
| 改表结构不敢上线 | 17.3 版本与迁移 |
| 想知道服务能扛多少量 | 18.1 容量评审、18.2 故障演练 |
小结
这一页的核心信息可以浓缩成三句话:
- 结构上,全书是「目录 1 篇 + 六部分 18 章 54 节」,共 55 篇,围绕研究助理服务
ResearchCopilot逐章推进。 - 路径上,系统通读 6–8 周;有明确症状可以查「常见问题速查」;已会写 Agent 但缺工程经验的话,重点读第 3、5、7、8、13、16 章。
- 方法上,本卷坚持「假模型为主、真跑为据、每节可复现」——正文里出现的每一个输出,都是在本机真实执行过的结果;跑不了的部分会明确标注原因,而不是编一个好看的数字。
本卷之后是《AI Agent 高级编程》:同一个项目,改用 PydanticAI、Claude Agent SDK、OpenAI Agents SDK、smolagents 等框架重写,并补齐持久化执行、计算机使用、跨 Agent 协议与训练相关的内容。如果你已经能独立完成本卷的交付流程,可以直接进入卷三。
最后再重复一句:本页不需要从头读到尾。它的作用是「在你需要的时候,三秒钟内把你送到正确的那一节」。把这一页加进书签,比记住任何章节编号都有用。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。