--- id: compress-full-context type: sop group: C status: published version: 1 updated: 2026-11-06 token_estimate: 2016 --- # 如何压缩快满的上下文 > **用途**:在上下文装不下之前,把「还要用来判断的」留住,把「能查到的」放走。 > > **覆盖**:长对话、长任务、多轮协作中的上下文管理。 > > **产出**:一份压缩后的工作集,或一个新会话的启动包。 > > 拿到就能跑:**压缩不是摘要。** 摘要是把内容变短,压缩是把可查的丢掉、不可查的留下。 --- ## 触发的变异问法 - 「上下文快满了怎么办」 - 「聊太长了它开始忘事」 - 「怎么让它记住前面的结论」 - 「要不要新开一个对话」 - 「怎么压缩对话」 - 「换个会话怎么接着做」 - 「它把我之前说的忘了」 - 「怎么保存进度」 --- ## 什么时候不要用这份文件 - **任务已经做完** —— 直接结束,不需要压缩。留着只会让下次的开场更重。 - **只是这一轮回答太长** —— 那是输出问题,不是上下文问题。 - **上下文还没到一半** —— 提前压缩会丢掉后面还用得上的细节。 - **任务本身没想清楚** —— 压缩一个模糊的任务,只会得到一份更模糊的摘要。 --- ## 判断:先问三个问题 | # | 问什么 | 怎么问出口(原话) | 判据 | 答不上来时 | |---|---|---|---|---| | Q1 | 这件事还要继续做吗 | 「接下来还有几步要走?」 | 还有 → Q2;没有了 → **路径 C(直接收尾)** | 看有没有「下一步要动手的事」 | | Q2 | 关键判据能不能一句话留住 | 「如果只留五句话,留哪五句?」 | 能 → Q3;不能 → **路径 A(先就地压缩)** | 留不出来的,多半是还没想清楚 | | Q3 | 有没有地方能落盘、下次查得到 | 「这些细节写下来,下次能读到吗?」 | 有 → **路径 B(落盘 + 分层)**;没有 → **路径 A** | 没有落盘位时就地压,别硬撑 | ### 分支 | 条件 | 路径 | |---|---| | Q1 = 任务已结束 | **C** · 收尾,不压缩 | | Q2 = 留不出五句 | **A** · 就地压缩(先想清楚) | | Q3 = 没有落盘位 | **A** · 就地压缩 | | Q3 = 有落盘位,任务还长 | **B** · 落盘 + 分层 | --- ## 路径 A · 就地压缩 继续在当前会话里做,只是把内容瘦下来。适合还能撑一段、或者暂时没有落盘位。 **压缩的对象是「过程」,不是「判据」。** 按这个顺序处理: 1. **留下的**:已经做出的决定、定下的约束、被否掉的方案及原因、当前状态。 2. **压成一句的**:探索过程(「查了 A、B、C,最终确定是 B」→「已确认 B」)。 3. **直接丢的**:读过的原文、试错的中间输出、重复确认过的内容。 ⛔ 不要用「摘要」的方式压缩——把一段话缩成三句,通常会**丢掉「为什么不这么做」**,而那恰恰是下次最容易踩回去的地方。 判据:**压缩后如果重来一遍,会不会犯同样的错?** 会,说明丢错了东西。 ## 路径 B · 落盘 + 分层 任务还长、细节还多。适合跨会话或跨天的工作。 做法: 1. **落盘**:把细节写进文件(决策记录、当前状态、待办),不留在对话里。 2. **分层**:常驻的只留指针和约束,细节按需读。 ``` 常驻:这件事的目标是 X,约束是 Y,详细进展见 `进展.md` 按需:进展.md 里有什么、做到第几步 ``` 3. **启动包**:新会话开头只给三样——**目标、约束、去哪看**。 ⛔ 不要把整份文件贴进新会话。贴进去等于没分层,只是把上下文压力换了个时间点。 ## 路径 C · 收尾 任务已结束时,什么都不用压。 但要做一件事:**把「结论」和「为什么」写到某个地方**,然后结束。 不写的后果是三个月后重新遇到同样的问题,从零再想一遍——而这正是「记忆」该解决的。 --- ## 出问题怎么办 | 现象 | 最可能的原因 | 处理 | |---|---|---| | 压完它还是不记得关键约束 | 压掉的是判据,留下的是过程 | 重做:留决定和约束,丢过程 | | 摘要写了很长但没用 | 按时间顺序摘,不是按判断价值摘 | 改成「决定 / 约束 / 待办」三段 | | 压缩后行为变了 | 丢掉了「为什么不这么做」 | 补回被否掉的方案及原因 | | 每次都要重新解释同一个约束 | 约束没进常驻层 | 把约束提到最前面,一句话 | | 新开会话还是很快满 | 启动包给太多 | 只给目标、约束、去哪看 | | 压缩后前后矛盾 | 决定被改了但旧决定还留着 | 压完做一次矛盾检查 | 倒数第二条最容易被忽略:**约束不进常驻层,每次都要重新说一遍**,这本身就是上下文浪费。 --- ## 输出规范 ### 人读 ``` 路径:A 就地压缩 / B 落盘分层 / C 收尾 保留(判据层):<决定 N 条、约束 M 条> 压成一句:<过程条目> 丢弃:<原文、试错输出> 落盘位置:<文件> 下次开场三样:目标 / 约束 / 去哪看 ``` ### 机器读 ``` path: compress|persist|close kept: {decisions: [...], constraints: [...], state} collapsed: n dropped: n storage: |null bootstrap: {goal, constraints: [...], where_to_look} ``` `bootstrap.constraints` 为空时,新会话必然要重新解释——**约束是启动包里唯一不能省的部分**。 ### 一句话版 `走 B:落盘 3 条决定、5 条约束;新会话只给目标、约束、文件位置。` --- ## 常见错误 - **用摘要代替压缩** —— 摘要把过程压短,把判据也压没了。 - **按时间顺序摘** —— 应该按「下次还用不用它来判断」摘。 - **压掉「为什么不这么做」** —— 于是下次又试一遍被否掉的方案。 - **把整份文件贴进新会话** —— 换了个时间点承担同样的压力。 - **约束不进常驻层** —— 每次都要重新说一遍,这本身就是浪费。 - **任务结束了还留着** —— 旧上下文会干扰新任务,该收就收。 - **压缩后不做矛盾检查** —— 改了决定但旧决定还在,后面会按错的走。 --- ## 最后核对 2026-11-06。上下文长度随产品变化,但「留判据、丢过程、细节落盘」的判据通用。与所执行系统的既定标准冲突时,以那个系统的标准为准。