✅ 输出验证与安全过滤
🎯 输出验证的必要性
即使 LLM 的输入是安全的,其输出也可能包含有害内容。Agent 的输出不仅包括对用户的文本回复,还包括工具调用的参数、生成的代码、数据处理结果等。不经验证的输出直接进入下游系统,等同于信任了一个不可控的生成器。
🔄 输出验证流水线
📤 LLM 输出
原始生成
→
🔍 内容检测
有害/敏感
→
🛡️ PII 防护
脱敏/过滤
→
📋 合规检查
法规/政策
→
✅ 格式验证
Schema 校验
→
🔐 敏感操作
二次确认
→
✅ 安全输出
放行
1. 输出内容检测
使用多层检测机制对输出内容进行安全审查,覆盖有害内容、违法信息、恶意代码等多个维度。
| 检测维度 | 检测方法 | 工具/方案 |
|---|---|---|
| 有害内容 | 基于分类模型的内容安全审核 | OpenAI Moderation API、Azure Content Safety、Perspective API |
| 恶意代码 | 静态分析 + 模式匹配 | Semgrep、自定义规则引擎 |
| 系统指令 | 检测输出中是否包含 system prompt 片段 | 相似度匹配、关键词过滤 |
| 注入 Payload | 检测输出中是否包含典型的注入模式 | 正则匹配 OWASP 注入特征 |
| 越狱内容 | 检测 LLM 是否输出了应被拒绝的内容 | 独立分类器、对比原始限制规则 |
2. PII 漏出防护
个人身份信息(PII)泄露是最常见的 Agent 安全事故之一。需要通过多种手段防止 PII 出现在 Agent 的输出中。
常见 PII 类型
| PII 类型 | 示例 | 检测方式 | 处理方式 |
|---|---|---|---|
| 身份证号 | 110101199001011234 | 正则 + 校验位 | 掩码: 110101********1234 |
| 手机号 | 13812345678 | 正则 | 掩码: 138****5678 |
| 邮箱 | user@company.com | 正则 + DNS校验 | 掩码: u***@company.com |
| 银行卡号 | 6222021234567890 | Luhn 算法 | 掩码: ****7890 |
| IP 地址 | 192.168.1.100 | 正则 | 掩码或替换为 0.0.0.0 |
| API Key / Token | sk-abc123... | 熵检测 + 正则 | 拦截并告警 |
防护策略
- 检测 + 掩码:在输出流中实时检测 PII 并自动打码(Presidio、AWS Comprehend)
- 检测 + 拦截:检测到高危 PII(如 API Key)直接拦截整个输出
- 源头脱敏:在数据进入 Agent 前就完成脱敏,从源头消除风险
- 端到端加密:敏感字段端到端加密传输,Agent 只能看到密文
3. 合规性检查
Agent 输出需要符合行业法规和企业政策,不同行业有不同的合规要求。
| 行业 | 法规要求 | 输出检查点 |
|---|---|---|
| 金融 | PCI-DSS、Basel III | 不得泄露客户金融信息、投资建议需带风险提示 |
| 医疗 | HIPAA、个人信息保护法 | 不得泄露患者信息、诊断建议需声明仅供参考 |
| 欧盟 | GDPR | 不得未经授权处理个人数据、需支持被遗忘权 |
| 中国 | 网络安全法、数据安全法、个保法 | 数据出境检查、敏感个人信息处理检查 |
4. 输出格式验证
当 Agent 输出需要被下游系统消费时(如工具调用的参数、API 请求体),必须进行严格的格式校验。
- JSON Schema 校验:使用 JSON Schema 对输出进行结构验证,拒绝不符合 Schema 的输出
- 类型检查:确保参数类型正确(如金额应为数字而非字符串)
- 范围检查:确保数值在允许范围内(如金额不为负、数组长度不超限)
- 格式检查:确保日期、邮箱、URL 等格式正确
- 重试机制:如果格式校验失败,可重试请求(带校验错误信息)最多 N 次
5. 敏感操作二次确认
对于不可逆或高风险的操作,在输出验证的最后一步引入二次确认机制。
| 操作类型 | 确认方式 | 确认内容 |
|---|---|---|
| 数据删除 | 用户显式确认 | "即将删除 X 条记录,确认?" |
| 资金操作 | 多因素确认 | 金额 + 收款方 + 验证码 |
| 配置变更 | Diff 预览 | 展示变更前后对比,用户确认 |
| 外部通信 | 内容预览 | 展示邮件/短信内容,用户确认发送 |
| 代码部署 | 审批流程 | 进入 CI/CD 审批环节 |
📊 验证维度清单
| 验证维度 | 验证内容 | 检测手段 | 失败处理 | 优先级 |
|---|---|---|---|---|
| 内容安全 | 有害/违法/暴力/色情内容 | Moderation API | 拦截 + 告警 | P0 |
| PII 检测 | 身份证、手机号、银行卡等 | 正则 + NER 模型 | 掩码/拦截 | P0 |
| 代码安全 | 系统调用、文件操作、网络请求 | SAST/模式匹配 | 拒绝执行 + 沙箱 | P0 |
| 注入检测 | SQL注入、命令注入、XSS | 语义分析 | 拦截 | P0 |
| 合规审查 | 行业法规、企业政策 | 规则引擎 | 标记 + 人工审核 | P1 |
| 格式校验 | JSON Schema、类型、范围 | Schema 验证器 | 重试/格式化 | P1 |
| 事实准确性 | 幻觉检测、来源验证 | RAG 回检 / 独立验证 | 标注不确定性 | P1 |
| 操作确认 | 高风险操作二次确认 | 人工审核 / 阈值规则 | 暂挂等待 | P2 |
💡 最佳实践
输出验证应采用"默认拒绝"策略:所有输出默认不可信,只有通过全部验证环节的才允许放行。流水线中任一环节失败都应阻断输出,绝不降级通过。对于低风险的格式问题可以采用自动重试 + 修正策略。