2094 字
约 6 分钟
8
S20-J05 · 上下文工程:压缩、记忆与漂移对抗

适用读者:被"上下文越长越贵越笨"困扰的人;把"记忆"和"上下文"混为一谈的人。
前置: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. 自测

  1. 上下文的三个成本?为什么要设"窗口 30%~50%"预算?
  2. 删/压/留决策树的四个分支?
  3. 三招压缩各适合什么、各自代价?
  4. 压缩后如何验证没压坏?
  5. 长对话漂移的四种表现与"10 轮重述"模板?
答案
  1. token 费用(O(n²) 累计)、注意力稀释、延迟;预留空间给生成与新信息。
  2. 必须精确→留;后续可能用→移到笔记本留索引;可等价替代→压;无关→删。
  3. 截断(丢早期约束)、摘要(有损丢数字)、选择性保留(需分类规则)。
  4. 约束回归:列 5~10 条硬约束,压缩后让模型复述。
  5. 指令遗忘/目标漂移/事实漂移/风格漂移;模板含目标、已完成、未完成、硬约束、已知坑。

8. 下一篇

S20-A04 · 训练与微调机制 —— 预训练在学什么、Chat Template 与 SFT 如何把基座变成"会说话的助手"、幻觉的四种治理路径与 Contextual Retrieval 的机制。


本篇属于系列《S20 · AI 应用与工程》。旧文来源:A-4610、A-4620/4621、A-4643/4648/4649;扩展点 E-S20-021/022/023。模型机制描述按公开论文口径,具体版本行为随厂商实现变化。

S20-J05 · 上下文工程:压缩、记忆与漂移对抗
https://www.clxhxhhr.top/posts/5472/
作者
clxstart
发布于
2024-12-31
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。