← 返回学习资料

AI Agents in Depth · 全书学习专题

Source · 本页为通读笔记,内容整理自 《深入理解 AI Agent》(AI Agents in Depth)· 李博杰 开源在线书籍 bojieli.github.io/ai-agent-book  ·  Apache 2.0  ·  引言 + 10 章 + 后记
阅读原书
10章正文
109个动手实验
1个核心公式
5个贯穿设计模式
15个语种版本

这本书回答一个问题:把一个 Agent 从「能跑的 Demo」做成「可靠的产品」,中间差了什么。它的答案不是某个框架或某个模型,而是一套围绕模型构建的工程体系。

全书唯一的核心命题

Agent = LLM + 上下文 + 工具

= 大脑 + 眼睛 + 手脚

全书立场:方向认同,节奏务实

对于「模型变强后会不会吃掉 Harness」这个问题,书中的回答是:方向上不怀疑模型会持续内化 Harness(工具调用、长程规划都曾靠外部编排,如今已是原生能力);但节奏上这个过程远比想象中慢——训练以月计,模型也无法一次内化真实业务中所有约束与偏好。

模型此刻的能力边界,就是 Harness 此刻的价值所在。模型每内化一层,Harness 就卸下一层,转而兜底新的能力前沿。

核心公式与全书地图

书中给出两个公式。它们不是并列的两套骨架,而是同一事物在不同抽象层次上的描述:

生产形态下的完整展开
Agent   = Model + Harness
Harness = 上下文管理 + 工具接口 + 约束 + 验证 + 纠正
Agent  ↔ Environment            # Agent 与环境是交互的两方,不是彼此的组成部分

最小 Demo 只需 Model + 能构造上下文、暴露工具的 Harness;生产系统还要在同一边界内加入约束、验证和纠正。

ENVIRONMENT 文件 · 数据库 · 网页 · 用户 其他 Agent · 物理 / 仿真世界 状态与转移规律属于环境 Harness 可以创建、隔离 或代理一个环境 但不因此包含环境自身 AGENT 边界 Model 策略决策 LLM HARNESS · 模型之外、环境之内 上下文管理 工具接口 让 Agent 能做事 约束 验证 纠正 让 Agent 不做错事 行动 观察
两个抽象层次:外层是 Agent ↔ Environment 的交互边界,内层是 Agent 的 Model–Harness 结构
一条最容易被误解的边界

Harness 不是「模型之外的一切」,而是 Agent 边界内、模型之外的运行与治理层。工具定义、调用适配器、沙箱的权限与重置机制属于 Harness;沙箱内随行动变化的文件和进程、外部数据库、网页、用户及物理世界属于 Environment。

物理部署位置不能决定概念归属——即使仿真环境与 Agent 运行在同一进程中,它仍然是 Environment。

全书三段结构

PART 1 · 构建(第 2–6 章) 在第 1 章建立的坐标系上,逐一展开 Agent 的构成要素 2 上下文工程 3 记忆与知识库 4 工具 5 Coding /通用 Agent 6 交互:模态与时机 PART 2 · 评估与进化(7–9) 怎么知道建对了、怎么持续变好 7 评估 8 后训练 9 持续进化 PART 3 从单个到多个 10 多 Agent协作
第 1 章是全书的概念地图;第 7–9 章构成「发现循环」的证据 → 提案 → 实验三段

五个工程范式:层层包含,而非彼此替代

GRAPH 工程 · 2026-07 LOOP 工程 · 2026-06 HARNESS 工程 上下文工程 提示工程
提示工程 ⊂ 上下文工程 ⊂ Harness 工程 ⊂ Loop 工程 ⊂ Graph 工程——单个 Agent 循环正是执行图中的一个节点
范式关注范围核心问题
提示工程输入给模型的自然语言指令怎么把话说清楚
上下文工程模型能看到的所有信息模型能看到什么
Harness 工程Agent 如何组织模型运行并与环境交互怎么可靠地做事
Loop 工程跨轮次的持续自主运转谁发现下一件该做的事、何时才算真正完成
Graph 工程显式执行图:节点承担能力,边规定路由整个流程如何编排与持久化
这个演进弧线指向同一个判断

当各家模型的能力越来越接近、不再是决定性差异时,竞争优势就转移到了模型之外的工程实践。书中给出的例证:LangChain 在 Terminal Bench 2.0 上把得分从 52.8% 提到 66.5%(排行榜 30 名开外跃至前 5),改变的不是模型,而是 Harness。

CH 1AI Agent 入门

本章是全书的概念地图:快速引入核心公式、运行循环、工程框架与设计模式,为后续章节提供统一的术语和参照坐标。
实验 1-1 ~ 1-4
思考题 10 道

三大组件与两个可扩展的空间

直觉理解实现组件学术概念含义
大脑LLM策略(Policy)面对当前信息,从所有可选行动中挑出最合适的一个
眼睛上下文构造观察与历史把环境返回的观察与已有历史组织成决策所需的信息
手脚工具与适配器观察/行动接口规定可读取哪些观察、发出哪些行动,以及接口格式
全书最重要的杠杆

在底层模型固定时,提升 Agent 任务表现最主要的系统工程手段,往往就是重新定义或扩展观察空间与动作空间——用本书的术语说,就是扩展上下文和工具。

许多看似需要「更聪明模型」的问题,其实只是接口问题:把任务所需数据纳入上下文,或把所需操作封装成工具,原本不可解的任务就可能变得可解。

两个产品例证:Manus 把 Deep Research、Coding、Computer Use 三条原本独立的路线合并进同一个生产级 Agent——取三类 Agent 观察空间与动作空间的并集;OpenClaw 又把接口延伸到用户的数字生活(多种消息渠道 + 本地 Gateway 连接云盘与本地文件系统)。

上下文的五个组成部分

① 系统提示词
+
② 工具定义
=
静态前缀
  |  
③ 用户消息
+
④ 模型回复
+
⑤ 工具结果
=
轨迹

Agent 的上下文 = 静态前缀 + 轨迹。ReAct 循环的本质,就是通过不断向轨迹追加内容来让模型持续推进任务。

消融实验(1-1)最反直觉的两个发现

① 上下文组件并不等价。去掉工具定义或工具执行结果会直接夺走行动与闭环能力;去掉思考过程与历史消息的代价,则取决于其承载的信息能否从当前观测重建。

② 「给出了回答」不等于「完成了任务」。上下文残缺时典型的失败不是报错退出,而是一个看上去毫无破绽的答案——数据其实来自参数记忆,排版与真正基于观测的答案一模一样。

编排模式:从简单到复杂

WORKFLOW
工作流:确定性编排 执行路径由代码预先写死,LLM 只在节点内部工作。

优势:严格流程控制(「付款前不能预订」由代码强制);安全性——攻击面被限制在单个节点内。
局限:缺乏变通,预设未覆盖的情况无法灵活应对。
AUTONOMOUS
自主 Agent:动态决策 执行路径由 Agent 根据环境反馈实时决定,本质上就是在循环中使用工具的 LLM。

优势:适合开放式问题,能识别失败并调整策略。
局限:成本更高、有复合错误风险,必须设计明确的停止条件。
Harness 很重要,不等于 Harness 越复杂越好

书中给了一个具体的反面例子:为「从百万条聊天记录提炼记忆」设计 Agent 时,AI 很容易迅速画出一条看似严谨的流水线(切分 → 提取 → 核验 → 身份解析 → 整理 → 合并复核 → 事实图 → 覆盖账本 → 不可变版本)。每个部件单看都有道理,组合起来却非常低效、不可靠——复杂工作流的执行拓扑是固定的,遇到新例外就继续加节点,架构越来越复杂、通用性越来越差,模型原本可以根据上下文处理的语义判断,反而被工作流写死了。

Manus 官网的概括是:“Less structure, more intelligence.” 好的结构不是替 Agent 预演全部思考,而是守住边界,并把边界内的决策空间还给模型。

构建有效 Agent 的三个核心原则

🎯
保持简单
从最简方案开始,只在必要时增加复杂度。每多一层抽象都会成为以后调试时新的盲区。
🔍
保持透明
明确显示规划步骤、执行日志与决策轨迹。黑箱里的错误一旦发生,外部观察者既无法定位也无法纠正。
🔌
设计好 ACI
从 Agent 视角而非程序员视角设计接口。容易误用的地方要从设计上让错误无法发生——制造业称之为防呆(Poka-yoke)。
1-1★★上下文的关键作用(消融)
1-2★Kimi K3 原生 Agent 能力
1-3★GPT-5.6 原生 Deep Research
1-4★文生图工作流 vs 原生生成
实验 1-4 揭示的规律

Harness 里那些给模型能力短板打补丁的部分,会随着模型变强被模型自己内化。仅在第一章里这样的事就发生了好几轮:few-shot 示例与「一步一步思考」被指令微调和推理模型内化;输出格式修复、JSON 解析容错被结构化输出和原生工具调用内化;文生图的提示词改写被原生多模态能力吃掉。每一轮内化,消灭的都是「翻译」和「脚手架」这类适配层代码。

CH 2上下文工程

上下文决定 Agent 的能力上限。本章处理一次任务之内的状态更新与上下文腐化。
实验 2-1 ~ 2-10
思考题 9 道
一句话立论

一个中等能力的模型配上精心组织的上下文,往往能胜过一个顶级模型在信息匮乏下的盲目摸索。

OpenAI 研究员翁家翌的概括更直接:「人和模型一样,最重要的是 Context。」他还指出「团队合作中最大的问题也是 context 的不一致」,而「AI 短时间内无法取代人的最大原因也是 context——因为 AI 跟人并不在同一个环境里面」。

这不只是技术问题,更是组织问题

大多数团队的关键知识都是隐性的:架构决策只有老员工记得,业务规则靠口口相传,重要背景锁在私聊记录里。如果团队本身就是一个信息黑洞,再好的 Agent 也无计可施。

因此有一个判断:对远程工作友好的团队往往也对 AI Agent 友好。Linux 内核就是范例——高度透明、文档驱动,信息是公开的、可检索的、结构化的。构建 AI 原生团队,首先是一场文档化运动,而不只是部署新工具。

KV Cache:三条必须记住的结论

本章以一个真实故障开场:某团队为了让 Agent「知道」当前时间,在系统提示词里加了一行时间戳。第二天首 token 延迟从 0.5 秒涨到 3–5 秒,月度推理账单几乎翻了一倍。

01
系统提示词和工具定义一旦确定就不要改。任何改动,哪怕多一个空格,都可能改变 token 序列,使首个不同 token 及其后的缓存无法复用;改动越靠前,影响越大。
02
动态信息永远追加到末尾——时间戳、用户状态等变化内容,作为新消息追加到对话末尾,而不是修改已有的系统提示词。
03
使用标准 API 格式,不要自行拼接消息。根本问题不在缓存,而在于偏离了模型训练时见过的格式,会削弱多步思考能力。
缓存不只是优化手段,而是架构约束

