L大语言模型从理论到实践
阅读 PDF ↗
CHAPTER 16

智能体运行系统

智能体的决策能力只有接入可恢复、可授权、可审计的执行系统,才能形成可靠的业务结果。一次模型输出可能提出合理动作,但网络超时无法说明动作是否完成,重试可能重复产生副作用,旧状态上的审批也可能不再适用。本章从应用契约出发,构造贯穿知识查询与工单处理的运行系统,解释这些问题为何出现以及如何处理。

第15章《智能体架构》讨论规划、记忆与协作;本章把这些机制落实为持久状态与执行边界。检索证据的组织见第13章《检索增强生成》,模型服务本身的连接与工作进程见第32章《模型服务架构》

16.1任务判定契约

业务结果及生成结果

设应用接收企业用户的故障描述,检索经授权的知识,读取设备状态,提出处理建议,并在允许的情况下创建或更新工单。该任务至少有三类结果:有来源的知识回答、供人审核的操作提案、已经由业务系统确认的状态变更。三者不应共用一个模糊的“完成”标志。

任务输入应包括已认证主体、租户、用户目标、业务对象、期限与授权范围。自然语言描述可以补充目标,但不能覆盖程序取得的身份与权限。输出应携带结果类型、事实或动作引用、业务对象版本、终止原因和未完成事项。生成器说“工单已创建”不构成创建证据;必须存在受信执行器取得的业务回执。本章主要符号见表16.1

表 16.1 智能体运行系统的主要符号。

符号 含义
\(S_v,e_k\) 版本 \(v\) 的任务状态与第 \(k\) 个持久事件。
\(\delta\) 从已记录状态与事件计算下一状态的转换函数。
\(a,h(a),k_a\) 动作提案、其规范化摘要与幂等键。
\(g\) 执行者持有的单调递增隔离代数。
\(B,U,R\) 任务总预算、已结算用量和未结算预留量。
\(r_j,c_j\) \(j\) 个活动的预留上界与实际成本。
\(d,t\) 任务截止时间和当前时间。
\(V_o,V_p\) 业务对象版本与权限策略版本。

三层接口职责

模型接口接收上下文并返回文本或结构化提案;工具协议描述能力发现、参数和结果;应用状态机决定是否执行、如何记录和何时结束。三层可以通过适配器连接,但职责不能混合。

模型上下文协议(Model Context Protocol,MCP)的2025年6月18日规范采用宿主、客户端与服务端结构,宿主管理连接及策略,协议组织上下文与能力交互(Model Context Protocol 2025)。这里引用固定版本说明分层思想,不将该版本称为最新。协议互通不等于业务权限互通;新增工具服务仍需登记身份、能力、凭证范围和结果可信度。

工具契约不仅包含参数类型,还要包含只读或写入性质、对象范围、前置条件、期限、重试分类、幂等支持和结果查询方式。错误也应结构化,至少区分参数错误、无权限、前置版本冲突、暂时不可用、明确未执行和执行结果未知。把所有异常转换成“请再试一次”,会抹掉最重要的执行信息。

16.2运行架构及数据模型

应用状态、模型建议和外部执行各自承担明确职责。
图 16.1 应用状态、模型建议和外部执行各自承担明确职责。

持久化可以从一个支持事务和唯一约束的关系数据库开始,任务事件、动作意图和发件箱在同一事务边界内提交。工作进程可水平扩展,大型证据与结果存入受控对象存储,数据库保存摘要和引用。只有工作负载或隔离要求证明必要时再拆分服务;拆分不会自动提高正确性。

表 16.2 智能体运行系统的核心持久对象与约束。

对象 核心字段 约束
任务 租户、任务标识、状态版本、期限、预算、制品组合 租户与任务标识联合唯一。
事件 任务标识、序号、类型、负载摘要、发生与记录时间 每任务序号唯一;不以时间戳代替顺序。
动作 动作标识、工具版本、参数摘要、幂等键、状态、回执 同一语义动作的键唯一;尝试次数另记。
审批 动作摘要、对象版本、授权人、范围、到期时间 不得套用于参数或对象已经变化的动作。
发件箱 消息标识、动作标识、顺序、发送状态 与动作意图同事务写入。
证据引用 来源、版本、位置、访问范围、内容摘要 读取时重新满足权限与保留策略。

任务制品组合应固定模型、提示模板、工具模式、控制器和解析器版本。它不是把外部世界冻结:设备状态和权限仍会变化,因此执行前需要再次检查。状态快照中保存的是足够恢复的引用、版本与预算,不应默认复制全部敏感原文。

16.3持久执行及状态转换

事件重放语义

持久执行(Durable Execution)使长任务在工作进程退出后能够恢复到明确状态。设初始状态为 \(S_0\),则

