上下文窗口管理
本教程共 34 篇 · 第 12 篇 · 更新于 2026-07-26 · 约 10 分钟阅读
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),方便以后找到。
大任务会产生大量输出
用子代理委托执行,主对话只收到摘要,中间输出留在子代理独立上下文中。这是处理日志分析、大规模重构等任务的推荐方式。