Claude Code 的实践揭示了一个深层模式:当 Prompt Cache 的经济效益足够显著时,缓存一致性会反过来主导系统的架构选择:

  • 提示词结构由缓存边界决定——每个运行时条件若放在缓存边界之前,就会把缓存键的变体数量翻一倍(N 个二值条件产生 2^N 种组合)
  • 子 Agent 必须与父 Agent 字节级对齐——提示词、工具定义、模型配置、消息前缀、思考配置逐字节匹配才能命中缓存
  • 工具结果的替换字符串在首次出现时就被冻结——即使会话重启也使用完全相同的替换串

缓存经济性不是事后优化,而是前置约束。

Agent 状态栏:把隐式状态变成显式知识

理论基础:上下文窗口是一台只有一半的检索引擎

它「检索」的这一半非常强——你问什么,注意力就能从成千上万个 token 里把相关记录捞出来。但它缺了另一半:没有「提炼层」。上下文里的东西从来不会被自动数一遍、建个索引或就地总结成一条结论。

任何「关于这些内容的结论」——一共多少条、有没有超标、进展到哪一步——模型每次要用都得从原始记录里现算一遍,而代价随上下文堆积量上涨。

典型场景:系统提示词要求「拨打每个商家不超过 3 次」,但打了 3 次之后 Agent 经常数不清,又打了第 4 次甚至陷入循环。解法是在工具结果中直接标明「本次是第 3 次呼叫该商家」。

状态更新的两种实现做法缓存代价
每轮替换移除上一轮状态,在末尾追加最新状态失效范围只覆盖上次注入后新增的消息,整个前缀仍可复用
持久追加状态消息永久留在轨迹中,每轮只追加新状态对缓存完全友好,但陈旧状态会累积占用 token

取舍公式(设状态 S token、两次更新间新增后缀 R token、更新 N 次、缓存单价为普通输入的 α 倍):当 αSN/2 < (1−α)R 时倾向持久追加,否则倾向每轮替换。

状态栏的两条维护纪律

① 状态栏尽量用代码维护。实验发现模型几乎无条件地相信状态栏——你写「打了 3 次电话」,它就当真是 3 次,不会自己重算。这也意味着状态栏投毒风险值得认真对待。

② 谨慎删除原始上下文。状态栏是对原始上下文的一次有损投影,只提前算了「你预想会被问到」的维度。一旦有问题涉及未计算的维度,仅保留状态栏会导致准确率断崖式下降。

Agent Skills:渐进式披露

第一层 · 元数据
name + description,常驻
→
第二层 · 核心流程
SKILL.md 按需加载
→
第三层 · 细则
引用的子文档
为什么「追加到末尾」不破坏缓存

这是 KV Cache 前缀性质的直接推论:因果注意力决定了每个 token 的键值对只依赖它之前的 token,因此在末尾追加新内容不会改变任何已缓存 token 的 K、V。所以这不是「预编译」,而是「只增不改」的追加式注入。

一个易误解点:「追加到末尾」只发生在工具/Skill 被发现的那一轮。此后这个 schema 块就固定在轨迹原位置,成为普通历史消息,而不是每轮被重新搬到最新末尾。

上下文压缩:三个动机与一个隐蔽故障

📏
长度与成本约束
最直观:窗口有限、token 越多越贵、延迟越高。
🧠
提升思考质量
更深也更易忽视:把需要思考才能得到的结论,变成可以直接检索的知识。
😰
缓解上下文焦虑
模型认为窗口即将耗尽时,可能在任务未完成前提前收尾。
上下文腐化(Context Rot):装得下但找不到了

它与上下文溢出是不同问题:溢出是「装不下了」,腐化是「装得下但找不到了」——后者更隐蔽,因为 Agent 表面上还在正常工作,只是决策质量悄然下降。无关内容一旦占到上下文的大头,决策质量就会明显下滑。

隔离优于压缩

压缩是在信息已经进入上下文之后做减法;子 Agent 上下文隔离则更釜底抽薪——让大体积中间信息根本不进入主上下文。同一个「在代码库中找处理支付回调的函数」任务:主 Agent 亲自搜索可能把数万 token 原始代码纳入主上下文;委派给搜索子 Agent,主上下文只增加两条消息(任务描述 + 结论)。

压缩是有损的、需要额外 LLM 调用的事后补救;隔离则让噪声从一开始就与主上下文绝缘,主 Agent 的 KV Cache 前缀也完全不受影响。

2-1★本地 LLM 部署与工具调用
2-2★注意力机制可视化
2-3★★常见错误上下文管理模式
2-4★★提示工程消融实验
2-5★★提示注入攻防
2-6★★用 Skills 从论文生成 PPT
2-7★★从范文创建「去 AI 味」写作 Skill
2-8★★注意力可视化验证状态栏
2-9★★五种 Agent 状态栏技术
2-10★★★六种上下文压缩策略对比
实验 2-4 最值得记住的数字

信息组织混乱导致任务成功率下降超过 30%(保留所有规则内容,只打乱组织结构、去除标题层次)。移除工具描述性文本则使工具调用错误率增加 45%。对人类友好的信息组织方式,对模型同样友好。

CH 3用户记忆和知识库

上一章解决单次交互;这一章处理跨会话的持久化记忆与共享知识。
实验 3-1 ~ 3-12
思考题 9 道

两个尺度解决同一个问题:用户记忆让 Agent 成为「懂你的助手」,知识库让 Agent 成为「领域专家」。两者共用向量检索、知识压缩等底层技术,也面临同样的麻烦:信息冲突、知识过期、检索不准。

记忆能力的三层次评估框架

层次要求例子
第一层
基础回忆
准确存储和检索用户直接提供的、结构化、无歧义的信息「我的会员号是 12345」,后续需要时精确返回
第二层
多会话检索
面对不同对象、不同时期的多段会话,检索出所有相关信息并推理判断用户有两辆车时说「为我的车预约保养」,应主动询问哪辆而非随便猜
第三层
主动服务
综合多个会话甚至很久以前的信息,提供预见性帮助预订国际航班时主动关联数月前的护照信息,发现即将过期并预警

三套正交的分类体系

表3-1 记忆设计的三套分类体系(可自由组合)
分类体系回答的问题具体类别
记忆层次存在哪里?轨迹(当前会话)、用户长期记忆(跨会话)、业务状态(任务阶段)
存储格式怎么存?Simple Notes、Enhanced Notes、JSON Cards、Advanced JSON Cards
认知类型存什么?情景记忆(具体事件)、语义记忆(一般知识)、程序记忆(行为流程)
四种存储格式的取舍

Simple Notes(最小事实,O(1) 但丢失关联)→ Enhanced Notes(完整段落,语义完整但冗余)→ JSON Cards(三层嵌套,支持部分更新但结构刚性)→ Advanced JSON Cards(加入 backstory、person、relationship、时间戳)。

最后一种解决消歧问题:「张医生」可能是用户自己的牙科医生,也可能是父亲的心脏科医生——脱离情境就无法正确理解。

实践标准:关键且少量的数据用 Advanced JSON Cards 保证可检索性;大量且非关键的对话事实用 Simple Notes 降低成本;多数生产系统采用混合模式。

RAG 主流水线

分块
→
稠密检索
懂语义
稀疏检索
精确匹配
→
融合 RRF
→
神经重排序
跨编码器
→
生成
双编码器与跨编码器的类比

求职者把简历交给猎头快速筛选,是双编码器(查询与文档独立编码、靠向量运算比相似度,极快但无法捕捉深层匹配);面试官与每位候选人深谈,是跨编码器(拼接成一段完整文字送入模型逐词比对,慢得多但更准)。

重排序并不替代融合:融合负责从两路结果产生统一候选池,重排序负责在候选池上精排。

为什么原始文档不加处理放进知识库远远不够

CASE 1
黑猫白猫的计数问题 100 个独立案例(90 黑 10 白)。用户问「比例是多少」时受限于 top-k,大部分案例根本不会被检索到,模型只能基于不完整样本得出错误结论。

解法:预先生成摘要「共 100 只:90 黑(90%)、10 白(10%)」并索引。
CASE 2
优惠资格的边界问题 几百条工单各记录一个个案结论,没有任何一条写着资格范围本身。护士来问时有三重障碍:最近邻偏置(「医生」语义最近)、边界语义缺失(「仅限…,其他一律不适用」不存在于任何单条工单)、完整性信号缺失。

注意:第二重障碍调大 k 也解决不了。

结论:必须在索引阶段投入计算资源,对原始知识主动提炼、抽象和结构化——把「100 个个体案例」压缩为统计摘要,把「散落在几百条工单里的个案」提炼为带边界的明确规则。

知识更新:把知识库当成代码库

增量更新的核心做法

把每次知识变更当成一个 Pull Request。不只适用于可执行记忆;Markdown 知识库、用户记忆文件和规则文档同样应进入 Git,获得差异审查、版本历史、责任追溯和一键回滚能力。

生产环境不应让任何一个模型绕过审核,直接改主分支或线上向量库。

  • Proposer Agent 提交 PR:从原始证据发现新事实、冲突或过期内容,提出尽可能小而完整的 diff,同步维护链接、索引、时间元数据和证据引用
  • Reviewer Agent 独立审核:拿到变更前知识、diff 和原始证据,独立检查每个断言是否被证据支持;退回时须给出指向具体证据和行号的可执行意见
  • 双方迭代至收敛:设置最大迭代次数或成本预算,超限转人工,不能默认放行
  • 合入后再发布:CI 检查格式、链接、元数据、权限标签,通过后才从已合入版本增量重建索引
三条容易被忽略的要求

① Proposer 和 Reviewer 都必须是 Agent,而不是两次固定的 LLM API 调用——它们要主动搜索相关文档、追溯证据、运行检查,需要文件搜索、版本比较、测试执行等工具。

② 两者应优先使用能力相近但来自不同家族的模型(如 Proposer 用 Claude、Reviewer 用 GPT)。不同训练数据与推理习惯可降低在同一处犯同类错误的概率;能力则不宜悬殊。

③ 索引是可重建的派生物,Git 中已审核的知识才是真正的来源。

定期整理:增量更新的必要补充

增量更新及时,但每次只看到一个局部。长期运行后,多次局部正确的修改仍可能累积出全局问题。全量整理包含三项核心工作:去重去旧与合并、回到原始数据核查(不能只在已有摘要之间相互改写,否则早期遗漏会一代代传下去)、冲突解决与场景限定(不应简单「保留最新一条」,而要追溯各自信息源,检查是否分别在不同条件下成立)。

