11.3 全景回顾:从零到框架的完整路径与展望
这是全卷最后一节,也是三卷本的收官。前两节把平台化与真假对照做完,技术内容到此为止。这一节换个视角:不再推进任何代码,而是回头把三卷连成一条线,看清「为什么这样走、每一步换来了什么、还差什么」。如果你只读一节就想理解这套书的骨架,就是这一节。
本节把「三卷各自做了什么」推进到「三卷合起来是什么」:用一张「能力 × 卷 × 视角」总表对齐 minagent、ResearchCopilot 与框架重写三条线,回顾卷三 11 章的推进路径与取舍,并给出从零到框架的完整地图与展望。本节不含新代码,是全书的总索引与结语。
11.3.1 三卷一条线:minagent → ResearchCopilot → 框架重写
三卷讲的其实是同一件事的三个尺度:
- 卷一《AI Agent 开发入门》(目录
):从零手写引擎
minagent,一个二十行的循环长成涵盖消息、工具、记忆、编排、评测、服务的完整模块。视角是**「Agent 是怎么跑起来的」**——把每一层都拆开、每一行都自己写。 - 卷二《AI Agent 工程实战》(目录
):把引擎做成服务
ResearchCopilot——多跳检索、带引用报告、认证、租户隔离、队列、可观测、成本治理。视角是**「Agent 怎么稳定地服务别人」**——把单机能跑的东西变成生产可用的系统。 - 卷三《AI Agent 高级编程》(本卷):用主流框架(PydanticAI / Claude Agent SDK / OpenAI Agents SDK / smolagents / LangGraph)重写同一件事,并做生产化加固。视角是**「框架替你做了什么、你又让渡了什么」**——先读懂别人的实现,再决定哪些该用、哪些该自研。
三卷的读者对象不同,但契约是同一套:Message / ToolCall / ModelResponse / RunResult 从卷一到卷三字段名一字未改,FakeModel.calls 始终是 (完整消息列表, 工具 schema 列表) 的二元组。这不是巧合,而是刻意的设计——只有契约稳定,三卷之间才能互相引用、互相验证。你在卷一写过的断言,到卷三换成框架后依然能对着同一套消息形状写。
| 维度 | 卷一 | 卷二 | 卷三 |
|---|---|---|---|
| 贯穿项目 | minagent(引擎) | ResearchCopilot(服务) | 框架重写 + 生产化 |
| 主线语言 | Python 3.14(TS 对照) | Python 3.14 + TypeScript | Python 3.14 + TS |
| 核心问题 | Agent 怎么跑起来 | 怎么稳定地服务别人 | 框架替我做多少、我让渡多少 |
| 交付物 | 可运行的引擎库 | 可上线的服务 | 可治理的多 Agent 平台 |
| 默认模型 | 手写假模型 | 真/假开关,默认假 | 框架 TestModel/FunctionModel |
三卷的版本口径也一脉相承:主线 Python 3.14,假模型优先,真实 API 只出现在明确标注「可选」的位置。这条纪律从卷一卷首贯穿到本卷的 11.2 节,从未放松。
11.3.2 能力 × 卷 × 视角:一张总表
把三卷的每一项能力对齐到同一张表,就能看清各自的覆盖范围与视角差异。下表是全书的骨架索引:
| 能力 | 卷一 minagent(从零手写) | 卷二 ResearchCopilot(工程化服务) | 卷三(框架重写 + 生产化) |
|---|---|---|---|
| 消息契约 | 定义 Message/ToolCall/Role | 原样复用,落库为原始 JSON | 映射到各框架的消息 part |
| 模型接入 | Protocol + 自写假模型 | 模型路由与降级、真/假开关 | 框架内置 TestModel/FunctionModel |
| 工具 | Tool/ToolRegistry + 参数校验 | MCP 客户端接入、工具沙箱 | 框架工具装饰器 + 权限审批 |
| 编排 | 手写图引擎:节点/边/状态 | DAG 检索流水线、队列异步 | LangGraph 图执行器与检查点 |
| 记忆 | 短期缓冲 + 长期检索注入 | 记忆服务、写入流水线、治理 | 框架记忆能力 + 依赖注入 |
| 检索 | 本地嵌入 + 混合检索 + 引用 | Postgres 持久化 + 缓存 | 检索作为框架 tool 复用 |
| 评测 | 确定性测试 + 评测集打分 | 评分器 + CI 质量门 | 假模型 vs 真模型量化对照 |
| 可观测 | 手写 span 树 + 结构化日志 | OTel GenAI 语义约定埋点 | 三框架 trace 归一 OTel |
| 成本 | token 用量核算 | 缓存/路由/小模型降级 | 成本延迟治理 + 评测兜底 |
| 安全 | 幂等、超时、取消 | 输入输出护栏、审计日志 | 注入/越权/供应链纵深 |
| 持久化 | 检查点与快照 | 事务、行锁、schema 迁移 | Durable Execution 确定性重放 |
| 多 Agent | supervisor/worker、消息总线 | 租户隔离、并发控制 | A2A 协议跨 Agent 协作 |
| 计算机使用 | 不涉及 | 不涉及 | 截图/坐标动作 + 浏览器 Agent |
| 训练 | 不涉及 | 不涉及 | RL 问题设定 + SFT→RL + 训 vs 调 |
| 平台化 | 不涉及 | 单服务限流配额 | Agent 注册 / 版本 / 配额 |
读这张表的正确方式不是「卷三最强」,而是看每一列在回答哪一类问题。卷一的每一格都能追问到「这一行为什么这么写」;卷二的每一格都能追问到「生产环境里它会不会出问题」;卷三的每一格都能追问到「这套框架替我做了多少、我让渡了什么」。三列合起来,才是完整的 Agent 工程心智模型。
还有一处容易忽略的一致性:三卷对「同一个概念」用的是同一个词。工具调用在卷一叫 ToolCall、在卷二是落库的 tool_call、在卷三映射成框架的消息 part,但底层语义始终是「模型请求执行一个具名函数并带上参数」。正是这种术语上的统一,让你在换框架时不会被新名词带偏——你会先问「它对应我熟悉的哪个概念」,而不是从零建立理解。
11.3.3 从零到框架:每条路径的取舍
既然三卷都在讲同一件事,为什么不全用框架?因为**「从零」和「用框架」解决的是不同阶段的问题**。下表把三种做法放在一起:
| 做法 | 最适合的阶段 | 你得到的 | 你让渡的 |
|---|---|---|---|
| 从零手写(卷一) | 学习 / 需要极致可控 | 完全理解每一层、零依赖、契约自主 | 开发慢、轮子要自己造 |
| 工程化服务(卷二) | 要上线 / 要服务别人 | 可靠性、可观测、可运营 | 复杂度高、基建成本高 |
| 用框架重写(卷三) | 迭代快 / 生态重要 | 少写代码、白送能力、生态接入 | 接受别人的消息契约与错误语义 |
这三条不是互斥的阶段,而是可以按需混用的手段。一个成熟团队的真实状态往往是这样:核心循环用框架快速搭(卷三),但把可观测、成本、安全这几层牢牢握在自己手里(卷二的经验),并且在读不懂框架行为时能回到源码、甚至回到自己写过一遍的原理(卷一)。「从零」给你的不是「什么都自己写」,而是「有能力判断什么时候不必自己写」。
这也是为什么本卷每一节都以「这套框架替你做了什么、你又让渡了什么」收尾——它不是修辞,而是本卷唯一的核心问题。四家框架(PydanticAI 、Claude Agent SDK 、OpenAI Agents SDK 、smolagents )对同一个问题的回答各不相同,但都遵循同一条规律:框架替你实现的越多,你让渡的控制权就越多;选型的本质是在这两者之间按阶段做权衡。
用同一道题「查 smolagents 并给结论」把卷一与卷三的写法并排放在一起,规律会变得非常直观。卷一风格是手写最小循环:
# 卷一风格:消息契约、假模型、循环全部自己写
class FakeModel:
def __init__(self, script):
self.script, self.calls, self.n = list(script), [], 0
def complete(self, messages, tools):
self.calls.append((list(messages), list(tools))) # 二元组口径
step = self.script[min(self.n, len(self.script) - 1)]
self.n += 1
if isinstance(step, str):
return ModelResponse(Message("assistant", step))
return ModelResponse(Message("assistant", tool_calls=step), stop_reason="tool_use")
def run_minagent():
model = FakeModel([[ToolCall("c1", "search", {"query": "smolagents"})],
"结论:用 CodeAgent。"])
messages = [Message("user", "查 smolagents")]
tools = [{"name": "search"}]
for _ in range(8):
resp = model.complete(messages, tools)
messages.append(resp.message)
if not resp.message.tool_calls:
return resp.message.content, len(model.calls)
for tc in resp.message.tool_calls:
messages.append(Message("tool", "[hit] 3 条", tool_call_id=tc.id))
raise RuntimeError("未收敛")
卷三风格则是把这三件套交给框架:
# 卷三风格:Agent 循环、工具执行、消息管理都由 PydanticAI 承担
from pydantic_ai import Agent
from pydantic_ai.models.function import FunctionModel, AgentInfo
from pydantic_ai.messages import ModelResponse, TextPart, ToolCallPart
def run_pydanticai():
def fn(messages, info: AgentInfo):
done = sum(1 for m in messages for p in getattr(m, "parts", [])
if type(p).__name__ == "ToolReturnPart")
if done == 0:
return ModelResponse(parts=[ToolCallPart("search", {"query": "smolagents"})])
return ModelResponse(parts=[TextPart("结论:用 CodeAgent。")])
agent = Agent(FunctionModel(fn), instructions="先检索再给结论")
@agent.tool_plain
def search(query: str) -> str:
"""检索。"""
return "[hit] 3 条"
r = agent.run_sync("查 smolagents")
return r.output, r.usage.requests
两段代码在本机 venv3 里真跑,输出完全一致:
minagent : output='结论:用 CodeAgent。' steps=2
pydantic-ai : output='结论:用 CodeAgent。' steps=2
同一道题、同一个结论、同样 2 步。差别在代码量与可见度:卷一版要自己维护消息契约、假模型、循环与收敛判断;卷三版只描述「假模型吐什么」与「工具有哪些」,循环交给框架。代价同样清楚——卷三版里你看不到「循环怎么转、消息怎么攒」,那些被框架收进了 run_sync 内部。这正是「从零」的价值:读过卷一版的人,才知道框架那几十行里藏了什么。
11.3.4 卷三十一章回顾:每章解决了什么
把本卷 11 章的推进路径压成一句话表,方便你定位回看:
| 章 | 解决了什么 | 关键落点 |
|---|---|---|
| 1 | 框架全景与统一抽象 | 四层定位图 + Protocol 适配层 + 选型打分 |
| 2 | PydanticAI 重写问答路径 | Agent/RunContext + 输出模型 + 校验重试 |
| 3 | Claude Agent SDK 搭研究任务 | subagent/hooks/权限/session + allow/deny 审批 |
| 4 | 另两家框架与同题对照 | handoff/guardrails + CodeAgent + 三框架跑分 |
| 5 | 读框架源码 | LangGraph 图执行器 + run 循环 + subagent 调度 |
| 6 | Durable Execution | 崩溃重启 + 确定性重放 + 与自研检查点对照 |
| 7 | 计算机使用与浏览器 Agent | 截图/坐标动作 + Playwright + 沙箱与确认 |
| 8 | A2A 跨 Agent 协议 | Agent Card/Task + 与 MCP 分工 + 跨语言协作 |
| 9 | Agent 强化学习 | 轨迹/奖励/信用分配 + SFT→RL + 训 vs 调 |
| 10 | 生产化加固 | trace 归一 OTel + 成本延迟治理 + 安全纵深 |
| 11 | 平台化收官 | Agent 注册/版本/配额 + 真假对照 + 全景回顾 |
这 11 章的顺序本身也是路径:先看清全景(1)→ 用框架重写(2–4)→ 读源码(5)→ 补可靠性(6–7)→ 跨 Agent(8)→ 训练(9)→ 加固(10)→ 平台化(11)。如果你是按需跳读的,这张表就是你的回看索引。
值得留意的是这条路径里「读源码」(第 5 章)的位置——它被刻意放在「用框架」(2–4)之后、「补可靠性」(6–7)之前。原因很简单:只有在亲手用过框架、被它的行为困惑过之后,读源码才有具体的问题可答。上来就读源码,你会在几千行实现里迷路;先用它、再读它,你才知道该找哪一段。这个顺序本身就是「从零到框架」路径的一部分。
如果你只打算按需读几节,建议至少把第 1、5、11 章串起来读一遍——第 1 章给你全景,第 5 章给你「框架内部长什么样」,第 11 章给你「多个 Agent 怎么收口」。这三章合起来,是全卷最短的一条「框架心智模型」路径。
11.3.5 你现在能做什么
读完三卷,你应该具备这几种能力,它们都能被具体验证:
- 从零写出一台能跑的 Agent 引擎,并对它的每一轮循环做确定性断言(卷一)。
- 把它做成一个能上线、能观测、能控成本的服务,扛得住重启、并发与滥用(卷二)。
- 读懂主流框架的源码调用链,判断某个行为是框架实现还是你的用法问题(卷三第 5 章)。
- 在「用框架」和「自研」之间做有依据的取舍,而不是凭喜好或跟风(本卷全篇)。
- 给多 Agent 做平台化治理:注册、版本、配额,一处显式、可测、可查(第 11.1 节)。
- 诚实地量化「假模型 vs 真模型」的差距,不拿假模型的绿灯冒充上线质量(第 11.2 节)。
这几条里,最容易被低估的是最后一条。「不假装跑过」不是谦虚,而是工程判断力的底线——它决定了你交付的到底是「我觉得能行」,还是「我量过,差距在这里,风险在这里」。
把这六条连起来看,会发现它们对应的是同一种能力:在「少写代码」和「少让渡控制权」之间,按当前阶段做有依据的取舍。会写引擎的人很多,会用框架的人也很多,但能在两者之间来回切换、并且清楚每次切换代价的人很少——那正是这套书想训练的东西。
11.3.6 展望:还没解决的问题
诚实地说,三卷讲完仍有几块硬骨头没被完全啃下,它们正是下一步的方向:
- 评测的自动化:本卷的真假对照仍需人工授权、人工填表。如何让「内容风险」像「结构问题」一样自动回归,是开放问题。
- 多 Agent 的协调成本:A2A 解决了「怎么通信」,但没解决「怎么分工才不互相拖累」。协作拓扑的自动选择仍靠人判断。
- RL 的落地门槛:第 9 章讲清了问题设定与决策清单,但真训练仍需要数据、算力与基础设施,不是每支团队都具备。
- 成本与质量的动态平衡:路由、缓存、降级都在降本,但「降到什么程度质量会塌」缺乏通用答案,只能靠评测兜底。
- 框架之间的可迁移性:本卷证明「统一抽象 + 适配层」可行,但每换一家框架,消息契约、错误语义、可观测格式仍要重新对齐。
- 长任务的确定性与成本的张力:Durable Execution 让长任务可恢复,但每一步都要落盘、都要可重放,存储与延迟的代价随步数线性增长。
这些不是本卷的疏漏,而是这个领域此刻真实的边界。把它们写出来,比假装「已经全解决」更有用。判断一本书有没有帮到你,标准很简单:读完它,你能不能自己识别出下一个没被解决的问题,而不是只会复述已有的结论。
这六个方向里,哪一个最先被解决,取决于整个行业往哪走;但哪一个最该由你来解决,取决于你手头的项目。书能给你的,是识别问题的方法与验证结论的工具,剩下的判断得你自己做——这也是为什么三卷从头到尾都在强调「动手跑一遍」,而不是「记住这个结论」。
11.3.7 三卷常见问题速查
最后给一张「你的问题去哪一卷」的速查表。它把三卷的入口对齐到具体的困惑上,方便你在读完之后随时回查:
| 你的问题 | 去哪一卷 / 哪一节 |
|---|---|
| Agent 到底是怎么跑起来的 | 卷一:从零手写的 run() 循环 |
| 不想联网、不想花钱怎么学 | 卷一:1.3 可编程假模型 FakeModel
;卷三用框架内置 TestModel/FunctionModel |
| 怎么让 Agent 调用我自己写的函数 | 卷一:工具即函数;卷三:框架工具装饰器 |
| 崩溃后不想从头再跑 | 卷一:检查点;卷三:6.1 为什么需要持久化执行 |
| 怎么判断改动有没有让效果变好 | 卷一:评测集;卷三:11.2 真假模型量化差距 |
| Agent 服务怎么上线、怎么抗并发 | 卷二:队列、事务、限流、压测 |
| 怎么控制成本、慢在哪 | 卷二:成本优化与延迟剖析;卷三:10.2 成本与延迟治理 |
| 被人钻空子、提示注入怎么办 | 卷二:输入输出护栏;卷三:10.3 安全纵深 |
| 该选哪个框架、会不会被锁定 | 卷三:1.3 选型方法 |
| 框架内部到底怎么实现的 | 卷三:第 5 章源码剖析 |
| 多个 Agent 怎么协作 | 卷三:8.1 A2A 协议 |
| 要不要训练自己的模型 | 卷三:9.3 何时该训、何时调提示 |
| 多个 Agent 怎么统一治理 | 卷三:11.1 平台化 |
这张表的关键不在「答案」,而在每一行都指向一个可运行、可验证的落点。三卷的写法一致:不停留在概念,而是把你送到那一节,让你自己跑一遍、看输出、改一改。
最后提醒一点:这张表里「去哪一卷」不是排他的。真实问题往往横跨三卷——比如「我的 Agent 又贵又不准」,答案同时在卷一(评测方法)、卷二(成本优化)和卷三(真假对照)。三卷的价值不在于让你记住答案在哪,而在于让你有能力把一个模糊的问题拆成可分别验证的几个子问题。
11.3.8 收官
回到最初的问题:从零到框架,到底该怎么走? 三卷给出的答案是一条螺旋——先手写一遍(卷一),再工程化一遍(卷二),最后用框架重写并加固一遍(卷三)。每转一圈,你对「Agent 是什么」的理解都更具体一层:第一圈懂原理,第二圈懂工程,第三圈懂取舍。
如果你是从卷一读到这里,你已经走完了这条螺旋。如果你是从卷三进来的,建议回头补卷一的前几章——没有亲手写过一遍 run() 循环的人,读框架源码时很难分辨「哪些是本质、哪些是实现细节」。这也是本卷反复强调「引用结论、不重复展开」的原因:卷三的每一节都站在前两卷的肩膀上。
回到那句贯穿全卷的问句——这套框架替我做了什么、我又让渡了什么——现在你手里已经有了一整套回答它的工具:会用假模型量结构、会用真模型量内容、会给多 Agent 做注册与配额、会在失控前留一道授权门。工具会变,框架会更替,但这套「先量清楚、再下结论」的方法不会过时。带上它,你就可以开始写属于你自己的那台引擎了。
书的正文到此结束。想回看三卷的入口,可以回到 《AI Agent 高级编程》目录 、《AI Agent 开发入门》目录 与 《AI Agent 工程实战》目录 ,或从书稿书架 进入全部系列;想按专题继续深挖,站内的 AI 专题 、LLM 专题 、MCP 专题 、LLMOps 专题 与本卷互补。把三卷放进书架,是继续往下走的起点,而不是终点。
阅读导航:上一节:11.2 真实 API 冒烟:假模型 vs 真模型量化差距 · 下一节:回到目录 。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。