现在位置: 首页 > Claude Code 教程 > 正文

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.md
Linux/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 通过读取代码就能自己发现的信息

实例

# CLAUDE.md 示例(精简具体,每个文件控制在 200 行以内)

## 常用命令
- 包管理:始终使用 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)委托执行:主对话只收到摘要,中间输出留在子代理独立上下文中
  • 例如:使用子代理分析所有日志文件,找出性能瓶颈,只把结论告诉我