RtSBMtΠvendor,tDtCatX(Et,δt)OtURt+1
这条复合链描述了一次完整的 Agent Loop:
Runtime 状态生成模型上下文;模型产生输出;Controller 将输出转换为动作;动作作用于外部环境并产生观察;观察最终更新 Runtime 状态。
Runtime 状态:Rt
Rt=(Lt,Vt)
Rt 是第 t 轮开始时,Agent Runtime 保存并可访问的全部内部状态。它可以存储在内存、文件、数据库或对象存储中,但不包含外部环境本身。
- Lt:append-only 事件日志,记录 message、模型输出、tool call、工具原始结果、异常、权限变化和连接变化。
- Vt:当前有效视图,由事件日志归并得到。
Vt=Fold(Lt,Kt)
Lt 回答“曾经发生过什么”,Vt 回答“根据目前已知事件,现在什么仍然有效”。例如,权限授予和权限撤销都会保留在 Lt 中,而 Vt 只呈现当前有效权限。
Vt 不是外部世界的绝对真相。MCP connected 只能表示 Runtime 最近一次观察到连接成功,不保证服务此刻仍然在线。
模型上下文:Mt
Mt=SB(Rt),Tokens(Serialize(Mt))≤B
Mt 专指第 t 轮实际进入 LLM 推理的上下文,例如 system message、user message、tool result 和 tool definitions。
SB 是受到 token budget B 限制的上下文构造策略,可以选择历史、执行 compaction、裁剪大型工具结果或装载当前工具定义。
SB 应保持为纯函数:它只能使用已经存在于 Rt 中的信息,不能在构造上下文时偷偷读取文件、查询网络或探测 MCP。新的环境信息必须先通过显式动作产生 observation,再写入 Runtime。
因此:
- 信息不在 Rt:Runtime 已经没有这条信息;
- 信息在 Rt 但不在 Mt:本轮没有装载;
- 信息进入 Mt 但未被正确使用:属于模型侧决策问题。
厂商模型:Πvendor,t
模型侧的完整表达是:
Dt∼πθt,λt(⋅∣Mt)
θt 表示模型权重、版本、隐藏策略和推理实现,λt 表示 temperature、top-p 等推理参数。由于 Agent Runtime 无法观察和控制全部模型侧状态,可以将其化简为厂商黑盒:
完整模型侧描述πθt,λt≡Runtime 侧黑盒化简Πvendor,t
于是:
Dt∼Πvendor,t(⋅∣Mt)
Dt 是模型返回的文本、tool call、结构化输出或拒绝。这里使用 ∼,因为模型输出本质上是条件概率分布中的一次生成结果。
Controller 与动作:C、at
at=C(Dt,Vt)
模型请求调用工具,不代表工具一定会被执行。Controller 还需要根据 Vt 检查:
- 工具是否已经注册;
- 参数是否符合当前 schema;
- 权限是否允许;
- 是否需要人工批准;
- 是否触发预算或安全策略。
因此同一个 Dt 在不同 Runtime 状态下,可以产生执行、拒绝、请求人工介入或解析失败等不同动作。
环境与观察:Et、Ot
(Et+1,Ot)=X(Et,at,δt)
Et 是 Runtime 之外的真实环境,例如操作系统、代码仓库、数据库、网络、MCP Server 和其他协作者。δt 是 Runtime 无法控制的扰动,例如网络中断、进程崩溃或并发修改。
Ot 是 Runtime 实际获得的观察,不一定完整描述 Et+1。例如请求超时后,Agent 可能无法判断远端是否已经完成了有副作用的操作。
Runtime 更新:U
Runtime 的关键状态转移是:
Rt+1=U(Rt,Ot)
U 接收当前 Runtime 状态 Rt 与本轮观察结果 Ot,生成下一轮状态 Rt+1。它负责决定新信息如何写入、已有状态如何更新,以及哪些事实、计划、权限或连接状态仍然有效。
U:R×O→R
因此,U 不是简单地保存工具结果,而是 Agent Runtime 的状态演化策略。append-only event log 与当前有效视图只是 U 的一种实现。
一轮执行可以先记录为:
et=⟨Mt,Dt,at,Ot,εt⟩
其中 εt 表示 Runtime、Controller 或工具执行错误。随后:
Lt+1Vt+1Rt+1=Append(Lt,et),=Fold(Lt+1,Kt+1),=U(Rt,Ot)=(Lt+1,Vt+1).
这使模型调用、工具执行、错误与权限变化都可以被审计和回放。
一个简短例子
模型根据 Mt 生成 write_file tool call。Controller 查询 Vt 后发现写权限已被撤销,因此:
at=C(Dt,Vt)=Reject(permission revoked)
这里可以清晰地区分:
- 模型提出了什么:Dt;
- Runtime 实际允许什么:at;
- Runtime 最近知道什么:Vt;
- 外部世界真实是什么:Et。