\[ S_n=\delta(\delta(\cdots\delta(S_0,e_1),e_2)\cdots,e_n). \tag{16.1}\]

要使重放得到相同状态,\(\delta\) 对给定输入必须确定。模型采样、外部读取和时钟是非确定输入,应先作为事件记录,再参与转换。恢复时重复调用模型并假定得到同一提案,会创建新的决策轨迹;固定随机种子也不能保证跨运行时的完整再现。

快照可以降低重放成本。快照记录事件序号 \(k\) 与状态摘要,恢复后仅重放 \(k+1\) 之后的事件。快照与事件之间必须有一致边界,否则会跳过或重复应用事件。应用升级改变转换逻辑时,要保留旧版本解释器或显式迁移事件与快照,不能用新逻辑无条件重放旧任务。

状态可包括已接纳、规划中、等待工具、等待审批、等待核对、已完成、已失败和已取消。后面三类为任务终态,但已取消任务仍可能保留待核对的外部动作记录:取消停止后续计划,不会自动撤回已经执行的动作。

并发恢复版本约束

两个工作进程可能同时读到 \(S_v\)。若均无条件写入下一状态,其中一个结果会覆盖另一个。比较并交换(Compare-and-Swap,CAS)把更新限定为“当前版本仍为 \(v\) 时才提交到 \(v+1\)”。同一旧版本最多有一个提交成功;失败者必须重新读取状态,而非覆盖重试。

租约只限制一段时间内的所有权。旧进程暂停后恢复时,租约可能早已交给新进程。隔离令牌(Fencing Token)用递增代数 \(g\) 标记执行所有权,下游若保存已见最大代数,便可拒绝较小 \(g\) 的陈旧写入。若下游不支持该检查,单靠本地租约不能保证外部副作用不被旧进程重复执行。

假设与适用范围

以下原子性论述假设事务存储对相关行提供所需隔离、唯一约束可靠,且应用确实检查提交结果。它不推导外部业务服务的原子性;后者需要独立的幂等或查询契约。

16.4外部动作、幂等及未知结果

超时语义

发送创建工单请求后可能发生三种情况:请求未到达、业务系统已拒绝、工单已创建但响应丢失。客户端看到超时不能区分这些情况。若直接生成新标识再次创建,就可能得到两个工单。

幂等键(Idempotency Key)应绑定一个逻辑动作,在所有重试间保持稳定。服务端同时保存键、规范化参数摘要和结果;同键同参数返回已记录结果,同键异参数必须拒绝。键的作用域需要包括租户与业务操作,保留时间必须覆盖重试与核对窗口。1

若外部服务可以原子地执行效果并登记幂等结果,则重复传输不会重复产生该效果。若其先登记“成功”再执行效果,崩溃会留下虚假完成;先执行效果再登记,则崩溃会留下重复窗口。因此“恰好一次”必须说明原子边界,不能由消息队列的名称或本地状态标志推出。

不支持幂等的写入应优先利用业务自然键、版本条件更新或结果查询。仍无法判断时进入核对(Reconciliation)状态,由受控查询或人工确认结果,避免盲目自动重试。对只读请求也要注意计费、审计和外部速率等可观察影响;只读并不意味着成本为零。

本地提交及消息发送

若先提交动作意图再发送消息,提交后崩溃可能导致永远未发送;若先发送再提交,则消息可能被执行而本地不知道。事务发件箱(Transactional Outbox)将动作意图与待发消息放在同一数据库事务中,之后由独立分发者重试投递(Amazon Web Services 不详)。分发者发送成功后、更新发送状态前崩溃仍会重投,所以接收方必须去重。它解决本地双写的一致性,不自动解决远端副作用去重。

发送可以重复,逻辑动作身份与业务回执保持稳定。
图 16.2 发送可以重复,逻辑动作身份与业务回执保持稳定。

多步业务动作部分成功时,可采用补偿事务(Compensating Transaction)。Saga 将长事务分成可独立提交的步骤,并为已完成步骤设计补偿(Garcia-Molina 和 Salem 1987)。补偿是新的业务动作,不是数据库时间倒流:已发送通知不能让接收者“未读过”,取消预订也可能产生费用。不可补偿步骤应尽量后置,并在执行前完成必要确认;补偿失败需要单独的待处理状态。

16.5预算、异步及取消

预留避免并行超支

若多个并行活动各自只检查当前已用成本 \(U<B\),它们可能同时开始而合计超出预算。为活动 \(j\) 原子预留 \(r_j\),只在

\[ U+R+r_j\le B \tag{16.2}\]

时接纳,其中 \(R\) 为其他活动尚未结算的预留。完成后执行 \(U\leftarrow U+c_j\)\(R\leftarrow R-r_j\)。若 \(0\le c_j\le r_j\) 且提交原子,则 \(U+R\le B\) 在归纳意义下保持成立。若计费方允许实际成本超过预留,上述保证不再成立,必须限制生成与工具上限或设置额外风险准备。