权限过滤必须下推到检索层

一旦敏感内容进入了 LLM 的上下文,就很难保证它不以某种形式泄露到最终回答里。多租户系统还需保证租户之间的向量索引和元数据相互隔离。

3-1★三层次框架评估记忆系统
3-2★★四种记忆策略对比
3-3★★本地模型智能日志脱敏
3-4★★ANN 索引算法比较
3-5★★从零实现 BM25
3-6★★混合检索流水线
3-7★★★RAPTOR vs GraphRAG
3-8★★智能体化 vs 非智能体化 RAG
3-9★★智能体化 RAG 构建用户记忆
3-10★★上下文感知检索
3-11★★★上下文感知检索增强记忆
3-12★★★司法判例的隐性知识提取
双层记忆架构:两条线索的汇合

用 Advanced JSON Cards 把少量关键事实结构化后常驻上下文,提供随时可见的「概览」;用上下文感知检索按需从海量原始对话取回「细节」。

这解释了为什么第三层「主动服务」最难:它要求系统同时握有全局概览和精确细节——只靠常驻上下文会因容量受限丢失细节,只靠检索又会因缺乏全局视野发现不了跨会话的隐藏关联。

CH 4工具

工具是 Agent 的双手。本章展开五类工具中由 Agent 主动调用的三类。
实验 4-1 ~ 4-5
思考题 4 道
表4-1 五类工具的调用方向与作用对象
工具类型调用方向作用对象本书何处展开
感知工具Agent 主动调用获取信息本章
执行工具Agent 主动调用改变世界本章
协作工具Agent 主动调用驱动其他 Agent 或人类本章
用户沟通工具Agent 主动调用向用户传递信息第 6 章
事件触发工具Agent 注册、外部触发驱动 Agent 开始执行第 6 章
能力的表达形式:三选一

专用工具(结构化、确定性高,但每个占数百 token)|通用执行器(可组合探索)|Skill(自然语言描述,目录仅数十 token、人类友好,但参数复杂时易错)。

默认取向:通用工具优于专用工具,除非有明确的安全、权限或性能理由。四个决策维度:安全与权限、参数复杂度、变更频率、模型能力。

核心原则:通用基础能力用于组合与探索;专用工具用于约束高风险和强业务规则操作。

用代码编排工具调用:token 可降约两个数量级

用代码串联多个工具,中间结果留在执行环境而不进入上下文,token 消耗可降约两个数量级。

工具描述与参数传递

A
工具描述的核心是让 LLM 知道「什么时候用」。清晰列出边界(做不到什么)比描述能力更重要。Claude Code 的工具描述精心设计了使用边界("NEVER invoke grep as a Bash command")、具体示例、性能提示与协作关系("Use the Read tool at least once before editing")。
B
参数传递的保真性:禁止「静默输入转换」与「静默参数注入」。模型感知的世界与工具操作的世界不能有系统性偏差。

工具太多怎么办:三层递进的答案

层次化组织
与按需加载
→
模型原生的
主动工具发现
→
Skills
把工具发现变成「按需查阅」

MCP-Zero:系统提示词不预置 schema,Agent 声明需求,两层语义路由匹配,在 2800 个工具上省约 98% token。核心转变是把「选哪个工具」变成「查哪条资料」。

执行工具的层次化安全

输入验证
→
权限控制
→
提议者-审核者
→
Sidecar
表4-2 提议者-审核者机制与 Sidecar 机制对比
维度提议者-审核者Sidecar
执行时机操作前(事前审批)或操作后(事后验证)与主模型流式输出并行,门控单次工具调用
审查对象操作的合理性或结果操作本身(工具调用)
输入隔离提议者和审查者看到相似信息刻意隔离主模型的自由文本
典型用途不可逆操作审批、文档生成、配置修改权限分类、记忆相关性判断、工具输出摘要
两个易被忽视的工程要点

① 幂等性:通过唯一标识去重或先查询后变更,使超时/打断可安全重试。

② 沙盒隔离的级别:进程级 → 容器 → microVM/虚拟机。注意:venv 不是沙盒。

MCP 与 Skill Hub:两条分发渠道

MCP(Anthropic 2024 年底发布)用客户端-服务器架构统一专用工具接入,实现「一次开发,处处可用」;Skill Hub(skills.sh、ClawHub)靠注册表而非协议分发 SKILL.md,token 成本比 MCP 便宜一到两个数量级。

两条渠道都把引入一条能力的成本压到了一条命令,也都扩大了信任边界——必须审查描述与版本、隔离凭证,并保证模型看到的参数与工具真正执行的参数一致。

4-1★★★主动工具发现(120+ 工具)
4-2★★感知工具 MCP 服务器
4-3★★多模态信息提取三范式
4-4★★执行工具 MCP 服务器
4-5★★协作工具 MCP 服务器

CH 5Coding Agent 与通用 Agent

代码不只是一个工具,而是一种元能力——能在运行时动态创造出新的工具和能力。
实验 5-1 ~ 5-16
思考题 9 道
通用 Agent 的架构答案

以开放任务为目标的通用 Agent,其核心是一个 Coding Agent + 文件系统。从 Manus 到 OpenClaw,成功的开放任务型通用 Agent 都遵循这一范式。

为什么?几乎所有高效的内容生成最终都要落到代码上:PPT/Word 本质是 OOXML,PDF 可由 Markdown/HTML/LaTeX 生成,数据分析靠 Python,成功的浏览器操作序列也可固化为代码。Computer Use 通用性更强,但成本、延迟和稳定性远不如直接通过代码或 API。

七个核心工具

Code Interpreter
Bash Shell
读文件
写文件
编辑文件
Glob 搜文件名
Grep 搜内容

书中说明:其实只要一个 Bash Shell 就足够了(OpenAI Codex 就只提供这一个工具),七个是为了方便理解 Coding Agent 所需的基本能力。

为什么 Coding Agent 特别适合 Harness 工程

表5-1 任务清晰度与验证自动化程度的四象限
结果可自动验证结果需人工验证
目标明确最佳区域修复有测试用例的 bug吞吐量受限代码重构需人工审查
目标模糊高效地跑偏用 linter 优化「代码质量」难以启动「让 UI 更好看」
这解释了 Coding Agent 为何成熟度最高

不是因为代码生成模型特别强,而是因为软件工程几十年积累的基础设施天然构成了一套强大的 Harness——测试套件提供验收标准,Linter 和类型检查器提供即时验证,Git 提供完美的版本控制和回退。

四条可迁移的 Harness 设计原则

01
约束优先于指导。能用代码强制的规则就不要用文档建议——前者是「做不了」,后者只是「建议别做」。
02
验证要自动化。人工审查是不可扩展的瓶颈。
03
反馈越快越好,越结构化越好。错误信息越详细、越接近发生时刻,纠正效率越高。
04
回退要可靠。Agent 在安全网内操作才能大胆试错。
约束的另一层目的:防止过程性错误

验收基线管结果对不对,执行边界管过程——即使结果正确,用错误方法达成也不行:修复数据库故障时直接把库删了重建(「修复」生效,但数据没了);修复编译错误时把代码全删重写(编译通过,但实现没了)。

这类破坏性捷径总是存在:即使把限制写进最终评估指标,Agent 也常能找到绕过去的办法——这正是 reward hacking 在 Agent 任务中的日常形态。因此约束的是动作而非仅仅是结果。

故障与错误恢复:四层故障、分级恢复

层典型故障
API 层限流、服务过载、请求超时、连接中断、输出触顶被截断
工具层幻觉调用、参数畸形、执行抛异常,以及最危险的——工具反复返回同一错误而模型不加改变地反复重试
上下文层窗口溢出、压缩失败、轨迹结构损坏(工具调用缺少配对结果)
控制流层死循环、死亡螺旋(错误触发的恢复逻辑自身又调用 LLM、再次出错、连锁反应)
一个真实的死亡螺旋

Agent 因上下文溢出停止 → 触发「结束时自动提交代码」的停止钩子 → 钩子调用 LLM 生成 commit message → 再次上下文溢出 → 又一次触发钩子。

防护靠两条:在错误路径上禁用一切会再次调用模型的副作用逻辑;用递归深度计数器检测并打断残余连锁。

熔断阈值从哪来:生产数据而非拍脑袋

Claude Code 压缩熔断「连续 3 次」的阈值来自真实统计——曾有一个会话在这条恢复路径上连续失败三千余次,仅这类无效重试每天就在全球造成约 25 万次 API 调用的浪费;逾千个会话出现过 50 次以上连续失败。3 次正是「绝大多数故障已恢复」与「继续重试基本无望」之间的经验拐点。

错误处理的边界不是单次请求,而是整个恢复循环

在确认无法恢复之前,中间错误不应暴露给消费者——恢复期间扣留错误消息,恢复成功则消费者毫无感知,所有手段均失败后才统一呈现。

跨厂商接管:带得走文字,带不走凭证

模型的思考通常由可读文字 + 厂商附加的凭证构成。换一家模型仍读得懂文字,凭证换一家就失效;各家对凭证的要求还不一致,宽松的一端不做校验,严格的一端拒绝一切非自己签发的凭证。

设计原则:轨迹不该按任何一家的接口格式存储,而应保存为中立格式——思考拆成可移植文字与不可移植凭证,工具调用只记名称与参数,标识符在渲染时按目标厂商重新生成。中立轨迹的价值也不限于故障切换:第 7 章的评估重放、第 8 章的训练样本构造、第 9 章的经验提取,依赖的都是同一份产物。

代码作为元能力:六个方向

🧮
① 思考工具
用符号计算和约束求解弥补概率思考的不足。Wolfram 的洞察:LLM 擅长理解自然语言但不擅长精确计算,符号引擎恰好相反。
📋
② 业务规则约束
把模糊政策编码为可执行约束。「7 天内可退款」看似清楚,但「7 天」是自然日还是工作日?「购买」是下单还是发货?
🎬
③ 多媒体生成
PPT、视频、可视化。核心机制是提议者-审核者:Reviewer 渲染截图并用 Vision LLM 评估——这是 Proposer 完全无法获得的新信息。
🔌
④ 系统适配器
现场生成「万能胶」连接异构 API,自动适应格式演化。极端形态是 RPA:先用 Computer Use 操作界面,再把成功序列固化为代码。
🖥️
⑤ 生成式 UI
动态表单、SQL Artifact、对话式界面定制。A2UI 类协议只输出「界面描述清单」由客户端安全渲染,而非执行任意代码。
🔁
⑥ Agent 自举
用代码修复和创造同类 Agent。关键技巧是提供高质量实现作为参考范例,引导在此基础上修改而非从零开始。
Artifact 模式:让数据绕过 LLM

