适用读者:被"上下文越长越贵越笨"困扰的人;把"记忆"和"上下文"混为一谈的人。
前置:S20-B01(RAG 流程)、J02(上下文与记忆)、S19-J03(提示词四层)、S23(推理与 KV Cache)。
覆盖旧文:4620(上下文管理全指南)、4621(上下文 ≠ 记忆)、4610(溢出三招)、4648(长对话锚定)、4649(消灭 AI 腔)、4643(先 Log 再改码)→ 6 篇 / 约 1.5 万字符。
扩展点:E-S20-021(上下文的三个成本:token 费用、注意力稀释、延迟)、E-S20-022(删/压/留的决策树与压缩流水线)、E-S20-023(白板 vs 笔记本:上下文与记忆的双系统与守门员规则)。
下一篇:S20-A04 · 训练与微调机制。
1. 一句话结论
上下文是白板,记忆是笔记本:白板容量有限、擦一次就没了;笔记本可无限写、但要按需检索。把笔记本内容全抄到白板上,就是"越长越贵越笨"的根因。
出处:
A-4621(上下文 ≠ 记忆)、A-4620(管理五层)、A-4610(溢出三招)。
2. 三个成本(E-S20-021)
| 成本 | 机制 | 表现 |
|---|---|---|
| token 费用 | 每次请求都重发全部上下文(无状态 API) | 10 轮对话第 10 次请求携带前 9 轮,费用近似 O(n²) 累计 |
| 注意力稀释 | 关键信息被无关内容淹没("lost in the middle") | 上下文越长,中段信息召回率越低 |
| 延迟 | 预填阶段(prefill)与长度近似线性 | 首 token 延迟随上下文增长 |
判据:"加内容"永远比"减内容"容易,所以上下文会被无意识膨胀——必须显式设预算:单次请求上下文 ≤ 模型窗口的 30%~50%,超出即触发压缩。
KV Cache 与上下文的关系(与 S23 交界):
前缀稳定 → 命中 KV Cache → 预填成本接近 0(只算新增部分)
前缀变化(如把系统提示词里的时间戳/随机 ID 放在最前)→ 整段缓存失效 → 每次都全量预填
判据:把「不变的内容」放最前,「每轮变化的内容」放最后。
3. 删 / 压 / 留 决策树与压缩流水线(E-S20-022)
某段内容要不要留在上下文?
├─ 本轮必须逐字精确? ── 是 → 留(原文)
├─ 后续轮次可能用到,但现在不用? ── 是 → 移到"笔记本"(外部存储/文件/DB),留一句索引
├─ 可以被更短的表述等价替代? ── 是 → 压(结构化摘要)
└─ 与本任务无关? ── 是 → 删(别"以防万一"留着)
三招(4610 的压缩版)与何时用:
| 招 | 做法 | 何时用 | 代价 |
|---|---|---|---|
| 直接截断 | 丢最早的 N 轮 | 早期内容确实过期(闲聊、已完成的子任务) | 丢失约束(用户早期说的"不许改接口"被截掉) |
| 摘要压缩 | 用小模型把早期对话压成要点 | 需要保留语义但不需要原文 | 压缩有损;关键常量/数字易丢 |
| 选择性保留 | 按类别打分保留(约束 > 决策 > 事实 > 过程) | 长任务、多轮工具调用 | 需维护分类规则 |
压缩流水线(可落地):
① 分类:把上下文切块并打标签(约束/决策/事实/工具输出/过程叙述)
② 打分:约束=5,决策=4,事实=3,过程=1;工具原始输出降级为"摘要+引用"
③ 压:超过预算时,从最低分开始压(先摘要,再丢弃)
④ 校验:压缩后跑一遍"红线检查"——硬约束是否仍在(用固定 checklist)
⑤ 落盘:被压掉的原件写进"笔记本"(文件/数据库),上下文里只留"在哪能找到"
判据:压缩后必须做"约束回归"——把项目硬约束列成 5~10 条,压缩后让模型复述,缺一条就说明压错层了(同 S24-J05 §6 的复述法)。
4. 上下文漂移与长对话锚定(4648)
| 现象 | 机制 | 对策 |
|---|---|---|
| 指令遗忘 | 早期指令被后续内容稀释 | 关键约束每轮重述(放在末尾,离生成最近) |
| 目标漂移 | 多轮后偏离原始目标 | 每 10 轮强制复述:"当前目标 / 已完成 / 下一步" |
| 事实漂移 | 模型把早期推测当既定事实 | 事实与推测分区存放,标注 [推测] |
| 风格漂移 | 输出逐渐"AI 腔" | 用违禁句式清单替代"写自然一点"(4649) |
每 10 轮重述模板:
## 当前状态(每 10 轮重写一次)
目标:<一句话>
已完成:<3~5 条,带文件/命令>
未完成:<下一步 1~3 条>
硬约束(不可违反):<5 条以内,逐条列>
已知坑:<踩过的 2~3 条>
"消灭 AI 腔"的正确做法(4649 的重写):不要给形容词,要给禁用词表。
禁用:赋能、抓手、闭环、颗粒度、打法、心智、范式、生态位、"不仅…而且…"、"在当今…时代"
要求:每段首句给结论;单句 ≤ 40 字;不写"综上所述";数字给来源与口径
5. "先 Log 再改码"(4643 的机制化)
① 复现:给出最小可复现输入与当前实际输出(不是"它不对")
② 观测:在假设的分支上打日志(输入、分支、中间值)
③ 定位:日志证明假设成立/不成立 → 缩小到具体行
④ 修改:只改被证据指出的那一处
⑤ 验证:同一输入重跑,对比新旧输出
判据:"猜测性修复"的代价是多轮往返且引入新 bug——每一次没被日志证实的修改,都在增加不确定性。这条与 S24-J04 §3 的止损线①(净增 bug 即停)是同一件事的两面。
6. 反例:六种"上下文越管越乱"
| 做法 | 后果 |
|---|---|
| 把整份日志/整篇文档贴进上下文 | 关键行被淹没,token 费用翻十倍 |
| 只在开头写一次约束 | 长对话后约束失效 |
| 用"总结一下前面"代替结构化压缩 | 摘要丢数字与否定条件 |
| 把记忆存在上下文里当"持久记忆" | 会话结束即丢失;换会话行为不一致 |
| 系统提示词里放动态时间戳 | KV Cache 全失效,延迟与费用上升 |
| 用"写得更自然"纠正 AI 腔 | 不可执行,每轮重复同样的纠正 |
7. 自测
- 上下文的三个成本?为什么要设"窗口 30%~50%"预算?
- 删/压/留决策树的四个分支?
- 三招压缩各适合什么、各自代价?
- 压缩后如何验证没压坏?
- 长对话漂移的四种表现与"10 轮重述"模板?
答案
- token 费用(O(n²) 累计)、注意力稀释、延迟;预留空间给生成与新信息。
- 必须精确→留;后续可能用→移到笔记本留索引;可等价替代→压;无关→删。
- 截断(丢早期约束)、摘要(有损丢数字)、选择性保留(需分类规则)。
- 约束回归:列 5~10 条硬约束,压缩后让模型复述。
- 指令遗忘/目标漂移/事实漂移/风格漂移;模板含目标、已完成、未完成、硬约束、已知坑。
8. 下一篇
S20-A04 · 训练与微调机制 —— 预训练在学什么、Chat Template 与 SFT 如何把基座变成"会说话的助手"、幻觉的四种治理路径与 Contextual Retrieval 的机制。
本篇属于系列《S20 · AI 应用与工程》。旧文来源:A-4610、A-4620/4621、A-4643/4648/4649;扩展点 E-S20-021/022/023。模型机制描述按公开论文口径,具体版本行为随厂商实现变化。