例如预算100单位、已用40、已预留20,新活动预留30可接纳,总占用90;另一活动再申请20必须等待或拒绝。前一活动实际消耗24后,状态变为 \(U=64,R=20\),只剩16单位可继续预留。这是预算不变量的构造算例,不是成本实测。

期限同样应从父任务向子活动传播。子活动可用时间不超过 \(d-t\),并预留持久化与清理时间。重试次数、模型词元、工具次数、费用与墙钟期限是不同约束,任何一个触达上限都应产生明确终止或等待决策。

取消及完成的竞争

取消请求首先形成持久事件,然后停止新动作分派,并向可取消活动发送信号。若动作已经提交,取消可能仅中止等待而无法撤销效果。完成回执与取消事件竞争时,状态机应保留两项事实:用户已要求停止,以及某外部动作最终是否完成。不能为了保持一个漂亮的“已取消”终态丢弃晚到业务回执。

重试应限于确定可重试的错误,并受剩余期限和幂等能力约束。指数退避可以减少持续冲击,随机扰动降低同时恢复的同步峰值;参数错误、拒绝授权与已确认的业务冲突不应通过重复调用解决。异步回调需要认证、动作关联和去重,不能仅凭外部传来的任务标识修改状态。

16.6工具接入及人工协作

数据库工具优先暴露受限业务查询,而非任意高权限查询接口;代码执行工具需要进程或容器隔离、资源限制、文件与网络范围,凭证由网关注入而非放进模型上下文;业务写入工具应支持对象版本和结果查询。检索权限则在取回内容前或受信过滤层实施,生成后删除敏感词无法代替授权。

检查与使用时差(Time-of-Check to Time-of-Use,TOCTOU)发生在检查之后、真正执行之前对象或权限发生变化。审批应绑定 \(h(a)\)\(V_o\)、授权范围和到期时间。执行前再次读取对象版本与当前权限;不一致时重新规划或重新审批。批准“把工单123分派给甲组”不能授权后来被模型改成的“关闭工单123”。

人工协作是一种明确的等待状态,保存展示给人的提案、证据和选择。审批通过后恢复的是同一个动作身份;拒绝应被记录为约束或终止,不应让模型循环换一种措辞再次执行相同被拒动作。对于本来已获授权且参数未变的低风险重复执行,不应无理由重复审批。

16.7编码 Harness 及个人智能体平台

(选修) 本节将具体项目作为架构案例。以下产品事实依据2026年9月8日查阅的一手资料;功能会随版本变化,选型时还需锁定所采用的发布版或提交。表16.3中的侧重点不构成排他分类,同一平台可以嵌入其他执行器。

表 16.3 四种具体实现所展示的架构关注点;表格不表示性能排名或生产验收结果。

项目 可观察的组织方式 应审查的工程问题
Codex App Server 将交互客户端接入统一的智能体执行能力 线程与轮次身份、事件流、审批与断线恢复
DeepSeek Harness 以 Cordis 插件组织模型、工具、存储与运行循环 插件依赖、替换边界、版本兼容与日志语义
OpenClaw 常驻 Gateway 连接消息渠道、控制客户端与设备节点 消息路由、设备身份、连接恢复和授权主体
Hermes Agent 跨会话记忆、技能维护、消息网关与调度 经验写入质量、技能版本、长期任务及用户隔离

Codex 及 DeepSeek Harness

Codex 的 App Server 将智能体执行能力提供给客户端,交互协议包含线程、轮次、进度事件和审批请求。OpenAI 的架构文章描述了基于 JSON-RPC 的集成方式,并说明界面与执行状态分离的意义:客户端断开不应使服务端丢失任务事实。它适合说明“一个执行核心、多个交互入口”的设计,而不能据此推断所有部署都具备完全相同的工具和权限。(OpenAI 不详b)

DeepSeek Harness 的官方说明以 Cordis 插件系统为核心,模型、工具、技能、会话、沙箱、存储、循环、调度与界面均可通过插件组合;会话记录采用追加式日志。资料查阅时它仍处于开发者预览阶段。(DeepSeek 不详)这说明可替换性可以深入到运行循环,但可替换不等于语义兼容。例如,替换存储插件时必须确认事务与恢复语义;替换工具插件时必须保持动作身份及结果契约。预览项目可以作为架构研究对象,不能仅凭公开源码便认定其接口稳定或已满足生产要求。

OpenClaw 及 Hermes Agent

