很多人刚开始用 Claude Code,前半小时都很兴奋。

它能读项目文件,能看目录,能跑命令,能改代码,还能把测试结果拿回来继续分析。你会明显感觉到,它和普通聊天 AI 不一样,不是坐在那里给你一段建议,而是真的进到项目里干活。

但用着用着,问题也来了。

会话越来越长,Claude Code 读过的文件越来越多,跑过的命令输出越来越多,前面讨论过的方案、报错、测试结果都还挂在上下文里。然后你突然看到它提醒你 /compact。

很多新手这时候会慌:是不是它快记不住了?是不是前面花掉的 token 白费了?是不是必须开新会话?甚至还有人会觉得,既然都要压缩,那是不是 Claude Code 不适合做长任务?

其实不用这么紧张。

/compact 不是 Claude Code 崩了,也不是它突然失忆。更准确地说,是它的“工作台”快堆满了,需要把前面的内容收纳一下,压缩成一份摘要,让后面的任务还能继续进行。

这篇我们就用大白话讲清楚:Claude Code 的上下文窗口到底是什么,为什么用着用着会消耗大量 token,/compact到底保留什么、丢掉什么,以及新手怎么少浪费 token。

打开网易新闻 查看精彩图片

先理解 context window:它就是 Claude Code 的工作台

Claude Code 官方文档里说,context window 保存了 Claude 在本次会话里知道的一切,包括你的指令、它读过的文件、它自己的回复,以及一些不会直接显示在终端里的内容。文档还做了一个交互式示意,展示上下文是怎么一步步被填满的。

你可以把它理解成 Claude Code 当前正在使用的工作台。

你输入的任务,会放上去;Claude Code 读过的文件,会放上去;它跑命令得到的输出,也会放上去;项目里的 CLAUDE.md、自动记忆、MCP 工具名、Skill 描述,也会在合适的时候进入上下文。

这就解释了为什么你明明只问了几句话,token 却消耗不少。

因为 Claude Code 干活时看的不只是你刚刚那一句话。它可能已经背着一大包资料在继续工作。你让它修一个问题,它会读 README、看配置、搜索源文件、跑测试、分析报错。每一步都可能给上下文增加内容。

这也是 Claude Code 强大的原因。它能跨文件理解项目,能带着前面的信息继续推理。可代价也很明显:工作台不是无限大的,东西越堆越多,每次继续对话要处理的内容也越重。

为什么越用越贵、越用越容易提醒 /compact?

Claude Code 的成本和上下文大小高度相关。官方成本页写得很清楚:token 成本会随着 context size 增大而增加。Claude Code 会通过 prompt caching 和 auto-compaction 自动优化成本,但用户仍然需要主动管理上下文。

这句话翻成大白话就是:会话越长,Claude Code 背着的包越大;包越大,后面每次继续工作要处理的内容就越多。

有些内容很重要,比如当前任务目标、关键文件、最新报错和已经做过的修改。有些内容已经没用了,比如早就排除掉的错误方向、无关文件的长输出、上一个任务里的旧讨论。问题是,只要这些内容还在上下文里,它就可能继续消耗 token。

所以长会话用到一定程度,Claude Code 会需要压缩。/compact 的作用,就是把前面冗长的对话和操作过程总结成一份结构化摘要,腾出空间给后续任务。

你可以把它想象成整理桌面。

桌子上原来摊着十几页日志、几份代码片段、测试输出、讨论记录。现在把它们整理成一页摘要:当前目标是什么,已经做过什么,剩下什么问题,哪些文件最重要。桌面清爽了,任务还能继续。

/compact 不是全记得,也不是全忘了

很多人对 /compact 的误解,就出在这里。

它不是完整保留全部历史,也不是直接清空重来。官方文档说,长会话 compact 时,Claude Code 会总结对话历史,让它适配上下文窗口;但不同来源的指令和规则,在压缩后的保留方式不一样。

几个关键点要记住。

项目根目录的 CLAUDE.md 和未限定路径的规则,会从磁盘重新注入。自动记忆也会重新注入。系统提示词和输出风格不属于消息历史,所以不受 compaction 影响。

但带 paths: 的路径规则、子目录里的嵌套 CLAUDE.md,会等到再次读取匹配文件或目录时才重新加载。已经调用过的 Skill 内容会重新注入,但有上限:每个 Skill 最多 5000 tokens,总共最多 25000 tokens,旧的会先被丢掉。文档还提醒,Skill 内容被截断时会保留开头,所以重要说明最好放在 SKILL.md 前面。

