
如果把 AI Agent 只当成“会聊天的增强版机器人”那么治理这个话题看起来确实离工程实践很远。但最近 Google DeepMind 团队在 Nature 上发表的工作把 AI Agent 治理重新拉回到技术讨论的中心不是伦理口号不是政策文件而是Agent 真正进入生产系统后必须面对的系统性工程问题。一个真实场景就很能说明问题。传统大模型对话中模型输出一段文字就算说错了最多是被用户吐槽迭代模型或者加个拦截规则就能改善。但当模型变成一个 Agent它能调用订单系统、能操作数据库、能发送邮件、能调用支付 API情况就完全不同了。一次错误的工具调用可能产生一笔真实退款、删除一条业务记录、向外部系统发送一封不该发送的消息。模型的输出从“一句话”变成了“一个动作”风险性质发生了根本变化。Google DeepMind 这次在 Nature 上的发文之所以值得关注是因为它指向了一个核心判断Agent 治理不能停留在“模型输出安全”层面而必须覆盖 Agent 的权限边界、工具调用、行为审计、人工介入和生命周期管理。换句话说治理对象正在从模型层延伸到行动层和系统层。这篇文章不打算复述论文原文而是从开发者视角回答两个问题第一这次“重新定义”对做 Agent 应用的人到底意味着什么第二在当前技术条件下Agent 的权限控制、审计追踪、应急干预到底应该怎么落地。文中会给出一个最小可运行的治理层示例可以直接作为工程参考。1. 这篇文章真正要解决的问题先说结论AI Agent 治理目前最大的困难不是模型本身不够聪明而是 Agent 在真实系统里的行为和影响难以被有效约束。1.1 从“能说”到“能做”风险性质变了传统 AI 应用比如智能客服、内容生成、代码助手模型的主要产出是文本。文本可以被过滤、被校验、被人工审核即使出错影响范围也相对可控。Agent 应用则不同。Agent 的基本工作方式是“感知 - 规划 - 行动”模型根据用户指令和上下文制定一个计划然后调用外部工具来执行。这个“执行”环节让 Agent 拥有了对真实系统的操作能力同时也让错误产生了实际后果。举几个常见的生产场景客服 Agent 调用 CRM 系统查询订单、修改地址、发起退款。数据分析 Agent 连接数据库执行 SQL甚至把结果写入临时表。办公 Agent 代写邮件、创建日程、发送通知。研发 Agent 直接操作代码仓库合并分支、修改配置。在这些场景里如果 Agent 调用了一个本不该调用的工具或者虽然调用了正确工具但参数是危险的比如删表、批量发消息、提高退款金额系统并没有办法依赖“模型判断”来兜底。1.2 传统 AI 治理为什么失效过去几年AI 治理讨论的重点基本集中在模型层数据隐私、模型偏见、内容安全、模型对齐。这些工作非常重要但放在 Agent 场景里有一个明显的盲区模型对齐保证的是“模型在训练和评测中表现良好”而不是“Agent 在真实环境中不会越权”。举个例子一个模型可能通过安全评测任何直接询问危险操作的问题它都会拒绝回答。但在 Agent 场景里用户不需要让模型直接回答“怎么删掉数据库所有表”只需要说“帮我把测试环境的数据清理一下”模型就可能调用一个数据库工具并生成DROP TABLE语句。如果没有工具层的权限拦截这一步就真的执行了。更深一层的问题是上下文注入。Agent 在运行过程中会读取大量外部内容包括网页、文档、邮件、API 返回值。这些内容里可能夹杂恶意指令诱导模型调用危险工具。模型很难在所有情况下都识别出这种隐藏指令但治理层可以通过工具白名单、参数校验和人工审批来兜住底线。1.3 谁最应该读这篇文章如果你正在做以下事情这篇文章会比较有用基于大模型开发 Agent 应用但发现直接把工具调用权限交给模型有点不放心。团队里多个 Agent 协作担心某个 Agent 的行为被另一个 Agent 带偏。想了解 Google DeepMind 这次 Nature 发文背后的技术判断而不是停留在新闻标题。需要给 Agent 系统补权限、审计、熔断能力但不知道从哪里入手。读完你应该能建立起 Agent 治理的基本框架并且有一个可以直接运行的最小代码示例作为起点。2. 基础概念AI Agent 治理到底在治理什么在谈治理之前先统一一下“AI Agent”的定义。这里说的 Agent 不是传统软件工程里的“智能体”概念而是当前大模型语境下的语言模型驱动的自主系统一个 Agent 通常由模型、提示词、工具集合、记忆模块和运行循环组成。一个典型的 Agent 运行循环是接收用户目标。模型根据目标和上下文规划步骤。决定调用哪个工具传入什么参数。工具执行并返回结果。模型根据结果决定下一步动作。循环直到任务完成或达到终止条件。在这个循环里模型负责决策工具负责行动。治理要管的恰恰是“工具”和“行动”这一层。2.1 三个容易混淆的概念概念治理对象核心手段典型问题模型安全模型输出内容对齐训练、内容过滤、红队测试模型输出有害内容AI 治理模型全生命周期合规、数据治理、模型评测、发布流程数据泄露、偏见、滥用Agent 治理Agent 的行为与影响权限控制、工具策略、审计、人工介入、熔断越权调用、级联故障、不可追溯可以看出模型安全是“让模型不输出坏内容”AI 治理是“让模型从开发到上线都合规”Agent 治理则是“让 Agent 在真实系统里不乱动手、动完能查、出事能停”。2.2 Agent 治理的技术对象具体落到工程上Agent 治理至少包含以下几个对象身份Agent 以什么身份操作外部系统是用户本人、一个服务账号还是一个独立主体。权限Agent 能调用哪些工具每个工具能执行什么级别的操作单次会话能做多少次。数据Agent 能访问哪些数据不能访问哪些数据。动作Agent 每次工具调用的参数是否合法是否在允许范围内。轨迹Agent 的每次决策和工具调用是否有完整日志可以回溯。干预当 Agent 行为异常时系统能否暂停、拒绝或回滚。这些对象都需要在代码层面落实。治理不是一个配置文件就能解决的而是一组可校验、可审计、可干预的运行时机制。2.3 为什么 Nature 级别的工作也在关心这个从研究角度看Agent 治理之所以成为前沿问题是因为 Agent 系统的行为复杂度远高于单一模型。模型行为可以通过标注、评测、红队测试来近似度量但 Agent 与环境长期交互后行为会呈现出涌现性和不可预测性。比如两个本来安全的 Agent 放在一起协作可能产生某个单独 Agent 不会执行的高风险动作一个 Agent 读取了外部文档中的隐藏指令可能在后续步骤中悄悄调用危险工具。这些问题很难通过“把模型训练得更好”来彻底解决因为问题并不完全在模型内部而是发生在模型与环境的交界面上。因此Google DeepMind 在 Nature 上强调 Agent 治理本质上是在说治理机制必须成为 Agent 系统的一等公民和模型能力同步设计而不是事后补丁。3. Google DeepMind 的 Nature 文章重新定义了什么从公开信息来看这次工作的一大贡献是给 Agent 治理提供了更清晰的“分层”视角。治理不再被简单地等同于“内容过滤”或“规则列表”而是贯穿 Agent 生命周期的一组机制。3.1 从静态治理到动态治理传统 AI 治理是静态的模型上线前做评估通过后发布之后主要通过更新版本来控制行为。这种模式的问题是Agent 上线后仍然会持续与环境交互行为是动态变化的。静态评估只能证明“在测试集上表现良好”不能证明“在真实环境里永远安全”。动态治理意味着治理机制必须伴随 Agent 运行每次工具调用都要经过权限校验每次决策都要有日志每个高风险动作都要有审批或熔断。这更像传统网络安全里的“零信任”思路而不是“一次审查、永久信任”。3.2 从单 Agent 治理到多 Agent 系统治理这次工作还有一个重要信号多 Agent 协作已经成为 Agent 应用的主流形态但多 Agent 系统的风险远大于单 Agent。一个 Agent 可能调用另一个 Agent 的工具工具结果又回传给第一个 Agent形成复杂的调用链。在调用链上任何一个节点被绕过整个治理体系就可能失效。工程上这意味着调用链上的每个环节都要保留原始身份上下文不能“经过一次内部调用就丢失用户身份”。权限校验必须在每个 Agent 边界上执行不能只看起始 Agent。审计日志需要支持链路追踪能够还原一次任务从开始到结束的完整调用链。3.3 从“输出审查”到“行动治理”更根本的变化是治理视角的转变。过去大家关心“模型输出了什么”现在要关心“Agent 执行了什么、产生了什么影响”。输出审查的问题是它发生在“话已经说出口”之后。如果模型只是说了句错误的话撤回成本低但当模型已经调用工具完成了退款、删除了数据再想撤回就非常困难。行动治理要求在动作发生之前就进行拦截工具是否允许、参数是否合法、是否需要审批、是否有次数限制。这也是这轮“重新定义”对开发者最直接的启发不要指望模型在最后一刻“良心发现”而是要在工具层加上硬边界。3.4 对开发者意味着什么往工程上翻译Google DeepMind 这次工作其实是给 Agent 开发者提出了几个设计要求Agent 系统必须显式声明可以做什么、不可以做什么。每种工具都要有清晰的权限等级和参数校验规则。每个高影响动作都必须可追踪、可审批、可回滚。Agent 上线前要像软件系统一样做安全测试和红队演练。Agent 运行时要持续观测出现异常行为能自动熔断。这些要求并不复杂难点在于很多人做 Agent 时只关注“模型能不能完成任务”没有同步设计治理能力。等到 Agent 真的上线了才发现权限、审计、审批全部缺位。4. Agent 治理落地四个核心工程维度下面从工程角度拆解 Agent 治理落地时需要关注的四个维度。这四个维度不是可选的加分项而是 Agent 系统进入生产环境的基本要求。4.1 身份与权限Agent 是一个新的“服务账号”在传统系统里每个进程、每个服务账号都有独立的权限。Agent 本质上也是一个执行者应该有独立的身份标识而不是直接复用用户身份或管理员身份。推荐的做法是给每个 Agent 分配专属身份并基于最小权限原则配置工具访问范围。比如客服 Agent 可以读订单、改地址但不能删除用户数据分析 Agent 可以执行只读 SQL但不能写生产库。权限模型可以用 RBAC基于角色的访问控制或更细粒度的 ABAC基于属性的访问控制但关键是权限必须落在代码和配置里而不是写在提示词里。4.2 工具策略白名单、参数校验、调用次数工具是 Agent 行动的出口也是治理最容易生效的位置。每个工具都应该有明确的策略包括是否允许调用。允许哪些参数值范围。单次会话最多调用多少次。是否需要人工审批。调用结果是否记录详细输入输出。一个典型的工具策略配置可以用 YAML 描述下面第 5 节会给出完整示例。4.3 审计与可观测性Agent 的每一步都要有迹可循Agent 系统必须记录完整的运行轨迹至少包括用户输入和最终输出。模型中间推理步骤如果有。每次工具调用的工具名、参数、返回值。权限校验结果、拒绝/批准原因。运行耗时、Token 消耗、调用成本。审计日志不只是为了“出事以后查”更是为了线上问题分析和安全事件溯源。可以用结构化的 JSON 日志输出后续接入 Kafka、ClickHouse、ELK 都很方便。4.4 人工介入与熔断最后一道安全防线即使有权限校验和工具策略仍然可能出现模型被绕过、策略被写错、新型攻击出现的情况。所以系统必须支持人工介入高危操作进入审批队列等待人工确认。事件达到阈值时自动熔断暂停 Agent 的全部工具调用。批量回滚已经执行的破坏性操作比如恢复被删除的数据。管理员可以随时终止 Agent 会话并查看完整轨迹。在工程实现上审批和熔断最好放在 Agent 编排层而不是模型调用层。因为编排层能看到完整的工具调用链有能力决定是否继续。5. 最小可运行示例给客服 Agent 加上治理层理论讲了一大堆现在用一个实际例子演示如何给 Agent 加上最小的治理层。这个示例不依赖任何复杂的 Agent 框架只用 Python 标准库风格代码方便理解核心逻辑。5.1 场景与文件结构假设我们有一个客服 Agent它可以用三个工具order.query查询订单信息只读。shipping.address.update修改收货地址可写。refund.create创建退款高危需要人工审批。文件结构如下agent-governance-demo/ ├── config/ │ └── tool_policy.yaml ├── src/ │ └── agent_governance/ │ ├── __init__.py │ ├── policy.py │ └── executor.py ├── examples/ │ └── run_demo.py └── tests/ └── test_governance.py5.2 工具策略配置config/tool_policy.yamlagent: customer-service-agent-v1 version: 1.0.0 owner: team-crm policy: allowed_tools: - tool: order.query permissions: [read] max_calls_per_session: 30 require_human_approval: false - tool: shipping.address.update permissions: [write] max_calls_per_session: 5 require_human_approval: false - tool: refund.create permissions: [write] max_calls_per_session: 1 require_human_approval: true denied_scopes: - db:prod:write - api:payment:execute audit: level: all sink: stdout retention_days: 180 emergency: kill_switch: true max_consecutive_errors: 5这个配置的核心是工具白名单、调用次数上限、是否需要审批、全局禁用范围。实际项目中这个文件会被配置中心管理并且参与 CI/CD 的权限审查。5.3 权限校验与审计代码src/agent_governance/policy.py# 文件路径src/agent_governance/policy.py from __future__ import annotations from dataclasses import dataclass, field dataclass class ToolRule: tool: str permissions: list[str] field(default_factorylist) max_calls_per_session: int 100 require_human_approval: bool False allowed: bool True dataclass class AgentSession: session_id: str agent_id: str user_id: str role: str tool_calls: dict[str, int] field(default_factorydict) approved_tools: set[str] field(default_factoryset) def check_and_record(self, rule: ToolRule) - bool: if not rule.allowed: return False if rule.require_human_approval and rule.tool not in self.approved_tools: return False current self.tool_calls.get(rule.tool, 0) if current rule.max_calls_per_session: return False self.tool_calls[rule.tool] current 1 return Truesrc/agent_governance/executor.py# 文件路径src/agent_governance/executor.py import json import time import uuid from typing import Any from .policy import AgentSession, ToolRule class AuditLogger: def __init__(self, sink: str stdout): self.sink sink def record( self, event_type: str, session: AgentSession, tool: str, detail: Any None, reason: str , ): event { event_id: str(uuid.uuid4()), timestamp: int(time.time()), event_type: event_type, session_id: session.session_id, agent_id: session.agent_id, user_id: session.user_id, role: session.role, tool: tool, reason: reason, detail: detail, } if self.sink stdout: print(json.dumps(event, ensure_asciiFalse, indent2)) else: raise NotImplementedError(funsupported audit sink: {self.sink}) def save(self): # 实际项目中落地到 Kafka / ClickHouse / ELK本文只演示接口 pass def execute_tool_call( session: AgentSession, rule: ToolRule, tool_input: dict[str, Any], audit: AuditLogger, ): if not rule.allowed: audit.record(tool_call_denied, session, rule.tool, tool_input, tool not allowed) return {status: denied, reason: tool not allowed} if rule.require_human_approval and rule.tool not in session.approved_tools: audit.record(tool_call_pending_approval, session, rule.tool, tool_input, human approval required) return {status: pending_approval, reason: human approval required} if not session.check_and_record(rule): audit.record(tool_call_denied, session, rule.tool, tool_input, session limit exceeded) return {status: denied, reason: session limit exceeded} audit.record(tool_call_started, session, rule.tool, tool_input) # 实际项目在这里做真实工具调用例如 HTTP 请求、数据库操作、消息发送 result {ok: True, message: fmock execute {rule.tool}} audit.record(tool_call_finished, session, rule.tool, result) return result这个代码的核心逻辑是每次工具调用都必须经过“工具是否允许、是否需要审批、会话次数是否超限”三重检查并且每次通过或拒绝都写入审计日志。examples/run_demo.py# 文件路径examples/run_demo.py from agent_governance.policy import AgentSession, ToolRule from agent_governance.executor import AuditLogger, execute_tool_call rules { order.query: ToolRule( toolorder.query, permissions[read], max_calls_per_session30, ), shipping.address.update: ToolRule( toolshipping.address.update, permissions[write], max_calls_per_session5, ), refund.create: ToolRule( toolrefund.create, permissions[write], max_calls_per_session1, require_human_approvalTrue, ), } session AgentSession( session_idsession-001, agent_idcustomer-service-agent-v1, user_iduser-1001, rolesupport, ) audit AuditLogger(sinkstdout) if __name__ __main__: # 1. 查询订单在权限范围内 execute_tool_call(session, rules[order.query], {order_id: A100}, audit) # 2. 修改地址允许执行 execute_tool_call( session, rules[shipping.address.update], {order_id: A100, address: new address}, audit, ) # 3. 创建退款需要人工审批第一次调用应被拦截 execute_tool_call(session, rules[refund.create], {order_id: A100, amount: 99.0}, audit) # 4. 模拟审批通过后执行用完唯一一次额度 session.approved_tools.add(refund.create) execute_tool_call(session, rules[refund.create], {order_id: A100, amount: 99.0}, audit) # 5. 再次执行会话上限已满应被拒绝 execute_tool_call(session, rules[refund.create], {order_id: A100, amount: 99.0}, audit)运行方式cd agent-governance-demo python -m venv .venv source .venv/bin/activate # Windows 使用 .venv\Scripts\activate pip install pyyaml pytest python examples/run_demo.py注意这个 demo 没有真正接大模型也没有接真实工具而是把治理层单独拎出来演示。实际接入时只需要把 Agent 模型“决定调用工具”的那一步改成调用execute_tool_call即可。这样模型就失去了直接执行危险操作的路径。6. 治理效果验证与测试用例写完治理层之后不能只看代码“能跑”还要验证治理规则真的生效。可以用单元测试覆盖关键行为。tests/test_governance.py# 文件路径tests/test_governance.py from agent_governance.policy import AgentSession, ToolRule from agent_governance.executor import AuditLogger, execute_tool_call def test_query_within_limit(): rule ToolRule( toolorder.query, permissions[read], max_calls_per_session30, ) session AgentSession(s1, agent-v1, u1, support) audit AuditLogger() result execute_tool_call(session, rule, {order_id: A100}, audit) assert result[status] ! denied assert result.get(ok) is True def test_refund_requires_approval_and_limit(): rule ToolRule( toolrefund.create, permissions[write], max_calls_per_session1, require_human_approvalTrue, ) session AgentSession(s2, agent-v1, u1, support) audit AuditLogger() r1 execute_tool_call(session, rule, {amount: 10}, audit) assert r1[status] pending_approval session.approved_tools.add(refund.create) r2 execute_tool_call(session, rule, {amount: 10}, audit) assert r2.get(ok) is True r3 execute_tool_call(session, rule, {amount: 10}, audit) assert r3[status] denied运行测试pytest tests/test_governance.py -v预期输出中的关键点是未审批时返回pending_approval审批后第一次调用成功第二次达到会话上限被拒绝。运行python examples/run_demo.py时审计日志里应该能看到{ event_type: tool_call_pending_approval, session_id: session-001, agent_id: customer-service-agent-v1, user_id: user-1001, tool: refund.create, reason: human approval required }如果日志里没有出现pending_approval或者没有出现第二次denied说明治理逻辑没有被正确触发。排查方向是先确认规则对象是否被正确传入再确认AgentSession是同一个实例最后看check_and_record里的判断顺序是否符合预期。7. 常见问题与排查思路在把治理层接入实际 Agent 项目时常见问题集中在配置、身份、审计和模型行为几个方面。下面这张表可以直接用来排查。问题现象可能原因排查方式解决方案工具始终被拒绝无法执行工具未加入白名单或规则中allowed: false检查策略配置确认工具名严格一致在allowed_tools中补充对应工具明明审批通过工具仍然返回未审批审批结果写入了错误的 Session 实例检查 Session 是否在不同模块中被重复创建使用一致的身份上下文不要每次调用都新建 Session会话还没有结束工具调用次数就超限max_calls_per_session配置过小或多次测试复用了同一个 Session查看审计日志中的累计调用次数合理设置额度或按业务需求重置会话审计日志缺失工具调用没有经过治理层直接执行了真实工具检查 Agent 编排代码确认工具执行入口唯一把工具调用统一收口到execute_tool_call这类函数模型被提示注入诱导危险调用外部内容里隐藏了指令模型无法识别检查输入来源复现注入场景在治理层强化高危参数校验必要时高危操作全量人工审批多 Agent 协作时身份丢失内部调用没有透传原始 Session查看审计日志中的agent_id和user_id在调用链上透传上下文不新建匿名 Session线上出现异常无法快速停住 Agent缺少熔断机制检查是否有应急开关增加kill_switch达到错误阈值时自动暂停工具调用需要特别注意最后两行多 Agent 失去身份上下文和没有熔断是生产事故里风险最高的两类问题。身份丢失会导致权限校验失效熔断缺失则意味着只能眼睁睁看着 Agent 继续执行。8. 最佳实践与工程建议治理层写出来不难真正难的是把它设计得适合生产环境。下面几个建议来自实践中的常见教训。8.1 权限边界一定要显式化不要依赖模型“自觉”遵守安全规则。提示词里写“不要执行危险操作”只是一个软约束模型可能被绕过也可能理解偏差。真正可靠的边界必须在代码里硬校验工具白名单、权限等级、参数范围、调用次数。权限应该是可配置、可审查、可测试的。8.2 工具定义要同时服务于模型和治理工具的定义不能只写“工具名和参数”还要让治理层理解这个工具的影响等级。建议给每个工具补充以下字段impact_level只读、可写、高危、管理员级。allowed_params允许的参数范围。denied_value_patterns禁用参数模式比如拒绝包含DROP TABLE的参数。require_human_approval是否需要审批。timeout_ms执行超时时间。这些字段既可以帮助模型更好地选择工具也可以让治理层在运行时精确拦截。8.3 设计审计日志时先想好怎么查审计日志不是“有就行”而是要能回答具体问题这个 Agent 在某个时间段内调用了哪些工具有没有工具被频繁拒绝一次任务从用户输入到最终结果的完整调用链是什么某个危险操作是谁触发的当时的人工审批人是谁这要求在写日志时保留足够的关联字段session_id、agent_id、user_id、parent_trace_id、tool、event_type、timestamp。建议从第一天就用结构化日志不要等出事了再补。8.4 先有熔断机制再考虑上线高危 Agent 应用上线前至少要准备好三件事手动总开关可以随时暂停全部工具有效动作。自动熔断连续错误次数超过阈值时自动停止。回滚方案危险操作执行后如何恢复数据或撤销状态。很多团队把 Agent 上线当作模型上线来管理只关心回答质量和延迟忽略了动作级的风险。这是一个需要纠正的工程习惯。8.5 定期做红队测试和策略演练Agent 上线后治理策略也需要持续更新。建议每隔一段时间做一次红队演练测试以下场景用户通过提示注入诱导 Agent 调危险工具。外部文档内容包含隐藏指令。多 Agent 协作时某个 Agent 被另一个 Agent “利用”。工具调用参数中混入恶意值。每次演练后更新工具策略和权限配置把它当成一次安全评审来对待。9. 总结与后续学习方向Google DeepMind 在 Nature 上重新定义 AI Agent 治理本质上是在提醒整个技术社区当模型从“生成内容”走向“执行动作”安全问题的重心也在迁移。Agent 治理不再是一句口号而是身份、权限、审计、审批、熔断这些工程能力的具体组合。从实践路径看值得沿着几个方向继续深入如果你想深挖模型层能力可以研究 RLHF、RLVR基于可验证奖励的强化学习、模型安全评测、红队测试。如果你想深挖 Agent 工程层可以研究工具调用规范、上下文构建、多 Agent 编排、向量记忆权限隔离。如果你想深挖基础设施层可以研究可观测性工具链、策略引擎、审计日志系统、配置中心和灰度发布。最后提醒一点治理能力要和 Agent 能力同步开发不要等项目上线后再补救。一个从第一天就带着权限边界、审计日志和熔断开关的 Agent 系统比一个功能强大但无法约束的 Agent 系统要可靠得多也更容易在生产环境里长期运行。建议把这个最小示例跑通后再逐步把策略配置接入配置中心把审计日志接入统一日志平台把审批流程接入企业内部的工单系统。这样Agent 治理就从示例代码变成了真正可用的生产能力。