Skip to content

上下文管理

Claude Code 单会话最大 1M tokens(约 5-10k 行代码 + 完整文档)。但用法不当上下文很快"污染",质量下降。

一句话核心

Claude 的注意力是有限资源。 上下文越满,对每条内容的关注度越低。

Claude Code 的多层记忆

┌─ 永久记忆(不消耗 context)──┐
│  ~/.claude/CLAUDE.md         │  你的全局偏好
│  项目/CLAUDE.md              │  项目规范
│  .claude/settings.json       │  配置
└──────────────────────────────┘

┌─ 当前 context(每次会话)───┐
│  系统提示                    │  ~5k tokens(claude 自带)
│  CLAUDE.md(载入)           │  ~1-5k
│  工具定义                    │  ~10k
│  对话历史                    │  动态
│  当前用户消息                │  动态
└──────────────────────────────┘

┌─ Checkpoint(自动持久化)──┐
│  每次文件修改前快照          │  /rewind 恢复
│  跨会话保留                  │
└──────────────────────────────┘

┌─ 跨会话记忆(需工具)──────┐
│  claude-mem 等              │  压缩 + 注入下次
└──────────────────────────────┘

必须掌握的 5 个上下文命令

/context —— 上下文用量诊断(关键)

/context

输出详细拆分:

Context usage: 47,234 / 1,000,000 tokens (4.7%)

By category:
  System prompt:        4,521  ( 9.6%)
  CLAUDE.md:            2,103  ( 4.5%)
  Tool definitions:    10,234  (21.7%)
  Conversation:        28,431  (60.2%)
  Current files:        1,945  ( 4.1%)

⚠️ Suggestions:
- Conversation > 50% — consider /compact
- Tool definitions large — review enabled MCP servers

/usage 更精准看 context 占用

/compact —— 智能压缩历史

/compact

# 或带指令
/compact 重点保留架构决策和未完成的 TODO

把历史压缩成摘要,保留 cache 前缀(vs /clear 完全清空)。带指令可以告诉它"压缩时保留什么"。

/clear —— 完全清空

/clear

清空对话历史但保留:

  • CLAUDE.md
  • 文件编辑结果
  • 检查点

适用:切换不相关的新任务时。

/rewind —— 检查点回滚(双 Esc 同等效果)

/rewind

双击 Esc

Claude Code 在每次文件修改前自动建检查点,可以回到任意时间点:

Checkpoints (most recent first):
1. [2 min ago] Refactored auth.ts
2. [5 min ago] Added user.test.ts
3. [10 min ago] Initial state

Select to restore: _

跨会话保留 —— 关掉终端再开还能 rewind

# —— 快速追加 CLAUDE.md

输入 # 开头的消息:

# 在 src/legacy/ 下的代码不要重构,下个迭代删

Claude 自动判断该写入哪一层 CLAUDE.md

  • 跟项目相关 → 项目根 CLAUDE.md
  • 通用偏好 → ~/.claude/CLAUDE.md
  • 跟特定子目录相关 → 子目录 CLAUDE.md

最快建立项目知识库的方式。

上下文污染的 5 个信号

信号含义
Claude 给出前后矛盾的回答不同段落的指令冲突
Claude 忘了几条消息前的决策注意力被稀释
Claude 重复已经做过的事没意识到之前做过
Claude 回答变慢(同样问题)Context 太长,每次推理都重新看一遍
简单问题给出啰嗦回答受历史风格影响

任一信号出现 → 立刻 /compact/clear

高质量长会话的 5 个习惯

1. 任务切换必 /clear

你:"好,那个功能写完了。接下来帮我写测试..."

                      ❌ 错!应该 /clear 再开始

切换主题 = 必然 clear,否则历史污染新任务。

2. 每 30 分钟 /compact

长会话每隔半小时主动 compact 一次。预防性维护

3. 用 # 把发现写进 CLAUDE.md

# 已发现:auth.ts 的 sessionToken 字段实际叫 session_id(命名遗留)

下次会话自动加载,不用重新解释。

4. 善用 subagent 隔离脏活

我:"读一下整个 node_modules/some-lib/ 找出..."

                     ❌ 把整个 lib 读进 context

                     ✅ 改用 subagent 委派

详见 Subagents

5. 大文件别整读

❌ Read tests/large.json (30000 行)
✅ Grep "specific_pattern" tests/large.json
✅ 分批 Read,每次 500 行

Token 用量精细控制

关闭不用的 MCP server

每个 MCP server 加载 2-15k tokens 的工具定义。没用就关

json
// ~/.claude/mcp.json
{
  "mcpServers": {
    "github": { "command": "npx", "args": [...] },
    // "slack": { ... }  ← 注释掉不用的
  }
}

或临时禁用单个:

bash
claude --no-mcp github

Trim CLAUDE.md

/context 显示 CLAUDE.md > 5k tokens?删冗余:

bash
# 看实际 token 数
wc -w CLAUDE.md
# 一个 token ≈ 0.7 个英文词 / 0.5 个中文字

CLAUDE.md 减肥

文件读取按需

❌ Read 整个 src/                       → 几十万 token
✅ Glob "src/api/**/*.ts" → 拿路径列表 → 只 Read 相关

跨会话持久记忆:claude-mem

thedotmack/claude-mem — 自动捕获每次会话内容,AI 压缩后注入下次会话

安装

bash
npm install -g claude-mem
claude-mem init    # 在项目根目录跑

工作原理

会话 A 结束 → claude-mem 读所有改动 + 决策
            → AI 提炼成摘要(约 500 tokens)
            → 写入 .claude-mem/memory.json

会话 B 启动 → 自动加载摘要进 context
            → Claude "记得" A 会话发生了什么

跨工具兼容

支持 Claude Code / OpenClaw / Codex / Gemini / Hermes / Copilot / OpenCode 等多家。用一个 mem 通吃

上下文成本与命中率

长 context 未必等于贵,关键看是不是从 cache 命中:

场景100k token 上下文
全新 input$1.50(按 input 价)
全从 cache 读$0.15(cache 价是 input 的 1/10)

所以长上下文 + 高命中率 = 划算。详见 提示缓存优化

实战:处理 200k+ 大项目

bash
1. 进项目 claude
2. # 这是一个 Next.js + Prisma 项目,主要看 src/app 和 prisma/
3. /clear(确保干净)
4. "用 Glob 找出 src/app 的目录结构"
5. "读 prisma/schema.prisma 给我数据模型"
6. "现在开始:实现订单导出 CSV"
7. 实现中 /compact 一次
8. 测试通过 # 订单导出完成,注意 src/api/billing/export.ts 用了流式
9. /clear 下个任务

先建立项目地图(少量 token)→ 再做具体任务(用 Glob/Grep 精准定位)→ 完成后 # 记录 → /clear

检查点的妙用

试错性重构

你:"重构 auth 模块"
Claude:(改了 5 个文件)
你:跑测试发现 3 个挂了
你:/rewind  ← 回到改之前
你:"重来,这次不要动 oauth.ts"

比手动 git reset 快。

探索式编程

你:"试一下用 Redux 替代 Zustand"
Claude:(改了一堆)
你:体验不行
你:/rewind  ← 回滚
你:"换 Jotai 试试"

低成本实验。

推荐阅读

内容采用 CC BY-NC-ND 4.0 协议 · 禁止商业使用 / 禁止改编 / 禁止训练 AI 模型