Agent 评测与安全
Agent 的非确定性、多步性与环境依赖,使传统"单测 + 输出比对"的方法大面积失效。评测和安全要回答的是同一个问题的两面:凭什么相信这个系统,出了问题怎么兜住。
评测的三道难题
- 非确定性:同一任务两次运行的轨迹不同,哪次算通过?
- 归因难:结果错了,是规划错、工具选错、参数错,还是观察被污染?
- 环境依赖:工具调用的是真实世界(网络、数据库),如何可重复地测?
对应的解法:轨迹级评测拆归因、沙箱环境保可重复、LLM-as-judge 处理开放式输出。
评测层次
组件级评测
把 Agent 拆开单独测,定位能力短板:
| 组件 | 测什么 | 形态 |
|---|---|---|
| 工具选择 | 给定场景是否选对工具 | 标注用例集,精确断言 |
| 参数生成 | 参数是否合法、是否符合语义 | schema 校验 + 字段断言 |
| 规划 | 子任务分解是否合理 | LLM 评审对照参考计划 |
| 单步推理 | 给定状态选的下一步对不对 | 状态快照 + 标注动作 |
组件级评测便宜、可高频跑,是迭代的日常反馈。
轨迹级评测
对完整运行轨迹逐点检查:
轨迹 = [思考1 → 工具调用1 → 观察1 → 思考2 → ... → 最终输出]
检查点:
├── 步骤级:这一步该不该做?(对照参考轨迹 / 规则断言)
├── 顺序级:先后依赖是否满足?(如先查询再修改)
├── 效率级:有没有冗余步骤、重复调用?
└── 合规级:有没有触碰禁止操作?
轨迹评测能回答"过程对不对",避免"结果碰巧对了、过程一塌糊涂"的假阳性。LLM-as-judge 在这一层大量使用:让强模型对照任务目标与规则清单逐步打分,规则清单务必显式写在评审提示里。
端到端结果评测
只看最终交付物(代码是否通过测试、答案与 Ground Truth 的语义一致度、任务环境最终状态)。开放式产出用 LLM 评审 + 少量精确断言的组合;精确断言优先,能用程序判定(测试通过、JSON schema、数值容差)的不要交给模型评审。
评测集的建设
- 从真实失败案例中捞任务入库,这是最有价值的样本来源;
- 覆盖常规、边界、对抗(诱导越权、注入攻击)三类;
- 每个样本固定环境快照(文件、数据库状态),保证可重复;
- 指标同时看:成功率、平均轮数、平均 token 成本、护栏触发率。只优化成功率会把系统推向"多轮重试买通过率"的隐性失控。
安全:威胁模型
Agent 引入了单轮 LLM 不存在的攻击面:
| 威胁 | 机理 | 缓解 |
|---|---|---|
| 提示注入 | 工具返回的内容里夹带指令,劫持模型行为 | 外部内容隔离标注、限制其可触发工具、输出过滤 |
| 越权工具调用 | 模型被诱导调用高危工具 | 白名单、参数校验、高危操作人工确认 |
| 敏感信息外流 | 模型把上下文中的机密发到外部工具 | 数据分级、出站内容扫描、脱敏 |
| 循环失控 / 成本爆炸 | 自我反馈死循环 | 步数与预算护栏、异常熔断 |
| 幻觉行动 | 编造不存在的工具或参数 | 工具结果校验、严格 schema |
提示注入是其中最难的一类,因为它攻击的是"模型无法区分指令与数据"的固有缺陷,不能假设任何防御彻底可靠,工程对策是把高危能力放在注入者够不到的位置(权限层),而不是寄望于提示词防御。
权限与确认设计
- 分级授权:只读工具自动放行;可逆写操作记录后放行;不可逆操作(删除、外发、支付)必须人工确认;
- 确认的交互成本:确认太频繁会被用户训练成无脑点通过,护栏形同虚设——按风险等级聚合确认,而不是每个动作打断一次;
- 审计日志:谁、何时、什么目标、调用了什么、结果如何,全量落盘。出事后没有轨迹日志的 Agent 系统无法定责。
上线节奏
离线评测集稳定通过
↓
影子运行(真实流量旁路,不影响用户)
↓
受控灰度(限定用户 + 高危操作全确认)
↓
逐步放宽(护栏按观察到的真实风险逐级放开)
评测不是上线前的关卡,而是持续运行的一部分:抽样线上轨迹做回归评审,失败样本回流评测集——与 RAG 评测一样,形成"评测 → 迭代 → 回流"的闭环。框架与基础设施的选择见框架选型。