首页 / Claude Code 入门教程 / 上下文窗口管理

Claude Code 入门教程

上下文窗口管理

本教程共 34 篇 · 第 12 篇 · 更新于 2026-07-26 · 约 10 分钟阅读

Claude CodeClaude Code 入门教程上下文窗口Prompt CachingToken 优化/compact

12. 上下文窗口管理

本节目标:理解上下文窗口的运作机制,掌握 /compact、/clear、/rewind 等管理命令,了解 prompt caching 原理,学会优化 token 使用,让长会话保持高效。

上下文窗口是什么

上下文窗口(Context Window)是 Claude 在一次会话中能”看到”的全部内容。你可以把它想象成 Claude 的工作台桌面:桌面大小有限,放上去的东西越多,能放新东西的空间就越少。

Claude Code 默认模型的上下文窗口是 200,000 token(约 15 万个英文单词)。部分模型支持扩展到 1,000,000 token。不管多大,总会用完,所以管理上下文是高效使用 Claude Code 的核心技能。

窗口里有什么

在你输入第一个字之前,上下文窗口已经填了不少东西:

内容加载时机你看得到吗
系统提示每次启动看不到
自动记忆(MEMORY.md)启动时,前 200 行或 25KB看不到
环境信息启动时看不到
MCP 工具名称启动时看不到
Skills 描述启动时看不到
用户级 CLAUDE.md启动时看不到
项目 CLAUDE.md启动时看不到
你的提示你输入时看得到
Claude 读的文件工作时只看到一行提示
Claude 的回复工作时看得到
工具输出(命令结果等)工作时只看到摘要

注意一个关键点:你在终端里看到的内容和 Claude 上下文里的内容不一样。Claude 读了一个 2,400 token 的文件,你只看到一行”Read auth.ts”。那些文件内容全在上下文里,你看不见但它们在占空间。

Note

文件读取是上下文消耗的大头。提示要具体(“修复 auth.ts 里的 bug”),让 Claude 少读文件。研究型任务用子代理,把大文件读取挡在主上下文之外。

上下文衰退

上下文窗口不是”填满才算满”。随着内容增加,模型性能会逐渐下降,这叫上下文衰退(Context Rot)。

就像人在嘈杂的房间里很难集中注意力,Claude 在海量上下文中也会注意力分散。旧的不相关内容开始干扰当前任务。

衰退的典型症状:

  • Claude 前后矛盾,忘记之前达成的决策
  • 回复变得模糊笼统,细节减少
  • 对同一问题反复询问已经回答过的内容
  • 你在同一会话里对同一问题纠正了两次以上

出现这些症状,说明上下文已经”污染”了。别继续在同一会话里纠正,直接 /compact/clear

Warning

官方建议:如果在同一会话里对同一问题纠正了两次以上,不如直接 /clear,带着学到的约束重新开始一个更精准的提示。干净的会话加上更好的提示,几乎总是好过在污染的上下文中继续纠正。

检查上下文用量

随时用 /context 命令查看当前上下文的详细用量:

/context

它会按分类(系统提示、CLAUDE.md、记忆文件、会话历史等)列出 token 占用,并给出优化建议。建议在开始重要任务前先检查一次。

/memory 可以查看启动时加载了哪些 CLAUDE.md 和自动记忆文件。

/compact:压缩对话

/compact 把对话历史总结成精简摘要,释放上下文空间后继续工作:

/compact

压缩是有损操作。Claude 在压缩时处于上下文最满、性能最弱的状态,如果不给指令,它可能丢掉你认为重要的内容。

带指令压缩

/compact 支持传入自定义指令,控制保留哪些内容:

/compact focus on the auth bug fix
/compact 保留认证流程的架构决策,丢弃调试过程中的无效尝试
Tip

在重大决策后立即主动压缩,并用指令说明保留重点,比等待自动压缩效果好得多。

自动压缩

Claude Code 在上下文接近限制时(约 75% 用量)会自动触发压缩。但官方建议不要等自动压缩,应在 60~70% 时手动触发,避免在关键任务中间被打断。

压缩后保留什么

压缩不是把所有东西都删了。不同内容的命运不一样:

机制压缩后
系统提示和输出样式不变,不是消息历史的一部分
项目根 CLAUDE.md 和无范围规则从磁盘重新注入
自动记忆从磁盘重新注入
paths: frontmatter 的规则丢失,直到再次读取匹配文件
子目录中的嵌套 CLAUDE.md丢失,直到再次读取该子目录文件
调用的 Skills 内容重新注入,每个上限 5,000 token,总计 25,000 token
Hooks不受影响,作为代码运行

