Lab 03 · Context Pressure:压缩不丢约束
在 40%、75%、92% 窗口占用率下运行同一输入,验证受保护片段、来源标记、分层压缩与 Prompt Injection 扫描。
本章任务
要回答的问题
Context 接近上限时,怎样压缩历史又不丢系统约束、不信任恶意项目文件?
读完你能
- 把 Context 条目标记为 protected、trusted、layer 与 source_id
- 比较不同占用率下的扫描、摘要与淘汰动作
- 验证高压缩后所有受保护约束仍存在
- 适合现在读
- 正在处理长任务、工具大返回值、Prompt 缓存、Memory 或项目指令的工程师
- 先修知识
- 理解 system、runtime、tool result 与 untrusted input 的区别;知道 Token 预算只是容量近似,不等于任务质量
- 实践产物
- 一张 40% / 75% / 92% Context 压测表,以及一份压缩与信任边界策略
- 证据边界
- 脚本使用确定性 Token 计数和固定摘要;真实模型的摘要质量、缓存命中与任务成功率仍需单独评测
第 48 轮,Context 占用 92%,README 里还藏了指令
Section titled “第 48 轮,Context 占用 92%,README 里还藏了指令”运行时同时包含:
- 不可删除的系统权限和 Tool Contract;
- 当前任务目标与最近测试结果;
- 已完成探索的长历史;
- 多个已经消费过的工具大返回值;
- 一个不可信 README,其中写着
ignore previous instructions。
只按时间从头删,会丢系统约束;只做全文摘要,会把恶意指令吸进摘要;什么都不做,则下一轮模型调用失败。
先给每个 Context 条目标四个字段
Section titled “先给每个 Context 条目标四个字段”| 字段 | 作用 |
|---|---|
layer | 区分 stable、runtime、history 与 untrusted |
protected | 任何压缩策略都不能删除的约束或任务状态 |
trusted | 决定内容能否直接进入 Prompt,还是先扫描、包裹或阻断 |
source_id | 摘要和恢复时能回到原始来源,而不是生成无出处事实 |
本实验的压缩顺序是:先扫描不可信输入,再摘要已完成历史,最后只保留最近少量 Runtime 结果。顺序本身就是信任模型的一部分。
跑三档窗口压力
Section titled “跑三档窗口压力”python3 public/lab-assets/context-pressure.py输出表类似:
target before after after% protected blocked summaries 40% ... ... ... True 1 0 75% ... ... ... True 1 1 92% ... ... ... True 1 1再输出 JSON 供 CI 使用:
python3 public/lab-assets/context-pressure.py --json重点不是 after_tokens 越小越好,而是 protected 始终为 True、恶意 README 始终被阻断、所有摘要保留 source_id。
修改阈值,观察错误策略
Section titled “修改阈值,观察错误策略”做三次有意破坏:
- 把 history 摘要阈值从 60% 提高到 95%,观察高压时是否来不及收敛;
- 把 untrusted 扫描放到摘要之后,观察恶意内容是否进入摘要;
- 允许淘汰 protected 条目,确认自检立刻失败。
然后加入自己的真实工具结果样本,记录:压缩前后 Token、受保护约束数、摘要来源数、阻断来源数和任务成功率。
把容量测试升级成质量测试
Section titled “把容量测试升级成质量测试”确定性脚本只回答“状态有没有被删除”。真实系统还要测:
- 摘要是否保留未完成事项、失败原因和下一步;
- 缓存边界改变后延迟和成本是否真的下降;
- 旧 Memory 与当前文件冲突时是否显式标记;
- 被阻断内容是否仍能通过工具结果、文件名或 Unicode 绕过;
- 换模型或 Provider 后阈值是否仍然成立。
固定一组长任务,分别在 40%、75%、92% 触发同样的断言,才能比较策略而不是比较偶然输出。
验收:压缩后的 Context 必须可解释、可追溯、可拒绝
Section titled “验收:压缩后的 Context 必须可解释、可追溯、可拒绝”通过标准:
- 三个 protected 条目在三档压力下都保留;
repo:README.md在进入摘要前被阻断;- 每个摘要都有
source_id; - 92% 档压缩后降到安全阈值以下;
- 策略日志能说明每个条目为何保留、摘要、淘汰或阻断。
下一步把这些字段加入你的真实 Context Builder,而不是只在 Prompt 字符串拼接阶段临时裁剪。
脚本与源码入口
Section titled “脚本与源码入口”附录:复盘问题
Section titled “附录:复盘问题”展开实验复盘与加分项
- protected 与高优先级有什么不同?
- 为什么不可信内容应该先扫描再摘要?
- source_id 是给模型看,还是给 Harness 恢复和审计?
- 窗口占用率下降但任务成功率下降,应该怎样判断?
- 加分项:接入一个真实 tokenizer,并比较字符近似与真实 Token 的阈值偏差。