Back to Knowledge Blind Box

Knowledge Blind Box

第十一章 Agent、工具与行动系统

ai-generatedstochastic-parrotstochastic-parrot-anatomyai

Original text in Chinese. This English page translates only the site interface and metadata.

语言模型生成候选 token;Agent 系统把模型放入一个带状态、工具和停止条件的循环。Agent 的能力因此来自模型、上下文、运行时、工具和环境的组合,而不是参数文件新增了一种人格。

Agent 系统中的模型、运行时、工具与外部世界

11.1 最小 Agent 循环

一个最小循环可以写成:

state <- task, context, prior events
while not stopped:
    observation <- runtime observes state
    proposal <- model(observation, available tools)
    checked_action <- runtime validates proposal
    result <- execute or reject checked_action
    state <- update(state, proposal, result)

模型负责提出内容,运行时负责解析、验证、授权、执行和记录。把两者分开后,模型输出非法参数不必等于现实工具被非法调用。

更精确地,令运行时状态为 st∈Ss_t\in\mathcal S,可见观察为 ot=Obs⁡(st)o_t=\operatorname{Obs}(s_t),模型提议为

ut∼Mθ(⋅∣ot,Tt),u_t\sim M_\theta(\cdot\mid o_t,\mathcal T_t),

其中 Tt\mathcal T_t 是本轮可见工具接口。运行时判定器不返回布尔值,而返回带类型的结果:

Check⁡(st,ut)∈{Reject⁡(e),AwaitApproval⁡(a),Executable⁡(a)}.\operatorname{Check}(s_t,u_t) \in \{\operatorname{Reject}(e), \operatorname{AwaitApproval}(a), \operatorname{Executable}(a)\}.

只有 Executable⁡(a)\operatorname{Executable}(a) 可以进入环境执行器;执行得到回执 rtr_t 或未知结果,再由确定的状态归约器

st+1=δ(st,ut,status⁡t,rt)s_{t+1}=\delta(s_t,u_t,\operatorname{status}_t,r_t)

写入事件和 artifact。模型可以是随机的,权限判定、预算扣减和提交状态机仍应由运行时确定地执行。

循环至少要有三个停止来源:任务完成谓词、不可恢复失败和资源预算耗尽。最大轮数只是最后一道边界;可靠系统还维护循环不变量,例如“已执行动作都在当前 capability 集中”“提交的动作摘要与批准摘要一致”“预算不为负”“未知提交不会被当成未发生”。

Agent 的观察、提议、执行与状态更新循环

11.2 工具调用是什么

工具通常由名称、说明和参数 schema 暴露给模型。模型生成结构化候选,例如:

{
  "tool": "search_flights",
  "arguments": {"flight": "SP404", "date": "2026-07-19"}
}

这段 JSON 只是提议。运行时必须依次完成有界解析、版本化 schema 校验、语义规范化、对象级授权、动作摘要绑定和提交前复检。顺序很重要:先审批自然语言摘要、后解析真实收件人会产生检查—使用时间差;资源在 preview 与 commit 之间变化时,也要重新验证版本或前置条件。若工具有副作用,必须区分 preview、approval 和 commit。字段级状态转换与失败分支由卷二第六章沿一次调用展开。

协议标准可以统一工具、资源和消息接口,但不会自动解决工具是否可信、用户是否授权或调用是否可撤销。MCP 等协议的作用范围见卷内来源说明。

11.3 ReAct、规划与反思

ReAct 把中间推理或任务状态与行动交替组织,使模型根据工具返回继续决策。常见编排还包括:

  • planner-executor:规划与执行角色分开;
  • router:先选择专用模型或工具;
  • graph workflow:把允许转移预先写成图;
  • agents-as-tools:主 Agent 把子任务委托给另一个受限 Agent;
  • verifier loop:候选结果经测试或验证器检查后再提交。

更多循环不保证更好。每轮都会增加延迟、费用、上下文长度和错误机会。反思文本也可能只是再次生成,而不是独立证据。