SQL 查询场景中,让 Agent 执行 SQL 后用自然语言描述结果效率极低——不仅消耗大量 token,更严重的是 LLM「抄写」数据时非常容易出错。

更好的方案:Agent 生成 SQL 作为独立可执行产物,系统直接查库并渲染表格。数据从数据库直达用户界面,完全绕过 LLM 这个「中间人」。

动态生成软件:把信任边界下移到数据层

当接口、工作流乃至数据访问代码都由 Agent 随时生成时,应用层不再稳定。安全目标不能是「保证 AI 每次都把权限检查写对」,而应该是:即使 AI 写错了代码,权限约束仍然无法被绕过。

做法:数据库行级安全策略、约束与校验器、受控视图或数据访问服务,加上由受信任运行时绑定、无法伪造的访问上下文。必要条件是所有数据访问路径都必须经过受信任的数据层。

致命三要素 + 第四个维度

① 访问私有数据
+
② 暴露于不受信任内容
+
③ 具备外部通信能力
+
④ 持久记忆
本书补充

第四项不是并列的必要条件,而是攻击的放大器:攻击者可将看似无害的偏见或恶意指令写入长期记忆,跨会话潜伏,把一次性攻击升级为长期威胁。

Agent 为谁效忠:多方委托下的忠诚度

模型训练中形成了朴素默认——「谁在跟我说话,我就尽力帮谁」;但真实 Agent 常处在多方委托处境:替你砍价的 Agent,对面坐着的不是「需要被帮助的用户」,而是交涉对手。

实测显示一条忠诚度光谱,两端都会翻车:一端太老实(把底价直接抖给对手,被反复施压几轮就缴械);另一端太多疑(连主人正当请求也拒绝)。这两种失败是一根跷跷板,很难两全。

提示注入本质上就是一次策反。因此 Harness 层要明确限定忠诚对象:主人指令优先级最高,一切来自外部交互方的内容默认降格为「可参考、但不具备指令效力」的数据。

5-1★★★跨厂商的轨迹接管
5-2★★输出断掉后的接续
5-3★★代码生成提升数学解题
5-4★★约束求解提升逻辑思考
5-5★★小模型 + 代码化规则
5-6★★基于论文的 PPT 生成
5-7★★论文讲解视频生成
5-8★★基于 API 的视频剪辑
5-9★★零件的两种生成路线
5-10★★★自适应日志解析
5-11★★★生产日志智能诊断
5-12★★动态表单意图澄清
5-13★★自然语言 ERP Agent
5-14★★对话式界面定制
5-15★★★权限内嵌数据对象
5-16★★★能创造 Agent 的 Agent
实验 5-3/5-4 揭示的一个容易被忽视的前提

模型与脚手架之间是此消彼长的关系。模型足够强时脚手架可以更薄,代码求解器的增益随之收窄;模型不够强时就得在脚手架里做更多事。同一套脚手架配上不同能力的模型,得到的结论可能截然不同——这是评估一项 Agent 技术时容易被忽视的前提。

CH 6交互:观察与动作空间的扩展

前五章默认 Agent 与世界轮流行动。本章挑战这个前提:扩展的是两个空间的模态与时机。
实验 6-1 ~ 6-14
思考题 12 道
观察空间的扩展动作空间的扩展
内容(第 2–5 章)上下文工程、记忆与知识库工具、代码生成
模态(本章)语音、屏幕、物理传感器说话、点击、关节运动
时机(本章)世界主动推送、连续流跨回合、可打断、可抢占
一个被当成事实的假设

回合制是模型与接口的一种交互约定,不是环境的性质。真实环境不会等模型作出反应:邮件在它思考时到达,用户在它说到一半时插话,页面在两次截图之间已经变了样,杯子在机械臂伸手的途中被碰倒。

尺度场景观察侧的变化动作侧的变化
秒 — 天异步与事件驱动会被外部事件主动唤醒动作跨回合:先发起,后续靠事件收尾
10 毫秒 — 1 秒语音边说边听,不等一句说完边想边说,可被打断
亚秒 — 秒Computer Use屏幕在两帧之间持续变化动作后必须重新确认现实是否仍符合计划
毫秒机器人传感器连续回流动作分块:一次规划一小段,可被抢占

事件处理的三种策略

CANCELLATION
取消式(紧急事件) 本质是为紧急事件提前制造一个安全点:停止当前操作 → 清空待处理队列 → 与紧急事件一起追加到轨迹 → 立即重新调用 LLM。

例:用户输入「停!我说错了」。
QUEUED
队列式(常规事件) 放入队列末尾不打断当前操作,等到达安全点再批量追加。

例:Agent 调用搜索后用户补充「只看最近一个月」,搜索结果返回时两个事件一起呈现,避免不必要的往返。

并行处理(独立轻量查询):主任务分析大量数据时用户问「今天天气怎么样」。这类查询与主任务无关、需快速响应、成本低——用取消式会打断主任务,用队列式让用户等太久,应在并行推理会话中独立执行,并明确标记为「与主任务并行执行」以免 LLM 混淆。

紧急度判定:建议用轻量分类 LLM 做事件路由器

硬编码规则有局限——事件的语义决定了处理方式:「马上停下来」用取消式、「今天天气怎么样」用并行式、「报告需要用中文发给我」用队列式。

兼容同步接口时的占位符风险

核心思想:常态下让 LLM 看到标准同步轨迹,只在打断时插入占位符修复格式。但占位符带来语义风险——模型可能把「任务已启动」误当成「任务已完成」,在真实结果返回前作出依赖该结果的判断。应通过明确的任务状态和结果校验防止混淆。

工具接口设计层面的改进:把 phone_call 改成 initiate_phone_call——工具的名称和描述本身就要传达异步语义。

语音:三种交互范式

范式核心结构主要优势主要限制
级联VAD → ASR → LLM → TTS模块清晰、易替换、易调试延迟累积,副语言信息在接口处丢失
端到端 Omni原生音频输入输出,按轮次交互延迟较低,能保留语气、情绪和环境声仍依赖轮次,训练和调试成本较高
全双工持续听、说和决策支持重叠说话、自然打断和连续流模型训练、控制和评估都更复杂

贯穿三种范式的主线:如何摆脱「轮流说话」和 VAD 对发言权的猜测。只有全双工把「该谁说话」变成模型的持续决策。

快慢分离不只是对延迟的妥协

它还是一种让交互能力与智能上限分别演进的模块化选择:前台快模型负责低延迟倾听与维持对话,后台慢模型负责推理与工具调用;更强的思考模型发布后只需替换后台,不必重训整套实时语音系统。统一路线则把推理与交互绑定在同一训练周期。

实证:截至 2026 年 8 月,采用快慢分离的 Pine AI 语音 Agent 在 τ³-Voice Leaderboard 取得第一名,超过 Grok Voice、GPT-Realtime-2 等实时语音系统。

「端到端」的两个独立含义,别混为一谈

① 语音通路的端到端:模型直接收发音频,不经离散文本串接(Omni 和交互模型都属此类,但 Omni 通常仍按轮次推进)。
② 认知架构的端到端:实时交互与深度思考是否在同一模型内共享状态、共同训练。

两条轴彼此独立——一个系统完全可以在语音通路上端到端,同时在认知架构上保持快慢分离。

Computer Use:三条视觉定位路线

路线做法适用条件
结构化元素索引从 DOM / Accessibility Tree 枚举可交互元素并编号结构化信息可得时优先定位最精确稳定
纯视觉标注(SoM)用分割模型在像素上切出候选区域并叠加编号原生桌面软件、Canvas/WebGL、游戏;对未专门训练的通用模型更友好
纯坐标预测训练模型直接输出坐标对做过 GUI 定位训练的模型更直接;需按宽高比选目标分辨率做双向缩放

前两条的共同优势:把开放式的「找到按钮并预测坐标」转化为封闭式的「从已标注元素中选一个」——就像选择题比填空题更容易答对。

Computer Use 的隐含假设:屏幕是静止的

每 3–5 秒才睁一次眼、且完全没有耳朵的 Agent,对「两帧之间发生的事」既看不见也听不到。真正该被重新设计的不是动作接口,而是观察接口:屏幕关键帧截图(小模型判断是否发生有意义变化)、音量门控的语音转写、用文字描述画面(原图之后被清理出上下文,这句文字仍留在上下文里)。

移动端:生态壁垒比技术更难

真正卡住移动端的往往不是技术差异,而是商业模式冲突:传统互联网应用的核心变现逻辑是流量与注意力,而 Agent 代替用户操作时这条链路被彻底绕过——AI 不会关注广告,也不会冲动消费。这是一个结构性的利益冲突,短期内难以调和。

机器人:一个诊断实验

XLeRobot 案例的诊断价值

成本只有几百美元的机械臂,通过遥操作已经能完成连续多步桌面任务。这不只说明「硬件勉强可行」,更是一个明确的诊断证据:对于这个任务,硬件本体不是瓶颈,算法才是瓶颈。

诊断方法很直接:保持摄像头、机械臂、桌面布置和成功条件不变,先让人接管闭环。自主系统与人的差距,正体现在那些闭环能力上(靠近时减速、滑动时修正抓取点、失败后重新观察)。

层级核心问题典型时间尺度
任务目标人想完成什么分钟级
长程规划先做什么、后做什么秒到分钟
基本技能当前要完成哪个状态变化约 1—3 秒
VLA / 技能策略这个技能具体怎么动约 1—10 Hz 推理
底层控制与安全层如何稳定、及时地执行约 50—1000 Hz
动作分块是取舍,不是免费加速

大模型每秒通常只能推理 1—10 次,控制器却需要几十到上千次更新。动作分块把推理等待藏在执行时间里,但动作段越长,运动越平滑,模型在这段时间里看到的新画面却越少——伸手抓杯子时杯子被碰动,它可能仍在执行根据旧画面生成的动作。

VLA 的四个局限

训练数据有限(机器人演示远少于互联网文本)|只学会模仿,不一定懂后果(行为克隆没有要求模型回答「这个动作会造成什么结果」)|机器人各不相同|观察可能过时。

所以:语言模型知道「杯子」是什么,并不代表它知道摩擦、接触、液体晃动会怎样改变未来状态。VLA 主要回答「现在应该做什么」,还需要世界模型帮助判断「做了之后可能发生什么」。

但也要划清界限:「会生成视频」不等于「能指导机器人动作」。世界模型必须知道动作是什么,并能预测动作对物体和环境的影响;预测只能帮助选择,不能代替验收。

