Skip to content

上下文管理

上下文是 Claude Code 的工作记忆。窗口不是无限的,也不是想清就清。理解它的边界,你才能在长会话里保持思路一致,也能在跑偏时快速止损。

上下文窗口是什么

Claude 模型每一轮推理都要把之前的对话、读过的文件、跑过的命令输出,全部作为输入喂给自己。这些内容加起来受限于一个数字,就是上下文窗口。目前主流模型是几十万 token 量级,看上去很大,实际用起来消耗很快,因为读一个大文件、跑几次 grep、贴几段 diff,几万 token 就没了。

窗口一旦快满,Claude Code 会有两种反应:一种是自己动手压缩,一种是提醒你手动处理。理解这两个机制的时机,能省掉很多莫名其妙的表现。

自动压缩

Claude Code 内置自动压缩策略。当剩余可用窗口低于阈值时,它会在你下一次输入之前,把前面较早的对话摘要化,只保留关键结论和当前任务相关的引用。压缩之后你会看到一段简短的提示,写着已经压缩了多少历史。

压缩后的会话仍然可用,但有两个副作用需要注意:

  • 早期的具体细节可能被摘要吞掉。如果你后面又需要那些细节,只能再读一次原文件。
  • 压缩本身也要消耗 token,所以在极长的会话末段,压缩会越来越频繁。

手动 /compact/clear

除了自动压缩,你还有两个手动命令。

  • /compact:立刻触发一次压缩,把当前会话历史缩到一份摘要。适合在一个阶段告一段落、准备开始下一个阶段时用。可以顺带传一句你希望重点保留什么,Claude Code 会照顾到。
  • /clear:直接清空整个会话,从零开始。适合前面跑偏太远、或者切换到完全无关的新任务。

一个常用组合:完成一个功能模块之后,先让 Claude Code 写一段一两百字的阶段总结,再 /clear,把总结贴回去作为新起点。既省窗口又保留了必要脉络。

什么时候压缩,什么时候开新会话

一条经验规则:

  • 如果新任务和之前任务共享同一份代码上下文,比如同一个模块的下一个功能:/compact
  • 如果新任务完全无关,比如切到另一个项目、另一种语言:/clear 或者直接开新终端跑一个新的 claude
  • 如果只是想把之前跑偏的分支切掉,回到某个稳定节点:/resume 挑历史会话恢复。

注意

不要为了省事一直用同一个会话跑一整天。会话越长,Claude Code 越容易被前面遗留的假设带偏,压缩越多,早期决策越模糊。定期开新会话是好习惯。

大项目怎么给足关键上下文

Claude Code 默认不会自动读你项目里的每一个文件,它靠 Prompt 和你临时提供的信息按需搜索。大项目里,能不能一次到位,取决于你给的入口够不够。给足入口通常靠三样东西。

CLAUDE.md

项目根目录放一个 CLAUDE.md,写清项目定位、目录约定、常用命令、代码风格、测试与部署规范。Claude Code 每次开会话都会自动加载这个文件,等同于长期备忘。写它的时候注意精简,几百行以内最合适,太长反而失焦。

目录树

Prompt 里贴一段目录树,是让 Claude Code 快速理解项目形状的最省事方式。可以直接 !tree -L 2 或者 !ls src/,一行搞定。

text
!ls -R src | head -50
先看这个结构,然后告诉我我们该从哪个入口开始改

关键文件的路径清单

如果这次任务只涉及某几个文件,直接把它们的绝对路径列出来。

text
本次任务涉及这些文件:
- src/routes/order.ts
- src/services/payment.ts
- tests/order.test.ts
先把这三个读一遍,再告诉我方案

这样比让 Claude Code 自己去猜要读什么快得多,也准得多。

/resume 与会话历史

/resume 在 REPL 里的作用和命令行 claude --resume 是一样的,弹出会话列表让你挑一个恢复。选中之后当前上下文会被替换成那个历史会话的状态。适合切分身,比如上午做后端下午做前端,两条会话轮流恢复,中间不用清屏也不用重跑背景介绍。

对比一下三种恢复方式:

  • claude --continue 是无脑续最近一次,你什么都不用选。
  • claude --resume 是列表选,适合有很多历史会话时手动挑一条。
  • /resume 是在已经进 REPL 之后再切换到另一条会话,等于会话之间的跳转键。

小提示

好习惯是每天早上先 /resume 挑一个之前没做完的任务,接上而不是重开。这样思路不断线,也省得反复解释背景。周末回来也一样,别急着开新会话,先看看昨天的进度还在不在。

本教程为社区中文学习整理,非官方发布。Claude Code 属于 Anthropic。