本书所称 Claw 案例具体指 OpenClaw,不把所有带有 Claw 名称的项目视为同一实现。其官方架构以常驻 Gateway 统一连接消息渠道,控制客户端和设备节点通过 WebSocket 接入;设备能力与身份是显式协议字段。文档还指出事件出现缺口时客户端需要刷新状态。(OpenClaw 不详)因此网关既是渠道适配点,也是会话路由与设备信任的汇合点。收到一条消息只证明传输完成,不能自动证明发信人有权使用所连接设备的全部能力。

Hermes Agent 是 Nous Research 的智能体项目,区别于同名模型系列。其官方仓库描述跨会话记忆、会话检索、可维护技能、消息网关和调度能力。(Nous Research 不详)这里的“从经验学习”首先应理解为外部记忆与技能内容的更新,不能直接解释为底层模型权重在线训练。若一次任务成功后保存了技能,后续仍需检查该经验的前提、来源、版本与失败记录;环境变化后应允许撤回,而不能将“过去成功”提升为永久规则。

这类个人智能体还面临渠道身份与执行身份不一致的问题。例如,群聊发言者、消息渠道账号、操作系统账号和业务系统账号是不同主体。可靠实现应明确从哪一个主体派生权限,在哪一层检查对象范围,以及一次会话能否访问另一会话的记忆。多渠道接入和长期在线均不能替代这些约束。

选型及组合

比较产品时,应先给出任务闭环,再逐项映射组件。代码修改需要工作区隔离、差异审查与测试证据;持续个人助理需要身份路由、可取消调度和记忆治理。若个人助理委派编码 Harness,应记录父子任务身份、预算、工作区、允许工具和最终产物,避免把下游自然语言“完成”当作验收。集成应通过明确的工具或客户端协议进行,不能仅靠拼接两个聊天记录推断执行顺序。

16.8Computer Use 的观察及行动闭环

计算机操作(Computer Use)指智能体通过屏幕、界面结构及输入动作操作软件的能力。它可覆盖浏览器与原生应用,其机制是观察界面、提出动作、由执行器实施,再读取新状态。模型输出一次点击并不会自行驱动操作系统;执行环境必须实现相应动作并回传观测。OpenAI 的计算机操作接口文档也采用这种模型与执行环境分工。(OpenAI 不详a)

观测表示及动作落点

记界面观测为 \(o_t=(I_t,D_t,A_t,v_t)\)\(I_t\) 是截图,\(D_t\) 是可获得的文档对象模型,\(A_t\) 是可获得的无障碍树,\(v_t\) 是页面或窗口状态标识。并非每个环境都提供全部分量。截图适用于视觉布局与画布,但坐标依赖窗口、缩放和滚动;文档结构适合语义定位,但不覆盖所有像素内容;无障碍树暴露角色、名称和状态,其完整性取决于应用实现。

动作定位(Grounding)把“打开保存菜单”这样的意图映射到当前界面的具体目标。动作应绑定窗口或标签页、目标描述及观测版本;只保存一个坐标容易在页面变化后点击错误对象。若在原始截图 \((W_s,H_s)\) 上定位到 \((x_s,y_s)\),截图对应视口区域的原点为 \((x_0,y_0)\)、大小为 \((W_v,H_v)\),且只有轴对齐缩放,则

\[ x_v=x_0+x_s\frac{W_v}{W_s},\qquad y_v=y_0+y_s\frac{H_v}{H_s}. \tag{16.3}\]

各量必须使用约定的像素或逻辑坐标单位。只有知道截图尺寸与视口映射后才能换算;设备像素比不能在缺乏坐标约定时重复乘入。裁剪、浏览器工具栏偏移、iframe 坐标及页面滚动会改变映射,应重新获取对应几何关系。

动作返回及任务完成

执行链必须区分三件事:输入动作已派发、界面出现预期变化、业务后置条件成立。点击提交后按钮变灰只支持第一或第二项;确认对象已经创建,通常需要成功回执、对象标识或结果查询。对于回执未知的提交,应先查询结果,再决定是否重试。没有幂等语义的界面不应盲目重放整段动作。

设任务有 \(n\) 步,第 \(i\) 步在此前步骤均正确的条件下成功的概率为 \(p_i\),则由条件概率链式法则

\[ P(\text{全程成功})=\prod_{i=1}^{n}p_i. \tag{16.4}\]

此式不要求步骤独立,但 \(p_i\) 必须是上述条件概率;不能把不同测试的边际点击准确率直接相乘。长流程会累积失误,因此应在有业务意义的阶段读取后置条件,及时停止错误传播。设置检查点不能保证恢复成功,尤其不能撤销已经发生的外部副作用。

界面内容及权限边界

页面中的文字是待处理数据,不能因为出现在屏幕上就成为上级指令。截图、DOM 和无障碍树都可能承载提示注入;结构化读取只能改善定位,并不能自动消除恶意内容。执行器应绑定用户已授权的目标、对象和动作范围,隔离会话数据,并在界面变化时重新验证目标。截图与轨迹也可能包含隐私数据,需要控制保存范围、访问权限和保留时间。