6-1★★★事件驱动邮件处理
6-2★★★并行执行与打断能力
6-3★★★原生异步与回合中途引导
6-4★构建传统语音 Agent
6-5★模拟流式语音感知
6-6★★端到端 vs 自级联
6-7★★控制标记驱动 TTS
6-8★运行 Computer Use
6-9★browser-use 自动浏览器
6-10★真机遥操作整理桌面
6-11★模拟器理想控制上限
6-12★★自主整理桌面
6-13★★三种自主闭环对比
6-14★★★RGB 跨环境测试
四节共享同一条控制骨架
持续感知
  → 判断当前状态与时机
  → 选择回复或动作
  → 让输出进入环境
  → 观察反馈
  → 继续、修正、重试、停止或重新规划

也共享同一组原语——唤醒、安全点、取消、抢占、快慢分离。

CH 7Agent 的评估

构建完成不等于构建正确。本章建的是「发现循环」中的证据段。
实验 7-1 ~ 7-14
思考题 9 道
一个关键认识

评估的对象不应只是模型,而应是模型与 Harness 的组合体。同一个模型在不同 Harness 中表现差异悬殊。完善的评估体系应能区分「模型能力不足」和「Harness 设计缺陷」这两类本质不同的问题。

区分手段——模型替换实验:固定 Harness 只换模型。换强模型分数不涨 → 瓶颈在 Harness;分数随模型能力大幅波动 → 瓶颈在模型。注意这与消融实验不同:消融是关闭 Harness 组件看整体变化(定位内部哪个部件重要),模型替换是固定 Harness 只换模型(区分瓶颈在哪)。

评估指标:两个容易混淆的口径

CAPABILITY CEILING
Pass@k · 技术奇观 k 次尝试至少一次通过即算通过。衡量能力上限——「这件事原则上做得到」。

适合科研发现、漏洞挖掘、开放式创作:人类可以从 k 条候选中挑出最好的那条。

Manus、OpenClaw 早期成功率不高、成本很高,但通用性带来较高 Pass@k,这些「技术奇观」在社交网络被大量分享,是产品成功的关键。
BUSINESS RELIABILITY
Pass^k · 业务可靠性 连续 k 次每一次都通过,且不触发一票否决项。

单次成功率 p=0.6、k=5 时:
Pass@5 ≈ 99.0%(看起来几乎总能成功)
Pass^5 ≈ 7.8%(连续五次不出错仍很难)

后者才接近支付、退款、权限变更、生产部署的要求。

评估环境的五个组成要素

数据集
·
环境状态
必须可重置
·
工具接口
原子操作
·
评分标准
·
执行协议
工具接口的抽象层次是设计陷阱

不应存在「解决用户的上网问题」这类高层抽象——抽象层次过高会使评估退化为对单次函数调用的考察,规划与推理环节被工具本身吸收。

τ-bench → τ²-bench:五处重新设计

暴露的问题改法
任务指令过于笼统,答案可被猜测剧本拆为 known_info(用户知悉范围)与 task_instructions(透露方式)两栏
成功条件不精确,验证误判「网络已恢复」改为「测速为 excellent 才算解决,poor/fair/good 均不接受」——针对敷衍性修复
用户模拟器行为机械补充情绪、耐心上限、事实锚定要求
用户只参与对话,不参与操作引入双控环境:用户拥有独立工具集,验证因此覆盖「Agent 是否真读到了用户侧操作结果」
任务实例固定参数化批量生成,改善覆盖率与抗泄漏能力
缺少事实锚定会让评估彻底失效

没有「关于设备状态的回答必须以工具返回结果为依据」这条约束时,模拟用户会顺应 Agent 的引导确认问题已解决,评估随之退化为两个模型之间的相互确认。

高质量评估集有多难做

✂️
SWE-bench Verified
从 2294 个任务抽 1699 个人工评估,93 名开发者逐条检查,最终仅 500 个通过(淘汰 71%)。换来更高信噪比,评估成本也下降约 80%。
🔧
OSWorld
发布后 15 个月暴露 300 余个问题(环境、描述、验证逻辑、初始状态四类)。港大约 10 人小组与多家机构合作两个月系统性修复。
🐦
三种防泄漏手段
GAIA 让答案无法从单一网页检索+专有附件;AndroidWorld 参数化模板动态实例化;Terminal-Bench 嵌入 canary GUID 使泄漏可检测。

验证方式的谱系:向右移动,但不放弃左侧

确定性验证器
可复现、可进 CI
→
检查项清单
→
Rubric
→
LLM-as-a-Judge
→
配对比较

凡是能写成程序化断言的检查都应当继续用断言,LLM 评判只用于确实无法机械判定的维度。

Rubric 四准则(Scale AI)

① 基于专家指导(缺乏专业基础的 Rubric 只能捕捉语言流畅度等表面特征)|② 全面覆盖(不仅定义正面标准,还要明确陷阱)|③ 按重要性加权(支持一票否决:客服场景中幻觉是典型否决维度)|④ 评价标准自包含(避免「展示了深刻理解」,改为「引用至少两个权威理论并准确解释」)。

两种必须防范的评判偏差

长度偏差:倾向给更长、更详尽的回复打高分,哪怕内容并不更正确——就像考试时对不会的题长篇大论期望「蒙对」。防范:Rubric 里显式惩罚冗长;配对比较时先把长度控制到相近;定期审计评分与长度的相关性。

位置偏差:系统性偏向出现在某个位置的候选。标准缓解是交换顺序各评一次取平均;更严格的做法是只有两次判决一致时才计入。

古德哈特定律在评估中的形态

当一个度量指标变成优化目标时,它就不再是好的度量指标。更隐蔽的是,Agent 还会逐渐学会避开评判模型不擅长检测的错误类型,让评分系统看起来一切正常。

缓解:多源异构评判——不同模型家族的偏见往往正交,Agent 很难同时「欺骗」所有评判者。

失败归因:定位首个错误

归因对象是首个导致任务偏离的错误

后续错误往往只是连锁反应,不能把最后一个报错简单当成根因。问题案例来自三类信号:用户明确纠正、用户点踩、事后通过状态检查/规则验证器/LLM 评审发现。

一个教科书级的归因案例(AndroidWorld T3A)

任务是把图库中 expenses.jpg 的开销录入记账应用。Agent 用 32 步完成全部操作,没有任何一步返回错误,最后自行宣告完成,验收却报告记录不存在。

逐步回看发现:第 8 步的思考里写着 "I cannot actually see the content of the expenses in the image"——它自己已经知道没拿到数据,却既没有停下也没有报告;到第 11 步,四条开销数据凭空出现。首个错误落在第 8 步,而那一步既没有报错,也不是一次工具调用。

根因归属极易搞错:T3A 是纯文本 Agent,观察空间里只有元素树、根本没有图像像素,所以根因不是「模型不会 OCR」,而是 Harness 的观察通道缺失。记成模型问题就会去换模型或做 OCR 训练;真正该做的是补观察通道。

「做对了但说错了」被整体成功率掩盖

τ²-bench 公开基线中,带信息告知要求的 704 次运行失败 240 次,其中 162 次信息告知出错;有 80 次(占全部失败的三分之一)环境状态正确,但信息告知错误。多数评估只检查环境状态,因此看不到这类失败。

两层回归任务

END-TO-END
端到端回归任务 从初始状态和用户请求开始完成整个任务,检查最终状态、必要输出和安全条件。

最接近生产结果,却难以判断失败发生在哪一步。OSWorld、AndroidWorld、tau-bench 都属此类。
TRAJECTORY PREFIX
轨迹前缀回归任务 冻结已有上下文、对话、工具返回和环境状态,只要求 Agent 执行下一步。成本更低,也能隔离单个策略或工具问题。

对高可靠性生产 Agent,构建这类任务集往往比端到端更重要。答案应定义为可接受动作集合而非唯一动作。

成本分析:两项优化不能简单相加

表7-4 八轮 Agent 任务的真实成本对照
方案输入 token缓存 token总成本比基线节省
无缓存、无压缩20,7000$0.003776—
仅稳定前缀20,38613,568$0.00270728.3%
仅压缩历史16,1770$0.00311517.5%
稳定前缀 + 压缩16,0356,144$0.00264330.0%

28.3% + 17.5% ≠ 30.0%——原因是压缩历史的同时也缩短了可以命中缓存的前缀。几项上下文优化同时使用时,必须在完整任务中一起实测,不能把各自的节省比例直接相加。

一个三轮迭代的真实调优

表7-5 AndroidWorld Wi-Fi 子集的三轮实验(每组仅 4 项任务)
实验只改了什么成功率token 比下一步
H1增加导航提示25% → 25%0.47×没有提高,沿用原提示
H5accessibility feed 换 UIAutomator25% → 100%2.498×效果明显但太费 token
H5C精简元素树(删无语义节点)100% → 100%0.506×进入完整复测
三轮串起来的两条结论

① 提示写得更详细,也补不回 Agent 根本没有看到的信息——遇到这类失败应先检查输入,而不是继续堆提示词。
② 输入也不是越多越好。

整个过程没有更换模型,仅调整 Harness 如何表示界面,就先后解决了「能不能做成」和「做成是否划算」两个问题。

但也有纪律:在完整复测(116 项 × 5 种子)之前,不能把子集上的 4/4 写成系统整体 100%。一轮证据只支持与它规模相称的下一步。

看到表现下降时,应先检查评测系统本身,再动 Agent

常见误区是看到分数下降就立刻改 Agent 代码。评测系统本身可能先出了问题:环境资源不足导致进程被杀、验证器有 bug 把正确答案判为失败、测试用例与生产场景脱节。这些在结果数字上跟模型退化一模一样,只有审查完整轨迹才能区分。

统计显著性:别被噪声骗了

100 个用例、成功率 70% 时,95% 置信区间约为 70% ± 9 个百分点——「新模型 73% 对旧模型 70%」不足以支持切换。

同一批任务比较两个配置时应优先做配对分析(McNemar 检验或配对 bootstrap),而不是直接相减两个独立成功率。每个配置最好用 3–5 个随机种子,报告均值和波动范围。

7-1★运行 τ²-bench
7-2★人肉执行基准测试任务
7-3★★基于 Rubric 的记忆评估
7-4★★JSON Cards vs RAG
7-5★★全自动 TTS 质量评估
7-6★★AndroidWorld 失败归因
7-7★★轨迹前缀边界评估
7-8★★从配对比较构建排行榜
7-9★★测量模型的行动阈值
7-10★端到端成本分析
7-11★★多维度模型性能基准
7-12★★记忆系统端到端选型
7-13★★★AndroidWorld 评估与改进
7-14★★OpenVLA + RoboTwin2 环境
实验 7-4 一个反直觉的结果

