上一篇讲了「Runtime over Prompt:为什么 System Prompt 不是安全边界」——安全边界要落在 Tool 真正执行之前。这一篇往深一层:边界既然落在执行路径上,Runtime 凭什么判断一个 Tool 该不该放行?
AI 真正让企业犹豫的,往往不是「读」,而是「写」——查客户可以,改客户呢?发邮件呢?删数据呢?
AI 读数据出错了,是「看错了」——改回来即可,损失有限。
AI 写数据出错了,是「改坏了」——订单金额改错、客户资料覆盖、邮件发给了不该发的人,很多是不可逆或代价高昂的。
所以企业对 AI 的态度,通常从「让它查」到「让它做」之间有一道坎。这道坎的本质是:对不同风险的操作,企业要不要用同一套策略对待?
显然不要。查客户可以自动,改合同必须人批,删数据根本不该允许。
这就是「工具风险分级」要解决的问题:先给每个 AI 操作定一个风险等级,再按等级决定执行策略,而不是一刀切「全部自动」或「全部人审」。
把 AI 工具按风险从低到高分成六级,每级对应一种执行策略:
| 等级 | 含义 | 例子 | 执行策略 |
|---|---|---|---|
| R0 | 信息性 | 说明、统计概览 | 自动 |
| R1 | 只读 | 查询客户列表 | 自动 |
| R2 | 低风险写 | 更新备注 | 策略决定(治理可配置) |
| R3 | 业务敏感写 | 创建跟进任务、改订单 | 人工确认 |
| R4 | 高影响动作 | 双人审批类操作 | 双人审批 |
| R5 | 不可逆 / 外部动作 | 删除数据、发邮件 | 阻断 |
关键设计点:
这套分级的好处是:它把「敢不敢让 AI 做事」从感觉变成规则。业务方不用逐个判断,只需要按风险级定策略。
分级本身只是纸面规则,真正让企业放心的是它在运行时的强制力。一条完整的执行链:
工具声明风险级(R0-R5)→ 权限检查(行级数据范围:本人 / 组织)→ 策略门控(R5 阻断 / R3-R4 确认 / R0-R2 自动)→ 人工确认(确认了才执行,拒绝则不执行)→ 执行写操作 → 副作用登记(可撤销)+ 审计入链
以开源项目 KeelBase 的实现为例,这套链是可验证的。
仓库(境内访问建议用 Gitee 镜像):
riskLevel,MCP 出口把风险级透出到工具声明(_meta.keelbase)——外部客户端调用前即可见。isError=true + 拒绝理由清单),可追溯、防篡改。协议合规认证套件锁定这套语义。实跑 Server-NestJS/scripts/verify-protocol-conformance.mjs 的输出:
─ 工具风险分级(协议 §4)─
✓ RISK_STRATEGY 表与语料一致
✓ R1(读)→ auto / 无需确认
✓ R3(业务敏感写)→ confirmation / 需确认
✓ R4(高影响)→ human_approval / 需确认
✓ R5(不可逆/外部)→ block / 阻断
✓ 派生规则:未声明写工具 → R3 confirmation
✓ 派生规则:未声明读工具 → R1 auto
═══ Conformance 结果:34/34 通过(0s)═══
篡改、越级、确认绕过都会在这里被拒。
AI 写数据不是不能做,而是要分级、要确认、要可追。把「敢不敢让 AI 做事」变成一套可执行的规则,企业才敢把 AI 从「助手」升级成「干活的」。
如果你也在做 Agent,可以拿自己的系统对三个问题:
第三个问题最关键。如果答案是「模型自己拒绝的」,那这道边界还停在 Prompt 层,没落到执行路径上。
如果你发现某种工具分级或门控方式可以绕过,欢迎直接提 Issue(GitHub 或 Gitee 都行)——我更想看到失败案例,而不是只有成功案例。