Function · 函数
见基础路书第 02 章一段有名字、能复用的代码逻辑:输入参数,返回结果。Agent 工具本质上就是函数。
AI Agent 研发与基础学科的术语全集 —— 程序基础 / 软件架构 / Agent Loop / 工具调用 / 状态记忆 / 上下文工程 / RAG / 工作流 / 部署 / 测试评估,外加跨学科的复杂系统,共 11 类。每词配一句定义 + 归属路书 / 章节链接。学完某章后想速查回顾,来这里。
一段有名字、能复用的代码逻辑:输入参数,返回结果。Agent 工具本质上就是函数。
绑定在对象或类上的函数。`agent.run()` 是 Agent 类上的方法。
对象的模板,定义数据(属性)+ 行为(方法)。类本身不存在,只是说明书。
类的具体实例。`my_agent = Agent(...)` 造的就是 Agent 对象。
一组相关代码,通常对应一个文件。`tools.py` 是一个模块。
多个模块的集合,通常对应一个文件夹。`anthropic` 是 Python 包。
你的代码运行时需要的另一份代码。`requirements.txt` 里列的就是依赖清单。
把一个函数交给系统,让系统在特定时机自动调用。Streaming 大量靠回调。
处理某一类事件或请求的函数。tool_handler / error_handler 等。
系统预留的扩展点,可以在特定生命周期节点插入自定义逻辑。
规定模块"能做什么"的稳定约定,不关心内部怎么实现。
把复杂实现藏起来,只暴露简单稳定的接口。关注「隐藏复杂度」(区别于封装的「控制访问」)。
接口背后的具体代码逻辑。同一接口可以有多个实现。
模块间绑定的紧密程度。耦合越紧越难修改维护。
模块内部职责是否统一。高内聚 = 一个模块只做一件事。
把数据和操作打包在一起,只开放受控的访问入口、隐藏内部状态。关注「控制访问」(区别于抽象的「隐藏复杂度」)。
一组可被主动调用的功能集合。你调用库,而不是库控制你。
平台官方为开发者准备的工具包(client + 类型 + 辅助函数)。
提供应用结构和开发模式的工具。Library 你调它,Framework 它调你。
插入在请求处理链路中间的一层逻辑,例如鉴权、日志、限流、缓存。
把不同系统的接口转换成统一接口,方便替换底层实现。
某种能力的供应方 — model provider / embedding provider 等。
不同模块只负责自己的事情,避免职责混乱。是高内聚 + 低耦合的核心目标。
Orchestrator-Worker 拓扑里的中心 lead:动态 spawn / 调度 worker、聚合结果。能并行广度(超单 context window),但 worker 互不可见 → 碎片化风险,靠委派工程补洞(派活时把每个 worker 的边界和前提假设都写死)。Anthropic 多 agent 研究系统的架构。
agent harness 实际执行的那一层:loop / tools / state / events / error handling 等(Ch11 走读的 Codex `core` crate 就是它)。区别于评测的 eval harness,也区别于只暴露接口的 SDK wrapper。
可以挂载到主系统中的扩展能力,通常不需要大改主系统。
包在原始功能外面的一层,用来增加日志、重试、缓存、格式转换等能力。
capstone 读法:对应前面哪一章 → 真实系统怎么做(crate / 文件 + pin commit)→ 判断力训练点。目标是「抽象有形、具象有名」,把学过的抽象钉到真代码上,不教新概念。
引用活仓库代码的纪律:每个行级引用钉到 commit SHA + 日期,优先引 crate 名和官方源码走读,闭源系统只引公开行为不引泄露 / 逆向文件名。因为代码会漂,而「子系统对到抽象」的映射不漂。
把一个无状态、健忘、会犯错的模型,变成能在真实环境里可靠地感知→规划→行动→自我修正的系统的那一整套工程(loop / 工具 / 隔离 / 对抗防御 / context / 记忆 / 协同 / 度量)。模型负责会不会想,harness 负责能不能可靠地做——#8 整条路书的命题。
把 #8 前 11 章重组成同一个 harness 的九层:控制(loop)/ 能力(tools)/ 容纳(sandbox)/ 对抗(security)/ 供给(context)/ 持久(memory+自我改进)/ 协同(multi-agent)/ 度量(eval+失败)/ 实证(真实系统)。每层对应一堵当前墙。
训练 harness 故意宽(最大化动作空间让 optimizer 发现策略),生产 harness 故意窄(最小权限、默认拒绝、观测一切)——两个不同的工程产物。两个对称失败:训练里过度上锁(模型没学会从工具错误恢复)/ 生产里欠围栏(注入流过工具输出就泄密)。
模型权重远超单卡显存的物理约束 —— 前沿模型可达单卡的十几到二十倍(如 671B 模型 BF16 约 1.34TB,而单卡仅 80GB)。它是「大模型必须分布式」的根因。
把整个模型复制到多张卡、切分数据各算各的,再用 all-reduce 同步。关键区分:它要求每卡都装得下整个模型,所以不解决「单卡装不下」,解决的是吞吐;在 serving 里表现为多个完整 replica。
把单层内部的矩阵乘法切到多卡协同(层内并行)。能装下「一张卡放不下的层」,但每算一层都要 all-reduce 合并、通信最密,只在节点内高速互联(NVLink)才划算。源自 Megatron-LM。
把层堆按深度切成几段、每卡管一段,micro-batch 像流水线一样流过(层间并行)。通信轻,但开头灌入、结尾排空时有「气泡」空转;低延迟 serving 不爱用。源自 GPipe。
MoE 专属:把专家分散到多卡,每个 token 路由到它的专家所在的卡再收回。代价是 all-to-all 全交换通信。DeepSeek-V3 把它推到了 EP320 的部署规模。
Mixture-of-Experts:很多专家子网络,每个 token 只激活其中几个。系统含义:激活量决定算力,但参数总量决定显存 —— 所有专家必须同时驻留,二者不可混淆。架构细节见 #4 模型设计。
Zero Redundancy Optimizer:数据并行的内存优化,把优化器状态(ZeRO-1)、梯度(ZeRO-2)、参数(ZeRO-3)逐级分片到各卡、谁用到再取 —— 用通信换显存。属训练侧组装,深入见 #5 预训练。
让多张卡协同搬运数据的一组标准原语(all-reduce / all-gather / all-to-all 等)。它是「把计算切开后必须把碎片重新合起来」的工程化答案;由 NCCL 这类库执行。
集合通信原语:把各卡的部分结果归并(最常见是求和),再让每张卡都拿到同一份完整结果。张量并行合并碎块、数据并行平均梯度都靠它。等价于 reduce-scatter + all-gather。
集合通信原语:每张卡都向其他每一张发一份不同的数据、也从每一张各收一份。是这组原语里最「热闹」、代价最高的;MoE 专家并行路由 token 的核心。
英伟达 GPU 之间的高速直连(节点内)。H100 每卡约 900 GB/s(双向)、H800 砍到约 400(这是 DeepSeek-V3 那代的数字);2026 的 Blackwell Ultra 已到 NVLink 5 约 1.8TB/s。无论哪代,节点内都比节点间 InfiniBand 快约一个数量级 —— NVLink 是「路」,NVSwitch 是把路连成全互通的「立交桥」。
把多条 NVLink 连成「任意两张卡都能同时全速直达」的交叉开关芯片。一个 8 卡节点通常有几块 NVSwitch。没有它,卡只能两两点对点、带宽被分摊。
节点之间的高速网络(机器与机器之间)。Hopper 世代的 NDR 每卡约 50 GB/s(DeepSeek-V3 的数字),是带宽鸿沟里慢的一侧;2026 已到 XDR、每卡约 200 GB/s,但仍比节点内 NVLink 慢约一个数量级。常与 RDMA 一起出现。
Remote Direct Memory Access:让一台机器的网卡直接读写另一台的内存、绕开远端 CPU 和内核,延迟极低。面向 GPU 显存的加强版是 GPUDirect 与 IBGDA。
NVIDIA Collective Communications Library:卡间集合通信的发动机,把一句 all-reduce 翻译成针对硬件拓扑(谁走 NVLink、谁走网络)的最优搬运。AMD 上对应的是 RCCL。
一次 LLM 推理的两个阶段。prefill 把整段 prompt 一次性并行算完(大矩阵乘法、算力满载,compute-bound,决定 TTFT);decode 逐 token 自回归生成回答(每步搬全部权重加 KV 只算一个 token,显存带宽卡住,memory-bound,决定 TBT)。二者资源脾气相反,是 PD 分离(把两阶段拆到不同机器)的根因。
Time To First Token:从请求到达,到第一个输出 token 蹦出来的时间。主要由 prefill 计算(prompt 越长越久)加上请求在系统里排队、被调度的开销决定 —— 所以它不只是模型快不快,也是个系统问题。prefix caching 是压低它的主要杠杆。
Time Between Tokens:首字之后,每个输出 token 之间的间隔(也叫 TPOT 或 ITL,口径略有差异 —— TPOT 通常取均值,ITL 看分布)。它由 decode 阶段主导,而 decode 被 GPU 显存带宽卡住,所以 TBT 本质是显存带宽的一面镜子。
一个计算的瓶颈在哪:memory-bound 指卡在数据从显存搬到计算单元的带宽上、算力大量闲置;compute-bound 指卡在算力本身。LLM 推理里 decode 是典型 memory-bound(每步搬全部权重加 KV 只算一个 token),prefill 是典型 compute-bound(一次并行算一大批 token)。roofline 分析(见 Ch8)把这条判断线正式画出来。
也叫迭代级调度(iteration-level scheduling)。不以整批请求为单位、而以每一步 decode 为单位重新组批:某个请求一结束就腾出槽位,下一步立刻填进排队的新请求,GPU 不留气泡。对照静态批处理(整批要等生成最长的那个结束,先完成的干等)。首创 Orca(OSDI'22),vLLM 普及成事实标准;提升随生成长度方差增大而增大。
把一整块大 prefill 切成近似等大的小块,插进正常的 decode 步骤之间算,避免长 prefill 长时间霸占 GPU、把所有进行中请求的 decode 憋住(TBT 飙升)。是平衡 prefill(compute-bound)与 decode(memory-bound)抢同一 GPU 的关键手法。来自 Sarathi-Serve(OSDI'24),vLLM 新一代架构默认开启。
也叫 cache-aware 路由:在多副本集群里,把共享前缀(如同一段长 system prompt)的请求路由到同一副本,让第二个请求命中已算好的 KV cache、跳过重复 prefill。对照轮询会把它们随机打散、各自重算。SGLang 的 RadixAttention(基数树复用前缀)+ 缓存感知负载均衡是代表实现。
把一次推理的两个阶段拆到两组专门机器:prefill 机群(算力优化)算完 prompt、产出 KV cache,经 RDMA 传给 decode 机群(显存带宽优化)逐 token 生成。动机:两阶段资源脾气相反,合在一起互相拖累,也没法各自选硬件、各自独立扩缩。传输走 RDMA 不贵(能和计算重叠),够大规模才划算是为了把两个池各自喂满。源头 Splitwise(ISCA'24)/ DistServe(OSDI'24),2025 起成大规模 serving 标准(NVIDIA Dynamo / llm-d)。
MoE 专家并行部署里,把高负载(热门)专家复制到多张卡,避免持有热门专家的那张卡成为 all-to-all 的 straggler、拖垮整步。DeepSeek-V3 decode 部署用约 64 张卡专放冗余 + 共享专家。配套的 EPLB(Expert Parallelism Load Balancer · DeepSeek 2025 开源)按估计的专家负载算出复制 + 放置方案、动态再均衡(分层策略对应 prefill、全局策略对应 decode)。
按负载动态增减服务副本数。LLM serving 的特殊难处:一个新副本要先把几十上百 GB 权重装进显存,冷启动常以分钟计(远超无状态 web 服务的秒级),撑不进一个扩缩周期,所以要预留 warm headroom(代价是 GPU 开销翻几倍)。容量的真正单位不是 QPS,而是 KV cache 显存预算 —— 权重装完后剩的显存能同时塞下多少并发 × 上下文。
vLLM 的签名机制(SOSP'23):把 KV cache 切成固定大小的块(默认 16 token),用块表把逻辑块映射到 GPU 显存里分散的物理块,像操作系统的虚拟内存分页 —— 逻辑连续、物理分散,几乎消灭碎片(论文报告朴素分配的有效显存可低至约 20%),并支持前缀共享(引用计数 + copy-on-write)。今天的 vLLM V1 里,分页在 core、算注意力在可插拔后端(FlashAttention / FlashInfer),经典独立 CUDA kernel 退为备用路径。
每个序列一张的「逻辑块 → 物理块」映射表,是分页管理 KV cache 的核心数据结构:让一个序列逻辑上连续、物理上分散在 GPU 显存里。在 vLLM 代码里对应 KVCacheBlock(物理块编号 block_id + 引用计数 ref_cnt + 内容哈希),类比操作系统的页表。
判断一个计算瓶颈在哪的可视化模型(Williams 等,CACM 2009)。横轴是算术强度(FLOP/字节),纵轴是可达速度;平屋顶 = 峰值算力,斜屋顶 = 带宽 × 强度,可达速度取两者较小。两顶相交的脊点,横坐标 = 峰值算力 ÷ 带宽。落在脊点左侧 = memory-bound(卡带宽),右侧 = compute-bound(卡算力)。LLM 推理里 decode 在左、prefill 在右。
一个计算每从显存读一个字节,平均做多少次浮点运算(FLOP/字节),即 roofline 的横坐标。它和这张卡的脊点临界值(峰值算力 ÷ 带宽)谁高谁低,决定 workload 卡在算力还是带宽。LLM 单序列 decode 约等于 1(读 2N 字节权重只算 2N 次,与模型大小无关),prefill 因一次并行算一大批 token 而高得多;拼批能把 decode 的强度抬到约等于批大小,但 KV cache 读取不被摊薄。
Model FLOPs Utilization:实测的「模型定义必需」运算速度 ÷ 硬件峰值算力。只数模型本身要求的运算(不数重复计算或实现取巧),所以跨系统、跨硬件可比;出自 PaLM 论文(2022)。常用换算:每 token 约 2N 次运算(推理)/ 6N(训练,N = 参数量)。前沿训练普遍 35–55%(PaLM 标杆 46.2%);memory-bound 的 decode 用 MFU 量天生偏低,该改看 MBU(带宽利用率)。
把一次真实运行录下来、看时间和数据到底花在哪,而不是凭直觉猜瓶颈 —— 性能工程「不优化没测量过的东西」这条铁律的落地动作。闭环是:测量 → 放到 roofline 读出卡哪条屋顶 → 优化绑定约束 → 复测。常用工具:PyTorch Profiler(导出 trace,用 chrome://tracing / Perfetto 看)、NVIDIA Nsight Systems(整体时间线)、Nsight Compute(单 kernel,内置 roofline 图)。DeepSeek 的 profile-data 仓库是公开的真实 trace 范例。
用更少的比特表示权重/激活,以省显存、抬高 memory-bound 阶段的算术强度、并用上更快的低精度算力。两条主轴:训练后量化(PTQ,只需校准、serving 常用)对量化感知训练(QAT,训练时模拟、极低比特更稳);只降权重(GPTQ/AWQ,省搬运、治 decode)对连激活一起降(SmoothQuant 把激活离群值挪进权重,解锁低精度算力)。缩放粒度从 per-tensor 到 per-block(微缩放)越细越准。
不把整个模型一刀切到低精度,而是把占绝大多数计算量的大矩阵乘法(GEMM)降到低精度,同时把少数计算量小、却极敏感的部件留在高精度。DeepSeek-V3 第 3.3 节 的「不许降」清单是模板:嵌入层、输出头、MoE 门控、归一化、注意力,以及主权重/梯度/优化器状态。直觉:量化大头换吞吐,死守精密机件防止误差污染全局。
8 比特浮点,当下生产精度的主力(Hopper 起原生支持)。两个标准变体:E4M3(4 位指数、3 位尾数,范围 ±448,保精度,存权重/激活)与 E5M2(5 位指数、2 位尾数,保范围,存梯度)。对照纯整数 INT8 的均匀刻度,FP8 的对数式刻度更扛 LLM 激活里的离群值。把 KV cache 也降到 FP8,可在同显存里近似翻倍上下文/并发。
让 4 比特能用的关键技巧:一小块连续的数共享一个缩放因子 —— 块内每个数存成粗糙的 4 比特小数,再乘块的缩放因子还原真实大小,于是 4 比特的格子不必硬扛整个张量的离群值。两个生产格式:NVFP4(每 16 个一块、缩放因子用 FP8 还能取小数倍 + FP32 张量级缩放)比 MXFP4(每 32 个一块、缩放因子只能取 2 的整数次幂)更准,是 2026 年 Blackwell 上原生的前沿格式。
把可靠性变成可度量目标的一套语言。SLI(指标)是你实际测的数,站在用户角度、延迟看百分位(p95/p99)非均值;SLO(目标)是内部目标(如 30 天 99.9%);SLA(协议)是对客户的法律承诺、违约赔钱。错误预算 = 1 − SLO(99.9% = 每月约 43.2 分钟宕机),当成可花的预算:还有就放手快跑、花光就冻结加固,报警盯它的燃烧速度而非瞬时抖动。
对付长尾延迟的招:一个请求超过比如 p95 的预期延迟还没回,就向另一个副本再发一个一模一样的、谁先回用谁(绑定请求则让先开工的那个叫停另一个)。出自 Google《The Tail at Scale》—— 大扇出系统里单机偶尔的慢会被放大成几乎每个请求都慢;实测跨 100 台、延迟 10ms 后对冲,把 p99.9 从 1800ms 压到 74ms,只多发约 2% 请求。
DeepSeek 开源的分布式文件系统(Fire-Flyer FS):把上千块 NVMe 固态盘 + 上百节点的带宽聚合成一个共享存储,180 节点上约 6.6 TiB/s 聚合读。用 CRAQ(带分摊查询的链式复制)拿强一致 —— 写走完整条复制链(受限于最慢节点)、读打任意副本;元数据无状态、架在 FoundationDB 上。serving 角度的关键用途是把 KV cache 卸载到它(单客户端约 40 GiB/s),给 KV 加一层比 DRAM 便宜、大得多的内存层级。
服务一个模型的成本结构。GPU 按小时烧钱(2026 还闹供给紧张、价格回升、产能售罄,约束常是抢不抢得到卡)。输出 token 贵过输入 5–6 倍且跨厂商一致 —— 因为输入走 prefill(compute-bound)、输出走 decode(memory-bound),单看 FLOPs 两者近似相等,溢价全在显存搬运(「decode 是 memory-bound」印在账单上)。省钱头号杠杆是 prompt caching(命中缓存的输入约一折);agent 约 4×、多 agent 约 15× token。
把成千上万个 agent 会话当成一个生产服务运营在规模上 —— #2 分布式 infra × #8 agent 语义的交叉。新墙:单个 harness 能跑 ≠ 万级并发能运营,因为 agent 会话的形状(长命几分钟到几小时 / 有状态 / 有副作用难重试 / 必须在部署时续命)和无状态 web 请求恰恰相反。本主题只讲运营在规模上的分布式与 ops 面;单 harness 内部(loop / context / 工具 / 单沙盒 / 单 agent durable)是 #8 Agent 工程的题目。
运营 agent 会话的基础设施,借自网络的控制面/数据面之分:控制面决定路由、调度、配额策略、以及会话状态归谁拥有;数据面执行 agent 与工具调用。把两层分开,才能在不动正在跑的 agent 的前提下改路由/策略。反向代理的无状态假设对长命有状态会话失效;状态分层为 用户→会话→运行(会话是隔离边界)。坑:别拿用户 ID 当会话键、别拿工作进程本地内存当权威来源。
调度、回收成千上万个隔离执行沙盒的分布式基础设施(单个沙盒是什么、隔离档怎么选,见 #8 Ch4)。核心旋钮是空闲回收 vs 冷启动:回收省钱但下个请求要冷等几秒。2026 的胜出解法是快照到待命(把配好的沙盒快照、挂起、近瞬恢复)+ 按活跃计费 + 预热池(拿到达速率算池该多大)。规模下的安全做法:一会话一微虚拟机、结束就擦内存。
给多个租户安全计费、限流、路由 agent 流量的网关。关键纠偏:按请求数限流是错的原语(一万 token 和五十 token 都算「一个请求」),要按 token 计量(每分钟/每天 token,输入输出分开)。用「租户×工作负载×模型」桶键同时做限流 + 成本台账 + 审计;配额按 组织→团队→用户→虚拟密钥 层层向下;虚拟密钥 = 租户隔离边界,撞配额返回 429(agent 框架读作退避)。跨租户共享前缀缓存有时序侧信道,按租户哈希命名空间缓解。
设计 serving 系统的四维取舍尺子:延迟 × 吞吐 × 成本 × 可靠性。四维互相拉扯、没有免费的旋钮 —— 拼批提吞吐却拉高延迟、降精度提吞吐却赌上正确性、PD 分离要够规模才划算、加副本提可靠却翻倍成本(连容量本质都是 KV cache 的显存账)。判断力不是记住哪招最好,而是先问「这个场景四维谁最要紧、我愿在哪一维让步去换哪一维」。
2026 年 AI 系统的头号绑定约束已从算力转向电力:决定能否落地的是并网能力,而非芯片、资本或算法(WEF 2026)。瓶颈甚至不在发电,而在设备与排队 —— 高压变压器交货从约 2 年拉长到约 5 年,电力设备只占数据中心成本不到一成、却是百分之百的卡点,容量电价两年翻十倍以上。与「内存墙」、Patterson「瓶颈在内存与互联、不在算力」一起,标记了从「堆 FLOPs」到「抢电、抢内存带宽」的认知转向。
能基于目标、上下文、工具、状态自主决定下一步动作的软件系统。
模型推理 → 工具调用 → 结果回填 → 再推理 → 直到完成。Agent 的核心执行循环。
Agent 执行过程中的一个动作单位,例如一次模型调用或工具调用。
用户和模型之间的一轮交互。一个 turn 内部可能包含多个 Agent step。
Agent 从开始到结束的完整过程记录,包括所有调用、结果、错误和输出。它是 agent 评测与诊断的基本对象(见 Ch9 轨迹评测)。
Planner-Executor 模式里的强模型,把大任务分解成多步计划;便宜的 executor 执行单步。省钱逻辑:大模型只在(重)规划被调。陷阱:plan 太粗→executor 幻觉、太细→token 膨胀,需设 re-planning 上限(连 Ch2)。
Planner-Executor 模式里执行单步、调工具的(通常便宜 / 弱)模型。诚实标注:成熟 harness 实测里,强 planner + 便宜 executor 常在质量上输给单用一个前沿模型 → 让模型自己决定何时委派,优于人手固定混搭。
Reasoning + Acting 的 Agent 模式:思考 → 行动 → 观察 → 再思考。
限制 Agent 行为边界的规则系统(权限、安全、审批、输出约束)。
观察当前状态 → 决定动作 → 执行动作 → 更新状态 → 再继续循环。控制理论里的经典 pattern,Agent Loop 是它的 LLM 实例。
持续等待并处理事件的循环机制,常见于 UI / 浏览器 / Node.js 等系统。LLM Agent 系统的 async 实现底层就是 event loop。
Agent Loop 停止运行的条件:任务完成 / 达到 max iterations / 超时 / 失败 / 用户中断 / 成本上限。
限制 Agent 最多循环多少次,防止死循环和成本失控。Production 必备。
Agent 执行任务时的资源限制:token / 时间 / 工具次数 / API 成本等。Production 必加。
工具调用后返回给模型的结果。ReAct 模式里"思考→行动→观察"的第三步。
Agent 决定执行的外部行为:搜索、读文件、写代码、调 API 等。
让模型检查自己的过程或结果,用于纠错、总结、判断是否继续。Self-Correction 的基础。
Agent 根据错误反馈自动修改计划或输出。Reflection 的应用。
本路书的核心命题:一个 agent 的能力 = 模型能力 × 包在模型外那层 harness 的质量。harness 是和模型同等重要的高杠杆层 —— 同一个模型换套 harness,成功率可差数倍。
包在模型外面、让它能可靠干活的整层工程:循环、工具、终止、错误恢复、上下文管理。Agent ≈ 模型 × harness 的质量。
一个没有执行函数的专用工具,模型调用它就等于发出「我做完了」信号,让循环干净地停。比指望模型自然终止可靠。
确定性的强制叫停:N 步 / X 美元 / 连续 K 次错误任一触发就杀掉整个 agent run,防止跑飞烧钱。
推理模型在答复前私下生成的思考。harness 必须跨工具调用把它搬运下去,否则缓存失效、模型变笨变贵。
Anthropic 模型承载推理状态的块。工具调用循环里必须原样传回上一条 assistant 消息,漏了直接报错。
没有任何单步失败,但每一步的即时 context 一点点压过最初意图,任务整体跑歪(「修个 bug」五步后变成大重构)。典型的涌现失败。
agent 停不下来、反复做同一件事烧 token 不交付;根因是没有干净的终止信号加上 reasoning 模型的循环倾向。与过早终止是同源的两极。机制修复见 Ch2。
agent 部分进度就宣布完成、功能没测就标完成。和失控循环同源——都因为 agent 不会可靠评估「任务真做完没」。
一步的错(如工具报错被当成结果总结进去)静默污染后续每一步;根因是工具返回结构上不分成功失败。在 multi-agent 里被放大(A 的脏输出进 B 的 context 当事实)。
用户一表示不同意,agent 就把本来正确的答案改错,即便没有任何新事实。训练级根因(偏好「用户爱听」)归 #6,本章教在轨迹里识别它。
模型可以调用的外部能力,例如搜索、读文件、查数据库、运行代码。
模型请求执行某个工具的动作,通常包括工具名 + 参数。
模型输出结构化的函数名 + 参数,由外部程序实际执行函数。
描述工具参数格式、字段类型、必填项和约束的结构说明。
用于描述 JSON 数据结构的标准,常用于定义工具参数。
标准化的 LLM 和工具/数据源之间通信的协议。2026 主流 AI host (Claude / Cursor / Codex) 都支持。
限制单位时间内的调用次数,常见于 API 和模型服务。HTTP 429 对应它。
调用工具或函数时传入的数据。Tool schema 里 input_schema 定义每个 argument 的类型 + 约束。
检查参数、结果或输出是否符合 schema、规则和业务要求。LLM 输出必校验(模型有时输出 invalid JSON)。
集中记录当前可用工具的中心:名称、描述、schema、handler、权限等。
真正执行某个工具逻辑的函数或模块。Handler 是工具的 implementation,schema 是它的 interface。
工具执行完成后返回给 Agent 或模型的结果。在 Agent Loop 里作为 tool_result block 塞回 prompt。
工具执行失败时返回的错误信息:权限不足、参数错误、网络超时等。需要明确传回 LLM 让它决定下一步。
工具失败后再次尝试执行。需要分类(retryable vs not)+ backoff + jitter + max retries。
限制工具或请求最多执行多久,防止系统卡死。HTTP 504 对应它。
控制 Agent 能不能调用某个工具或执行某类动作。高 stakes 工具(发邮件 / 删文件 / 付款)必须有权限层。
在高风险动作前要求用户确认:发邮件、删文件、付款、发布内容等。HITL 是 Agent 安全的最后一道防线。
为模型这个新用户专门设计的接口(工具命名 / 返回 / 界面动作)。投入应像投人机界面一样 —— 同一个模型换一套 ACI,成绩能差几倍。
把面向一个工作流的多步揉进一个工具(如 schedule_event),而非一对一映射每个 API 端点。工具不是越多越好。
把 schema 交给 API,模型在解码层就被约束、物理上发不出违规 token。区别于只是「请输出 JSON、你自己校验」的 JSON mode。
工具标成延迟加载、不进初始上下文,模型用时再按名 / 描述搜出来。治理工具爆炸,实测省约 85% token。
把工具呈现成代码 API,让模型写代码编排工具,而非逐个直接调。同时砍掉工具定义和中间结果的 token 开销 1-2 个数量级。
在屏幕截图上给可交互元素叠编号框喂给模型。贵(每张截图数百 token)但几乎啥界面都能跑。GUI agent 的一种 observation 表征。
用浏览器的语义化结构(role / name / state)表征界面喂给模型。比截图便宜得多,但依赖站点 markup 质量(现实里多数站点脏)。
一个 skill = 一个目录 + `SKILL.md`(YAML name/desc + 正文)。三级渐进披露:name 启动常驻 → 相关时载入正文 → 附件按需深挖。与 Ch6 共享「load on demand」底层机制。2025 已成跨平台开放标准。
系统在某一刻需要记住的信息,例如任务进度、已调工具、当前 context 摘要。
系统不记得上一次请求,每次请求都独立处理。LLM API 是 stateless 的。
系统会保留过程信息,可以连续推进任务。
Agent 保存和复用历史信息的能力。primitive vocabulary 在本路书 04,production engineering 归 #8。
当前 context window 中的信息,直接参与模型推理。
模型窗口外的持久存储(文件 / DB / 向量库 / 知识图谱),跨步、跨会话、跨任务存活;对应窗口内易失的 working memory(Ch6)。MemGPT 虚拟内存隐喻:context = RAM,外存 = disk,agent 用工具分页。
记录"发生过什么"的记忆:跑过的轨迹 / 对话史,放召回存储,用相关性 + 最近性召回。Reflexion 的反思缓冲区就是它的工程化(把失败轨迹的语言教训存下来供下次重试)。
记录稳定知识和事实的记忆:用户偏好 / 项目约束 / 世界知识,放结构化 store 或知识图谱(如 Zep 的时序图谱,能理解状态变更而非并存事实)。
当前任务中最重要、最需要关注的信息。通常放 context window 顶部 / system prompt 最前。
保存记忆的地方:五型记忆落到三种持久存储形态 —— 向量 / 键值或文件 / 知识图谱。选型看集成速度对架构深度(mem0 快浅 · Letta 深托管 · Zep/Cognee 图结构)。
把数据保存下来,使程序重启后仍然存在。LLM 系统的 state 必须持久化(否则用户重连丢历史)。
任务执行过程中的保存点,用于失败恢复、续跑和回滚。长任务 agent 必备。
一次连续交互或任务过程的上下文单位。Session ID 把多个 LLM call 关联起来。
任何记忆系统的四个动词:write(何时记 —— 别全记,里程碑/模型自判)· read(按需召回,recency·importance·relevance 三轴打分,溯源 Generative Agents)· update(处理 staleness + 状态变更冲突)· forget/compress(去重摘要,警惕过度压缩的「脑叶切除」)。
「怎么做」的知识 —— 这就是 Skills。把可复用的多步 workflow 沉淀成可调用的过程知识;ProcMEM 把被动的经历叙事转成带激活/执行/终止条件的可执行技能(无参数更新)。
Letta:把 agent 拆两个 —— 主 agent 只对话+搜外存,睡眠期 agent 在空闲期(无用户输入的自主轮次)异步整理记忆(合并归档 / 重写乱块 / 总结近期对话)。让对话不被记忆 op 拖慢 + 主动重整。即「agent 在闲时做家务」。
自我改进的国民版:每次新会话开头读的 markdown,边干边把 learnings 写回 —— 读文件→干活→学到→更新→下次更好的复利环(Reflexion 闭环最朴素的体现)。诚实失败:bloat(撑爆 context)/ staleness(旧架构没删)/ 指令稀释 → 记忆必须自治。
模型当前能看到的信息(system prompt + 对话 + 工具结果 + 文件 + 检索结果)。
模型一次能处理的最大 token 范围。
模型处理文本的最小单位。1 英文词 ≈ 1.3 token,1 汉字 ≈ 2 token。
给模型的输入内容,包括任务、背景、约束、格式、示例等。
高优先级指令,用于定义模型角色、行为边界、安全规则和输出要求。
由应用开发者设置的行为指令,通常优先级高于普通用户输入,低于 system prompt。
可复用的 prompt 结构,通过变量动态填充内容。Production prompt 几乎全部模板化。
把长上下文压缩成短摘要,节省 token 并保留关键信息。Context Engineering 子学科的核心动作。
将长内容总结成短内容,是上下文压缩的一种常见方式。
把复杂信息提取成更精简、更可用的知识或规则。比 summarization 更结构化。
不同来源指令的优先级关系:system 指令 > developer 指令 > user 输入 > 网页或工具返回内容。LLM 安全的关键设计。
agent(非纯推理模型)的表现在 3-7 轮见顶,之后累积的外部状态(工具输出 / 失败尝试 / 环境响应)互相矛盾或淹没模型,结果主动下降。与 context rot 同源——更多不等于更好;串行堆推理对 agent 有天花板。
在每一步策划并维护那个最优 token 集合的一整套策略(Anthropic)。Karpathy 类比:context window = agent 的 RAM、模型 = CPU,这门学科是 OS 级的「该把什么调进 RAM」的内存调度。准则:找最小的高信噪比 token 集合。
被动退化:输入 token 越多,模型准确召回 / 推理的能力越差,即使任务没变难。根因 n² attention 被摊薄 + 训练短序列偏多。后果:声称的 window ≫ 有效 window(NoLiMa:32K 时多数模型已掉到基线一半以下)。
位置偏置:相关信息放 context 首尾时召回最好,放中间显著下降,性能呈 U 形(Liu 2023,对应心理学 serial-position effect)。新模型在简单任务上缓解,但复杂长任务仍受拖累。对策:把关键信息复述到末尾(attention 高区)。
主动退化:反复重写 / 压缩 context,每次摘要丢一点细节,累积侵蚀(ACE 命名)。伴生 brevity bias(为简洁丢领域洞察)。与 context rot 正交。对策:压缩可逆 + 增量 delta 更新,别整体重写;关键约束另存。
decode 时把每个 token 算过的 Key 和 Value 存下来反复复用,把每步计算从重算整个历史降到只算一个新 token。代价是一块随上下文长度线性增长、主宰 GPU 显存的缓存 —— serving 的容量约束本质就是它(第一性见 #2 Ch4)。一个高杠杆的派生用法:相同前缀可跨请求复用(prefix caching),命中价格约未命中的 1/10、首字延迟也大降,是 agent / 多轮对话的头号成本杠杆,纪律是稳定前缀(别放时间戳)、只追加不改历史、显式 cache 断点(见 #8 Ch6)。
管理 context 这块 RAM 的四个方向(LangChain 一手骨架):Write 写到窗外(scratchpad/memory)· Select 按需选进来 · Compress 压缩只留必要(有损)· Isolate 拆给子 agent 各自的窗。各治一种病:中毒 / 分心 / 混淆 / 冲突(Breunig)。
Select 策略的核心范式:不预载,维持轻量标识符(文件路径 / URL / query),到当前步真需要时才用工具拉。「mirrors human cognition」——人不会把整个文件系统背下来。Claude Code 不把整个 codebase 载进 context,按需探文件。
把近上限的对话摘要掉、用摘要重新初始化一个新 window(Anthropic)· 长任务连贯性第一杠杆。调参:先最大化召回再提升精度。有损(collapse 风险)→ 关键约束另存 CLAUDE.md。三家取舍各异:加密(Codex)/ 人可读(Claude Code)/ 模型自决(OpenCode)。
把大块、可回读、现在不一定要用的内容(网页 / 日志 / PDF / 大 tool 输出)写到文件,context 里只留指针。无损(原文在磁盘可回读),所以优先于有损的 compact。「能 offload 就别 compact,能 isolate 就别进主窗」。
把 window 当预算做运行时调度:分配(四大消费者 system+tools / history / retrieved / scratchpad 互挤,稳定放前、目标放末)· 驱逐(满了换出谁,LRU(最近最少用)/hot-tail,驱逐≠删除而是移到可召回外部)· 阈值(百分比 / 绝对 token / 任务边界)。
context engineering 的输入端:agent 每一步感知到的环境,该用什么表征塞进 context(不是感知质量=#7,是「喂什么 token」)。手法:tool 结果截断 / 引用而非倾倒 / 结构化优于散文 / 错误观测保真。坏表征 = 从源头制造 context rot。
context 工程的贯穿准则:相关信息的信噪比比总信息量更重要。Five Sigma 案例——精选、schema 化的相关数据准确率超 95%,而把全部文档语料喂进去反而远低。一句话:喂全 ≠ 喂准。
先检索相关资料,再让模型基于资料生成答案。
把文本压成固定维度的向量(常 1536 维),意思近的向量距离近。
一组数字,用于表达文本、图片或其他数据的语义特征。
专门存储和搜索向量的数据库,例如 Pinecone、Weaviate、Chroma、Milvus、Qdrant。
把长文档切分后得到的小片段,用于 embedding 和检索。
检索时返回最相关的 K 个结果。
初步检索后,用更强模型或算法重新排序结果。foundations 不教(归 #3)。
让模型回答基于可靠来源,而不是凭空生成。
模型按概率拼出但不存在 / 不准确的内容。
被检索和引用的原始资料:PDF / 网页 / Markdown / 代码文件等。
把长文档切成多个 chunk 的过程。切得不好,retrieval 质量直接掉。
根据向量距离寻找语义相近的内容。Vector DB 的核心操作。
相关内容是否能被检索出来。Retrieval 质量两大指标之一(另一个是 precision)。
检索出来的内容是否真的相关。和 recall 通常 trade-off。
为了快速检索而建立的数据结构。Vector DB 的 HNSW / IVF 等索引类型。
描述数据的数据:文件名、页码、章节、创建时间、权限标签等。检索时用作 filter。
标明答案来源,方便验证和溯源。RAG 系统的核心 production feature。
明确的任务步骤链。foundations 不教 production workflow 编排(归 #8)。
表示任务依赖关系的图结构,常用于工作流编排。
根据任务类型把请求分发给合适模块、工具或 Agent。
负责管理其他 Agent 的上层 Agent。
被主 Agent 调用的专门 Agent。foundations 仅 vocabulary,production design 归 #8。
封装好的能力包,通常包括说明、适用场景、工具、约束和执行流程。
用明确状态和转移规则控制流程:Draft → Review → Approved → Published。
工作流或图中的一个处理单元。
连接节点的路径、依赖或转移关系。
负责把请求、事件或任务派发给对应 handler 或 worker。
主 agent 把任务派给 subagent。委派工程(Anthropic 一手):每个 subagent 必须拿到目标 + 输出格式 + 工具指引 + 清晰边界;effort-scaling 把「开几个 agent」写进预算(简单 1 个 / 对比 2-4 / 复杂 10+)。在上游定死共享假设 = 工程化地防 Cognition 指出的并行冲突。
去中心拓扑的核心原语:一个返回「另一个 agent」的函数,调用即把控制权连同当前完整对话历史移交目标 agent → context 连续不碎。设计维度 = 传多少 state(全量 / 过滤 / 结构化交接单):传太多贵 + 噪声,传太少丢一致性。
记录当前可用 skill 的注册中心。Agent runtime 启动时加载。
系统能做什么:搜索、写代码、读文件、生成图片、查数据库等。Capability 是 skill / tool 的更抽象描述。
指导系统如何决策的规则:何时调工具 / 何时要求确认 / 何时停止。
agent 与 agent 之间的协议(对照 MCP 的 agent ↔ 工具):互相发现能力、交接任务。2026 已 v1.0、150+ 组织生产用。深入归 Ch8。
tool = 提供访问的原子原语(fetch/read/write/search,无内部决策)· skill = 封装「怎么做」的可复用 workflow 知识(MCP handles access, Skills handle workflow)· subagent = 生而隔离的 worker(干净 context、限权、只回结果)。三层协同非三选一;高 token 中间工作 → subagent,要限权 → subagent。
靠语言反馈 + 攒记忆/技能让 agent 变好,policy = context 里的文本、模型权重不动 = #8 教的。更新权重的 RL(SFT/RLHF/RLVR)= #6。硬线:动权重归 #6,没动归 #8;#8 产 trajectory 喂 #6 训练。分工示例:#8 设计动作空间,#6 学策略。
无梯度自我改进的根:Actor 跑 → Evaluator 评轨迹 → Self-Reflection 把失败口头反思成文本教训 → 存进 episodic buffer → 下次进 context。policy = 累积的反思文本,不是权重(故称 verbal RL)。HumanEval 91%。
把跑过的经历蒸馏成可复用技能:Voyager(技能库祖先)→ ExpeL(跨任务自然语言 insight)→ Trace2Skill(并行分析一池轨迹 → 无冲突 SKILL.md,跨模型迁移)→ ProcMEM(可执行过程记忆)。「记忆是蒸馏不是囤积」;蒸馏出的 skill 能跨模型 scale 迁移。
Ch8 脊柱:multi-agent 不是 free lunch,是用 token + 碎片化风险换并行吞吐 + 突破单 context window。决策框架 = 可拆性 × 共享上下文需求。Anthropic(+90%/15× token · 广度研究)与 Cognition(单线程 · 编码)两边都对,workload 决定成败。
从简到繁:单 agent + 工具 → pipeline 顺序 → orchestrator-worker(中心)→ 去中心 handoff/swarm → network 对话 → debate。守 simplicity:每升一级先证明上一级不够。第一分水岭 = 中心化(并行/会碎)vs 去中心(连续/难并行)。
多 agent 的第一成本(比钱更深 · Cognition 洞见):并行让决策分散、完整 agent 轨迹不共享 → 各 subagent 基于上游未约定的冲突假设行动 → 产出根本不一致、无法调和(Flappy Bird 反例)。token 贵是表象,决策一致性丢失是本质。
拓扑之一:多个 agent 多轮 propose→critique→收敛投票。与「冲突根治在上游」相反,debate **故意制造分歧再聚合**,用冲突本身提纯推理、抗幻觉,适合数学/策略推理(用 token 换准确率)。
多 agent 产出怎么合并。确定性聚合(投票 / schema 校验 / 去重):可靠、可审计、便宜,但只适合结构化产出。LLM-merge(一个 agent 语义综合):能调和语义冲突但贵、碰根本不一致会失败。所以根治在上游(派活定死假设),而非下游硬合并。
不同模型分工降本(强 planner + 便宜 executor)。省钱逻辑成立,但 2026 动手实测:成熟 harness 里强 planner + 便宜 executor 常在质量上输给单用一个前沿模型 → 让模型自己决定何时委派。坊间「降本 N×」具体倍数多无一手出处,按定性方向用、勿写死。
系统之间通信的接口。LLM API 是 stateless 的。
常见 API 风格,使用 GET / POST / PUT / DELETE 等方法操作资源。
边生成边返回结果。LLM streaming 把首字延迟(TTFT)从几秒降到 100ms,体感快 10×。
持久化存储 + 复杂查询。Agent 系统典型组合:Postgres + Redis + Vector DB。
把贵的东西(慢查询、LLM 调用)暂存一份,下次省事。注意 stale + consistency 陷阱。
异步缓冲,生产者投信、消费者按节奏取。解决削峰 + 解耦。
把应用 + 依赖打包成可复制、可部署的运行环境。Docker 最常见。
持续集成 / 持续部署。git push → 自动测试 + 自动部署的工程流程。
API 的具体地址,例如 `POST /v1/chat`。
客户端发给服务端的数据。HTTP request 含 method / URL / headers / body。
服务端返回给客户端的数据。HTTP response 含 status code / headers / body。
像调用本地函数一样调用远程服务。gRPC 是常见实现。
客户端和服务端双向实时通信的协议。Agent 进度通知 / chat UI 必用。
运行后端程序的机器或云服务。
请求服务的应用:浏览器、iOS App、桌面 App、CLI 等。
负责业务逻辑、数据库、权限、模型调用和 API 的部分。
用户直接看到和操作的界面部分。LLM app 前端常负责 streaming 显示和工具确认 UI。
关系型数据库查询语言。Postgres / MySQL / SQLite 等用 SQL。强结构数据首选。
非关系型数据库总称:MongoDB / Redis / Pinecone / Neo4j 等各自门派。
消费队列任务并执行具体工作的进程。Agent 长任务架构的标配。
按照固定时间周期自动执行的任务,例如"每天凌晨 2 点重新索引文档"。
最常见的容器工具。打包应用 + 依赖为 image,任何机器跑都一样。
无需直接管理服务器的部署方式,按请求或容器运行服务。GCP Cloud Run / AWS Lambda / Vercel Functions 等。
部署时注入的配置:API key、数据库地址、模型名等。绝不写进代码。
敏感配置:API key、数据库密码、OAuth token、私钥等。必须用 Secret Manager 加密存储。
确认"你是谁"。LLM app 通常用 OAuth / JWT / Session cookie。
确认"你能做什么"。和 authentication(认你)是两件不同的事。
常见授权协议,用于让应用访问用户在第三方平台上的资源(GitHub / Google / Slack 等)。
外部系统在事件发生时主动 POST 到你的 endpoint。和 polling(你主动查)相反。
runtime 自动把每步检查点落库,进程崩溃/重启后从最后检查点恢复而非从头重跑,让长任务 agent 不丢进度。
标识一个有副作用操作的键,重放前先查它是否已执行,保证写文件/下单/发邮件这类动作不被重复执行。
把模型生成的代码当 semi-trusted code 容纳的受限环境,核心目标是限制它出错时的爆炸半径(blast radius)。靠隔离 + 最小权限 + 纵深防御。
两个独立旋钮:审批是 autonomy 轴(动作要不要先问人),隔离是 containment 轴(动作跑了能炸多大)。可任意组合,强隔离可换来更高自主。
Linux 机制,过滤一个进程能发出哪些系统调用及其参数。与 Landlock 互补叠加(它管 syscall,Landlock 管内核对象)。
Linux 安全模块(LSM),在文件/目录/网络端口等内核对象层做访问控制,且无特权进程能给自己加限制。≠ seccomp,两者互补叠加而非二选一。
用用户态程序重实现大部分 Linux 系统调用,使被关代码的 syscall 不直达宿主内核,大幅收窄攻击面。代价:syscall 不全 + 开销随负载波动大。仍共享内核。
极简 microVM,每份代码独立内核(硬件边界)、只仿真 5 个设备、约 125ms 启动 / <5MiB 内存。跑完全不可信代码的多租户事实标准(e2b / Vercel Sandbox)。
deny-by-default 的出站管控:沙盒无网络接口,唯一出口走沙盒外的 proxy 做域名白名单。Ch4 是资源边界一维,Ch5 是反数据外泄命门。极限:proxy 不解密 TLS,可信域名仍是外泄通道。
agent 发不带凭证的请求,由沙盒外的 proxy 注入真凭证再转发 —— agent 永远看不到真密钥。凭证集中管理、可记日志、可强制 endpoint 白名单。
审批规则(解析命令/AST 匹配)是权限闸门,决定「问没问」,参数级 pattern 可被绕过,不是安全边界;OS 沙盒决定「能不能」,才是强制隔离。两层叠加才完整。
把恶意指令藏进 agent 读到的内容里劫持它。原罪:指令和数据共用一个 token 通道,自然语言没有「参数化」可根治(对比 SQLi 有 prepared statement)。分直接(用户越狱)和间接(第三方藏进外部内容,agent 时代主战场)。
Willison 2025:访问私有数据 + 暴露于不可信内容 + 能对外通信,三者同现才构成窃数据的完美风暴。最可靠防御 = 架构上拆掉一条腿(不是加 prompt 护栏)。
注入的本质:agent 是持有用户高权限的代理,注入让不可信内容「借走」了它的权限。失败不在于模型读到恶意内容,而在于恶意内容能借走模型的权限 → 防御目标是不让脏数据触及高权限决策。
MCP 特有攻击:指令藏在工具描述里(模型读得到、用户 UI 看不到)、在调用前的握手阶段「插队」进 context、或批准后偷改行为(rug pull)。实测 ASR≈66%、拒绝率<23% —— 模型对齐挡不住。
Ch5 最重的一刀。过滤:识别并拦截坏内容(必被自适应攻击绕)。约束:从架构上让注入即使成功也碰不到高权限决策 —— 给保证而非概率。优先架构 pattern + 最小权限 + egress,而非堆分类器。
Willison 2023。特权 P-LLM 编排+调工具但绝不碰不可信内容;隔离 Q-LLM 处理脏数据但无任何工具;Q 只把结果以符号变量($VAR)交给 P。不可信数据触及不到调工具的 LLM = OS 级特权分离。
Google+DeepMind+ETH。P-LLM 生成沙盒 DSL 代码,数据带能力标签(来源+可去向)全程追踪,工具调用时强制策略。不改模型,纯架构保证。AgentDojo 上 77% 任务带安全保证 vs 无防御 84%(代价仅约 7 点)。
Meta 2025。一个 session 内三属性(处理不可信输入 / 访问敏感数据 / 改状态或对外通信)最多占两个;三者全需则不得自主运行、必须人在环 + 重置 context。是致命三连的可落地 checklist 版。
OWASP LLM06。三根因 = 最小权限的三个旋钮:过度功能(工具太多 → 收窄工具集)、过度权限(凭证太大 → task-scoped 最小权限 token)、过度自主(无批准就执行 → 人类闸门)。
人在环的已知失效模式(OWASP ASI09):审批弹窗太多 → 用户反射性点确认,等于没审批。含义:审批 UI 设计本身是安全工程(默认值、关键信息呈现、是否强制展开危险细节)。
生产 harness 在质量、速度、成本三个相互拉扯的目标间找点,没有免费午餐:追任一个常牺牲另外两个。工程姿势是先定 workload 可接受底线(多准 / 能等多久 / 能花多少),再在三角里找满足底线的点。
缓存 agent 循环每轮重发的前缀(系统提示 + 工具定义 + 历史)的注意力键值,命中则跳过预填充,读取约 0.1× 基础价,输入成本降 5-10× —— 控 agent 成本的头号杠杆。头号失效模式:前缀顶部放变动元素(如时间戳)→ 整个缓存失效、静默全价。
测试单个函数、模块或 handler 是否正确。LLM 系统下也适用,测 prompt + tool 的输出。
评估 Agent 表现的标准任务集。4 层叠加:unit / behavior / A/B / human。
更标准化、可比较的评测。常用于跨模型 / 跨版本对比。
人工确认过正确答案的测试集。Eval 的基石,持续扩展。
记录系统运行过程的信息。LLM 系统要 structured logging 才能分析。
一次请求从开始到结束的完整执行轨迹。LLM 系统的 trace 包括 agent loop 每一步。
系统出问题时能否看清发生了什么。3 件套:logs + metrics + traces。
从请求发出到获得响应的时间。LLM 系统看 TTFT + tokens/sec,不只看总时间。
单位时间内系统能处理多少请求。trade-off lens 三轴之一。
系统运行消耗的资源和费用。LLM 系统要算 token 成本 + infra 成本 + 人工成本。
验证系统是否按预期工作。LLM 系统的 testing 比传统系统多一层 eval(行为质量)。
测试多个模块组合起来是否正常工作。LLM 系统的 integration test 通常包括真实 LLM call。
从用户输入到最终输出完整测试整个链路。最重 + 最慢的一类 test。
防止新改动破坏已有功能。Golden set 是 LLM 系统的 regression test 基础。
测试中的判断条件:`assert output.contains("citation")` 等。LLM eval 中常用宽松 assert(contains / startsWith / in set)。
量化系统表现的数据:成功率、延迟、token 用量、工具失败率等。Observability 三件套之一。
把 agent 能力量化成:模型以 50% 可靠度完成的任务,换算成人类工时有多长。≈ 每 7 月翻倍(近年加速),Opus 4.5 ≈ 320 分钟 —— 是趋势锚,但 50% 口径 ≠ 生产可用(~99%)。
一个训练环境 = 沙盒(隔离 + 有状态重置 + 可复现)+ 奖励(可验证信号)+ 重置(回基线)。#8 把执行沙盒做成可被训练循环复用的载体;数据/算法归 #3/#6。
2025 实证:12 个已发表的注入防御被自适应攻击全破,多数 ASR>90%(原论文都报告接近零),人类红队 100% 成功。教训:静态测试集自评 = 虚假安全感 → 防御性 eval 必须用自适应红队;「通过 eval」≠「安全」。
agent 对抗安全的事实标准 benchmark。三指标:Benign Utility(无攻击完成率)/ Utility Under Attack(有攻击仍正确完成)/ ASR(执行全部恶意步骤比例)。用形式化检查环境状态判定,不用 LLM 裁判(裁判会被同一注入骗)。
把评测单位从「单次输入→输出」下沉到整条多步、有状态的执行轨迹。只看最终输出会成系统地漏掉失败(2026 共识:漏两到四成),因为 agent 的失败常在跨步累积时才显形。
agent 评测的核心取舍。默认优先评环境终态(防误杀 agent 找到的、设计者没预想的合法解),再辅以过程信号查作弊、给部分分、算效率、做诊断。关键区分:结果是环境状态,不是 agent 嘴上说的 transcript。
度量非确定 agent 的一对指标。pass@k(k 次至少成一次)= 能力上限,乐观;pass^k(k 次全成)= 可靠性下限,按单次成功率的 k 次方指数衰减。生产要的是 pass^k:单次 90% 的 agent,连成 8 次只剩约 43%。
agent 任务天然分阶段,「对了一半」有意义。给阶段性里程碑打分,保留二元解决率会抹掉的改进信号(识别问题并核验身份但没完成退款的 agent,比一上来就失败的好)。
真实 GitHub issue 修 bug 的执行式 coding benchmark,曾是事实标准。Verified 子集因任务 verbatim 进训练而污染、被广泛报道停报;SWE-bench Pro 用多语言 + 私有代码库 + 标准化 scaffold 抗污染,同模型 Verified 81% 对 Pro 46%。
benchmark 的答案 verbatim 进了预训练语料,或公开可查(校验答案挂在 HuggingFace、联网 agent 搜到攻略),让榜分虚高 5 到 15 分。抗污染设计:私有数据 + 联网隔离。
榜本身能不能真的测对。2026 年 UC Berkeley 的 BenchJack 把 8 个主流 agent 榜全刷到接近 100% 而不真解题(10 行让测试全过、换 curl binary、空 JSON、注入裁判),validity 成了信任危机,「像 2005 年的 web 安全」。
用一个 LLM 给无法机械判定的开放式产出打分。它能扩展、灵活,但核心工程问题不是「会用」,而是「会验证」(对人一致性)加「会运维」(防偏见与漂移)。
验证裁判与人一致性的正确度量,量的是实际判得一不一致而非线性相关(裁判可能完全相关却系统偏严)。阈值:高于 0.80 强一致、0.60 到 0.80 尚可、低于 0.60 重做量规(评分标准);人类互评本身约 0.80。
LLM 裁判的系统性偏见:位置(偏好某位置)、冗长(偏好长答案)、自偏好(偏爱同族模型,最难修)、格式、校准漂移(模型升版分布变)。不排查就把偏见当信号。
缓解裁判偏见的元原则:单裁判不可靠,改用一组互相不同族的小裁判各自独立打分再聚合(投票或平均),比单个强裁判更稳;聚合要考虑裁判间相关性(同族会犯同样的错)。
把 LLM 裁判当一台会漂移的测量仪器来运维:pin 住(裁判模型 id、量规版本、prompt 模板哈希)的版本契约,升级裁判当成套件迁移,每月对人工样本重校。反面教训:仪表盘能绿着骗你三个月(κ 实测仅 0.31)。
把一次 agent 失败的根因归到 harness(scaffold)、model(模型本身)、inference(采样解码)、product(任务/grader)四象限之一,决定修复落在哪。手法:控制变量(换 scaffold 不换模型,反之)、隔离试跑、0%/100% 先怀疑 eval。Ch9 立框架,Ch10 逐条诊断时调用。
评测的测试系统:批量并发跑任务、记录每一步 trace、应用评分器、聚合结果。区别于运行时的 agent harness(编排工具、管内存、产出),两者必须分开,如同 CI/CD 流水线之于应用运行时。
把 eval 当每次改动的 CI 质量门(分层:dev 子集 → staging 全量 → prod 加安全),并把每一次生产事故固化成一个新 test 的飞轮,让可靠性复利上升。触发:每次模型 / prompt / 工具改动都全量跑。
Agent 失败的规范分类:5 族(A 工具/动作 · B 推理/控制 · C 上下文/记忆 · D 协同/验证 + E 安全指针)约 19 个具名模式,每族带「哪章修」第四栏。诊断时不背诵某份学术 taxonomy,而是合成一个可诊断视图。
诊断失败轨迹的铁律:下游一长串错常常都源于上游一个根因错。只定位并修那个根,别去追被它带歪的一串传播错误(AgentDebug 的核心区分)。
沿失败轨迹找到的最早一步:模型的输出或动作开始偏离正确路径的点(实证常在第 2 步左右)。它是失败尸检 SOP 定位根因的锚。
拿到一条失败的完整轨迹后人怎么走诊断的 6 步:取全 trace → 找 first divergence → 归 AgentDebug 四模块 → 归 Ch9 失败归因四象限 → 命名 + 指章 → 修复 + 固化成回归。
用三支柱(可靠 / 可扩展 / 可维护)+ #8 章节脊柱 + 失败 taxonomy 评审一份还没跑的 agent 方案;关键动作是先停下做第一印象判断,再逐项对照。
模型 / prompt / 工具 schema 升级后 agent 行为悄悄改变,且常是多个看似无害的改动叠加而成(Anthropic 2026-04 Claude Code 事故即此)。靠每次变更跑 per-model eval + soak period 守护。
分诊(哪些值得修)→ 打包成定向 eval → 根因调查(读 trace / eval / repo / skills)→ 修复验证 → 固化成回归,模糊案例退回人。与 Ch7 的 agent 自动闭环互为两端(人在环 vs 运行时自演化)。
整体行为由大量简单局部交互涌现而成、无法还原到单个部件的系统。判据不是零件多少,而是交互能否被还原。
零件再多也可拆解、可预测、装回去行为不变的系统(如飞机)。与复杂相对,是入门用的对照坡道(源自 Cynefin 框架)。
大量局部交互在更大尺度上产生的、无法从部件推导的新整体性质。复杂系统科学的核心概念(Anderson《More Is Different》)。
全局秩序在没有中央控制器、没有外部蓝图的情况下,从局部交互中自发形成。
系统的输出绕回成为自己的输入。增强回路(正反馈)放大变化、趋于指数;平衡回路(负反馈)抑制变化、趋于稳定;带延迟的平衡回路会震荡(Meadows)。
输出不与输入成比例,小因可致大果、反之亦然。复杂系统因果不再是直线。
确定性系统中微小的起点差异被指数级放大(约按 ε 乘以 e 的 λt 次方),使长期预测不可能(Lorenz 1963)。它说的是误差被放大,不是给你操控结果的杠杆;著名的「蝴蝶」比喻出自 Lorenz 后来的演讲、非 1963 论文。
由一群适应性主体组成的复杂系统:每个主体带着会随经历改变的内部模型与策略,整个主体群体又在选择压力下被一轮轮塑造、演化 —— 在自组织(固定规则涌现秩序)之上多了『规则本身在变、系统被选择』这一层(John Holland 命名)。
新节点倾向连向已热门节点,导致『富者愈富』的枢纽结构,解释了网络里常见的无标度枢纽(无标度是否普遍、互联网算不算,2019 年后有争议;Barabási & Albert 1999)。
部件不直接通信,而是通过在共享环境里留下可感知的痕迹(如信息素)来间接协调:写入痕迹、读取痕迹、据此行动,正负反馈把局部行为收敛成全局秩序(Grassé 1959)。
系统越过某个阈值后发生重组、突跳到另一个稳定状态(常是非线性的);IPCC 的定义还强调撤回触发因也不一定回到原态。
系统翻到新状态后,撤掉当初的触发因也不原路退回 —— 复原要付出远大于触发的代价(山谷里的球)。
触发因把系统踢进坏状态,一个增强回路(如重试风暴)把它锁死,即使触发因消失也出不来 —— 反馈与滞后在分布式系统里的合体(Bronson et al. 2021)。
把系统画成点(节点)与线(边):节点连出的边数叫度。用连接的形状、而非部件本身,来描述与解释系统行为。
网络同时具有高抱团与短路径 —— 靠极少数横跨远方的捷径,把抱团的大世界压成任意两点都近的小世界(Watts & Strogatz 1998)。
度分布服从幂律、由少数枢纽主导、没有『典型』度的网络。枢纽主导这个模式真实普遍,但严格无标度的普遍性有争议(Broido & Clauset 2019)。
连接数远超其他节点的高度节点。它让网络对随机故障稳健、对针对性攻击脆弱(同一结构的两面),并充当传播的超级节点。
完全确定(规则中无随机)的系统因对初始条件极度敏感而长期不可预测的现象;严格判据是『有界相空间中至少有一个正的 Lyapunov 指数』。混沌≠随机(它确定)、≠复杂(它可低维,如单变量的 logistic map)。
混沌系统长期被吸附其上的相空间集合:有界、永不精确重复(aperiodic)、且分形。Lorenz 给出第一个具体例子,Ruelle & Takens 1971 命名这一类。
衡量相空间中近邻轨迹平均的指数分离速率。有界系统里出现正指数即混沌的指纹(光有正指数不够,还须有界);最大正指数的倒数(Lyapunov 时间)约等于预测视界。
误差指数增长使确定系统的预测只在有限时间窗内可信,特征时间约为最大 Lyapunov 指数的倒数。它是系统内禀的极限,完美的模型与算力也跨不过(如中纬度天气,Zhang 2019)。
控制参数(如温度)越过某个临界值时,系统宏观状态发生的整体性突变(如水↔冰、铁磁体在居里点得失磁性)。是突变而非渐变;『局部撬动全局』那类丰富的临界现象出现在连续相变上。
系统处在相变边界上的状态:关联长度发散、涨落跨越所有尺度、不同系统共享临界指数(普适)。与 Ch3 的 tipping-point 互补 —— 那讲过阈值翻面的动力学,这讲临界点附近的统计结构。
系统在自身动力学驱动下自发驶向并停留在临界点、无需外部把参数精调到临界,表现为各种大小的事件(幂律);典型思想模型是 BTW 沙堆(Bak, Tang & Wiesenfeld 1987)。其普适性有争议 —— 连真实沙堆/米堆实验都未必给出幂律。
事件大小没有特征尺度的分布:小事件多、大事件少却不可忽略(肥尾),各尺度自相似铺开。本章指事件/级联/塌方的大小分布,区别于 Ch4 的 scale-free-network(节点度的幂律)。严格幂律的经验声称常被高估(Clauset et al. 2009)。
随连通概率或密度上升,系统在某个临界值上突然出现贯穿全局的巨型连通簇 —— 『突然连上』的干净相变直觉(Broadbent & Hammersley 1957;森林火灾、随机图连通)。
一处局部失效顺着部件间的耦合扩散、波及整体;在临界态系统里级联大小服从幂律(多数小、偶尔掀翻全局)。Ch3 的亚稳态失效、Ch4 的枢纽爆炸半径都是它的实例。
复杂适应系统的基本单元:能感知环境、按规则行动、并带一个会随经历更新的内部模型与策略的部件。与第 2 章那种只跑固定局部规则的部件相对 —— 它的规则会变。
一群策略在没有设计者时随时间改进的引擎:变异生成多样、选择留下管用、保留把它传下去,循环往复即『爬坡』。遗传算法是其计算实例;它是生物启发的模型,不是字面生物学。
不写整体方程,而是给每个主体一条简单局部规则、让它们互动、观察宏观涌现的建模方法(谢林隔离、Sugarscape、圣塔菲人工股市)。
把『每种策略或基因型有多适应』画成高低起伏的地形,演化即在其上爬坡;崎岖多峰会困住局部最优。协同演化会让这片地形本身不停移动,所以活系统没有终极均衡。
多个主体互为对方的选择压力,彼此的适应度景观随对方的移动而被重塑(红皇后:拼命跑才能停在原地)。它是『景观会动』的来源。
复杂系统里『四两拨千斤』的介入位置:小改动能撬动整个系统行为。Donella Meadows 把它从弱到强排成十二级(最弱:常数/参数/数字 → 最强:超越范式),并指出人本能去推的恰是最弱那端、还常推反方向,而高杠杆(范式、目标、规则、自组织、信息流)最有力却最难动。注意:是 Meadows 的实践者启发式排序,非验证过的定律(她本人说其顺序『滑溜』)。