AB
AiBoss
チュートリアル

Claude Code

チュートリアル

在 Claude Code 里正确使用 /compact:压缩时机、成本与自动压缩设置

Claude Code 的 /compact 会把之前的对话历史换成一份 AI 写的摘要,让后续每轮发送的内容变短。但压缩得太频繁反而更贵:实测中,在作业告一段落、长时间中断前压缩,费用可降约 57%;而在连续作业中每轮都压缩,费用会涨到 2.75 倍。本文讲清什么时候该压缩、什么时候该 /clear、自动压缩怎么配置,以及摘要会丢掉什么。

Claude Code 的 /compact 会把当前会话的历史记录替换成一份由模型撰写的摘要,然后在这个摘要的基础上继续对话。它的直接效果是:之后每一轮发送给模型的内容变短了,进入提示缓存的量也变小了。对长时间跑同一个任务的会话来说,这是控制上下文体积的主要手段。但它不是「越用越省」的开关——压缩本身要付出摘要生成和缓存重写的费用,用错时机反而更贵。本文面向已经在用 Claude Code、希望把会话成本与上下文长度管住的开发者,讲清压缩的适用时机、自动压缩的配置方式,以及摘要会丢掉哪些东西。如果你还没开始用这个工具,可以先看 Claude Code 的说明,再回来处理上下文管理的问题。

理解压缩的前提是理解提示缓存。缓存机制会把本次请求与上次请求开头相同的部分保存在服务端,下次以更低的价格读取。以 Claude Sonnet 5.5 为例,从缓存读取的部分按普通输入价格的 0.05 倍计费,而把内容写入缓存则按普通输入的 2 倍计费。这两个倍率之间相差 40 倍,正是这个差距决定了压缩到底省钱还是费钱:压缩的价值在于把「一大段历史重新写进缓存」换成「一小段摘要写进缓存」。如果历史本来就在缓存里被廉价读取,压缩省不下什么,却要额外付摘要的钱。

准备工作

在动手之前,先确认几件事,否则后面的判断会失准。

  • 确认你的计费方式。订阅方案与 API 密钥的缓存保持时间不同。订阅方案中、且在套餐额度内的主对话,缓存保持约 1 小时;用 API 密钥调用,或者超出套餐额度后用 usage credits 付费时,主对话的缓存保持只有 5 分钟。压缩摘要的调用和子代理同样是 5 分钟保持。缓存保持时间直接决定了「中断多久之后需要压缩」这个判断。
  • 确认上下文窗口大小。支持 1M token 上下文窗口的模型(例如 Claude Sonnet 5.5)在接近上限时触发自动压缩,触发点大约在 967K token。如果你的模型窗口更小,这个数字要按比例理解。
  • 找到上下文占用显示。桌面版的 Context 面板和终端里的 /context 命令都会显示上下文被什么占用了。这是后面所有判断的依据,先熟悉它。
  • 区分「对话」和「指示文件」。Context 面板里,Messages 是对话历史,Memory files 是 AGENTS.md、CLAUDE.md 这类指示文件。压缩只作用于对话历史,指示文件在压缩后会从磁盘重新读取,所以指示文件太大时压缩帮不上忙。

价格、倍率、缓存保持时长、上下文窗口大小都属于会变动的信息,动手前请以官网当前公布的信息为准。

操作步骤

第一步:判断当前该不该压缩

打开 Context 面板(终端里用 /context),看 used 的百分比,也就是当前对话占上下文窗口的比例。然后对照下面这张表决定动作。表中的「还能省」列指的是:在这个占用比例下,如果后面还要继续同样的作业,压缩的费用大约需要几轮才能被省回来。

Context used压缩后大约几轮回本建议
5%(约 5 万 token)约 19 轮后面还要跑 20 轮以上才值得压缩
10%(约 10 万 token)约 8 轮后面还要跑 8 轮以上才值得压缩
25%(约 25 万 token)约 3.4 轮后面还要跑 4 轮以上就压缩
50%(约 50 万 token)约 2.2 轮后面还要跑 3 轮以上就压缩
75%(约 75 万 token)约 1.8 轮后面还要跑 2 轮以上就压缩

这些轮数是基于一次约 5.4 万 token 会话的压缩实测推算出来的:一次 /compact 的固定开销约 $0.0242(其中摘要正文输出约 1,875 token),下一轮把摘要重新写入缓存约 $0.0302,压缩后的一轮输入约 18,891 token。会话越大,摘要本身也越长,实际回本所需轮数可能比表中更多。所以这张表是判断方向的参考,不是精确账单。

从表里能读出一条清晰的规则:used 越大,压缩越划算;used 很小的时候,压缩基本是亏的。在 used 只有 5% 的时候压缩,要再跑近 20 轮才能把压缩的钱省回来,而多数会话根本跑不到那么多轮。

第二步:在作业告一段落时手动压缩

最稳妥、收益也最明确的做法,是在一段作业收尾、准备长时间离开之前压缩。终端里直接输入:

/compact

桌面版则在 Context 面板右下角点「Compact session」。这一步的意义在于:缓存会在约 1 小时后失效,如果不压缩就离开,回来时整段历史都要按普通输入价格重新读入、再按 2 倍价格重新写入缓存;如果离开前先压缩,回来时只需要重写一小段摘要。实测中,约 5.4 万 token 的会话中断 65 分钟后恢复,不压缩的费用是 $0.182,离开前压缩的费用是 $0.078,降低约 57%。

