KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA
08. 数据外泄不只发生在最终回答里 — keel 龙骨
给最终回答加敏感词过滤,只覆盖一条输出通道。Agent 还可以把数据放进工具参数、URL query、HTTP header、文件名、通知、浏览器表单、日志、trace 或另一个 Agent 的消息。
给最终回答加敏感词过滤,只覆盖一条输出通道。Agent 还可以把数据放进工具参数、URL query、HTTP header、文件名、通知、浏览器表单、日志、trace 或另一个 Agent 的消息。
先画数据生命周期
采集 -> 存储 -> 检索 -> 进入模型上下文 -> 工具参数 -> 外部系统 -> 日志/审计 -> 删除
每一步都问:数据分类是什么、谁能看到、为什么需要、保留多久、能否跨租户、能否离开当前信任域。
秘密应尽量不进入模型上下文
API token、cookie、私钥和数据库密码由 credential broker 在执行点直接注入 Adapter。模型只看到逻辑资源引用:
credential_ref = config-api/tenant-a/staging
而不是实际 token。这样即使上下文被注入,模型也没有可复制的秘密字符串。
数据分类驱动通道策略
| 分类 | 例子 | 默认处理 |
|---|---|---|
| public | 公开文档 | 可进入模型和公开输出 |
| internal | 内部服务名、非敏感指标 | 仅组织内模型/工具 |
| confidential | 租户配置、事件详情 | 最小片段、同租户、受控输出 |
| secret | token、私钥、cookie | 不进入模型;只在执行点注入 |
| regulated | PII、财务或健康数据 | 依政策、地域、用途和留存严格控制 |
分类是上下文和工具策略的输入,不只是数据库标签。
输出控制要覆盖所有 sink
一个数据流只有在 source 与 sink 同时允许时才能通过:
source: tenant-a confidential config
sink: tenant-a internal ticket -> 可能允许并脱敏
sink: public webhook -> 拒绝
sink: model trace -> 只保存摘要/hash
模型提出的“业务理由”不能自行解除 DLP 规则。例外需要明确主体、审批、时限和审计。
日志是常见泄露面
不要默认记录:
- 完整 prompt 和检索文档;
- HTTP Authorization、Cookie 和 query token;
- 工具完整响应与数据库行;
- 浏览器截图中的个人信息;
- 异常对象携带的 request body;
- 审批界面的未脱敏 diff。
日志需要字段级 allowlist、脱敏、访问控制、留存期限和删除能力。为了调试而无限期保存全部输入输出,会把观测系统变成第二份敏感数据库。
检查理解
- 为什么最终回答过滤不能阻止 URL query 外泄?
- credential reference 与真实 token 应分别出现在哪一层?
- trace 为什么要有独立的数据分类和留存策略?