《AI Agent 高级编程》11.3 全景回顾:从零到框架的完整路径与展望

三卷本收官:把卷一的 minagent(从零手写)、卷二的 ResearchCopilot(工程化服务)与卷三的框架重写与生产化串成一条线,用一张「能力 × 卷 × 视角」总表看清各自的位置与取舍,回顾卷三 11 章各自解决了什么,并给出从零到框架的完整路径与下一步展望。

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 + TypeScriptPython 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 确定性重放
多 Agentsupervisor/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 适配层 + 选型打分
2PydanticAI 重写问答路径Agent/RunContext + 输出模型 + 校验重试
3Claude Agent SDK 搭研究任务subagent/hooks/权限/session + allow/deny 审批
4另两家框架与同题对照handoff/guardrails + CodeAgent + 三框架跑分
5读框架源码LangGraph 图执行器 + run 循环 + subagent 调度
6Durable Execution崩溃重启 + 确定性重放 + 与自研检查点对照
7计算机使用与浏览器 Agent截图/坐标动作 + Playwright + 沙箱与确认
8A2A 跨 Agent 协议Agent Card/Task + 与 MCP 分工 + 跨语言协作
9Agent 强化学习轨迹/奖励/信用分配 + 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 真模型量化差距 · 下一节:回到目录 。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「agent」更多文章

  1. 《AI Agent 高级编程》目录
  2. 《AI Agent 高级编程》11.2 真实 API 冒烟:假模型 vs 真模型量化差距
  3. 《AI Agent 高级编程》11.1 平台化:Agent 注册、版本与配额