状态栏多了一个数,我开始疯狂 /compact
先说现象,因为它有点好笑。
九月初,我给 Claude Code 的状态栏加了一格:上下文用了多少。就一行小字,长这样:
◔ 312k/1M 31% ⚠200k+
然后我就开始疯狂 /compact。
不是谁让我这么干的,也不是我读了什么最佳实践。是那个数就杵在屏幕底下,每按一次回车它就涨一点,涨到一定程度我手就痒。
更好笑的是,额度变得非常耐用。以前一周过半就开始心虚,现在周末了还剩一大截。
我去翻了一下本机的会话记录,想看看这是错觉还是真的。
一、数字
拿加这一格的那天当分界,前后各看二十天:
| 加之前 20 天 | 加之后 20 天 | |
|---|---|---|
手动 /compact |
2 次 | 35 次 |
| 自动压缩 | 3 次 | 1 次 |
| 每轮请求的上下文(平均) | 约 254k | 约 202k |
| 每轮请求的上下文(中位数) | 约 203k | 约 170k |
| 超过 200k 的轮次占比 | 约 51% | 约 40% |
手动压缩翻了十几倍,自动压缩基本消失了。每一轮扛着的上下文,平均轻了两成。
这两个数字背后是同一件事:以前我是被动地等它满,现在是主动地在它变沉之前卸货。
额度到底省了多少,我没法精确算——订阅额度怎么折算 token,外面看不到。但「每一轮少背两成」这件事是实打实的,而且用的是同样的模型、干的是同一类活。
二、为什么一个数就能改变习惯
大模型对话有一个特别反直觉的地方:每一轮都要把之前所有的内容重新发一遍。
你问第 50 个问题的时候,前面 49 轮的对话、读过的文件、跑过的命令输出,全都跟着这一句一起再发一次。有提示缓存兜着,重发的部分会便宜很多,但不是零。
所以一个会话越聊越长,后面每一句话都越来越贵。就像一辆车后备箱里的东西只进不出,油耗一天比一天高,而仪表盘上没有「载重」这一项。
以前我对这件事有概念,但没有感觉。概念是「长会话比较费」;感觉是「现在这一句,背着 31 万 token」。
有概念不会改变行为,有感觉才会。
这跟记账是一个道理。知道「外卖花得多」没用,看见账单上那个具体的数才会手软。
三、那一格是怎么设计的
状态栏是个脚本,Claude Code 每次刷新会把当前会话的一坨 JSON 喂给它,它吐一行字出来。上下文那一格我做了几个小决定,回头看每个都挺关键:
显示「已用」,不显示「剩余」。 压缩是按已用触发的,盯着已用才知道离下一次打断还有多远。「还剩 69%」听起来很安心,「已经用了 31 万」听起来就想动手。
分颜色。 70% 以下灰色,70% 变黄,85% 变红加粗。灰色的时候它存在感很低,不打扰;变色的时候不用读数字就知道该停一下了。
单独标一个「⚠200k+」。 我用的是 1M 窗口,用到 30 万的时候百分比才 31%,看起来一点都不紧张。但越过 20 万之后单价是更贵的一档。所以这一格说的是「变贵了」,而不是「快满了」——这两件事在大窗口下差得很远,得分开告诉我。
真正让我开始手动压缩的,就是这个 ⚠。它一亮,我就会想:这个会话前面那些东西,后面还用得上吗?
大多数时候答案是用不上。
四、什么时候按 /compact
用了二十天,摸出来几个时机:
- 一段活干完、下一段还没开始的时候。 比如刚修完一个 bug、提交了,接下来要做另一件相关的事。前面的排查过程已经没用了,结论在提交里。
- 读了一大堆文件、终于找到问题在哪的时候。 找的过程很占地方,找到之后只需要记住「在哪、为什么」。
- ⚠200k+ 亮起来的时候。 这是最直接的信号。
- 别等自动压缩。 自动压缩往往发生在最不该被打断的时候——长任务做到一半。手动压缩可以挑时机,还能顺手告诉它「重点保留什么」。
反过来,也有不该压的时候:正在调一个细节很多的 bug、上下文里的每一行报错都还有用,这时候压了等于把线索扔掉。
五、顺手的发现
加了这一格之后,我又陆续往状态栏里塞了几样东西:会话花了多少钱、提示缓存是热的还是冷的、订阅额度过半没有(没过半就不显示,免得变成噪音)。
但回头看,真正改变我行为的只有上下文那一格。 其他的都是「知道一下」,只有它是「每一轮都在变、而且我能对它做点什么」。
我想这是能不能改变习惯的分界线:
一个数值得放在眼前,得满足两个条件——它会随着我的动作变,我也有办法让它变回来。
花了多少钱,我没法让它变回来;额度用了多少,也只能等它自己重置。只有上下文,一个 /compact 就能把它打回去。
最后
这事没有什么技术含量,就是一行字。
但它让我想起之前写过的:焦虑来自不知道数字。反过来也成立——浪费也来自不知道数字。
以前不是我不想省,是我根本看不见在哪儿费。
现在看见了,手就自己动了。哈哈。
