Skip to content

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 命令可以随时查看当前上下文的详细用量分析:

bash
/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:

bash
/init

如果已有 CLAUDE.md,/init 会建议改进而不是直接覆盖。生成后,手动补充 Claude 无法自动发现的内容(如禁止修改的文件、特殊约束等)。

也可以在会话中用 # 快捷键快速向 CLAUDE.md 追加一条记忆:

bash
# 所有 API 错误响应必须使用 { code, message } 格式

按下 # 后输入内容回车,Claude 会将其写入对应层级的 CLAUDE.md,作为持久指令保存。

3、CLAUDE.md 内容要求

官方要求每个 CLAUDE.md 文件控制在 200 行以内。文件越大,消耗的启动 token 越多,Claude 的遵守率反而越低。以下是内容建议:

应该写入:

  • 构建、测试、部署的常用命令
  • 代码规范:命名约定、缩进、禁止使用的模式
  • 关键约束:"始终使用 pnpm"、"禁止修改 migrations/ 目录"
  • 项目架构说明:主要目录的用途

不应该写入:

  • 多步骤操作流程(应放到 Skills 文件中)
  • 只与代码库某一部分相关的规则(应使用 .claude/rules/ 按路径限定)
  • Claude 通过读取代码就能自己发现的信息

实例

bash
# 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:

bash
.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 和自动记忆:

bash
/memory

在编辑器中可以删除不准确的条目,或使用 Auto memory 开关禁用自动记忆功能。也可以通过环境变量临时禁用:

bash
CLAUDE_CODE_DISABLE_AUTO_MEMORY=1 claude

3、主动让 Claude 记住内容

对话中可以直接让 Claude 写入记忆:

bash
记住:我们的 API 测试需要本地运行一个 Redis 实例
bash
以后请记住:处理错误时,统一返回 { code, message } 结构

如果想升级为强制规范而非只是偏好记忆,可以说:"把这条规则写进 CLAUDE.md",Claude 会将其写入对应的 CLAUDE.md 文件。


上下文窗口优化命令

1、自动压缩(Auto-compaction)

Claude Code 在上下文接近限制时会自动触发压缩(约在 75% 用量左右),将对话历史总结为摘要后继续工作。但官方建议不要等待自动压缩,应主动在 60~70% 时手动触发,避免在关键任务中间被打断,且主动压缩可以通过指令控制保留哪些内容。

2、压缩上下文(/compact)

手动压缩对话历史,将长会话总结为精简摘要继续工作:

bash
/compact

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

bash
/compact Focus on the API changes
bash
/compact 保留认证流程的架构决策,丢弃调试过程中的无效尝试

压缩是有损操作。压缩时 Claude 处于上下文最满、性能最弱的状态,如果不给指令,它可能丢掉你认为重要的内容。在重大决策后立即主动压缩,并用指令说明保留重点,比等待自动压缩效果好得多。

3、清除上下文(/clear)

切换到全新任务时清除所有对话历史:

bash
/clear

清除后 CLAUDE.md 和自动记忆不受影响,仍会在新会话中加载。官方建议:如果在同一会话里对同一问题纠正了两次以上,不如直接 /clear,带着学到的约束重新开始一个更精准的提示词——干净的会话加上更好的提示,几乎总是好过在污染的上下文中继续纠正。

4、回退到检查点(/rewind)

Claude Code 在每次修改文件前会自动创建检查点。双击 Esc 或执行 /rewind 可打开回退菜单,选择要恢复的检查点:

bash
/rewind
bash
(或双击 Esc 键)

在回退菜单中,你可以选择以下操作:

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

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

5、快速提问不污染上下文(/btw)

如果需要快速查询一个小细节,但不想让这次问答进入对话历史(消耗上下文),使用 /btw

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

AI 思考中...

CLAUDE.md 使用指南

Claude Code 权限配置

基于 VitePress 构建,部署于 GitHub Pages