简单说:启动时加载的东西会重新加载,对话过程中加载的东西会被总结。路径范围规则和嵌套 CLAUDE.md 属于后者,因为它们是在对话中按需加载的。

Note

如果某条规则必须在压缩后依然有效,把它放在项目根 CLAUDE.md 里,不要用 paths: frontmatter。

/clear:清除上下文

切换到完全不相关的任务时,用 /clear 清除所有对话历史:

/clear

清除后 CLAUDE.md 和自动记忆不受影响,仍会在新会话中加载。相当于开了个新会话,但不用退出 Claude Code。

适用场景:

  • 任务完成,要开始新任务
  • 上下文严重污染,Claude 开始胡说
  • 换一个完全不同的代码库工作

/rewind:回退到检查点

Claude Code 在每次你发送消息前会自动创建检查点。双击 Esc 或执行 /rewind 打开回退菜单:

/rewind

菜单里有几个选项:

操作效果适用场景
恢复对话 + 代码回退对话历史和文件改动,完全还原Claude 走偏了,全部撤销
仅恢复对话回退对话历史,保留文件改动想重试不同思路,代码改动保留
仅恢复代码还原文件到检查点状态,保留对话代码改坏了,对话分析有参考价值
从此处摘要该检查点之后的对话压缩为摘要清理后半段冗余,保留前期完整上下文

检查点跨会话持久保存,关闭终端后仍可回退。这不是 Git 的替代品,但在探索性实验中比手动 git stash 方便。

Tip

/rewind 回退到已经缓存的前缀,不像 /compact 那样构建新前缀。如果你走上了想完全放弃的路径,/rewind/compact 更高效。

/btw:快速提问不污染上下文

需要快速查一个小细节,但不想让这次问答进入对话历史消耗上下文:

/btw 这个项目的 TypeScript 版本是多少?

答案以浮层方式展示,问题和答案都不进入对话历史。适合查阅配置、版本号等不需要保留的一次性信息。

Prompt Caching:缓存机制

Prompt caching 是 Claude Code 自动管理的优化机制,让响应更快、更省钱。了解它的原理能帮你避免不必要的性能损失。

怎么工作的

每次你发送消息,Claude Code 都会发出新的 API 请求。模型在请求之间不记得任何东西,所以每次都要重新发送完整上下文:系统提示、项目上下文、之前的每条消息和工具结果,加上你的新消息。

新内容附加在末尾,所以每次请求的大部分和上次相同。Prompt caching 让 API 重用已处理过的内容,只处理变化的部分。

缓存通过匹配请求的开头部分(前缀)来工作。匹配是精确的:前缀中任何位置的改动都会让其后所有内容重新计算。

三层结构

Claude Code 把请求组织成三层,让很少变化的内容排在前面:

内容什么时候变
系统提示核心指令、工具定义、输出样式工具定义集合变化或 Claude Code 升级
项目上下文CLAUDE.md、自动记忆、无范围规则会话开始,或 /clear、/compact 后
对话你的消息、Claude 的回复、工具结果每个回合

对对话层的改动不影响系统提示和项目上下文的缓存。对系统提示的改动会让所有缓存失效,因为后面所有内容都跟着变了。

Tip

在会话顶部选好模型和工作量级别,然后在任务之间的自然中断处做 /compact。任务中途改动越少,缓存命中率越高。

哪些操作会让缓存失效

这些操作会导致下一个请求错过部分或全部缓存,出现一次性的变慢和变贵:

  • 切换模型:每个模型有独立缓存,切换意味着全部重新处理
  • 更改工作量级别:同一模型的不同级别也是独立缓存
  • 启用快速模式:添加的请求头是缓存键的一部分
  • 连接或断开 MCP 服务器:工具定义在系统提示层(延迟加载的工具除外)
  • 启用或禁用提供 MCP 服务器的插件:同上
  • 拒绝整个工具(如添加 Bash 到拒绝规则):从系统提示中移除工具定义
  • 压缩对话:用摘要替换历史记录,新前缀和旧的不匹配
  • 升级 Claude Code:新版本通常更新系统提示或工具定义
Note

模型切换可能感觉是免费的,直到你注意到随后的变慢回合。opusplan 模型设置在 Plan Mode 期间用 Opus,执行期间用 Sonnet,所以每次 Plan Mode 切换都是模型切换。

哪些操作保持缓存

