Skip to content

上下文管理

Context Management

上下文管理是高效使用 Claude Code 的关键技能。理解上下文窗口的工作原理、掌握压缩和恢复策略,能够显著提升开发体验和输出质量。


上下文窗口概念

Understanding the Context Window

Claude Code 使用的模型拥有 200K tokens 的上下文窗口。上下文窗口包含了当前对话中所有的输入和输出。

什么占用上下文空间

内容类型大致占比说明
系统提示词5-10%CLAUDE.md、权限规则等
对话历史40-60%所有的问答往返
文件内容20-40%读取的源代码文件
工具调用结果10-20%命令执行结果、搜索结果等

上下文使用量估算

bash
# 查看当前上下文使用情况
> /context
上下文使用: 124,500 / 200,000 tokens (62.3%)

# 查看详细的费用和 token 信息
> /cost
本次会话:
  输入 tokens: 89,200
  输出 tokens: 35,300
  总费用: $0.87

Token 计数规则

一般的经验法则:

  • 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 在上下文使用量达到一定阈值时自动进行压缩。压缩过程会:

  1. 保留关键的对话摘要
  2. 保留最近的对话轮次
  3. 保留重要的代码修改记录
  4. 丢弃冗余的中间过程

手动触发压缩

使用 /compact 命令可以随时手动触发压缩:

bash
# 基础压缩
> /compact
正在压缩对话上下文...
压缩前: 156,000 tokens
压缩后: 42,000 tokens
释放: 114,000 tokens (73%)

自定义压缩提示词

/compact 命令支持自定义指令,让你控制压缩时保留哪些信息:

bash
# 保留所有代码修改
> /compact 保留所有的文件修改记录和代码变更细节

# 保留架构决策
> /compact 保留架构设计决策和技术选型讨论,丢弃调试过程

# 保留特定文件的上下文
> /compact 保留与 auth.ts 和 database.ts 相关的所有讨论

# 只保留结论
> /compact 只保留最终结论和待办事项,丢弃所有中间讨论过程

压缩策略建议

场景推荐策略命令示例
长时间调试保留错误原因和解决方案/compact 保留 bug 原因和修复方案
架构讨论保留决策和理由/compact 保留架构决策
代码重构保留修改清单/compact 保留已修改的文件列表
多文件编辑保留未完成的任务/compact 保留还未完成的修改任务

清除上下文

Clearing Context

/clear 命令完全清除当前对话的所有上下文,相当于开始一个全新的对话。

bash
> /clear
上下文已完全清除。

# 注意:/clear 之后,Claude 不记得之前讨论的任何内容
> 继续刚才的工作
# Claude 无法继续,因为上下文已被清除

/clear vs /compact 的区别

特性/clear/compact
保留对话摘要
保留 CLAUDE.md是(重新加载)
释放空间100%50-80%
适用场景切换到全新任务继续当前任务但需要空间
对后续对话的影响无记忆保留关键上下文

会话恢复

Session Recovery

Claude Code 提供了强大的会话恢复功能,让你可以继续之前的对话。

继续最近对话

bash
# 使用 -c 标志继续最近一次对话
claude -c

# 输出示例:
恢复会话: 2024-01-15 14:30:22
上一条消息: "已完成用户认证模块的重构"

从历史恢复

bash
# 使用 -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 恢复

bash
# 通过特定的会话 ID 恢复
claude --session-id a1b2c3d4

# 在脚本中保存和恢复会话
SESSION=$(claude --print-session-id -c "开始新任务")
# ... 稍后 ...
claude --session-id $SESSION -c "继续之前的任务"

会话恢复的注意事项

  1. 恢复的会话包含完整的对话历史
  2. 如果历史超出上下文窗口,会自动压缩
  3. CLAUDE.md 的变更会在恢复时重新加载
  4. 文件系统的变更不会自动同步到上下文中

Rewind 版本回滚

Version Rollback with Rewind

Rewind 功能允许你将对话回退到之前的某个状态,撤销 Claude 的部分操作。

使用 Rewind

当 Claude 执行了不理想的操作时,你可以通过以下方式回滚:

bash
# 在终端中,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 提交。

bash
# Rewind 还原了 Claude 对文件的修改
# 但不会影响你自己手动做的修改
# 也不会影响 Git 的提交历史

@-mention 引用文件

File References with @-mentions

在 VS Code 扩展中,你可以使用 @ 符号引用文件,将其内容添加到上下文中。

基本用法

bash
# 引用单个文件
> 请检查 @src/auth.ts 中的安全问题

# 引用多个文件
> 对比 @src/old-api.ts 和 @src/new-api.ts 的差异

# 引用目录
> 分析 @src/components/ 下所有组件的结构

支持的引用方式

引用方式语法说明
文件引用@filename引用特定文件
路径引用@path/to/file使用相对路径引用
目录引用@directory/引用整个目录
Tab 补全@ + Tab自动补全文件名

在终端中添加文件

在终端版本的 Claude Code 中,你可以通过其他方式添加文件到上下文:

bash
# 使用 /add-dir 添加目录
> /add-dir ./src

# 直接告诉 Claude 读取文件
> 请读取 src/auth.ts 文件

# Claude 会使用 Read 工具自动读取文件

手动管理上下文

Manual Context Management

除了自动机制外,你还可以手动管理上下文以获得最佳效果。

主动提供信息

bash
# 在对话开始时提供必要的背景
> 我正在开发一个 Express.js + TypeScript 项目。
  数据库使用 PostgreSQL,ORM Prisma。
  请帮我实现用户注册功能。

# 比以下方式更高效(Claude 需要花费 token 去探索):
> 请帮我实现用户注册功能。

控制文件读取范围

bash
# 好的做法:明确指定需要的文件
> 请只查看 src/auth/ 目录下的文件,分析认证流程

# 避免:让 Claude 搜索整个项目
> 项目里有没有认证相关的代码?
# 这会导致 Claude 进行大量文件搜索,消耗上下文

分段处理大任务

bash
# 将大任务拆分为多个独立的小会话

# 会话 1: 分析和规划
claude
> 分析 src/auth/ 模块的代码结构,给出重构建议
> /exit

# 会话 2: 执行重构
claude
> 根据以下计划重构 src/auth/:
  1. 提取通用验证逻辑
  2. 统一错误处理
  3. 添加类型定义

上下文管理最佳实践

Best Practices for Context Management

黄金法则

  1. 定期压缩 - 每完成一个子任务后使用 /compact
  2. 及时清除 - 切换到不相关的任务时使用 /clear
  3. 提供背景 - 在对话开始时提供必要的项目信息
  4. 控制范围 - 明确指定 Claude 需要查看的文件范围
  5. 利用 CLAUDE.md - 将持久化信息放入 CLAUDE.md

不同场景的策略

短对话(单个问题)

bash
claude
> 解释 src/utils/debounce.ts 中 debounce 函数的工作原理
> /exit

无需管理上下文,直接提问即可。

中等对话(一个功能的实现)

bash
claude
> 实现用户密码重置功能
# ... 多轮对话 ...
> /compact 保留已完成的步骤和待办事项
# ... 继续工作 ...
> /exit

在对话中间适时压缩。

长对话(大规模重构)

bash
# 阶段 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
  • 分阶段工作 - 大任务拆分为多个小会话