# Lesson 2: 上下文窗口：你最重要的资源

## 本课目标

- 理解上下文窗口的本质以及它为什么是最关键的约束
- 掌握上下文如何填满、性能如何退化
- 熟练使用 `/clear`、`/compact`、`/cost` 等核心管理命令
- 了解 Token 优化配置
- 避免五个最常见的上下文陷阱

## 核心内容

### 1. 什么是上下文窗口

上下文窗口是 Claude 的"工作记忆"——大约 **200K tokens**（约 15 万个中文字符）。听起来很多，但它装的不只是你说的话：

```
┌─────────────────────────────────────────────┐
│              上下文窗口（~200K tokens）         │
├─────────────────────────────────────────────┤
│                                              │
│  你说的每一句话                                │
│  Claude 读的每一个文件的内容                    │
│  Claude 运行的每一条命令的输出                   │
│  Claude 自己的每一次回复（包括思考过程）          │
│  系统提示词、规则、加载的技能                    │
│                                              │
│  ⚠️ 一次代码探索就可能消耗数万 tokens           │
│                                              │
└─────────────────────────────────────────────┘
```

为什么这很重要？因为：

> **上下文窗口会很快填满，随着填充，性能会下降。** ——Claude Code 官方最佳实践

当窗口接近满的时候：
- Claude 开始"忘记"你早期说的指令
- 错误率明显上升
- 回复质量显著下降
- 你不得不反复重复已经说过的要求

**这不是一个技术细节——这是影响你所有工作方式的根本约束。**

### 2. 上下文如何填满

你可能以为"200K tokens 很够用了"。看看实际消耗：

| 操作 | 大约消耗 | 说明 |
|------|---------|------|
| 你问一个简短问题 | 50-200 tokens | 很少 |
| Claude 读一个中等大小的文件 | 1,000-5,000 tokens | 一个文件就可能消耗不少 |
| Claude 运行一个命令，输出 50 行 | 500-2,000 tokens | 错误日志可能更多 |
| Claude 给你一个详细回答 | 1,000-3,000 tokens | 包含代码示例的更多 |
| 一次调试循环（读文件+运行+分析+修复） | 5,000-20,000 tokens | 很容易就消耗大量上下文 |
| 探索一个大型目录（如 cc4pm 的 94 个 skills） | 30,000-80,000 tokens | 可能一次就占用 40% |

**上下文使用量分区**：

```
 0%──────25%──────50%──────70%──────90%──────100%
 │       │        │        │        │         │
 │  自由区  │  正常区  │  注意区  │  压缩区  │ 清理区 │
 │       │        │        │        │         │
 │ 随便用  │ 正常工作 │ 注意效率 │ 该/compact│ 必须/clear│
```

### 3. 核心管理命令

掌握这些命令，就掌握了上下文管理的主动权。

#### `/clear` —— 最重要的习惯

```bash
/clear
```

彻底重置上下文，清空一切从头开始。

**什么时候用**：在**不相关的任务之间**。这是最重要的一个习惯。

```
❌ 错误做法：
  任务1：研究竞品 → 任务2：写 PRD → 任务3：代码审查
  （一个会话里混杂三个不相关任务，上下文被无关信息占满）

✅ 正确做法：
  任务1：研究竞品 → /clear
  任务2：写 PRD → /clear
  任务3：代码审查
  （每个任务都有干净的上下文）
```

#### `/compact` —— 智能压缩

```bash
/compact                    # 自动压缩，保留关键信息
/compact 关注 API 变更       # 带指示的压缩，告诉 Claude 保留什么
```

不同于 `/clear` 的彻底清空，`/compact` 是智能压缩——保留关键决策和代码状态，删除中间过程。

**什么时候用**：在同一任务的**逻辑断点**——比如研究阶段完成准备进入实现阶段时。

#### `/cost` —— 监控 Token 消耗

```bash
/cost
```

显示当前会话的 token 使用量和预估费用。养成定期查看的习惯。

#### 其他关键操作