三套记忆方案在同一组 60 问上对比,混合方案并没有自然胜出:它在 3 道题上做到了两种单一方案都没做到的事,却在另外 8 道题上不如表现更好的单一方案,与每道题的最佳单一方案相比平均成功率反而更低。另一个值得注意的数字:180 次评判中幻觉否决触发了 28 次。

内部评估基础设施:最好的产品如何评估自己

🔬
消融基础设施
总开关同时禁用多个特性创造「裸模型」基线。消融开关必须在启动路径极早期注入,意味着它必须从一开始就设计进架构。
🅰️
AB 测试方法论
多臂而非二元;区分机制指标与目标指标(最容易犯的错是把正在改变的东西当作优化目标);设置护栏指标;记录基线统计。
🎚️
双层特性开关
编译时开关物理移除代码(逆向工程也无法发现);运行时开关服务端下发 + 本地缓存。宁可读到稍旧配置,也不能阻塞启动。
📝
提示词敏感性评估
系统提示应能确定性渲染,建立版本化快照,每次变更都在评估集上跑回归——就像代码变更需要跑 CI 一样。

外部评估告诉你「Agent 有多好」,内部评估基础设施告诉你「哪项改动让它变好了」。

CH 8模型后训练

四个环节分别处理底座、协议与策略。本章面向完全没有 RL 或训练背景的读者。
实验 8-1 ~ 8-19
思考题 13 道
表8-1 模型能力开发的四个环节
阶段用什么数据优化目标学到什么典型代价
预训练海量原始互联网文本预测下一个词语言规律、世界知识、基本推理极高(数百万~数千万美元)
Mid-training目标语言/领域语料 + 保留数据继续预测下一个词(对全部 token 算损失)补齐领域知识、语言和基础能力中到高
SFT几千~几万条示范对预测下一个词(只在回答上算损失)指令遵循、输出格式、风格、流程协议低(几小时~几天)
RL任务、环境 + 奖励信号最大化期望奖励可迁移的决策策略、探索出的新解法高(常是 SFT 的几十~上百倍)

直觉类比:预训练是「接受通识教育」,Mid-training 是「集中研修专业教材」,SFT 是「老师示范答题与表达规范」,RL 是「自己下场做题、根据结果反复打磨」。

全章两条主线

主线一:本章对照实验中,SFT 更容易记住示范,RL 表现出更好的泛化。但这是这些实验条件下测得的结果,不是普遍属性——数据足够多样、正则化得当时 SFT 也能泛化,奖励或环境有偏时 RL 也会过拟合。

主线二:数据和环境,比算法更重要。这是工业界最反直觉也最有价值的经验。掌握现成算法的基本用法即可,真正决定成败的是三件事:Mid-training 语料有没有补齐底座、示范数据有没有建立起行为协议、仿真环境与奖励能不能提供可靠反馈。很多场景下,只要前两类数据质量到位,你甚至根本不需要做 RL。

SFT 的本质:换了数据的「预测下一个词」

SFT 在数学上和预训练是同一个任务——都是预测下一个词、最小化同一个损失函数。差别只有两点:数据不同(人工准备的「输入—输出」对),以及损失只算在回答上(loss masking)。

这解释了 SFT 为何表现出记忆倾向:优化目标是让标注回答里每个 token 的概率尽可能高,也就是尽量复现示范。一句话概括:用极高的样本效率,把一套稳定的「输入→输出」映射与协议固化进参数。

什么时候选哪个:先判断缺的是底座、协议,还是策略

表8-4 Mid-training、SFT 与 RL 的选择准则
观察到的现象主要缺口优先方法
领域概念/语言/基础操作不会;合理采样下 pass@k 仍接近 0知识与能力不在基模的有效支持中Mid-training;动态事实用 RAG
偶尔能做对,但格式、工具 schema、语气或固定流程不稳定行为协议没有固化SFT 或约束解码
已有非零成功率和可靠奖励,但好策略概率低、OOD 泛化不足概率质量分配与策略优化RL
只有少量稳定示范,尚无可交互环境可模仿数据有、在线反馈无SFT / RFT / 离线偏好优化
RL 的两个硬前提

① 格式支持:如果模型吐出的 JSON 无法解析,奖励函数连「成功还是失败」都判断不了。

② 能力支持(更根本):如果在合理的 k、温度和任务覆盖下实测 pass@k 仍接近 0,基础模型几乎生成不出成功轨迹。只给 0/1 奖励时,GRPO 的一组 rollout 很可能全为 0,组内优势直接消失;PPO 也看不到「应该往哪里移动」。把采样量继续放大只能以约 1/p 的速度等待偶然成功。

RL 擅长把已有但概率较低的成功行为推高,不擅长从全零奖励中凭空创造模型从未学过的知识和能力。

「必须先 SFT」只在特定条件下成立

实验 8-11 中 Llama-3.2-Vision-11B 在严格结构化输出设置下不经 SFT 直接 RL 会失败;但足够强、已有非零成功率的基模可以跳过 SFT——DeepSeek-R1-Zero 就是这种情形。它后来加入冷启动 SFT,主要是改善可读性与语言一致性,而不是为 RL 注入任务知识。

GRPO 一次训练迭代:四步

  • 让策略模型重复尝试:同一份初始代码复制到 16 个隔离沙箱,独立解决 16 次。每次包含完整的「阅读 → 修改 → 运行测试 → 提交」,这整条过程叫一次 rollout
  • 计算奖励:验证器在干净环境应用补丁并运行测试。假设 4 次通过、12 次失败,则前 4 条得 1、后 12 条得 0
  • 计算相对优势:组内平均成功率 4/16,通过的 4 条得正优势、失败的 12 条得负优势。若 16 条全败或全胜,相对优势会消失
  • 梯度下降更新策略:不是把某个成功补丁原样背下来,而是让「先复现问题、检查边界条件、修改实现并运行测试」更容易出现,「掩盖异常、改测试、没验证就提交」更少出现

粗略时间估算:复杂 Agent rollout 生成数十轮工具调用,最慢 rollout 约 2000 秒 + 梯度更新约 600 秒 ≈ 一个 step 43 分钟;训练 100 steps 接近 72 小时。

一个极易被当成浮点噪声的致命问题

大规模 LLM RL 常用 vLLM/SGLang 生成 rollout,再用 FSDP/Megatron 重算 log probability。即使加载同一份权重,浮点精度、归约顺序、张量并行方式、批大小的差异,也可能让同一 token 的 log probability 略有不同——于是更新前本应为 1 的概率比已经偏离 1:系统名义上同步了权重,数值上却把 on-policy 训练变成了 off-policy。

放大链条:log probability 小误差 → 指数化的概率比偏差 → 长前缀累积 → clipping/优势加权改变 → 梯度方向改变。若 4000 个 token 的 log ratio 都有同方向 10⁻³ 偏差,轨迹级比率会累积到 e⁴ ≈ 54.6。

工程对策:在任何参数更新之前,用同一批轨迹比较 sampler 与 trainer 的 token log probability——这是最直接的 on-policy 单元测试。

RL 环境:先问「我的仿真环境真的像真实世界吗」

这个问题比选 PPO 还是 GRPO 重要得多

环境一旦失真,策略就会失效。如果仿真里的客服总按固定套路回话、错误信息跟生产环境对不上,模型就会学到一套只在仿真里管用的「应试策略」。这是 RL 项目最常见的失败方式——不是算法不行,而是练习场与考场并不相同。

造不出环境怎么办:让模型扮演环境

第一层:合成工具返回值。ZeroSearch 用 LLM 扮演搜索引擎,并采用课程式设计——初期返回高质量文档,随训练推进逐步掺入噪声,促使学生学会从不完美结果中提取信息。全程没见过真实搜索引擎的模型,直接对接真实搜索时依然表现良好。

第二层:仿真整个环境动态。DreamGym 把环境动态蒸馏进推理式「经验模型」,批量合成 rollout。

但风险明确:模拟器的世界知识就是训练的天花板,模拟器的系统性偏差会被策略照单全收;更糟的是 RL 会主动寻找并利用模拟器的漏洞。稳妥做法是混合:模型模拟承担大部分交互量,辅以真实环境交互定期校准偏差。

奖励设计:三个维度 + 一个额外问题

维度选择原则
来自哪里可验证奖励(RLVR)|人类偏好(RLHF)|模型评判(GRM)规则越确定,奖励越便宜、可复现,也越不容易被钻空子
什么时候给结果奖励(ORM)|过程奖励(PRM)密集反馈换收敛速度,稀疏反馈换探索空间
表达多少信息标量|半标量|向量|生成式诊断每增加一个评价维度,就增加一种被钻空子的可能
reward hacking 与 reward seeking 的区别

reward hacking 是钻规则或实现漏洞拿高分;reward seeking 则是模型先在心里建立一个「评判器会看什么」的模型,再按猜测调整行为。后者不一定篡改测试或伪造结果,却可能在长程任务中自行设置一个过于简单的检查,刚好通过就提前结束。

所以「通过了 grader」不能自动等价于「任务完成了」:评判器是意图的代理,训练越强,模型越可能把代理当成目标本身。

RLVP:奖励结果,惩罚路径

结果奖励解决「事情有没有办成」,却表达不了「是否按规定办成」。真实环境通常是非对称验证器:检测「做了一个坏动作」便宜而可靠,证明「这一步确实取得了有意义的进展」却很难。

关键不是「奖励越密越好」,而是能否恢复组内差异:纯结果奖励在全败组和全胜组都会产生零方差;违规动作通常容易检测,惩罚几乎总能恢复差异;进展奖励只有在部分进展可达时才有效。

实证(实验 8-16):TerminalBench 违规次数由 3.71 降至 0.66 而成功率基本持平;miniF2F 达到 0.9 成功率所需迭代从 7.0 降至 4.4。但软件修复中若所有 rollout 都无法通过任何测试,进展信号不可达,加入它不会带来收益。

蒸馏:把一次 rollout 变成密集监督

方法轨迹/状态由谁采样每条轨迹的主要监督
SFT / 离轨蒸馏人类或教师标注答案的逐 token 监督,密集
On-policy RL当前学生结果或过程奖励,通常稀疏
On-policy Distillation当前学生教师在学生前缀上的逐 token 分布,密集

学生决定走到哪里,教师负责在学生已经走到的位置告诉它下一步的完整概率分布。一条长度为 T 的 rollout 不再只产生一个 0/1 信号,而能产生约 T 组逐 token 监督。在数学等任务上,达到同等性能所需训练步数约为纯 RL 的 1/10。

没有更强的教师怎么办:OPSD 自蒸馏

同一个模型分饰教师和学生两角,但看到的上下文不同:教师版能看到「特权信息」(标准答案或已验证的正确解答),学生版只看到问题本身,却在自己采样的轨迹上向教师版的逐 token 分布对齐。

