Claude Code 上下文管理
上下文管理是高效使用 Claude Code 的核心技能。
官方文档明确指出:上下文窗口是 Claude Code 最重要的资源,随着上下文填满,模型性能会逐渐下降(称为上下文衰退,context rot)——这是使用 Claude Code 时需要主动对抗的核心问题。
本章深入讲解如何通过 CLAUDE.md 指令文件、自动记忆系统、上下文窗口优化命令等手段,让 Claude 在长会话和跨会话中保持高效状态。
上下文窗口基础
1、上下文窗口包含什么
Claude Code 的上下文窗口大小为 1,000,000 tokens(100 万 token)。它容纳了 Claude 在当前会话中"看到"的一切内容:
| 内容来源 | 加载时机 | Token 占用 |
|---|---|---|
| 系统提示词(Claude Code 行为规范) | 每次会话启动 | 固定占用 |
| CLAUDE.md 文件 | 启动时完整加载 | 取决于文件大小 |
| 自动记忆(Auto memory) | 启动时加载(前 200 行或 25KB) | 有上限 |
| 对话历史 | 累积增长 | 随会话持续增加 |
| 工具结果(文件读取、命令输出等) | 每次工具调用后追加 | 日志/大文件消耗极快 |
| MCP 工具名称、Skills 描述等 | 启动时加载 | 中等 |
2、上下文衰退(Context rot)
官方明确指出:随着上下文填满,LLM 性能会下降,因为注意力被分散到更多 token 上,旧的、不相关的内容开始干扰当前任务。具体症状包括:
- Claude 开始前后矛盾,忘记之前达成的决策
- 响应变得模糊、笼统,细节减少
- 对同一问题反复询问已经回答过的内容
- 在同一个会话里对同一个问题纠正了两次以上
出现以上症状说明上下文已经"污染",此时应主动使用 /compact 或 /clear 处理,而不是继续在同一会话中纠正。
使用 /context 命令可以随时查看当前上下文的详细用量分析:
/context
它会按分类(系统提示、CLAUDE.md、记忆文件、会话历史等)列出 token 占用,并给出优化建议。建议在开始重要任务前先检查一次。
CLAUDE.md 指令文件
CLAUDE.md 是 Claude Code 中记录静态指令和项目规范的核心文件。每次会话启动时,Claude 会自动将其加载到上下文窗口中。
1、存放位置与作用范围
CLAUDE.md 支持多个位置,更具体的位置优先级更高:
| 范围 | 文件路径 | 适用场景 | 是否提交 git |
|---|---|---|---|
| 组织级 | macOS: /Library/Application Support/ClaudeCode/CLAUDE.mdLinux/WSL: /etc/claude-code/CLAUDE.md |
公司编码标准、合规要求 | 由 IT 统一管理 |
| 项目级 | ./CLAUDE.md 或 ./.claude/CLAUDE.md |
项目架构、编码规范、工作流 | 是,与团队共享 |
| 用户级 | ~/.claude/CLAUDE.md |
个人编码偏好,适用所有项目 | 否,个人私有 |
| 本地私有 | ./CLAUDE.local.md(加入 .gitignore) |
个人的项目特定配置,不提交 git | 否,加入 .gitignore |
CLAUDE.local.md是个人私有配置的官方推荐方式:沙箱 URL、本地测试账号、个人调试习惯等不应共享的内容,应放在这里而不是CLAUDE.md中。运行/init时选择"个人"选项,它会自动将该文件加入.gitignore。
2、创建 CLAUDE.md
执行以下命令,Claude 会自动分析项目并生成初始 CLAUDE.md:
/init
如果已有 CLAUDE.md,/init 会建议改进而不是直接覆盖。生成后,手动补充 Claude 无法自动发现的内容(如禁止修改的文件、特殊约束等)。
也可以在会话中用 # 快捷键快速向 CLAUDE.md 追加一条记忆:
# 所有 API 错误响应必须使用 { code, message } 格式
按下 # 后输入内容回车,Claude 会将其写入对应层级的 CLAUDE.md,作为持久指令保存。
3、CLAUDE.md 内容要求
官方要求每个 CLAUDE.md 文件控制在 200 行以内。文件越大,消耗的启动 token 越多,Claude 的遵守率反而越低。以下是内容建议:
应该写入:
- 构建、测试、部署的常用命令
- 代码规范:命名约定、缩进、禁止使用的模式
- 关键约束:"始终使用 pnpm"、"禁止修改 migrations/ 目录"
- 项目架构说明:主要目录的用途
不应该写入:
- 多步骤操作流程(应放到 Skills 文件中)
- 只与代码库某一部分相关的规则(应使用
.claude/rules/按路径限定) - Claude 通过读取代码就能自己发现的信息
实例
## 常用命令
- 包管理:始终使用 pnpm,不要使用 npm 或 yarn
- 运行测试:pnpm test:watch
- 构建:pnpm build
## 代码规范
- TypeScript strict 模式,不允许 any
- 组件文件使用 PascalCase 命名(如 UserProfile.tsx)
- 数据库时间戳统一使用 UTC 格式
## 约束事项
- 禁止直接修改 prisma/migrations/ 目录下的已有文件
- .env.local 包含真实密钥,禁止读取或输出文件内容
- API 接口统一在 src/api/ 目录下管理,不在其他地方直接发请求
4、按路径限定规则(.claude/rules/)
对于较大的项目,可以用 .claude/rules/ 目录将指令拆分为按文件路径生效的细粒度规则,避免所有规则都堆在根 CLAUDE.md 中消耗启动 token:
.claude/
└── rules/
├── api.md # 只对 src/api/**/*.ts 文件生效
├── frontend.md # 只对 src/components/**/*.tsx 文件生效
└── testing.md # 只对 *.test.ts 文件生效
路径限定规则只在 Claude 读取对应目录下的文件时才会加载,不在启动时全量占用上下文。
自动记忆(Auto memory)
自动记忆是 Claude Code v2.1.59 及以上版本内置的跨会话记忆系统,默认开启,无需任何配置。它让 Claude 在工作过程中自主记录发现的构建命令、调试经验、代码风格偏好等信息。
1、工作机制
- Claude 不会每次会话都写记忆,它会判断信息是否值得保留(在未来对话中是否有用)
- 记忆按 git 仓库路径隔离,存储于
~/.claude/projects/<项目路径>/memory/ - 同一仓库的所有工作树共享一份自动记忆
- 写入记忆时,终端会显示 "Writing memory";下次检索时显示 "Recalled memory"
2、查看与编辑记忆(/memory)
使用 /memory 命令查看和编辑所有记忆内容,包括各级 CLAUDE.md 和自动记忆:
/memory
在编辑器中可以删除不准确的条目,或使用 Auto memory 开关禁用自动记忆功能。也可以通过环境变量临时禁用:
CLAUDE_CODE_DISABLE_AUTO_MEMORY=1 claude
3、主动让 Claude 记住内容
对话中可以直接让 Claude 写入记忆:
记住:我们的 API 测试需要本地运行一个 Redis 实例
以后请记住:处理错误时,统一返回 { code, message } 结构
如果想升级为强制规范而非只是偏好记忆,可以说:"把这条规则写进 CLAUDE.md",Claude 会将其写入对应的 CLAUDE.md 文件。
上下文窗口优化命令
1、自动压缩(Auto-compaction)
Claude Code 在上下文接近限制时会自动触发压缩(约在 75% 用量左右),将对话历史总结为摘要后继续工作。但官方建议不要等待自动压缩,应主动在 60~70% 时手动触发,避免在关键任务中间被打断,且主动压缩可以通过指令控制保留哪些内容。
2、压缩上下文(/compact)
手动压缩对话历史,将长会话总结为精简摘要继续工作:
/compact
/compact 支持传入自定义指令,控制压缩时重点保留哪些内容:
/compact Focus on the API changes
/compact 保留认证流程的架构决策,丢弃调试过程中的无效尝试
压缩是有损操作。压缩时 Claude 处于上下文最满、性能最弱的状态,如果不给指令,它可能丢掉你认为重要的内容。在重大决策后立即主动压缩,并用指令说明保留重点,比等待自动压缩效果好得多。
3、清除上下文(/clear)
切换到全新任务时清除所有对话历史:
/clear
清除后 CLAUDE.md 和自动记忆不受影响,仍会在新会话中加载。官方建议:如果在同一会话里对同一问题纠正了两次以上,不如直接 /clear,带着学到的约束重新开始一个更精准的提示词——干净的会话加上更好的提示,几乎总是好过在污染的上下文中继续纠正。
4、回退到检查点(/rewind)
Claude Code 在每次修改文件前会自动创建检查点。双击 Esc 或执行 /rewind 可打开回退菜单,选择要恢复的检查点:
/rewind
(或双击 Esc 键)
在回退菜单中,你可以选择以下操作:
| 操作 | 效果 | 适用场景 |
|---|---|---|
| 恢复对话 + 代码 | 回退对话历史和文件改动,完全还原 | Claude 走偏了,改动有问题,全部撤销 |
| 仅恢复对话 | 回退对话历史,保留文件改动 | 想重试不同思路,但代码改动可以保留 |
| 仅恢复代码 | 还原文件到检查点状态,保留对话 | 代码改坏了,但对话中的分析有参考价值 |
| 从此处摘要(Summarize from here) | 将该检查点之后的对话压缩为摘要,保留之前的完整历史 | 只想清理后半段冗余对话,保留前期的完整上下文 |
检查点跨会话持久保存——关闭终端后仍然可以回退到之前的检查点。这不是 git 的替代品,但在探索性实验中比手动 git stash 更方便。
5、快速提问不污染上下文(/btw)
如果需要快速查询一个小细节,但不想让这次问答进入对话历史(消耗上下文),使用 /btw:
/btw 这个项目的 TypeScript 版本是多少?
答案会以浮层方式展示,问题和答案都不会进入对话历史,适合查阅配置、版本号等不需要保留的一次性信息。
会话管理命令
| 命令 | 功能 | 使用场景 |
|---|---|---|
/context |
查看上下文各部分的详细 token 用量分析 | 排查哪部分消耗了过多 token |
/compact [指令] |
压缩对话历史为摘要,可指定保留重点 | 上下文 60~70% 时主动压缩 |
/clear |
清除所有对话历史,保留 CLAUDE.md 和记忆 | 切换到新任务,或上下文已严重污染 |
/rewind(或双击 Esc) |
打开检查点菜单,可选择恢复对话/代码/两者,或从某处摘要 | Claude 走偏了,需要回退后重试 |
/memory |
查看和编辑 CLAUDE.md 及自动记忆内容 | 检查记忆是否准确,删除过时条目 |
/btw |
快速提问,答案不进入对话历史 | 查阅小细节,不想污染上下文 |
/init |
分析项目并生成或改进 CLAUDE.md | 首次在新项目使用,或项目有重大变更 |
#(快捷键) |
快速向 CLAUDE.md 添加一条持久指令 | 随时记录规范或约定 |
claude --continue |
继续最近一次会话 | 重新打开终端后接着工作 |
claude --resume |
从历史列表中选择一次会话继续 | 恢复几天前的某个特定任务 |
常见问题与解决方案
问题一:Claude 没有遵守 CLAUDE.md 中的规则
- 检查 CLAUDE.md 是否过大(超过 200 行时遵守率下降)
- 将模糊表述改为具体指令:不要"写整洁的代码",要"使用 2 个空格缩进"
- 用
/memory检查是否有冲突的自动记忆条目 - 考虑用
.claude/rules/将规则按文件路径拆分,减少每次加载量
问题二:Claude 开始前后矛盾,"忘记"之前的决策
- 这是上下文衰退的典型症状,不要继续在同一会话纠正
- 运行
/compact 保留关键决策,或直接/clear后带着总结重新开始 - 重要结论用
#快捷键写入 CLAUDE.md,确保下次会话仍然有效
问题三:/compact 后关键信息丢失
- 压缩时传入具体指令:
/compact 保留认证流程的架构决策和已确认的 API 格式 - 在压缩前将最重要的结论写入 CLAUDE.md
- 调试失败的尝试不值得保留,可以更激进地压缩或 /clear
问题四:关闭终端后如何继续上次工作
- 使用
claude --continue继续最近一次会话 - 使用
claude --resume从历史列表选择特定会话 - 用
/rename给重要会话起一个描述性名称(如 "oauth-migration"),方便以后找到
问题五:某个大任务会产生大量工具输出,怎么避免上下文爆满
- 使用子代理(subagent)委托执行:主对话只收到摘要,中间输出留在子代理独立上下文中
- 例如:
使用子代理分析所有日志文件,找出性能瓶颈,只把结论告诉我