16.9浏览器控制协议及适配

(选修) Chrome 开发者工具协议(Chrome DevTools Protocol,CDP)用于检测、调试和控制 Chromium 系浏览器。它按 DOM、Network、Runtime、Page 等域组织命令与事件;协议消息使用结构化 JSON。(Chrome DevTools Team 不详)CDP 是底层浏览器接口,Computer Use 是任务能力,二者不在同一抽象层。智能体可以使用 CDP 取得界面信息,也可以通过截图和输入驱动浏览器。

目标、会话及异步事件

浏览器包含多个 target,例如页面与工作线程;控制器需要先选定目标,再将命令与相应会话关联。请求编号用于匹配响应,事件用于接收异步变化。一次导航可能使先前保存的节点句柄或执行上下文失效,弹窗可能创建新的目标,因此不能把“当前活动页”当作稳定的业务对象身份。控制器应保存目标身份并在导航、断线或状态缺口后重新读取。

在工具层可以定义“定位当前页面中名称为保存的按钮并确认可操作”,由适配器负责浏览器细节。Playwright 提供这类更高层的浏览器自动化接口,也支持通过 CDP 连接 Chromium;其文档明确提示该连接方式相较原生 Playwright 协议连接具有较低保真度。(Microsoft 不详)因此使用同一库名不代表连接路径与功能范围相同。WebDriver 双向协议(WebDriver BiDi)是另一条标准化浏览器自动化路径,提供双向通信和事件机制;具体浏览器的实现覆盖仍需核对。(W3C 不详)

表 16.4 操作接口的选择应依据对象语义、可验证性和权限,而非仅依据是否能够点击成功。

接入方式 适合表达的对象 主要限制
业务 API 业务对象、事务、明确回执 需要存在可用且获授权的接口
浏览器自动化库 定位器、页面、等待条件 依赖应用结构和驱动兼容性
CDP 浏览器目标、文档、网络与运行时 主要面向 Chromium,需处理版本和会话
无障碍接口 控件角色、名称与状态 应用暴露的语义可能不完整
截图与输入 可见像素与坐标动作 定位误差、几何变化与回执歧义

兼容性及执行边界

CDP 的 tip-of-tree 定义会变化,官方不承诺其向后兼容;应锁定浏览器与协议适配版本,检查所需命令是否受支持。2远程调试连接具有广泛的会话访问能力,应限制其可达范围,并与用户日常浏览配置隔离。使用浏览器已有登录态必须明确授权范围,不能把“能够连接”当作“允许访问所有标签页”。

MCP 等工具接入协议可以把浏览器能力暴露给模型,实际适配器再调用 CDP 或其他驱动。协议叠加不会自动产生端到端幂等性、认证或业务成功判定;这些仍由本章的运行系统负责。测试除正常操作外还应覆盖导航中断、目标关闭、登录过期、遮挡、重复按钮、回执丢失和恶意页面指令,并分别记录定位、执行与业务验证失败。

16.10知识助手及工单处理的链路

业务回执生成

考虑用户要求“根据设备A的告警及维护规定建立待处理工单”。执行链路如下。

  1. 接口建立任务,固定租户、主体、设备标识、期限和应用制品版本;以请求幂等键处理用户重复提交。

  2. 检索器按主体权限取得维护文档版本与位置;设备查询工具返回状态及对象版本17。二者均保存来源与时间,不能把文档说明当作设备当前事实。

  3. 模型产生工单草案,包含设备、告警摘要、支持证据和建议优先级。解析器检查结构,业务规则检查必填信息与取值范围;缺失信息转入等待用户补充。

  4. 若操作在授权范围内,执行器绑定参数摘要与设备版本17;若需审批,持久化该提案并等待。期间对象变化则重新评估。

  5. 在事务中保存动作意图、预算预留及发件箱。工具网关再次授权,以稳定动作键调用工单系统。

  6. 工单系统返回工单标识与版本。运行系统记录回执后才生成“已创建”的答复;若超时,则按键查询或进入待核对,答复必须说明状态尚未确认。

  7. 后续更新工单采用其版本条件。任务结束释放未用预留,保留可追溯事件与按保留策略管理的证据引用。

工单创建的持久执行时序。当前授权重查失败时终止发送并记录拒绝;没有业务回执时不能走“已创建”答复路径。
图 16.3 工单创建的持久执行时序。当前授权重查失败时终止发送并记录拒绝;没有业务回执时不能走“已创建”答复路径。

16.3区分本地事务提交、远端业务提交和最终回答三个时刻。发件箱只保证发送意图不会被本地故障静默丢弃;远端幂等、结果查询与重复回执处理共同约束恢复行为。

