上下文管理
Context Management
上下文管理是高效使用 Claude Code 的关键技能。理解上下文窗口的工作原理、掌握压缩和恢复策略,能够显著提升开发体验和输出质量。
上下文窗口概念
Understanding the Context Window
Claude Code 使用的模型拥有 200K tokens 的上下文窗口。上下文窗口包含了当前对话中所有的输入和输出。
什么占用上下文空间
| 内容类型 | 大致占比 | 说明 |
|---|---|---|
| 系统提示词 | 5-10% | CLAUDE.md、权限规则等 |
| 对话历史 | 40-60% | 所有的问答往返 |
| 文件内容 | 20-40% | 读取的源代码文件 |
| 工具调用结果 | 10-20% | 命令执行结果、搜索结果等 |
上下文使用量估算
# 查看当前上下文使用情况
> /context
上下文使用: 124,500 / 200,000 tokens (62.3%)
# 查看详细的费用和 token 信息
> /cost
本次会话:
输入 tokens: 89,200
输出 tokens: 35,300
总费用: $0.87Token 计数规则
一般的经验法则:
- 1 个英文单词约 1-1.5 tokens
- 1 个中文字约 2-3 tokens
- 1 行代码约 10-20 tokens
- 一个 500 行的源代码文件约 5,000-10,000 tokens
示例:一个典型的 React 组件文件(200 行)
├── 代码本身: ~3,000 tokens
├── 文件路径元信息: ~50 tokens
└── 工具调用包装: ~100 tokens
总计: ~3,150 tokens(约占上下文的 1.6%)自动压缩机制
Automatic Compaction
当对话上下文接近窗口限制时,Claude Code 会自动触发压缩。
自动压缩的触发条件
Claude Code 在上下文使用量达到一定阈值时自动进行压缩。压缩过程会:
- 保留关键的对话摘要
- 保留最近的对话轮次
- 保留重要的代码修改记录
- 丢弃冗余的中间过程
手动触发压缩
使用 /compact 命令可以随时手动触发压缩:
# 基础压缩
> /compact
正在压缩对话上下文...
压缩前: 156,000 tokens
压缩后: 42,000 tokens
释放: 114,000 tokens (73%)自定义压缩提示词
/compact 命令支持自定义指令,让你控制压缩时保留哪些信息:
# 保留所有代码修改
> /compact 保留所有的文件修改记录和代码变更细节
# 保留架构决策
> /compact 保留架构设计决策和技术选型讨论,丢弃调试过程
# 保留特定文件的上下文
> /compact 保留与 auth.ts 和 database.ts 相关的所有讨论
# 只保留结论
> /compact 只保留最终结论和待办事项,丢弃所有中间讨论过程压缩策略建议
| 场景 | 推荐策略 | 命令示例 |
|---|---|---|
| 长时间调试 | 保留错误原因和解决方案 | /compact 保留 bug 原因和修复方案 |
| 架构讨论 | 保留决策和理由 | /compact 保留架构决策 |
| 代码重构 | 保留修改清单 | /compact 保留已修改的文件列表 |
| 多文件编辑 | 保留未完成的任务 | /compact 保留还未完成的修改任务 |
清除上下文
Clearing Context
/clear 命令完全清除当前对话的所有上下文,相当于开始一个全新的对话。
> /clear
上下文已完全清除。
# 注意:/clear 之后,Claude 不记得之前讨论的任何内容
> 继续刚才的工作
# Claude 无法继续,因为上下文已被清除/clear vs /compact 的区别
| 特性 | /clear | /compact |
|---|---|---|
| 保留对话摘要 | 否 | 是 |
| 保留 CLAUDE.md | 是(重新加载) | 是 |
| 释放空间 | 100% | 50-80% |
| 适用场景 | 切换到全新任务 | 继续当前任务但需要空间 |
| 对后续对话的影响 | 无记忆 | 保留关键上下文 |
会话恢复
Session Recovery
Claude Code 提供了强大的会话恢复功能,让你可以继续之前的对话。
继续最近对话
# 使用 -c 标志继续最近一次对话
claude -c
# 输出示例:
恢复会话: 2024-01-15 14:30:22
上一条消息: "已完成用户认证模块的重构"从历史恢复
# 使用 -r 标志浏览历史对话
claude -r
# 显示最近的对话列表:
最近对话:
1. [2024-01-15 14:30] 用户认证模块重构
2. [2024-01-15 10:15] 数据库迁移脚本
3. [2024-01-14 16:45] API 端点测试
4. [2024-01-14 09:00] 项目初始化
选择要恢复的对话 (1-4):会话 ID 恢复
# 通过特定的会话 ID 恢复
claude --session-id a1b2c3d4
# 在脚本中保存和恢复会话
SESSION=$(claude --print-session-id -c "开始新任务")
# ... 稍后 ...
claude --session-id $SESSION -c "继续之前的任务"会话恢复的注意事项
- 恢复的会话包含完整的对话历史
- 如果历史超出上下文窗口,会自动压缩
- CLAUDE.md 的变更会在恢复时重新加载
- 文件系统的变更不会自动同步到上下文中
Rewind 版本回滚
Version Rollback with Rewind
Rewind 功能允许你将对话回退到之前的某个状态,撤销 Claude 的部分操作。
使用 Rewind
当 Claude 执行了不理想的操作时,你可以通过以下方式回滚:
# 在终端中,Claude 完成操作后
# 使用 Escape 键触发 Rewind 选项
[Esc]
# 或者直接描述要回退的意图
> 回退到修改 auth.ts 之前的状态Rewind 的工作原理
对话时间线:
T1: 分析代码 ─────────┐
T2: 修改 auth.ts ──────┤
T3: 修改 config.ts ────┤ ← Rewind 到这里
T4: 运行测试(失败)───┤ ← 这些会被撤销
T5: 尝试修复 ──────────┘ ← 这些会被撤销
Rewind 到 T3 后:
- 对话回退到 T3 的状态
- 文件变更也会被还原
- 你可以给出新的指令继续Rewind 与 Git 的关系
Rewind 不仅回退对话状态,还会还原文件变更。这与 git checkout 类似,但它是基于 Claude Code 的操作记录而非 Git 提交。
# Rewind 还原了 Claude 对文件的修改
# 但不会影响你自己手动做的修改
# 也不会影响 Git 的提交历史@-mention 引用文件
File References with @-mentions
在 VS Code 扩展中,你可以使用 @ 符号引用文件,将其内容添加到上下文中。
基本用法
# 引用单个文件
> 请检查 @src/auth.ts 中的安全问题
# 引用多个文件
> 对比 @src/old-api.ts 和 @src/new-api.ts 的差异
# 引用目录
> 分析 @src/components/ 下所有组件的结构支持的引用方式
| 引用方式 | 语法 | 说明 |
|---|---|---|
| 文件引用 | @filename | 引用特定文件 |
| 路径引用 | @path/to/file | 使用相对路径引用 |
| 目录引用 | @directory/ | 引用整个目录 |
| Tab 补全 | @ + Tab | 自动补全文件名 |
在终端中添加文件
在终端版本的 Claude Code 中,你可以通过其他方式添加文件到上下文:
# 使用 /add-dir 添加目录
> /add-dir ./src
# 直接告诉 Claude 读取文件
> 请读取 src/auth.ts 文件
# Claude 会使用 Read 工具自动读取文件手动管理上下文
Manual Context Management
除了自动机制外,你还可以手动管理上下文以获得最佳效果。
主动提供信息
# 在对话开始时提供必要的背景
> 我正在开发一个 Express.js + TypeScript 项目。
数据库使用 PostgreSQL,ORM 是 Prisma。
请帮我实现用户注册功能。
# 比以下方式更高效(Claude 需要花费 token 去探索):
> 请帮我实现用户注册功能。控制文件读取范围
# 好的做法:明确指定需要的文件
> 请只查看 src/auth/ 目录下的文件,分析认证流程
# 避免:让 Claude 搜索整个项目
> 项目里有没有认证相关的代码?
# 这会导致 Claude 进行大量文件搜索,消耗上下文分段处理大任务
# 将大任务拆分为多个独立的小会话
# 会话 1: 分析和规划
claude
> 分析 src/auth/ 模块的代码结构,给出重构建议
> /exit
# 会话 2: 执行重构
claude
> 根据以下计划重构 src/auth/:
1. 提取通用验证逻辑
2. 统一错误处理
3. 添加类型定义上下文管理最佳实践
Best Practices for Context Management
黄金法则
- 定期压缩 - 每完成一个子任务后使用
/compact - 及时清除 - 切换到不相关的任务时使用
/clear - 提供背景 - 在对话开始时提供必要的项目信息
- 控制范围 - 明确指定 Claude 需要查看的文件范围
- 利用 CLAUDE.md - 将持久化信息放入 CLAUDE.md
不同场景的策略
短对话(单个问题)
claude
> 解释 src/utils/debounce.ts 中 debounce 函数的工作原理
> /exit无需管理上下文,直接提问即可。
中等对话(一个功能的实现)
claude
> 实现用户密码重置功能
# ... 多轮对话 ...
> /compact 保留已完成的步骤和待办事项
# ... 继续工作 ...
> /exit在对话中间适时压缩。
长对话(大规模重构)
# 阶段 1: 分析
claude
> /plan
> 分析整个认证模块并制定重构计划
> /compact 只保留重构计划和文件清单
> /exit
# 阶段 2: 逐步执行
claude -c
> 按计划执行步骤 1: 提取公共接口
> /compact 保留已完成的步骤
> 执行步骤 2: 迁移旧实现
# ...拆分为多个阶段,每个阶段间压缩或重新开始。
上下文效率对比
| 做法 | Token 消耗 | 效果 |
|---|---|---|
| 一次性提供全部文件 | 高 | 低效,大量无关信息 |
| 让 Claude 按需读取 | 中 | 较好,但有搜索开销 |
| 精确指定所需文件 | 低 | 最高效 |
| 使用 CLAUDE.md 提供背景 | 极低 | 高效且持久化 |
常见问题
FAQ
Q: 上下文满了会怎样?
当上下文接近 200K tokens 限制时,Claude Code 会自动压缩。如果自动压缩后仍不够,你可能需要手动使用 /compact 或 /clear。
Q: 压缩后 Claude 会忘记什么?
压缩保留对话摘要和关键信息,但具体的代码片段、中间调试过程等细节可能被丢弃。如果有必须保留的信息,在 /compact 指令中明确说明。
Q: 如何判断是否需要压缩?
当你感觉 Claude 的回答开始"跑偏"或重复之前的讨论时,通常意味着上下文质量下降,是时候压缩了。使用 /context 可以看到具体的使用率。
Q: /clear 后还能恢复之前的对话吗?
使用 /clear 后,当前会话的上下文无法恢复。但你可以使用 claude -r 来浏览历史会话记录。
Q: 多个文件的内容会重复加载吗?
Claude Code 会缓存已读取的文件内容。在同一会话中多次引用同一文件不会重复消耗上下文空间,除非文件内容在此期间被修改。
小结
Summary
高效的上下文管理是使用 Claude Code 的核心技能。记住这些要点:
- 了解限制 - 200K tokens 的上下文窗口是有限的资源
- 主动管理 - 不要等到上下文满才处理
- 善用工具 -
/compact、/clear、/context是你的得力助手 - 持久化记忆 - 将重要信息存入 CLAUDE.md
- 分阶段工作 - 大任务拆分为多个小会话