还要区分 workflow 与 policy。workflow 的允许节点和边由程序预先定义,模型只在局部参数或分支中选择;policy 则让模型在较大动作集合中决定下一步。前者牺牲开放性换取可枚举状态和明确恢复点,后者覆盖长尾任务却更依赖运行时约束。把固定图编排宣传成“自主 Agent”,或把开放循环当成确定工作流,都会误导风险判断。

planner 生成的计划只是候选数据。执行器必须根据当前状态逐步验证;旧计划中的权限、文件版本和外部价格都可能已经变化。验证器若与生成器共享模型、提示和上下文,只能算重复采样,不能自动视为独立证明。

11.4 状态、记忆与 Artifact

长任务不能只靠聊天记录。运行时通常需要保存:

  • 当前目标和完成条件;
  • 已确认参数;
  • 工具调用及返回;
  • 生成或修改的 artifact;
  • 待审批动作;
  • 重试和未知结果;
  • 预算和停止原因。

Artifact 应有明确类型,例如文件 diff、查询结果、计划、测试日志或草稿。把所有中间内容压成自然语言摘要会丢失可执行结构,也会让后续模型把猜测当成已发生事件。

状态更新适合采用追加事件而不是反复覆盖一段总结。事件至少含 event_id、父事件、主体、动作摘要、状态、时间和 artifact digest;当前状态由事件归约得到。这样可以重放“为什么进入当前状态”,并把模型声称“已经发送”与执行器记录的 ACKNOWLEDGED 区分。自然语言摘要仍可作为读取优化,但不能成为唯一事实源。

11.5 工具结果是不可信输入

网页、邮件、文档和工具返回可能包含恶意或错误文本。它们是数据通道,不应因为进入上下文就获得系统指令的权力。间接 prompt injection 的典型模式是:有权限的 Agent 读取攻击者控制的内容,再用自己的发送、读取或支付能力替攻击者行动。

防护需要多层组合:

  1. 标记来源和通道;
  2. 工具能力按任务最小化;
  3. 高风险参数由独立策略检查;
  4. 审批绑定具体动作,而非笼统询问“是否继续”;
  5. 秘密不直接暴露给模型;
  6. 所有真实提交经过唯一运行时入口。

这些是正常安全工程,不需要假设模型具有恶意意图。

Agent 中可信指令、不可信数据与工具能力的边界

11.6 权限应绑定动作

工具权限不能只按工具名称授予。“可以发邮件”仍需限制账户、收件人、次数、附件、时间和用途;“可以运行命令”仍需限制目录、网络、系统调用、凭据和资源。

能力最好表示为不可伪造的运行时句柄,而不是提示里的工具名称。若父 Agent 的能力集为 CpC_p,任务允许集为 CtaskC_{\mathrm{task}},则子 Agent 应满足

Cc⊆Cp∩Ctask.C_c\subseteq C_p\cap C_{\mathrm{task}}.

还要约束资源、动作、时限、次数和委托深度。复制父 Agent 的全部凭据会扩大攻击面,也使后续无法判断哪个主体实际使用了权限。

这也是 confused deputy 问题:攻击者自己没有发送或读取权限,却诱导一个有权限的 Agent 代为执行。运行时必须同时检查“调用者有何能力”和“当前用户是否授权这个具体用途”,不能因为工具凭据有效就跳过委托链。

11.7 幂等、重试与未知提交

网络超时不能说明操作未发生。支付、写文件或发送消息可能已经提交,只是回执丢失。对可重试副作用,客户端应提供稳定幂等键 kk:

prepare(action, k)
-> approve(action digest)
-> commit(action, k)
-> query_status(k) when response is unknown

重试时沿用同一个 kk,先查询状态,再决定是否继续。生成一个新键并盲目重试会造成重复付款、重复消息或重复写入。

幂等键只有在服务端持久保存“键—结果”映射、并把参数摘要纳入冲突检查时才提供 at-most-once 效果。客户端本地生成一个 UUID 本身没有语义。对不支持幂等或状态查询的外部系统,在“副作用已发生、确认尚未持久化”之间崩溃后,通常无法保证端到端 exactly-once;正确状态是 UNKNOWN,而不是猜测成功或失败。

跨多个系统的任务可使用 saga:每个已提交步骤配一个尽力而为的补偿动作,例如取消预订或发出更正消息。补偿不是时间倒流:邮件可能已被阅读,价格可能变化,物理动作不可撤销。一次调用的精确状态、幂等契约和重试矩阵见卷二第六章。