这些操作要么附加到对话末尾,要么不触碰请求:

  • 编辑仓库中的文件:文件内容只在 Claude 读取时进入上下文,编辑不追溯改历史
  • 会话中途编辑 CLAUDE.md:不使缓存失效,但编辑也不生效,下个 /clear 或重启才加载
  • 更改输出样式:同上,不失效但不生效
  • 更改权限模式:不改系统提示或工具定义(opusplan 例外)
  • 调用 Skills 和命令:指令作为用户消息注入,不改前面的内容
  • 运行 /rewind:截断回较早回合,剩余历史和该点缓存相同
  • 生成子代理:子代理有独立缓存,父代缓存不受影响

缓存生命周期

缓存在不活动期间后过期。每次命中缓存的请求都会重置计时器,所以只要持续工作,缓存就保持温暖。足够长的间隙后,下一个请求会重新计算完整输入。

两个 TTL(生存时间)选项:

  • 5 分钟:默认值,更便宜
  • 1 小时:更长的中断保持缓存温暖,但缓存写入费用更高

Claude Code 根据认证方式自动选择:

  • Claude 订阅:自动用 1 小时 TTL,包含在计划中不额外收费。超限使用额度时降到 5 分钟。
  • API 密钥或第三方提供商:默认 5 分钟。设置 ENABLE_PROMPT_CACHING_1H=1 开启 1 小时 TTL。

Token 优化策略

1. 提示要具体

“修复 auth.ts 里的 token 刷新 bug”比”修复认证问题”好。具体的提示让 Claude 少读不必要的文件,节省上下文。

2. 用子代理做研究

研究型任务需要读大量文件,但这些文件内容你不需要保留在主上下文里。委托给子代理:

用子代理分析所有日志文件,找出性能瓶颈,只把结论告诉我

子代理在独立的上下文窗口里工作,读了 6,100 token 的文件,只返回 420 token 的摘要给你。这就是上下文节省。

3. 控制文件读取

文件读取是上下文消耗的大头。一些技巧:

  • 指定具体文件而不是让 Claude 自己找
  • grep 搜索而不是读整个文件
  • 把大文件拆分成小文件,让 Claude 只读需要的部分

4. 精简 CLAUDE.md

每个 CLAUDE.md 控制在 200 行以内。用路径范围规则把只在特定文件类型下生效的指令拆出去,启动时不占空间。

5. 及时清理

  • 任务之间用 /compact 带指令压缩
  • 换任务用 /clear 清空
  • 走偏了用 /rewind 回退
  • 查小事用 /btw 不污染上下文

6. 禁用不需要的自动记忆

如果自动记忆里有不准确或过时的条目,用 /memory 检查并删除。不需要自动记忆可以关掉:

{
  "autoMemoryEnabled": false
}

或环境变量:

export CLAUDE_CODE_DISABLE_AUTO_MEMORY=1

扩展上下文窗口

如果需要更大的窗口而不是更小的对话,部分模型支持 1,000,000 token 的上下文窗口。选择 [1m] 模型变体即可启用。压缩在更大限制下工作方式相同。

Note

更大的上下文窗口不等于更好的性能。上下文衰退依然存在,只是阈值更高。管理上下文的策略在 200K 和 1M 窗口下同样重要。

管理命令速查

命令功能使用场景
/context查看 token 用量分析排查哪部分消耗过多
/compact [指令]压缩对话为摘要上下文 60~70% 时主动压缩
/clear清除对话历史切换新任务或上下文污染
/rewind回退到检查点Claude 走偏,需要重试
/btw 问题快速提问不进历史查小细节不污染上下文
/memory查看记忆文件检查加载了哪些指令
# 内容快速添加 CLAUDE.md 指令随时记录规范
claude -c继续最近会话重新打开终端接着干
claude --resume选择历史会话继续恢复之前的特定任务

常见问题

/compact 后关键信息丢了

压缩时传入具体指令:/compact 保留认证流程的架构决策和已确认的 API 格式。在压缩前把最重要的结论用 # 写入 CLAUDE.md。调试失败的尝试不值得保留,可以更激进地压缩或直接 /clear

Claude 没遵守 CLAUDE.md 规则

检查文件是否超过 200 行(遵守率下降)。把模糊表述改为具体指令。用 /memory 检查是否有冲突的自动记忆条目。用 .claude/rules/ 把规则按路径拆分,减少每次加载量。

关闭终端后怎么继续

claude -c 继续最近一次会话。claude --resume 从历史列表选择。用 /rename 给重要会话起描述性名称(如 oauth-migration),方便以后找到。

大任务会产生大量输出

用子代理委托执行,主对话只收到摘要,中间输出留在子代理独立上下文中。这是处理日志分析、大规模重构等任务的推荐方式。