---
title: 上下文窗口怎么管：压缩之后什么还在
description: 会话还没开始就已经占掉一截。压缩会把带 paths 的规则、子目录的 CLAUDE.md 和超额的 skill 正文丢掉，项目根 CLAUDE.md 和 auto memory 会从磁盘重新注入——一张表说清哪些活哪些死，以及 clear 和 compact 该怎么选。
published: 2026-07-24
updated: 2026-07-24
keywords:
  - Claude Code 上下文
  - compact 压缩
  - clear 和 compact 区别
  - context 命令
  - 1M 上下文
  - skill 被截断
  - 自动压缩
---

# 上下文窗口怎么管：压缩之后什么还在

> 我把官方那份上下文时间线和「压缩后什么活下来」的表接到了一起。**最值钱的是那张表**——它解释了一类很难查的现象：你写过的规则，在长会话里会自己消失，而且不报错。

## 会话开始时已经占掉的

一个新会话不是从零开始。启动就装进去的东西大致是（官方给的示意值，不是你的真实数）：

| 装了什么 | 大致 token |
|---|---|
| system prompt | ~4,200 |
| auto memory（`MEMORY.md`） | ~680 |
| 环境信息（工作目录、平台、shell、git 状态） | ~280 |
| MCP 工具名（schema 默认延迟加载） | ~120 |

加上你的 CLAUDE.md、rules、以及第一次读的几个文件。**默认窗口 200K**——Fable 5、Sonnet 5、Opus 4.6 及之后、Sonnet 4.6 支持 100 万 token 的窗口（部分要选 `[1m]` 变体，Sonnet 5 直接就是 1M）。

看自己的实况：**`/context`**，它按类别给实时占用，还会指出哪些能优化，包括加载了哪些 CLAUDE.md 和 auto memory 文件。

---

## 压缩之后什么还在

上下文接近上限时会自动压缩，也可以手动 `/compact`。压缩就是把对话历史总结掉——**你的指令能不能活下来，取决于它当初是怎么加载进来的**：

| 机制 | 压缩之后 |
|---|---|
| system prompt、output style | **不变**（本来就不在消息历史里） |
| **项目根 CLAUDE.md**、无 scope 的 rules | **从磁盘重新注入** |
| **auto memory** | **从磁盘重新注入** |
| 带 `paths:` frontmatter 的 rules | **丢**，直到再读到匹配的文件 |
| 子目录里的嵌套 CLAUDE.md | **丢**，直到再读那个目录里的文件 |
| 调用过的 skill 正文 | 重新注入，但**每个 skill 上限 5,000 token、总计 25,000**，超了先丢最老的 |
| hooks | 不适用——hook 是代码，不占上下文 |

三个直接的推论：

**一、只在对话里说过的话，压缩之后就没了。** 「以后都用 pnpm 别用 npm」这种，说一次是活不过压缩的。要它长期有效就得落到 CLAUDE.md 或 auto memory 里。

**二、`paths:` 是省 context 的手段，代价是它活不过压缩。** 一条规则如果必须在整个会话里一直有效，就**别给它加 `paths:`**，或者干脆搬到项目根 CLAUDE.md。省 context 和抗压缩，这里只能选一个。

**三、SKILL.md 最重要的话写在最前面。** 超出 5,000 token 的部分会被截断，而**截断保留的是开头**。把关键指令压在文件末尾的 skill，压缩之后就剩个开头的介绍。

---

## `/clear` 还是 `/compact`

两个动作差别比看起来大：

| | `/clear` | `/compact` |
|---|---|---|
| 做什么 | 开新会话，历史丢掉 | 总结历史，接着干 |
| 花多少钱 | **不花** | **贵**——它要读完那段对话才能总结 |
| 什么时候用 | 切到**不相关**的活 | 同一件事要接着做，但快满了 |

**压缩一个大上下文，这个动作本身就是一次大请求。** 所以别养成「快满了就 compact」的习惯——如果下一个任务跟前面无关，`/clear` 又快又免费。

想回头找，`/clear` 之前先 `/rename`，之后用 `/resume` 回去。

**`/compact` 可以带指示**，让它按你要的留：

```
/compact 重点保留那个鉴权 bug 的排查过程和最后的修法
```

自动压缩猜什么重要，带指示的压缩由你定。也可以把默认指示写进 CLAUDE.md：

```markdown
# Compact instructions

压缩时重点保留测试输出和代码改动。
```

---

## 在撑满之前

三个动作，成本从低到高：

**把大块阅读交给子代理。** 抓文档、跑测试、翻日志——让几万 token 的原始输出留在子代理的上下文里，主对话只收一份摘要。这是唯一一个能「读了但不占地方」的办法。

**用 hook 在数据进来之前过滤。** 一万行日志 grep 完再给它，几万 token 变几百。

**切任务就 `/clear`。** 陈旧上下文在之后每条消息上都收一次费。

---

## 一个容易忽略的连锁

压缩这件事跟账单是连着的：**每条消息都带着整个对话发出去**。所以上下文越长，之后每一条消息越贵——不是压缩那一下贵，是压缩之前的每一条都在为那段历史付钱。

外加缓存那一层：休息时间超过缓存寿命（订阅 1 小时、API key 5 分钟），回来第一条消息就是把整段上下文按全价重新过一遍。上下文越长，这一下越疼。

三件事连起来看才对：**上下文长度 → 每条消息的价 → 缓存过期时的重算成本**。[省钱三件套](/guides/claude-code-cost)那篇把这条线讲全了。

---

## 参考

- [Claude Code 官方文档：Explore the context window](https://code.claude.com/docs/en/context-window)
- [Claude Code 官方文档：How Claude remembers your project](https://code.claude.com/docs/en/memory)
- [Claude Code 官方文档：Manage costs effectively](https://code.claude.com/docs/en/costs)
- [Claude Code 省钱三件套](/guides/claude-code-cost)
- [CLAUDE.md 到底该写什么](/guides/claude-md)