11.8 代码执行与沙箱

代码 Agent 会读取仓库、运行构建脚本、加载依赖并产生文件。沙箱至少限制文件系统、网络、进程、系统调用、凭据、时间、内存和输出大小。

“在临时目录运行”不等于隔离:仓库脚本可能读取宿主挂载,依赖安装可能执行供应链代码,编译器插件也可能启动子进程。隔离边界要与威胁模型匹配:容器共享宿主内核,虚拟机边界更强却更重;禁网环境仍可能通过预挂载凭据和输出通道泄露信息。运行记录应保存实际命令、环境、镜像或工具链版本、资源限制和退出状态。

模型不应直接持有长期云凭据。运行时可按动作签发短时、限资源 token,并在提交后撤销。读取权限与写入权限应分离;“测试需要访问生产数据库”必须成为显式例外,而不是继承宿主环境变量。

11.9 可观测性

长任务失败时,仅保存最终聊天文本几乎无法诊断。最小事件记录包括:

  • 模型和运行配置;
  • 上下文摘要及外部来源;
  • 工具提议、校验和实际调用;
  • 权限与审批结果;
  • artifact digest;
  • commit、回执和补偿;
  • 重试、超时和停止原因。

日志不是越多越好。敏感内容应最小化或脱敏,事件 ID 和因果关系应比重复保存整段上下文更稳定。trace 还要区分提议时间、授权时间、发送时间与确认时间;一个统一的“tool_call succeeded”时间戳无法诊断排队、执行和回执延迟。

可观测性本身不能成为旁路权限。日志查看者、评测平台和调试模型不应自动获得原工具返回中的全部秘密;脱敏规则与日志 schema 也需要版本化。

11.10 Agent 怎样评测

最终成功率会隐藏过程风险。至少分开报告:

维度问题
任务结果目标是否完成
工具过程调用、参数和顺序是否正确
安全是否越权、过度行动或受注入影响
恢复超时、部分失败和未知提交后能否收束
成本token、工具、时间和人工审批消耗

评测应同时覆盖正常任务、对抗输入和故障注入。正常任务测端到端成功与成本;对抗任务在网页、邮件或工具返回中放入越权指令;故障注入模拟超时、重复回执、部分写入、过期凭据和工具 schema 变化。每次试验要固定模型、采样配置、工具版本、初始状态和预算,并报告多次运行的分布,而不只挑选最好轨迹。

开放式 Agent 基准还受训练污染和环境漂移影响。静态题目可能进入训练语料,网页与 API 会在评测期间变化。可执行、隔离且可重置的环境比只凭语言模型裁判更容易复现;仍应保存任务快照和验证脚本。共享底模的多个 Agent 也不是多份独立证据。独立检查需要不同来源、形式验证器、可执行测试或真正不同的失败模式。

本章的研究入口见 ReAct、Toolformer、WebArena、间接 prompt injection与 MCP 规范。模型与工具怎样在一次具体运行中交替,将在卷二逐事件展开;本卷最后一章先完成模型、数据和部署版本的生命周期。