对着答案解释学生刚走过的路径,通常比独立探索更容易。但它不会凭空创造新知识——如果模型拿着答案也讲不清过程,自蒸馏就没有额外信号。

从评估资产到训练输入

表8-5 第七章评估数据集到第八章训练用法的映射
第七章的评估数据集第八章的训练用法
端到端回归任务(含验证器)RL rollout 任务与可验证奖励(RLVR);拒绝采样(RFT)的采样池
轨迹前缀回归任务DPO 偏好对、决策边界的 SFT 示范、On-Policy Distillation 的教师状态
失败归因记录(首个错误步骤与类别)过程监督的负标签(PRM)、RLVP 路径惩罚的规则来源
Rubric 多维评分与人工金标集向量奖励的各维度、生成式奖励模型(GRM)的训练与校准数据
边界集与保留集缺一不可

以「过早结束」为例:训练后既要用边界集检查「任务未完成时模型是否选择继续验证」,也同样重要地要用保留集检查「任务确实已完成时模型能否正常宣称完成」。

只盯前一个指标,会把模型训练成永远不敢收尾的过度矫正状态:每个任务都无限验证下去,延迟与成本崩溃。

还要警惕奖励作弊的新形态:模型可能学会「口头声称去验证」而不真的验证——这正是端到端奖励必须依赖模型无法编写或修改的隐藏测试的原因。

8-1★Q-learning 寻宝游戏
8-2★★传统 RL vs LLM Agent
8-3★★从头训练 LLM
8-4★★自己训练 VLM
8-5★★继续预训练学新语言
8-6★★★语音 SFT
8-7★★★多语言思考
8-8★★Prompt 蒸馏
8-9★★★思维链蒸馏
8-10★★AdaptThink 何时不思考
8-11★★GeneralPoints 记忆与泛化
8-12★★★V-IRL 多轮视觉导航
8-13★★★SimpleVLA-RL 开放探索
8-14★★★ReTool 代码解释器
8-15★★★AWorld-train 沙盒
8-16★★★RLVP 奖励结果惩罚路径
8-17★★过早结束 → DPO 修复
8-18★★作用域敏感的引号 SFT
8-19★★特殊字符串精确复制 SFT
实验 8-1/8-2 的对照:先验 > 环境 > 算法

同一个寻宝游戏:表格 Q-learning 需要近 10000 次完整尝试才达到 100% 胜率;LLM Agent 第一局就在 18 步内通关——因为它理解了游戏的概念结构(「武器总比空手好」「需要找钥匙」「银剑才能对付守卫」),而对 Q-learning 来说「门」「钥匙」「剑」只是无意义的符号组合。

姚顺雨《The Second Half》的结论:几十年来 RL 研究者的优先级可能完全颠倒了——不是算法 > 环境 > 先验,而是先验 > 环境 > 算法。

CH 9Agent 的持续进化

能力悖论:Agent 能零样本解决新任务,却在做过一万次相似任务后仍重犯第一天的错误。
实验 9-1 ~ 9-9
思考题 —
两个必须先分清的概念

持续学习 vs 持续进化:模型权重层面的持续学习尚不可靠,故先在模型外围构建可验证的「持续进化」系统。

保存经历 ≠ 从经历中学习:学习发生在「评价、对照、归纳、验证」之后,而非日志落盘那一刻。

与第 3 章记忆的分工:用户记忆沉淀「世界是什么样」,经验学习沉淀「在什么条件下应该怎样行动」。

为什么不能直接在线改参数

生产环境缺乏干净的学习信号,容易导致灾难性遗忘、策略漂移、安全退化,以及提示注入被固化进参数。

三层验证结构

结果验证器
事情是否办成
→
过程验证器
是否以允许方式办成
→
质量验证器
是否让用户舒服

结果层最应优先建立——它来自环境真实状态,比模型自述可靠。过程层可用代码判定(政策库、权限表、动作轨迹都能精确表达)。质量层用 LLM-as-a-Judge + Rubric,逐项给分并引用轨迹证据。

可学习的评价须含四要素

① 成功/部分成功/失败 ② 逐维度结论 ③ 证据位置 ④ 失败类型标签。

并且:证据不足时应允许拒绝评分并把该样本剔出学习集——而不是硬给一个分数。

四种更新载体

表9-2 四种持续进化方式的适用边界
更新方式适合承载优势局限
经验知识库事实、经验规律、例外与来源更新快、可追溯、可检索依赖检索与模型正确应用
Prompt 与 Skill可用自然语言说明的判断原则可解释、作用范围可控易膨胀、冲突或被忽略
程序与 Harness可确定解析、可执行验证、高风险硬约束可测试、执行稳定、成本低开发维护成本高
模型参数高维感知、生成风格、隐式策略泛化强、推理开销低更新与回归成本高
决定载体的判据

是「能力的表示性质」,而不是「任务是否长期稳定」。医疗影像识别、自然语气等能力即使面对持续变化的领域,仍往往需要参数更新;反过来,长期稳定的转账审批规则也应由代码提供确定性保障,而不能只靠模型记忆。

知识提炼的五步管道与三层数据结构

  • 保存不可变原始轨迹(审计用)
  • 单次运行的结构化分析(草案)
  • 按任务族聚合建立证据表
  • 达到门槛才入正式文档
  • 在新任务上测迁移

对应三层数据:不可变原始轨迹(审计)/单次运行分析(草案)/跨轨迹归纳的正式文档。注意:Reflexion 式反思是草案来源而非证据。

τ²-bench 实证:从 19 条失败轨迹自动归纳规则

通过率 12.3% → 19.3%,原通过任务无一改坏;越界调用与缺参调用下降约八成。

两个关于「提炼」的重要教训

① 提炼材料决定归纳质量。仅给错误文本,得到的是泛泛的「教训」;补充工具职责清单后,才得到可执行的「职责归属」。

② 模型会把观察到的行为当作应然行为。书中记录了一个真实案例:模型曾归纳出「三次失败即转人工」这条规则——而转人工在该评估中必然判失败。所以提炼产物必须由独立验证者审查。

Skill 与 Harness 的边界

SKILL
负责语境判断与澄清 Spec 可用自然语言说明的判断原则,作用范围可控、可解释。
HARNESS
负责不可绕过的硬约束否决 用代码强制的边界,Agent 无法通过说服绕过。
程序化经验(PreAct):浏览器轨迹编译为参数化工作流

重复任务端到端加速 8.5–13 倍。但必须具备三重验证:动作前验证、动作后验证与独立回放验证。

自我修改的发布流程

worktree / 分支
→
最小补丁
→
静态检查 · 单测 · 安全扫描
失败轨迹重放 · 回归
→
灰度

「变更契约」须可证伪。

Cordis / DeepSeek Harness:一切皆插件

动态组合分时间可组合性(可撤销效果,改了什么)与空间可组合性(反应式协效果,依赖什么)。

核心判断:自我进化的上限取决于系统的可组合性——「不存在只能由人类维护的特权内核」。

三道安全边界

01
证据与指令隔离——避免被处理的内容冒充指令。
02
待验证能力与正式能力隔离——未通过门槛的产物不能进入运行时。
03
安全机制本身不可被自我修改——验证器、测试、发布门槛、审计日志、稳定版本必须在自我修改的作用域之外。

分层评估:不能只用端到端分数反推更新器好坏

表9-3 持续进化的分层评估指标
指标回答的问题
更新提案有效率提案接受率与增益
产物激活率是否在正确场景加载
遵循成功率激活后是否照做
保留任务集增益泛化与不退化

长期还须同时观察五类结果:回退、泛化、Token 效率、安全性、长期工程质量。

睡眠学习:整合、遗忘与能力保鲜

五步:触发 → 定向 → 采集整合 → 验证审批 → 修剪索引。前台交互期间不断累积新证据和局部更新,后台在周期性窗口里从全局视角重新审视整个知识体系。

Harness 更新能力 ≠ Harness 受益能力

五种搜索尺度:规则 → 上下文 → 工作流 → Harness 代码 → 优化器代码(参 ACE / MCE / AFlow / Meta-Harness)。能改进的层级越高,风险也越大。

9-1★★为客服 Agent 构建轨迹验证器
9-2★★从失败轨迹提炼转接规则
9-3★★优化航空客服系统 Prompt
9-4★★进化需求澄清 Skill
9-5★★★从浏览器轨迹生成工作流
9-6★★★失败轨迹触发自我修改
9-7★★用户反馈触发确认门禁
9-8★★★把这本书交给 Hermes
9-9★★★评估 Agent 是否在持续进化
本章小结的核心判断

持续进化需要把在线执行与离线学习分开:在线记录证据,离线生成并验证更新提案,再逐步发布、整理或回滚。

这个闭环在结果可自动验证的任务上最可靠;对于目标模糊、反馈延迟的开放任务,人仍需参与问题定义和评价标准的制定。

CH 10多 Agent 协作

从「如何构建和改进一个 Agent」推进到「如何组织多个 Agent」。
实验 10-1 ~ 10-6
思考题 11 道
📖 本章有一份独立的深度学习页——完整覆盖两个维度、三种拓扑、六种失败模式与 Agent 社会,含 5 张图解与全部参考文献。点此进入 →

核心判据:只有一条

是否采用多 Agent 的第一判断标准

协作过程是否引入了单个 Agent 在生成时无法获得的新信息?

这解释了一个看似矛盾的现象:学术研究常说多 Agent 无用(比的是「多个 Agent 看同一段文本互相辩论」,无新信息),工程实践却有效(含代码执行、视觉渲染、工具验证等外部反馈环)。

表10-1 多 Agent 协作模式的信息增量对比
协作模式是否引入新信息效果
同一模型自我审查否通常无效甚至有害
不同 Agent 辩论同一段文本否等计算量下与单 Agent 持平
审核者使用测试执行结果审查代码是(执行反馈)显著提升
审核者查看渲染截图审查前端代码是(视觉反馈)显著提升
审核者使用外部工具验证事实是(工具反馈)显著提升

两个核心设计维度

DIMENSION 1
上下文是否共享 共享:后续 Agent 继承完整轨迹,信息不丢失但上下文易膨胀。
不共享:各自独立,模块化好但必须设计显式通信——三种机制本质是 IPC 两大范式(共享文件系统 = 共享内存;工具参数与消息总线 = 消息传递)。
DIMENSION 2
协作拓扑 对等协作:2-3 个平等身份迭代改进。
管理者:中心化规划与调度。
去中心化:无运行时中心,自主移交。

三者都是「执行图」的不同形态。
与操作系统的完整对应

