给Agent做数据分类分级时怎么让规则真正生效
Agent 分类分级配置的核心不是把数据打上标签就结束,而是让每个 Agent 在发起读取或调用前,能明确知道自己被允许接触哪一级数据,以及越级时该拒绝还是走审批。
如果只做分类不做分级执行,标签就只是注释。
下面按数据级别定义、Agent 授权级别、越级处理逻辑三个层面,给出一份可以放进配置文件的写法,并说明如何验证配置真的生效。
先把数据级别和 Agent 级别分开定义
分类分级最常见的错误是把“数据有多敏感”和“Agent 能干什么”混在同一张表里。
建议拆成两个独立清单:
- 数据级别:描述数据本身的敏感程度,例如
public、internal、confidential、restricted。 - Agent 级别:描述 Agent 被授予的访问能力,例如
L1只能读公开数据,L2可读内部数据,L3可读机密数据但需审批,L4才允许接触受限数据。
这样拆分后,规则可以写成“级别为 L2 的 Agent 默认只能访问 internal 及以下数据”,而不是把判断散落在各个工具函数里。
一个可用的配置片段如下,放在 Agent 启动时加载的 YAML 文件中:
agent_policy:
agent_id: support-bot-01
agent_level: L2
data_access:
allowed_levels:
- public
- internal
denied_levels:
- confidential
- restricted
escalation:
require_approval: true
approval_channel: security-review
这份配置只做两件事:声明 Agent 级别,并明确允许和拒绝的数据级别。
审批通道用于越级时转人工,不在 Agent 内部自动放行。
在调用入口强制执行分级判断
配置文件写得再清楚,如果工具调用不读它,分级就不会生效。
执行点应该放在 Agent 调用数据工具的统一入口,而不是每个工具自己判断。
以 Python 为例,可以在工具分发层加一道检查:
DATA_LEVEL_ORDER = {"public": 0, "internal": 1, "confidential": 2, "restricted": 3}
AGENT_MAX_LEVEL = {"L1": 0, "L2": 1, "L3": 2, "L4": 3}
def check_access(agent_level: str, data_level: str) -> bool:
return DATA_LEVEL_ORDER[data_level] <= AGENT_MAX_LEVEL[agent_level]
调用工具前,先根据资源元数据拿到 data_level,再和当前 Agent 的 agent_level 比较。
不满足条件时直接返回拒绝结果,并把拒绝原因记录到审计日志。
这里的关键是资源元数据必须可信。
如果数据级别由调用方自己传入,Agent 就可以把 confidential 谎报成 public。
级别应来自数据目录、数据库字段或统一的元数据服务,不能由请求参数决定。
越级请求不要静默降级
很多实现遇到越级请求时会悄悄返回空结果或低级别数据,看起来没有报错,实际上会让调用方误以为数据不存在。
更稳妥的做法是明确拒绝,并区分两种场景:
- 完全越权:Agent 级别低于数据级别且没有审批通道,直接返回拒绝,不重试。
- 可审批越级:配置中开启了审批,返回“待审批”状态,由人工确认后再放行,Agent 不自动轮询等待。
拒绝结果里建议只包含状态和原因码,不要把受限数据的字段名、表名或路径带出来,避免通过错误信息泄露结构。
上线前用三类用例验证配置
配置写完后,至少用下面三类用例检查一遍,确认分级真的在拦截:
- 同级访问:L2 Agent 读取 internal 数据,应成功返回。
- 越级访问:L2 Agent 读取 confidential 数据,应返回拒绝,且日志中有对应记录。
- 伪造级别:在请求参数中手动传入
data_level=public尝试读取 confidential 资源,应仍然被拒绝,证明级别来自元数据而非请求参数。
验证时同时查看审计日志,确认每次拒绝都记录了 Agent ID、目标资源、请求级别和实际级别。
没有日志的分级配置很难在事后排查越权行为。
常见误区:分级不是给 Agent 贴标签
一个常见误解是给每个 Agent 分配一个级别后就认为配置完成。
实际上 Agent 可能同时调用多个工具,每个工具背后的数据级别不同,必须逐次判断。
另一个误区是把分级规则写进提示词让模型自己遵守,这只能作为辅助提醒,不能替代入口处的强制检查。
如果 Agent 会动态加载新工具,还要在工具注册时要求声明数据级别,未声明级别的工具默认按最高敏感级别处理,避免新工具绕过已有规则。
分类分级配置的价值在于把“能不能访问”变成可执行、可审计的判断。
先定级别,再在入口强制执行,最后用越级用例验证,三步做完,分级才算真正落地。