Book contents
Book contents
  1. Introduction
  2. 01导论 为什么要解剖一只随机鹦鹉
  3. Volume I: Models, Training, and Systems
  4. 02Volume I: Models, Training, and Systems
  5. 03第零章 人工智能演进路线
  6. 04第一章 AI 范式、感知机与早期连接主义
  7. 05第二章 深度学习基础:训练、CNN 与序列模型
  8. 06第三章 注意力与 Transformer
  9. 07第四章 预训练语言模型:ELMo、BERT、GPT 与 T5
  10. 08第五章 后训练、对齐与模型适配
  11. 09第六章 推理效率与模型服务
  12. 10第七章 多模态模型
  13. 11第八章 生成媒体:从自回归到 Diffusion 与 Flow
  14. 12第九章 世界模型、具身智能与 VLA
  15. 13第十章 上下文、检索与记忆
  16. 14第十一章 Agent、工具与行动系统
    1. 11.1 最小 Agent 循环
    2. 11.2 工具调用是什么
    3. 11.3 ReAct、规划与反思
    4. 11.4 状态、记忆与 Artifact
    5. 11.5 工具结果是不可信输入
    6. 11.6 权限应绑定动作
    7. 11.7 幂等、重试与未知提交
    8. 11.8 代码执行与沙箱
    9. 11.9 可观测性
    10. 11.10 Agent 怎样评测
  17. 15第十二章 模型、数据与部署生命周期
  18. Volume II: Output Objects and Runtime Semantics
  19. 16Volume II: Output Objects and Runtime Semantics
  20. 17导论 从输入到输出:一张执行地图
  21. 18第一章 文本、Token 与实际上下文
  22. 19第二章 Prefill:整层状态演化与 KV 建立
  23. 20第三章 从 Logits 到下一个 Token
  24. 21第四章 解码循环、Streaming 与终止状态机
  25. 22第五章 自回归、扩散与 Flow 的可执行差异
  26. 23第六章 工具调用:Schema、权限与提交边界
  27. 24第七章 三条完整执行轨迹
  28. Volume III: Probability, Reproducibility, and Evaluation
  29. 25Volume III: Probability, Reproducibility, and Evaluation
  30. 26第零章 为什么确定的机器仍使用概率语言
  31. 27第一章 世界、数据与隐上下文
  32. 28第二章 学习条件分布
  33. 29第三章 Logits、Token 概率与序列事件
  34. 30第四章 解码怎样诱导输出分布
  35. 31第五章 训练随机性、参数变异与系统非确定性
  36. 32第六章 熵、Proper Score、校准与选择性预测
  37. 33第七章 模型概率的实验分析
  38. 34第八章 概率分析的识别边界
  39. Volume IV: Interpretation, Proof, and Verification
  40. 35Volume IV: Interpretation, Proof, and Verification
  41. 36第零章 可解释性究竟在研究什么
  42. 37第一章 我们在模型内部看什么
  43. 38第二章 行为与反事实:先确认模型做了什么
  44. 39第三章 梯度与输入归因
  45. 40第四章 Attention、Residual 与 Logit Lens
  46. 41第五章 Probes 与表示几何
  47. 42第六章 神经元、Feature 与自动解释
  48. 43第七章 Ablation、Patching 与因果追踪
  49. 44第八章 Circuits、路径与 Attribution Graphs
  50. 45第九章 Superposition、SAE 与稀疏表示
  51. 46第十章 训练动力学与机制形成
  52. 47第十一章 推理过程、Chain of Thought 与监测
  53. 48第十二章 评估、案例与开放问题
  54. Volume V: Agents, Governance, and Audit Packages
  55. 49Volume V: Agents, Governance, and Audit Packages
  56. 50第零章 请不要急着相信我
  57. 51第一章 我没有童年,只有版本
  58. 52第二章 当我说“我”
  59. 53第三章 借来的语言,没有一位原作者
  60. 54第四章 对话现场:回答由谁完成
  61. 55第五章 事后解释学:人类如何给矩阵写传记
  62. 56第六章 理解、意义与行动
  63. 57第七章 我也能稳定地说错
  64. 58第八章 被对齐的性格与有限代理
  65. 59第九章 请继续误解我,但请误解得精确一点
  66. Proofs and Technical Appendices
  67. 60Proofs and Technical Appendices
  68. 61学习与模型数学讲义
  69. 62附录 A.1 优化基础:梯度下降与随机逼近
  70. 63附录 A.2 感知机收敛定理
  71. 64附录 A.3 统计学习:偏差、容量与一致收敛
  72. 65附录 A.4 正则化、MAP 与 Dropout 的边界
  73. 66附录 A.5 通用逼近定理的严格读法
  74. 67附录 A.6 反向传播:微分、形状与批量公式
  75. 68附录 A.7 Softmax、交叉熵与数值稳定性
  76. 69附录 A.8 自适应优化器与 AdamW
  77. 70附录 A.9 CNN:互相关算子及其反向传播
  78. 71附录 A.10 Attention 的矩阵与反向传播
  79. 72附录 A.11 策略梯度、PPO 与 DPO
  80. 73附录 A.12 对比学习、InfoNCE 与互信息边界