| 操作 | 用法 | 场景 |
|------|------|------|
| `Esc` | 按一次 | 打断 Claude 当前操作（发现它跑偏了） |
| `Esc + Esc` 或 `/rewind` | 快速双击 Esc | 回退到上一个检查点，恢复代码和对话状态 |
| `/btw` | `/btw 这个函数的参数类型是什么？` | 侧边快速提问，不污染主上下文 |

### 4. Token 优化配置

在 `~/.claude/settings.json` 中添加以下配置，可以自动管理上下文：

```json
{
  "model": "sonnet",
  "env": {
    "MAX_THINKING_TOKENS": "10000",
    "CLAUDE_AUTOCOMPACT_PCT_OVERRIDE": "50"
  }
}
```

| 配置项 | 作用 | 推荐值 |
|--------|------|--------|
| `model` | 默认模型 | `sonnet`（日常平衡之选） |
| `MAX_THINKING_TOKENS` | 限制 Claude 内部推理消耗 | `10000`（减少不必要的思考开销） |
| `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` | 上下文占用超过此百分比时自动压缩 | `50`（比默认更积极地压缩） |

设置 `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` 为 `50` 意味着当上下文使用超过 50% 时，Claude 会自动执行压缩，避免你忘记手动管理。

> **延伸阅读**：cc4pm 还内置了自动化的上下文和成本管理——`suggest-compact.js` Hook 每 50 次工具调用自动提醒压缩，`cost-tracker.js` Hook 自动记录每次会话的 Token 用量和成本到 `~/.claude/metrics/costs.jsonl`。详见 **Lesson 23（阶段 4）自动化工作流**。

### 5. 演示案例：体验上下文的膨胀和管理

这个演示让你亲身体验上下文如何快速膨胀，以及如何管理。

**准备**：

```bash
cd cc4pm
claude
```

**步骤 1：触发大量上下文消耗**

```
你：列出 skills/ 目录下所有技能的名称和简要说明。
```

Claude 会开始用 Glob 搜索所有 skill 文件，然后逐个读取。cc4pm 有 **94 个技能**，这个操作会消耗大量上下文。

观察终端中 Claude 不断调用 Read 工具的过程——每读一个文件，上下文就在增长。

**步骤 2：检查上下文消耗**

```
你：/cost
```

你会看到类似这样的输出：

```
Session cost: $0.XX
Input tokens: ~50,000
Output tokens: ~5,000
```

注意 input tokens 的数字——仅仅一个探索性问题就可能消耗了 25% 以上的上下文窗口。

**步骤 3：执行压缩**

```
你：/compact 保留技能列表的摘要，压缩探索过程的细节
```

Claude 会智能地：
- 保留技能名称和分类的摘要
- 删除读取每个文件的中间过程
- 删除文件的原始内容细节

**步骤 4：验证压缩效果**

```
你：/cost
```

对比步骤 2 的数字，你会看到 token 消耗明显减少了。

#### 动手试试

在上面的基础上继续实验：

```
# 实验 1：体验 /clear 的效果
/clear
/cost
# → 消耗归零，完全干净的起点

# 实验 2：用 /btw 做侧边提问
# 先问一个主要问题
"帮我分析 agents/planner.md 的设计模式"
# 然后用 /btw 问一个不相关的小问题
/btw README.md 里的项目描述是什么？
# → 侧边提问不会污染你和 Claude 关于 planner 的讨论
```

### 6. 五个常见上下文陷阱

来自官方最佳实践，这些是最容易犯的错误：

#### 陷阱 1：厨房水池会话

**症状**：一个对话里混杂多个不相关任务——先做竞品分析，接着写代码，再改 PPT。

**后果**：上下文被无关信息占满，Claude 对每个任务的理解都不够深。

**解决**：不同任务之间用 `/clear`。每个任务给 Claude 一个干净的起点。

#### 陷阱 2：反复纠正

**症状**：Claude 做错了，你纠正；还不对，你再纠正；来回三五次还是不对。

**后果**：上下文被大量失败尝试污染，Claude 越来越困惑。

**解决**：纠正两次还不对 → `/clear`，用更好的初始提示词重新开始。重新描述需求比反复纠正更高效。

#### 陷阱 3：信任但不验证

**症状**：Claude 的输出看起来合理，你就直接用了，没有测试或验证。