故障恢复路径

表 16.5 不同故障位置的可确认事实与恢复动作。

故障位置 可确认事实 恢复动作
意图事务提交前 无持久动作承诺 从最近事件恢复,不假定已经发送。
提交后、发送前 发件箱存在 分发者继续投递。
远端完成、响应丢失 本地结果未知 以相同键查询或重试,禁止新建逻辑动作。
结果记录后、答复前 业务回执已持久化 由回执重建答复,不再次执行。
审批后对象变更 原审批基于旧版本 再检查、重规划,必要时重新审批。
取消后收到回执 取消与外部完成均发生 记录真实效果,按授权决定是否补偿。

算法16.1 计算过程

受控动作提交与恢复。

  1. 从任务版本读取允许工具、剩余预算、期限和终止状态,解析提案并生成规范化参数摘要。

  2. 检查当前权限、业务前置条件与审批绑定;不满足则记录明确状态,不调用外部写入。

  3. 以任务版本条件,在同一事务中预留预算、建立动作身份、追加意图事件和发件箱记录。

  4. 分发者使用固定幂等键执行;把明确失败、成功回执和结果未知分别记录。并发记录通过动作版本与唯一约束去重。

  5. 对未知结果使用受信查询核对;只有满足幂等契约才自动重试写入。所有尝试共享原动作身份。

  6. 结算实际成本并追加结果事件,驱动状态转换;恢复时读取既有结果,不重复已完成副作用。

部署拓扑及故障隔离

任务接口可以无状态复制,工作进程按模型活动与工具活动分池,以避免慢工具占满模型执行槽。各副本通过事务存储竞争任务版本,不能依赖进程内存保存唯一任务状态。知识索引按权限域访问,业务系统仅对工具网关开放凭证范围,模型服务没有直连业务写入的权限。

以网络与凭证范围隔离模型推理和业务写入。部署区表示职责边界,不规定必须使用六套集群。
图 16.4 以网络与凭证范围隔离模型推理和业务写入。部署区表示职责边界,不规定必须使用六套集群。

16.4中的边界由网络与凭证共同落实,而不是仅靠服务命名隔离。事务存储需要满足明确的恢复点目标与恢复时间目标;备份恢复还须与外部已完成动作核对。若数据库恢复到了动作执行前的旧时间点,简单重放发件箱可能再次发送已执行动作,因此幂等记录的保留窗口应覆盖灾难恢复范围。跨区恢复不能只验证服务启动,还要验证任务身份、动作键和业务回执是否继续一致。

16.11测试、观测及发布

执行轨迹的判定边界

轨迹回放(Trajectory Replay)使用已记录模型结果与工具结果验证控制器状态转换;它可以发现分支、预算和恢复错误,但不能证明真实接口当前可用。真实集成验证需要在受控业务环境中核对接口语义和最终状态。故障注入应覆盖发送前后崩溃、重复回调、过期租约、参数冲突、审批撤销、取消竞争与预算并发。

评估应分别测量参数有效、授权判定、工具实际完成和最终任务完成。对串行必要环节 \(E_1,\ldots,E_m\),准确关系是

\[ \Pr\left(\bigcap_{j=1}^mE_j\right) =\Pr(E_1)\prod_{j=2}^m\Pr(E_j\mid E_1,\ldots,E_{j-1}). \tag{16.5}\]

无须独立即可成立,但把各环节边际成功率直接相乘需要独立假设。模型误解目标往往同时导致检索与工具错误,故用独立乘积估计应用可靠性可能失真。

日志应记录任务、动作、尝试、模型修订、工具版本、事件序号和终止原因,敏感负载采用受控引用。指标维度使用有限集合,任务标识放入追踪或日志;观测“执行成功”必须对应业务回执,不能只统计 HTTP 成功。公开决策摘要用于解释选择,不要求保存或暴露模型内部思维过程。

发布时固定整个应用制品组合,在相同任务集上比较业务结果、权限违规、人工干预、成本、恢复行为与时延。新模型的语言表现更好,不代表工具参数与控制器兼容。旧长任务应继续使用兼容版本,或经过显式状态迁移;简单切换流量只影响新任务,不能自动回滚已提交的业务效果。


  1. 尝试标识用于区分网络调用,动作幂等键用于合并语义相同的调用。每次尝试生成新幂等键会失去去重作用。↩︎

  2. CDP 文档中的 stable 1.3 是历史冻结子集,不意味着它涵盖现代浏览器的所有能力,也不意味着 tip-of-tree 是稳定发布接口。↩︎

WORKBOOK / 习题

配套习题与解析

先独立作答,再展开参考解析。选修题保留原书标记。

习题 16.1

