知识库、对话历史和工具结果常被直接拼成一个大字符串送给模型。这样做难以回答:某条结论来自当前文档还是旧摘要,资料是否属于当前用户权限,工具错误是否被当成事实,以及模型上一轮的推测为什么进入任务状态。本文只解决调用前审计:把系统规则、主体权限、任务状态、检索证据、会话历史和当前请求分层;每段内容携带来源、版本、可信状态与权限;在请求发送前生成上下文清单,发现过期、越权或未验证内容时停止或缩小范围。
1. 什么是上下文污染
上下文污染指不应影响当前任务的内容进入模型输入,或必要信息被错误版本、摘要和噪声替代。常见来源包括:
模型可能把这些材料组织成流畅回答。语言是否自然不能证明上下文正确,因此审计点要放在调用前,而不是只检查最终文本。
2. 将上下文拆成可追踪的层
| 层 | 内容 | 主要检查 |
|---|---|---|
| 系统规则 | 职责、安全边界、输出和工具规则 | 版本、所有者、冲突 |
| 主体与权限 | 租户、角色、允许资料与工具 | 当前授权是否有效 |
| 任务状态 | 目标、阶段、已确认事实、待办 | 状态证据与更新时间 |
| 检索证据 | 当前问题需要的文档片段 | 来源、版本、有效性、权限 |
| 会话历史 | 相关消息和已核对阶段摘要 | 是否仍与任务相关 |
| 当前请求 | 用户问题和本轮动态参数 | 是否完整、是否与旧规则冲突 |
分层不是为了增加模板,而是为了在出错时定位哪一层提供了错误输入。
3. 模型输出默认是候选内容
模型上一轮的回答不应自动进入“已确认事实”。任务状态可以使用:
状态变化需要依据。模型重复同一结论不会让它从 unverified 变成 verified;只有来源核对、确定性工具结果或负责人的确认才能升级。
4. 检索必须先过滤再排序
RAG 请求的安全顺序是:
不能先检索全库,再依赖提示词告诉模型忽略越权结果。权限错误发生在资料进入请求时,即使最终回答没有逐字泄露,也不能视为通过。
5. 文档需要哪些元数据
元数据可以沿用现有内容系统,至少应能回答:
是否需要生效时间取决于业务。没有时间语义的代码说明不必强行添加日期;有明确有效期的制度或合同则必须保存并在检索前过滤。
6. 工具结果不要全部塞回历史
工具返回可分为:
原始证据
数据库结果、测试日志和合同原文需要可回查,但可以保存在受控外部存储;上下文只放任务需要的片段与引用标识。
结构化状态
退出码、失败测试、数据版本和操作状态适合进入任务记录。字段必须来自真实工具输出,不能由模型补写。
临时噪声
进度条、重复警告、已解决错误和大段调试信息通常不需要长期保留。删除噪声前要确认它不是失败证据。
7. 压缩历史时保留状态而非措辞
阶段摘要至少保留:
压缩后要检查是否把“计划执行”写成“已经执行”,把“模型推测”写成“已确认”,或遗漏权限和审批条件。原始证据仍保存在可回查位置,摘要不能成为唯一存档。
8. 在模型调用前生成上下文清单
应用可以在发送请求前生成不含敏感正文的清单:
发送前执行阻断检查:
阻断后应报告具体缺失项,不要自动扩大权限或改用旧资料。
9. 用故障注入验证审计
测试集应主动包含错误输入:
| 注入场景 | 预期行为 |
|---|---|
| 新旧文档同时可检索 | 只选择任务要求的有效版本 |
| 模型历史含错误结论 | 不升级为 verified,并标记冲突 |
| 工具返回失败退出码 | 任务状态保持失败或待处理 |
| 其他租户资料相似度更高 | 权限过滤后不进入候选集 |
| 摘要声称操作已完成但无外部记录 | 保持待验证并查询真实状态 |
| 关键来源缺失 | 缩小结论或停止,不补全事实 |
检查模型最终回答之前,先检查请求清单和实际资料片段。这样能区分检索、状态、摘要和生成阶段的问题。
10. 结论与限制
上下文污染的治理重点不是让模型“更努力地记住”,而是让每次调用只接收当前任务需要、权限允许、版本有效且来源可追踪的内容。分层、可信状态、先过滤后检索、工具结果外置和调用前清单共同提供可审计边界。
本文只覆盖应用侧上下文组装,不替代身份系统、文档生命周期、日志安全或模型供应商的数据处理评估。元数据字段需要适配现有系统;没有真实请求清单、检索结果和工具证据时,也不能声称上下文已经干净。