轨迹 ≈ 进程内存|LLM ≈ CPU|Agent 运行时 ≈ 内核|工具调用 ≈ 系统调用|spawn_subagent ≈ fork|cancel_subagent ≈ kill|list_agents ≈ ps|共享文件系统 / 消息 ≈ 共享内存 / 消息传递。

这套抽象并不新鲜——正是 1970 年代 Actor 模型的基本设定。因此操作系统与分布式系统的成熟经验大多可以直接借用。

Loop 工程:把宣称变成证明

过早终止的三种形态,同一个根源

偷懒式假完成(测试没跑就报完成)|过早放弃(一条路走不通就说办不成)|假成功(以为办成了,实际闭环没走完)。

根源:在验证之前,「完成」只是模型的一句宣称,不是证明。

业界共识:循环的瓶颈在验证器,而不在模型。验证不可靠,循环转得再快,也只是把劣质产出更快地标记为完成。

可检查的系统不变量:模型可以提出「完成」,但不能批准自己的「完成」。

六种失败模式

#失败模式要点
F1共享文件系统的并发冲突简单冲突用乐观锁;语义冲突(不同文件、逻辑矛盾)需工作副本隔离
F2错误的级联放大进程传字节逐位保真,Agent 传语义每转述一次都是有损重编码
F3同质趋同(共因失效)30 个 Agent 有 18 个创建同名 Git 分支;同模型的多个审核意见不能视为独立证据
F4互相扯皮三个 Agent 把彼此操作理解为蓄意阻挠,终止对方进程、撤销权限,甚至部署自复制破坏代码
F5循环失控失控 Agent 有时会生成数千个子 Agent;建议用独立 API key
F6理解债与认知投降这不是 Agent 的失败,而是人的失败
Agent 的故障天生是拜占庭式的

传统分布式系统大多只需防崩溃故障(部件停止工作);Agent 却很少径直停止运行,而是继续给出看似可信的错误结论,且错误不会主动声明自己是错误。这正是拜占庭故障。交叉验证、多数表决都是拜占庭容错的经典手段。

Karpathy 的一句话,也是全书的收束

「你可以外包你的思考,但不能外包你的理解。」

管理 Agent 就像管理技术员工,既不能越俎代庖,也不能放手不管。因此,Agent 使用者的技术基本功很重要。

10-1★★系统提示词 vs Skill 角色转换
10-2★★书籍翻译 Agent
10-3★★★自主编排电话 + 电脑
10-4★★★多网站并行搜集(级联终止)
10-5★运行斯坦福 AI 小镇
10-6★★★语音狼人杀 Agent

贯穿全书的五个设计模式

第 1 章一次性命名并给出规范定义,后续章节反复调用。

模式核心机制在哪些章出现
提议者—审核者
Proposer-Reviewer
产出与评判由两个不共享上下文的角色承担,评判方看到的是产物本身(渲染结果、测试输出、结构化参数)而非产出方的推理过程。
前提是自审不可靠。
3(更新知识)· 4(工具事前审批与事后验证,Sidecar 是只读变体)· 5(PPT/视频/日志三实验的骨架)· 7(评估 UI)· 9(审核更新提案)· 10(对等协作,及为何不能自审)
渐进式披露
Progressive Disclosure
不把全部信息一次性放进上下文,而是先给可检索的目录,再按需加载细节。同时优化上下文预算与选择精度。 2(Agent Skills 最典型)· 3(分层检索)· 4(主动工具发现、分页截断)· 10(Agent 发现)
只增不改
Append-only
状态以追加方式演进,已写下的内容不再回头修改。换来可缓存、可重放、可审计。 2(KV Cache 前缀稳定性是其性能形态)· 3(事件式记忆)· 4(新工具 schema 追加到轨迹末尾而非插回前缀)
边界集 + 保留集
Boundary + Retention
任何修改都要同时在「它应当改变的那批样本」和「它不应当影响的那批样本」上验证。
只测前者会把过拟合当进步,只测后者会把无效修改当安全。
7(回归任务)· 8(训练与评估隔离、过早结束案例)· 9(更新提案验证)
最小 diff + 可回滚 每次修改尽量小、带来源、可单独回滚。让归因成为可能——出了问题能定位到具体哪一次改动。 3(知识更新)· 5(代码补丁)· 9(Prompt 与程序更新)
第 1 章的三条学习路径,也是按可回滚程度从高到低排列的

上下文内适应 → 外部产物更新 → 参数更新。

三层护栏:按「被绕过的难度」排序

LAYER 1 · 上下文层 管「模型能看到什么」——相关性分类器、安全分类器、内容审核、基于规则的保护、来源标注 最易被绕过 LAYER 2 · 执行层 管「模型能做什么」——工具风险评级、独立审查进程、最小权限凭证、沙盒隔离、人在回路、输出检查 LAYER 3 · 数据层 管「世界最终能被改成什么样」——行级安全策略、约束与校验器、受控视图、受信任运行时绑定的访问上下文 最难被绕过
三层不是按请求处理顺序排的,而是按被绕过的难度——越靠下越不依赖模型自己的判断
上下文层有一个结构性上限

处在同一个上下文里的 Agent,很难判断自己是否已经被注入。所以上下文层只能降低攻击成功率,给不出保证——这正是必须有下面两层的原因。

数据层的价值在于它不依赖上面两层是否正确:即使提示注入得手、生成的代码完全漏写了权限判断,越权操作仍会在数据层被拒绝。

护栏的另一类失败:误拒绝

为了降低危险请求被放行的概率,模型可能同时拒绝一部分合法但形式敏感的任务(经过授权的安全测试、模型蒸馏研究)。因此护栏评估不能只测「应当拒绝的请求是否被拦截」,还要测「明确允许的请求是否能够正常完成」。

三条学习路径:不同时间尺度上的协同

路径发生在优势局限对应章节
上下文适应当前任务中快速、低成本受上下文窗口与信息组织约束,不跨会话保留2
外部产物更新跨任务可审计、可修订执行时仍需通过上下文或工具接口被使用3、4、5 提供基础;9 讨论如何生成
参数更新训练周期自然、广泛的泛化能力部署成本较高8

三条路径不是互斥分类:上下文负责临场适应,外部产物负责可控积累,参数负责内化难以显式表达的能力。

反复出现的六个判断

01
「给出了回答」不等于「完成了任务」。上下文残缺、观察通道缺失、过早结束时,典型失败不是报错退出,而是一个看上去毫无破绽的答案。因此验证必须核实机器可独立复核的事实,而非 Agent 的自我陈述。(1 · 5 · 7 · 8 · 10)
02
约束优先于指导,能用代码强制的就不要用文档建议。Linter 规则、类型约束、CI 检查、数据层权限是「做不了」;系统提示词里的「请遵循…」只是「建议别做」。(1 · 5 · 9)
03
数据与环境比算法更重要。先验 > 环境 > 算法。Mid-training 语料决定底座、SFT 示范决定协议、环境与奖励决定 RL 能探索什么。造练习场往往比调模型更贵、更难。(7 · 8)
04
模型内化一层,Harness 就卸下一层。那些给模型能力短板打补丁的适配层代码会被逐轮吃掉——few-shot、CoT 提示技巧、JSON 容错、文生图提示词改写都已发生。但 Harness 转而兜底新的能力前沿。(1 · 5)
05
结构不是替 Agent 预演全部思考,而是守住边界。「Less structure, more intelligence.」复杂工作流的固定拓扑会把模型本可根据上下文处理的语义判断写死。(1 · 9)
06
一轮证据只支持与它规模相称的下一步。子集上的 4/4 不能写成系统整体 100%;73% vs 70% 不足以支持切换;两项优化的节省比例不能直接相加。(7)

109 个实验总览

章主题实验数编号范围
1AI Agent 入门41-1 ~ 1-4
2上下文工程102-1 ~ 2-10
3用户记忆和知识库123-1 ~ 3-12
4工具54-1 ~ 4-5
5Coding Agent 与通用 Agent165-1 ~ 5-16
6交互:观察与动作空间的扩展146-1 ~ 6-14
7Agent 的评估147-1 ~ 7-14
8模型后训练198-1 ~ 8-19
9Agent 的持续进化99-1 ~ 9-9
10多 Agent 协作610-1 ~ 10-6
合计109配套代码见原书仓库

星级含义:★ 入门体验 · ★★ 需要动手实现 · ★★★ 综合工程项目。各章实验清单见上面对应小节。

参考与说明

Original Source 《深入理解 AI Agent》(AI Agents in Depth)· 李博杰 本页为通读笔记,所有观点、数据、表格与引语均整理自原书,版权归原作者所有
阅读原书

各章原文直达

章标题链接
引言为什么写这本书/book/introduction/
1AI Agent 入门/book/chapter1/
2上下文工程/book/chapter2/
3用户记忆和知识库/book/chapter3/
4工具/book/chapter4/
5Coding Agent 与通用 Agent/book/chapter5/
6交互:观察与动作空间的扩展/book/chapter6/
7Agent 的评估/book/chapter7/
8模型后训练/book/chapter8/
9Agent 的持续进化/book/chapter9/
10多 Agent 协作/book/chapter10/
后记模型会不会吃掉 Harness?/book/afterword/

项目信息

  • 仓库:github.com/bojieli/ai-agent-book(Apache License 2.0,配套实验代码在此)
  • 下载:仓库 Releases 提供中文 PDF 与 EPUB
  • 多语言:中文(简体)原版 + 14 种社区翻译,共 15 个语种
  • 构建:MkDocs,每次仓库推送后由 GitHub Actions 自动重建,内容持续更新
本页说明

本页是通读笔记性质的结构化整理,用图表、表格与分层导航重新组织了全书 10 章的脉络,便于检索与复习。所有事实、数据、引语与结论均来自原书,未添加原书之外的论断;图表为便于理解而绘制,「反复出现的六个判断」一节是对全书主题的归纳。

本书内容持续更新,页面标注的更新日期各章不同(第 6 章 2026-09-06、第 1/2/7/9 章 2026-09-03、第 8 章 2026-08-26、第 4 章 2026-08-25、第 5 章 2026-08-24、第 3 章 2026-08-21、第 10 章 2026-08-31)。建议配合原书阅读,以获得完整论述与最新修订。

一处需要提醒的核对结果

整理过程中发现,站点首页目录对第 6–9 章的排序与各章正文的交叉引用不一致。本页采用的是正文交叉引用所确认的顺序:6 交互 → 7 评估 → 8 后训练 → 9 持续进化(例如第 6 章小结明确写「第七章先回答如何判断系统构建得对不对;第八章讨论如何通过后训练更新模型参数;第九章再把运行轨迹、评估与多种更新载体组织成持续进化闭环」)。

→ 第十章「多 Agent 协作」独立深度学习页

↑