这部分很重要。

如果你有长期必须生效的项目规则,最好放在项目根目录的 CLAUDE.md 里,不要藏在很深的子目录规则里。
如果某个 Skill 很长,最关键的触发条件、执行步骤、禁止事项和验收标准要放在前面,不要把重要信息写到最后。
如果 compact 后你发现 Claude Code 好像漏了某个子目录规则,可以让它重新读取相关文件或目录,规则会在匹配时再次加载。

所以,/compact 之后不是“什么都没了”。但也别假设它和压缩前完全一样。压缩后的会话更像一份整理过的接力摘要,够继续工作,但某些细节需要你重新唤起。

先用 /context 看看谁在占空间

很多人 token 花得快,却不知道花在哪里。

Claude Code 给了一个很实用的命令:/context。官方文档说,你可以用 /context 查看当前上下文使用情况,它会按类别给出实时拆解和优化建议;也可以用 /memory 看哪些 CLAUDE.md 和自动记忆在启动时加载了。

所以别靠猜。

如果你感觉会话越来越重,先跑:

/contextcode>

看看上下文主要被谁占了:是对话历史,还是文件内容,还是 MCP 工具,还是规则和记忆。

再跑:

/memory

看看启动时加载了哪些长期说明。

这两个命令用顺以后,你会慢慢对 Claude Code 的“工作台”有感觉。以前你只会觉得“怎么又贵了”“怎么又要 compact”,现在你能看到到底哪些东西占了空间。

切换无关任务,别硬接,直接 /clear

省 token 最有效的习惯之一,是不要把无关任务硬塞进同一个长会话。

官方成本页建议,切换到无关工作时用 /clear 开新上下文,因为过期上下文会在后续每条消息里浪费 token;如果担心以后找不到旧会话,可以先用 /rename 起名,再用 /resume 回来。

比如你刚让 Claude Code 修完一个登录报错,接下来又想让它研究另一个完全无关的项目。这个时候继续在原会话里问,旧项目的文件、测试输出、错误日志都可能继续占着上下文。

更好的流程是:

/rename login-bug-fix/clear

然后在新上下文里开始新任务。

这不是浪费,而是省钱。你把旧任务收好,新任务轻装上阵。以后要回来,再用 /resume 找旧会话。

新手最容易犯的错,就是一个会话从早用到晚。刚开始觉得连续,后面就会发现上下文越来越脏,Claude Code 也越来越容易被旧信息干扰。

/compact 可以加指令,不一定让它随便压

很多人看到 /compact,直接敲一下就完事了。其实你可以给它一点方向。

官方成本页提到,可以给 /compact 添加自定义压缩指令,比如:

/compact Focus on code samples and API usage

你也可以在 CLAUDE.md 里写 compact instructions,让 Claude Code 压缩时更关注某些内容。文档示例里就写了:使用 compact 时,请关注测试输出和代码变更。

这很适合长任务。

比如你在修测试,就可以让它 compact 时重点保留:失败测试、已改文件、最新错误、尚未验证的点。
如果你在做 API 集成,就让它保留:接口地址、请求参数、返回格式、已确认的坑。
如果你在做迁移任务,就让它保留:迁移范围、已完成步骤、未处理文件、风险点。

你可以这样写:

/compact 请重点保留:当前目标、已修改文件、最新测试结果、仍未解决的问题,以及下一步计划。无关探索过程可以压缩掉。

这样比直接 /compact 更稳。

它不会保证所有细节都完美保留,但能让摘要更贴近你接下来要做的事。

MCP 不要全开,CLAUDE.md 也别写成百科全书

很多人为了“让 Claude Code 更强”,会把一堆 MCP server 全接上,把 CLAUDE.md 写得很长,把所有流程、习惯、规则都塞进去。短期看很安心,长期看会增加上下文负担。

官方成本页对 MCP 的建议很直接:运行 /mcp 查看配置的服务器,禁用当前不用的 MCP server。文档还提到,很多 CLI 工具,比如 gh、aws、gcloud、sentry-cli,通常比 MCP server 更节省上下文,因为它们不会增加工具列表负担。

所以不要觉得 MCP 接得越多越好。当前任务用不到,就别让它一直挂着。

CLAUDE.md 也是一样。官方建议把专门流程从 CLAUDE.md 移到 Skills,因为 CLAUDE.md 会在会话启动时加载进上下文;如果里面塞满 PR 审查、数据库迁移之类只在特定场景用到的详细说明,即使做无关任务也会占 token。文档建议 CLAUDE.md 尽量控制在 200 行以内,只保留关键内容。