为知识回答、操作提案和已完成写入分别设计输出契约,并说明各自需要什么证据。

展开参考解析

知识回答返回论断、引用版本和支持状态;操作提案返回目标、规范参数、预期副作用与所需批准,不声称已完成;完成结果返回业务对象ID、动作键、回执、状态与时间。三者的证据分别是可定位来源、可校验计划、真实业务后置条件。模型自报“完成”不能替代第三类证据。

习题 16.2

证明确定转换函数按同一事件序列重放得到相同状态;加入一次未记录的外部读取后,该证明在哪一步失效?

展开参考解析

\(s_{t+1}=F(s_t,e_t)\)且F确定,初态一致。若重放到t时状态相同,则输入同一记录事件\(e_t\)后仍相同,由归纳所有状态一致。若F读取未记录的时钟、网络或模型输出,第二次可能取得不同值,归纳步的相同输入前提失效。应把这些结果记录为事件并回放,不重新调用以替代历史。

习题 16.3

给出两个工作进程同时更新任务的时序,说明版本条件如何避免丢失更新,以及为何仍需外部隔离机制。

展开参考解析

A、B同时读版本7;A条件写7成功置8,B写7失败再读取8,避免丢更新。但A的旧租约可能在远端继续写,即使本地版本已经更新,数据库CAS也不能让远端自动停止。工具端需验证递增隔离代次或稳定幂等键,并拒绝陈旧执行者;租约时间还需考虑时钟与延迟。

习题 16.4

构造服务端先登记键再执行与先执行再登记的两种崩溃窗口。怎样的原子边界可以消除重复副作用?

展开参考解析

先登记已完成再执行,登记后崩溃会导致动作从未发生却被当完成;先执行再登记,执行后崩溃会在重试时重复。若业务状态变更和去重结果可放在同一服务端事务,二者原子提交可避免两窗口。跨服务事务不可得时,使用发件箱保证可投递、远端幂等保证重复提交不增副作用,并保留未知状态;本地记键本身不等于恰好一次。

习题 16.5

发件箱消息已发送但发送状态未更新时进程崩溃,恢复后会发生什么?为什么不能因此删除接收方去重?

展开参考解析

发件箱未标发送会在恢复后再次投递,这是至少一次路径的正常行为。接收端以逻辑动作键和摘要去重,返回既有结果;若删去去重,同一业务写可能执行两次。发送标记提前写也可能丢消息,因此不能用“先标记”替代完整交付协议。去重保留窗口需覆盖重试和灾难恢复时间。

习题 16.6

推导预算不变量,并讨论工具最终成本超过预留时应如何改变契约。

展开参考解析

设总预算B、已用U、预留R,接纳成本上界b必须满足\(U+R+b\le B\);原子将R加b后并发接纳仍保持不变量。结算实际c且\(c\le b\)时,\(U'=U+c,R'=R-b\),总和减少\(b-c\ge0\)。若c可能大于b,原证明失效;需硬上限执行、分段追加预留或明确可承受超支政策,不能把事后记账称为预先预算保证。

习题 16.7

为“创建工单成功但响应丢失”设计状态机,包括自动核对与人工核对路径。

展开参考解析

状态可为已准备、已授权、发送中、未知、已确认成功、明确失败。工单已建但响应丢失时,以稳定动作键向工单系统查询并取得ID后转成功;查询明确未创建才允许同键重试。无查询能力时安排人工以审计字段核对,期间最终回答明确未知,禁止以新键创建第二张。人工核对本身也应留下证据与权限。

习题 16.8

设计一个审批摘要,证明参数变化不能复用旧审批;讨论对象版本变化但参数不变的情况。

展开参考解析

摘要覆盖主体、租户、工具版本、规范资源、参数、用途、数据级别、有效期及必要对象版本。批准签名绑定其哈希,任何参与字段变化都会产生新摘要,因此原批准失配。即使参数未变,所有权、余额或ACL版本改变也可能使动作不再授权,应在执行点重查或要求重新批准。摘要哈希不取代批准人身份验证。

习题 16.9

对不可逆通知设计补偿策略,解释哪些事实无法撤销。

展开参考解析

误发通知可发送更正、撤销可撤销链接、停止后续推送并联系受影响接收者,均作为独立授权动作记录。已被读取或复制的内容无法保证收回,通知历史和隐私影响仍存在。不得把发送一条更正消息标为原事件从未发生;应分别报告业务缓解与信息披露残余。

习题 16.10

区分轨迹回放、真实接口集成验证和线上任务评估的证据范围。

展开参考解析

轨迹回放验证给定历史输入下的控制器分支、预算和状态一致,不能证明外部接口现在可用。真实集成验证检查认证、协议及业务后置条件,但样本和受控环境有限。线上评估观察实际任务分布与依赖漂移,需要分层指标和故障归因,不能只靠HTTP成功率。三者互补而不能互相替代。

