返回洞察与实践

Agent Runtime:从状态机到可审计执行

Agent Runtime 不是提示词模板,而是把模型决策、工具调用、权限检查、状态恢复和审计轨迹连接起来的执行层。

摘要

Agent Runtime 是大模型应用从“会回答”走向“能执行”的中间层。它不直接等同于模型、提示词或工作流编排,而是负责管理一次任务的状态、上下文、工具调用、权限、人工确认、失败恢复和运行轨迹。

如果把模型看作一个会生成下一步动作的策略函数,那么 Runtime 就是执行环境。它决定哪些动作可以被执行,哪些证据可以进入上下文,哪些副作用必须等待确认,以及一次运行结束后是否能被复盘。

为什么聊天上下文不是 Runtime

许多 Agent 原型把所有信息都放进 messages:用户输入、模型推理、工具结果、历史摘要。这种方式适合演示,但不适合长期任务。聊天上下文有三个问题:

  • 它是顺序文本,不是可查询的业务状态。
  • 它会混合过期事实和当前事实。
  • 它无法自然表达权限、重试、确认和补偿动作。

生产系统通常需要把“对话历史”和“任务状态”分开。对话历史记录交互过程;任务状态记录系统认为当前已知、已执行、待确认和不可执行的事实。

type AgentRunState = {
  runId: string;
  taskId: string;
  actor: {
    userId: string;
    role: string;
    tenantId: string;
    scopes: string[];
  };
  objective: string;
  collectedFields: Record<string, string>;
  evidenceRefs: Array<{ source: string; version: string; chunkId: string }>;
  toolEvents: ToolEvent[];
  pendingApprovals: ApprovalRequest[];
  stopReason?: "completed" | "blocked" | "handoff" | "failed";
};

这类状态结构让 Agent 可以暂停、恢复、转人工,也可以在模型升级后重放同一个任务。

Runtime 的最小状态机

一个任务型 Agent 不一定需要复杂框架,但通常需要明确的状态机。最小形态可以分成六个阶段:

created
  -> planning
  -> retrieving
  -> acting
  -> awaiting_approval
  -> finalizing
  -> completed / handoff / failed

状态机的价值不在于形式漂亮,而在于约束动作。处于 retrieving 阶段时,系统只允许只读检索;处于 awaiting_approval 阶段时,高风险写操作不能继续执行;处于 failed 阶段时,只能执行补偿、重试或转人工。

这种设计也能避免一种常见错误:模型在上下文不足时继续编造下一步。Runtime 应该允许模型说“需要更多字段”,但不允许它跳过权限、证据和确认直接写入业务系统。

工具调用是候选动作,不是事实

Tool calling 的返回值经常被误解为“模型已经执行了工具”。更准确地说,模型只是提出了一个候选动作:

model proposes action
  -> schema validation
  -> identity and scope check
  -> risk classification
  -> idempotency key generation
  -> execution or approval request
  -> result normalization
  -> event logging

这一层保护很关键。模型可能把自然语言里的“差不多下周”填成具体日期,也可能把用户提到的客户名匹配到错误 ID。Runtime 必须在执行前检查参数来源、字段类型、对象归属和动作风险。

对于写操作,还要加入幂等键。否则模型或网络层的一次重试,可能变成重复创建工单、重复发送通知或重复扣费。

权限要进入上下文之前

企业 Agent 的安全边界不能只放在最终回答阶段。只要无权数据进入模型上下文,就已经发生了泄露。更稳妥的做法是:先把用户身份、租户、项目、客户、业务对象转换为检索约束,再召回知识和工具结果。

retrieval_context = {
  tenant_id,
  user_role,
  project_scope,
  customer_scope,
  document_policy,
  task_object_id
}

这意味着 Runtime 不是被动接收上下文,而是主动构造上下文。模型看到的材料应该是经过权限过滤、版本过滤和字段最小化之后的结果。

审计轨迹是 Runtime 的输出

一个 Agent 的最终答案正确,不代表运行过程可靠。两个系统都能生成同一段回复,但其中一个可能只读取了必要证据,另一个可能越权读取了无关客户资料。没有运行轨迹,团队无法区分。

建议至少记录以下事件:

事件记录内容
model_turn模型、输入摘要、输出动作、token 和耗时
retrieval查询条件、召回来源、过滤原因、证据版本
authorization用户身份、权限范围、允许或拒绝原因
tool_call工具名、脱敏参数、结果摘要、重试次数
approval确认人、确认动作、风险等级、确认时间
side_effect写入对象、字段变化、幂等键、补偿方式

这些轨迹会变成评估和回归测试材料。模型换代、工具 schema 变更、权限策略调整后,都可以用历史运行回放检查是否引入新风险。

与工作流引擎的区别

Agent Runtime 和传统工作流引擎有重叠,但边界不同。

维度工作流引擎Agent Runtime
控制逻辑预定义流程图模型提出下一步,Runtime 约束执行
输入形态结构化表单和事件自然语言、文件、业务对象混合输入
工具选择节点固定可在候选工具中选择
风险控制流程权限和审批权限、证据、工具、输出同时约束
评估方式节点是否完成轨迹、证据、副作用和最终结果一起评估

实际系统通常会把两者结合:确定性流程交给工作流引擎,开放式判断交给模型,Runtime 负责连接和审计。

局限与工程权衡

Runtime 会增加系统复杂度。最常见的成本包括:状态模型设计、工具事件规范、权限映射、日志脱敏、回放环境、人工确认 UI。对于只读问答场景,这些成本可能过高。

因此建议从最小 Runtime 开始:一个任务状态表、一个只读检索工具、一个低风险写工具、一个确认机制、一条审计日志。等任务稳定后,再扩展多工具、多角色和多模型策略。

参考材料

  • ReAct 提出了把推理和行动交替组织的 Agent 模式:Yao et al., 2022。
  • OpenAI、Anthropic 等工具调用接口把模型输出结构化为可执行候选动作。
  • MCP 等协议正在标准化工具连接层,但状态、权限和审计仍需要应用 Runtime 设计。