博客
架构

发布于 更新于

Arag 和 Shouryamaan

如何设计 Agent 控制面

以 Markdown 阅读

Agent 控制面负责围绕执行做出决策,包括身份、授权、凭据范围、审批、限制、操作状态、资源所有权和审计记录。数据面则执行获得许可的数据库查询、浏览器操作、部署或 API 调用。

如果每项工具都以不同方式做出这些决策,系统就没有真正的控制面,只有一套会随工具增加而逐渐分化的约定。

将决策与执行分开

flowchart LR
    Agent[Agent request] --> Identity[Resolve identity and tenant]
    Identity --> Policy{Policy and approval}
    Policy -->|deny| Audit[Audit decision]
    Policy -->|allow| Broker[Issue scoped credential]
    Broker --> Operation[Create or resume operation]
    Operation --> Tool[Execute tool in data plane]
    Tool --> Resource[(Database, API, browser, compute)]
    Tool --> Operation
    Operation --> Audit

控制面应回答:谁在执行、该身份拥有哪些资源、允许执行什么操作、是否需要用户同意、可以运行多少工作,以及如何停止操作。数据面只应获得范围严格受限的指令,以及完成指令所需的足够权限。

这条边界是完整 AI agent 架构的补充。它不必从第一天起就是一项独立服务,但其契约应该在代码中清晰可见。

在选择工具前确定身份

执行工具前,先确定已经过身份验证的用户、租户、agent 和会话。如果服务端可以从凭据绑定租户标识符,就不要接受模型输出中的租户标识符。

NIST 的零信任架构要求对每次请求单独评估信任,而不是因为调用方位于某个网络内部就直接信任。对 agent 来说,这意味着即使请求来自内部工具,下游服务仍需对工具代表的身份执行授权。

控制面、agent 会话和应用运行时应使用不同凭据。能够配置资源的管理凭据,不应开放给普通应用调用。

让策略返回具体决策

一项有效的策略决策应记录:

  • 主体、租户、资源和操作;
  • 策略版本和命中的规则;
  • 是否需要人工审批;
  • 费用、调用次数、时间或数据量限制;
  • 允许或拒绝结果,以及稳定的原因。

工具描述可以告诉模型何时请求审批,但强制执行必须位于提示词之外。OWASP 的过度代理权指南建议尽量减少工具功能、权限和自主程度,并由下游系统强制执行授权。

以尽可能小的权限范围分配凭据

如果提供商支持,数据面 worker 应获得仅适用于已批准资源和操作的短期凭据。如果提供商不支持,应将凭据保留在服务端工具中,并在封装层执行相同的限制。

绝不能通过模型上下文、工具描述、URL 或模型可见错误传递密钥。链路追踪中记录凭据引用,而不是凭据值。

Agent 安全指南介绍了完整的身份与密钥路径。

将操作与对话分开追踪

一轮聊天不是操作记录。对于会写入、等待、重试或可能比当前请求存活更久的工作,应创建操作 ID。保存状态、脱敏后的输入、幂等键、审批状态、尝试次数、输出或引用,以及最终结果。

这样,agent 可以查询部署是否仍在运行,而无需重新发送部署请求。用户也可以基于一个稳定对象取消、恢复或调查操作。

在同一个控制面管理资源清单与所有权

控制面应该知道每个数据库、bucket、部署、浏览器会话和 agent 凭据属于哪个租户。资源清单让撤销和删除更容易执行,也能避免模型按易读名称选择资源时误选另一个租户中的同名项。

配额应应用于经过身份验证的租户和操作,而不是模型提供的租户字段。达到限制时应返回稳定结果,让 agent 能够解释原因,而不是盲目重试。

同时审计决策与结果

审计记录需要同时包含策略决策和观察到的结果。“允许删除”和“删除完成”是两个不同事件。应保存操作 ID、执行者、租户、资源、操作、策略版本、审批引用、时间戳和结果类别。

默认情况下,不要在审计日志中存储原始提示词、密钥或完整工具结果。如果确实需要保留原始内容,应在独立访问策略下存储 hash 或引用。

从现有应用内部开始

小型系统可以使用中间件、策略模块、凭据适配器、操作表和 append-only 审计表实现控制面。只有规模或职责分工确有需要时,才拆分为多项服务。初始目标是建立一条一致的决策路径。

下方的提示词会追踪现有工作流,并找出埋在各个工具处理程序中的控制逻辑。这些重复逻辑是最先应该迁移到共享契约后的部分。