可以这样分工:

CLAUDE.md 放项目里长期、通用、每次都需要的规则。
Skills 放特定场景才需要的流程,比如发布检查、数据库迁移、代码审查。
临时要求放当前聊天里。
不再需要的 MCP 先关掉。

这样上下文会干净很多。

大日志、大测试输出,别全塞进主会话

另一个 token 黑洞,是长输出。

你让 Claude Code 跑一大段测试,终端吐出几千行;你让它读一个 10000 行日志,它直接把大量内容带进上下文;你让它抓一堆文档回来,主会话一下变重。

官方成本页建议,把跑测试、抓文档、处理日志这类冗长操作交给 subagents,这样大输出留在子 Agent 的上下文里,主会话只拿摘要。

另外,hooks 和 skills 也能帮忙减少上下文。官方举了一个例子:不用让 Claude 读完整 10000 行日志,可以用 hook 先筛出包含 ERROR 的行,只把关键片段送进上下文。这样可能从几万 token 降到几百 token。

这点对实战很重要。

不要让 Claude Code “什么都看完再说”。很多时候,先过滤、再摘要、再交给主会话,效果更好,成本也低。

比如跑测试时,不一定要把全部通过项都塞进去,只看失败项和附近几行就够了。
看日志时,不一定要读完整文件,先筛 ERROR、WARN、时间窗口。
查文档时,不一定要整页抓回来,先让子 Agent 提炼关键结论。

主会话应该保留判断,不要被大量原始噪音淹没。

提示词越具体,越少乱扫文件

很多 token 浪费,来自一开始问题太模糊。

模糊请求,会触发广泛扫描;具体请求,能让 Claude 用更少文件读取完成工作。

这对新手太重要了。

不要说:

优化一下这个项目。

可以说:

请只检查 src/auth.ts 里的 login 函数,给用户名和密码参数补输入校验。不要重构认证流程。完成后运行 auth 相关测试。

这句话把范围、文件、动作、禁止事项和验证方式都说清楚了。Claude Code 不需要大范围扫项目,token 自然省。

复杂任务也一样。官方建议复杂任务先用 plan mode,让 Claude 探索代码库并提出方案,再经你确认后实现;如果它方向不对,要尽早按 Escape 停止,必要时用 /rewind 或双击 Escape 回到检查点。文档还建议给验证目标,比如测试用例、截图或预期输出,并且增量测试。

这不是为了限制 Claude Code,而是为了减少返工。

方向错了还继续跑,token 才最贵。

给新手的一套简单习惯

如果你刚开始用 Claude Code,可以先养成这几个习惯。

第一,开始一个任务前,先说清范围。不要让它猜整个项目,尽量告诉它看哪个目录、改哪个文件、跑哪个测试。

第二,感觉会话变重时,先用 /context 看占用,不要凭感觉判断。

第三,切换无关任务前,用 /rename 保存旧会话名,然后 /clear 开新上下文。

第四,看到 /compact 不要慌。它是收纳,不是崩溃。需要的话,给 /compact 加一句说明,让它保留你最关心的内容。

第五,不要把所有规则都塞进 CLAUDE.md。长期通用规则放里面,专项流程放 Skills。

第六,MCP 和工具不要全开。当前用不到的先关掉,能用 CLI 的场景可以优先考虑 CLI。

第七,长日志、长测试输出、资料抓取,尽量让子 Agent 或 hook 先处理,主会话只接收摘要和关键结果。

这些习惯不复杂,但能明显减少 token 浪费,也能让 Claude Code 更稳。

最后说一句

Claude Code 老让你 /compact,不是坏事。它说明这次会话已经积累了很多上下文,工作台快堆满了,需要整理一下。

真正要避免的,不是 /compact 本身,而是无意识地把所有东西都往一个会话里塞。

上下文窗口是 Claude Code 的工作台。工作台要放关键材料,不要堆满过期日志、无关文件、太长规则和用不到的工具。该 /clear 就 /clear,该 /compact 就 /compact,该把流程放进 Skill 就别塞进 CLAUDE.md。

等你理解了 context window,再看 token 消耗,就不会只觉得“怎么又花了这么多”。

你会知道:哪些 token 是必要的上下文,哪些 token 是可以省掉的杂物。

这一步看懂了,Claude Code 才会真的越用越顺。

打开网易新闻 查看精彩图片