TokenPlus

上下文窗口怎么管:压缩之后什么还在

更新·markdown 原文

我把官方那份上下文时间线和「压缩后什么活下来」的表接到了一起。最值钱的是那张表——它解释了一类很难查的现象:你写过的规则,在长会话里会自己消失,而且不报错。

会话开始时已经占掉的

一个新会话不是从零开始。启动就装进去的东西大致是(官方给的示意值,不是你的真实数):

装了什么大致 token
system prompt~4,200
auto memory(MEMORY.md~680
环境信息(工作目录、平台、shell、git 状态)~280
MCP 工具名(schema 默认延迟加载)~120

加上你的 CLAUDE.md、rules、以及第一次读的几个文件。默认窗口 200K——Fable 5、Sonnet 5、Opus 4.6 及之后、Sonnet 4.6 支持 100 万 token 的窗口(部分要选 [1m] 变体,Sonnet 5 直接就是 1M)。

看自己的实况:`/context`,它按类别给实时占用,还会指出哪些能优化,包括加载了哪些 CLAUDE.md 和 auto memory 文件。


压缩之后什么还在

上下文接近上限时会自动压缩,也可以手动 /compact。压缩就是把对话历史总结掉——你的指令能不能活下来,取决于它当初是怎么加载进来的

机制压缩之后
system prompt、output style不变(本来就不在消息历史里)
项目根 CLAUDE.md、无 scope 的 rules从磁盘重新注入
auto memory从磁盘重新注入
paths: frontmatter 的 rules,直到再读到匹配的文件
子目录里的嵌套 CLAUDE.md,直到再读那个目录里的文件
调用过的 skill 正文重新注入,但每个 skill 上限 5,000 token、总计 25,000,超了先丢最老的
hooks不适用——hook 是代码,不占上下文

三个直接的推论:

一、只在对话里说过的话,压缩之后就没了。 「以后都用 pnpm 别用 npm」这种,说一次是活不过压缩的。要它长期有效就得落到 CLAUDE.md 或 auto memory 里。

二、`paths:` 是省 context 的手段,代价是它活不过压缩。 一条规则如果必须在整个会话里一直有效,就别给它加 `paths:`,或者干脆搬到项目根 CLAUDE.md。省 context 和抗压缩,这里只能选一个。

三、SKILL.md 最重要的话写在最前面。 超出 5,000 token 的部分会被截断,而截断保留的是开头。把关键指令压在文件末尾的 skill,压缩之后就剩个开头的介绍。


/clear 还是 /compact

两个动作差别比看起来大:

/clear/compact
做什么开新会话,历史丢掉总结历史,接着干
花多少钱不花——它要读完那段对话才能总结
什么时候用切到不相关的活同一件事要接着做,但快满了

压缩一个大上下文,这个动作本身就是一次大请求。 所以别养成「快满了就 compact」的习惯——如果下一个任务跟前面无关,/clear 又快又免费。

想回头找,/clear 之前先 /rename,之后用 /resume 回去。

`/compact` 可以带指示,让它按你要的留:

/compact 重点保留那个鉴权 bug 的排查过程和最后的修法

自动压缩猜什么重要,带指示的压缩由你定。也可以把默认指示写进 CLAUDE.md:

# Compact instructions

压缩时重点保留测试输出和代码改动。

在撑满之前

三个动作,成本从低到高:

把大块阅读交给子代理。 抓文档、跑测试、翻日志——让几万 token 的原始输出留在子代理的上下文里,主对话只收一份摘要。这是唯一一个能「读了但不占地方」的办法。

用 hook 在数据进来之前过滤。 一万行日志 grep 完再给它,几万 token 变几百。

切任务就 `/clear`。 陈旧上下文在之后每条消息上都收一次费。


一个容易忽略的连锁

压缩这件事跟账单是连着的:每条消息都带着整个对话发出去。所以上下文越长,之后每一条消息越贵——不是压缩那一下贵,是压缩之前的每一条都在为那段历史付钱。

外加缓存那一层:休息时间超过缓存寿命(订阅 1 小时、API key 5 分钟),回来第一条消息就是把整段上下文按全价重新过一遍。上下文越长,这一下越疼。

三件事连起来看才对:上下文长度 → 每条消息的价 → 缓存过期时的重算成本省钱三件套那篇把这条线讲全了。


参考