**后果**：问题在后续阶段才暴露，回去修复时上下文已经被后续工作占满。

**解决**：总是给 Claude 验证手段——测试用例、预期输出、截图对比。让 Claude 在当前上下文中就完成验证。

#### 陷阱 4：无限探索

**症状**：让 Claude "调查一下这个代码库"但不限定范围，Claude 读了几百个文件。

**后果**：上下文被大量文件内容占满，真正需要的信息反而被"淹没"。

**解决**：限定探索范围。不说"调查代码库"，而说"看一下 src/auth/ 目录下的认证逻辑"。或者用子代理在独立上下文中探索。

#### 陷阱 5：过度膨胀的 CLAUDE.md

**症状**：CLAUDE.md 文件写了几百行规则，试图覆盖所有可能的情况。

**后果**：每次对话都要加载这些规则，占用宝贵的上下文空间。而且规则太多，Claude 可能忽略真正重要的那几条。

**解决**：精简 CLAUDE.md。判断标准：如果删掉某条规则 Claude 照样能做对，就删掉它。把详细的领域知识放到 Skills 里按需加载，而不是放在每次都加载的 Rules 里。

### 总结：上下文管理的黄金法则

```
✅ 在不相关的任务之间用 /clear
✅ 在逻辑断点用 /compact
✅ 定期用 /cost 监控消耗
✅ 纠正两次不对 → /clear 重来
✅ 限定探索范围，避免无限发散

❌ 一个会话里混杂多个不相关任务
❌ 反复纠正同一个错误
❌ 让 Claude 不受限制地探索整个代码库
❌ 忽视上下文消耗，直到性能退化
```

### 进阶：两个令牌优化技巧

#### 策略性手动压缩

默认情况下，Claude Code 会在上下文快满时自动压缩。但自动压缩的时机可能不理想——它可能在你思路正连贯时突然压缩，丢失关键上下文。

**更好的做法**：在逻辑断点（完成一个功能、解决一个 bug 之后）手动执行 `/compact`，并指定保留什么：

```bash
/compact 保留 PRD 的核心需求列表和当前进度
```

这样你能控制哪些信息被保留、哪些被丢弃，而不是让自动压缩做猜测。

#### 用 CLI + Skill 替代部分 MCP

MCP 虽然强大，但每个 MCP 的工具描述都会占用上下文。如果你只用 GitHub MCP 来创建 PR，不如创建一个包装了 `gh pr create` 的 `/gh-pr` 命令——功能一样，但不会在每次对话中占用上下文。

**判断标准**：如果某个 MCP 你只用其中 1-2 个功能，考虑用 CLI 命令 + Skill 替代。如果你经常用 5 个以上功能，保留 MCP。

## 常见问题

**Q: 上下文窗口是不是越大越好？为什么不用更大的窗口？**

A: 更大的窗口确实在发展中，但即使窗口更大，管理习惯仍然重要。原因是：即使有 1M tokens 的窗口，Claude 对早期信息的"注意力"也会随距离衰减。保持上下文精练、相关，永远比单纯扩大窗口更有效。

**Q: /compact 会不会丢掉重要信息？**

A: 可能会，所以建议使用带指示的压缩：`/compact 保留 API 接口定义和测试结果`。明确告诉 Claude 什么信息必须保留，什么可以丢弃。关键决策和代码状态通常会被自动保留。

**Q: 我怎么知道上下文快满了？**

A: 几个信号：（1）`/cost` 显示的 input tokens 超过 150K；（2）Claude 开始"忘记"你之前说的约束条件；（3）Claude 的回复质量明显下降。设置 `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` 可以让系统自动处理。

## 下一步

请调用 `AskUserQuestion` 展示以下选项，让学习者点击选择；从每条中提炼 1-5 个词作为 label，其余写入 description，不要要求输入数字：

- 进入下一课：Lesson 3 - 主动管理上下文
- 返回主菜单
- 退出学习

---
*阶段 1 | Lesson 2/26 (阶段内 2/10) | 上一课: Lesson 1.1 - CC 工作原理 | 下一课: Lesson 2.1 - Token 与语言税*