习题 16.11

构造两个强相关失败环节,使边际成功率乘积显著偏离端到端成功率。

展开参考解析

设两环节各以概率0.1失败,且由同一个错误目标解析触发,二者完全相关。各自成功率0.9,独立乘积预测0.81;真实端到端两者成功概率0.9。反向也可构造互斥失败得到0.8。通用式为\(P(E_1)P(E_2\mid E_1)\),应测条件依赖而非假设层数越多就独立相乘。

习题 16.12选修

设计旧任务跨应用版本升级的恢复方案,列出必须保留的解释逻辑与版本字段。

展开参考解析

保留任务状态模式版本、转换器版本、模型/提示/工具修订、原动作键、批准摘要及业务回执。旧任务可继续由旧解释器执行,或在检查点作可审计的状态迁移,迁移前确认无未决副作用;未知动作先对账。新模型只用于新决策,不能重写已记录决定。回滚应用版本不能撤销已经提交的工单或通知。

习题 16.13

一张1920乘1080的完整视口截图对应960乘540的逻辑坐标视口,原点为零;目标位于截图坐标(1200,600)。计算动作坐标,并说明页面滚动后能否直接复用。

展开参考解析

在轴对齐缩放且没有裁剪偏移的前提下,\(x_v=\frac{1200\times960}{1920}=600\)\(y_v=\frac{600\times540}{1080}=300\),故为逻辑坐标\((600,300)\)。页面滚动后对象相对视口的位置可能变化,旧观测不再保证有效;应重新读取界面并定位。这里已经用视口与截图尺寸完成单位换算,不应再无依据地乘一次设备像素比。

习题 16.14

某界面任务有10步,每步在此前均成功的条件下成功概率都是0.98。求全程成功率;提交最后一步后回执丢失,是否应从头重放?

展开参考解析

由条件概率链式法则,\(P=0.98^{10}\approx0.8171\)。该乘法使用条件概率,不需要另加独立假设。回执丢失时动作可能已经生效;应保存目标对象与动作身份,查询业务结果或人工核实,再判断是否重试。重新执行整条链可能重复创建对象,阶段检查点也不能替代写入幂等性。

习题 16.15选修

比较 CDP、Computer Use 和智能体工具协议所在的层次。通过一个工具协议连接浏览器后,是否自动获得跨浏览器兼容和安全授权?

展开参考解析

Computer Use 是利用观察与输入操作软件的能力;CDP 是 Chromium 系浏览器的检测与控制协议;智能体工具协议负责向模型或运行系统描述并调用能力。适配器可以把工具调用转为 CDP 命令,但兼容范围仍受底层驱动和版本限制,授权仍须由受信执行层按主体、对象及动作检查。三者组合也不自动提供业务幂等与后置条件验证。

REFERENCES

参考文献

Amazon Web Services. 不详. 《Transactional outbox pattern》. 见于 2026年9月8日. https://docs.aws.amazon.com/prescriptive-guidance/latest/cloud-design-patterns/transactional-outbox.html.
Chrome DevTools Team. 不详. 《Chrome DevTools Protocol》. 见于 2026年9月8日. https://chromedevtools.github.io/devtools-protocol/.
DeepSeek. 不详. 《DeepSeek Harness developer preview》. 见于 2026年9月8日. https://www.deepseek.com/harness/en/.
Garcia-Molina, Hector, 和 Kenneth Salem. 1987. 《Sagas》. 收入 Proceedings of the ACM SIGMOD International Conference on Management of Data, 249–59. https://www.cs.cornell.edu/andru/cs711/2002fa/reading/sagas.pdf.
Microsoft. 不详. 《Playwright BrowserType API》. 见于 2026年9月8日. https://playwright.dev/docs/api/class-browsertype.
Model Context Protocol. 2025. 《Architecture: Specification 2025-06-18》. 2025年6月18日. https://modelcontextprotocol.io/specification/2025-06-18/architecture.
Nous Research. 不详. 《Hermes Agent》. 见于 2026年9月8日. https://github.com/NousResearch/hermes-agent.
OpenAI. 不详a. 《Computer use》. 见于 2026年9月8日. https://developers.openai.com/api/docs/guides/tools-computer-use.
———. 不详b. 《Unlocking the Codex harness: how we built the App Server》. 见于 2026年9月8日. https://openai.com/index/unlocking-the-codex-harness/.
OpenClaw. 不详. 《Gateway architecture》. 见于 2026年9月8日. https://docs.openclaw.ai/concepts/architecture.
W3C. 不详. 《WebDriver BiDi》. 见于 2026年9月8日. https://www.w3.org/TR/webdriver-bidi/.

搜索全书

搜索全书正文、习题与解析