对比另外两种做法:恢复之后才压缩,费用 $0.155,只降 15%,因为消失的历史已经按普通输入价格读了一遍;把终端开着不管,Claude Code 会在缓存失效前不久自动压缩,费用 $0.171,相当于无摘要估算的 32%。

第三步:给压缩加上保留指令

/compact 后面可以跟一段说明,告诉模型摘要里要保留什么。例如:

/compact 只保留认证模块缺陷修复的相关内容

模型会按这条指令挑选要留在摘要里的信息。这在长会话里很实用:你明确知道接下来还要接着做哪一块,就把那一块钉住,其余细节让它被压掉。

第四步:配置自动压缩

Claude Code 有两类自动压缩,触发条件不同,开关也不同。

接近上限时触发。当对话接近上下文窗口上限时自动压缩,1M 窗口的模型大约在 967K token 处触发。要关闭它,在 /config 里把 Auto-compact 关掉,对应配置项 "autoCompactEnabled": false。要让它更早触发,用 /autocompact 指定阈值,取值范围 100K 到 1M,例如:

/autocompact 500k

作业中断期间触发。终端开着、最后一次提问之后约 54 分钟、且电脑没有休眠时,Claude Code 会自动压缩。这个行为只对 1 小时缓存保持的主对话生效(订阅方案、套餐额度内),并且默认要求对话在 20 万 token 以上。要关闭它,设置 "idleCompaction": false;要降低对话体积门槛,用环境变量 CLAUDE_CODE_IDLE_COMPACT_MIN_TOKENS,最低可设到 10 万 token。

两类自动压缩的收益差别很大。中断期间的自动压缩会在缓存失效前不久触发,实测费用降低约 68%;而接近上限时触发的自动压缩可能正好落在作业中途,反而打断节奏、增加开销。所以一般建议保留中断期间的自动压缩,对上限触发的自动压缩则结合手动压缩来控制时机。

第五步:不该压缩的时候改用 /clear

如果一段作业已经彻底结束、接下来要开始完全不同的任务,压缩是错误的选择——旧任务的摘要对新任务毫无价值,却要付摘要生成和缓存重写的钱。这时应该用 /clear 或者直接开一个新会话。同理,会话刚开始、还没有多少历史可压的时候,也不要压缩。

一个完整示例

假设你在一个约 50 万 token 的会话里修一个认证模块的缺陷,已经改了几轮,现在要出去吃午饭,回来还要继续改两三轮。

  1. 先看占用:终端输入 /context,看到 used 约 50%。
  2. 对照表格:50% 时压缩约 2.2 轮回本,你回来还要跑 3 轮以上,值得压缩。
  3. 带指令压缩,把接下来要用的线索钉住:
    /compact 保留认证模块缺陷的复现步骤、已排除的原因、待验证的假设
  4. 离开。缓存约 1 小时后失效,但此时历史已经被换成一段短摘要。
  5. 回来后继续提问。第一轮会把摘要重新写入缓存,之后各轮都从缓存廉价读取。
  6. 如果这轮修完就彻底换任务,不要压缩,直接 /clear 开新会话。

反过来,如果同样是 50% 占用,但你只剩最后一轮就能收工,那就不要压缩——回本需要 2.2 轮,你跑不到。

注意事项

连续作业中频繁压缩会显著变贵。在同一个会话里不间断地跑 10 轮,只改变 /compact 的次数:在作业分界处压缩一次,费用上升 22%;每轮都压缩,费用涨到 2.75 倍。原因是作业持续进行时,历史本来就从缓存按 0.05 倍价格读取,压缩省下的读取费用微乎其微(实测只省了 $0.019),而每次压缩都要按输出价格生成摘要正文、下一轮再按 2 倍价格把摘要写回缓存。多出来的 $0.428 里,缓存写入 +$0.198、摘要正文输出 +$0.161、不走缓存的输入 +$0.088。所以「勤压缩」是反直觉的错误做法。

摘要里没写的东西就没了。实测中,一段 39,875 字符的原文被压成 3,236 到 4,006 字符的英文摘要,摘要保留了写作规范和修改过的段落,但最初贴进去的原文消失了。之后追问原文中的某一句话,模型没有编造,而是回答「写不出来」。需要长期保留的资料不要贴在对话里,放到文件里,压缩之后再让它读取。

摘要会降低回答质量,但降多少没有定论。压缩后的对话在细节还原上必然不如原文,具体影响程度取决于任务类型和摘要质量,需要自己观察。

压缩本身要花钱。缓存已经失效之后再压缩,仅摘要调用就要约 11 美分;在作业告一段落时压缩,约 3 美分。这也是「提前压」优于「事后压」的原因之一。

中断期间的自动压缩有前提条件。关掉终端、或者电脑进入休眠,54 分钟的计时就不会触发压缩。要长时间离开,请在关闭终端之前自己执行 /compact。

指示文件太大时,压缩解决不了问题。AGENTS.md、CLAUDE.md 这类文件不属于对话历史,压缩之后会从磁盘重新读取,所以它们占用的上下文不会因为压缩而减少。如果 Context 面板显示 Memory files 很大,应该去精简这些文件本身。实测中把指示文件从 867 KB 精简到 57 KB,Memory files 从 349.4k token 降到 34.9k token。反过来说,压缩之后修改指示文件是有效的——新内容会被重新读入。

缓存保持时间因计费方式而异。只有订阅方案、套餐额度内的主对话享受约 1 小时的保持;API 密钥调用和超出额度后的 usage credits 付费都是 5 分钟。5 分钟保持意味着中断的判断标准完全不同,压缩的收益也随之变化。具体条件请以官网当前说明为准。