上下文窗口
想象 Claude 是个聪明的实习生,但他的工作台只有一张桌子。这张桌子就是「上下文窗口」(context window)——他只能看见桌上摊开的东西。桌子容量大约 200,000 个 token,差不多相当于 15 万字中文,或者一中型项目的全部源码。
这一篇讲清楚:这张桌子为什么是 Claude Code 一切设计的中心,塞满了会发生什么,以及怎么管好它。
200K token 是什么概念
Section titled “200K token 是什么概念”token 是模型处理文本的最小单位。粗略换算:
- 1 个 token ≈ 0.75 个英文单词 ≈ 0.5 个汉字
- 200K token ≈ 15 万字中文,约一本中等厚度的书
- 一个 5 万行的代码库,大约要占掉 15-20 万 token
听起来很大,但你要知道:这张桌子是所有东西共享的——你打的每句话、Claude 读的每个文件、跑的每条命令的输出、它自己生成的回复,全都要摊在上面。一个不小心,桌子就满了。
为什么上下文窗口是「一切的容器」
Section titled “为什么上下文窗口是「一切的容器」”这是理解 Claude Code 所有组件的关键。你往 Claude 脑子里塞东西的每一个动作,都在吃上下文:
- 你输入一句话 → 吃 token
@引用一个文件 → 文件内容进上下文,吃 token- Claude 跑一条
git log→ 输出进上下文,吃 token - CLAUDE.md 每次会话自动读 → 吃 token
- Skills 预加载的 description → 吃 token(每个约 100 token)
所以整个 Claude Code 的设计,本质上都是在回答一个问题:怎么在 200K 的桌子上,高效地放对东西。Memory 是「常驻桌面的便签」,Subagents 是「另开一张桌子干活」,Skills 是「按需展开的抽屉」,/compact 是「把桌面收拾一下」。
用满了会发生什么
Section titled “用满了会发生什么”这是最重要的一点:Claude 不会在上下文满的时候报错,而是会悄悄变笨。
打个比方,就像一个人桌上堆满了文件,你问他「三天前我们讨论的那个 bug」,他开始翻找、出错、答非所问。具体表现是:
- 忘记早期约定:你 20 分钟前说「别动测试文件」,它开始改测试文件了。
- 重复劳动:已经探索过的文件,它又去读一遍。
- 回答变水:开始给笼统、正确的废话,而不是具体的代码。
- 指令遵循下降:CLAUDE.md 里的规矩开始被忽略。
官方文档明确说:当上下文用到 95% 时,会自动触发压缩(auto-compact)。压缩会把前面的对话浓缩成一段摘要,腾出空间。问题是,压缩是有损的——细节会丢。
和 Cursor 有什么不同
Section titled “和 Cursor 有什么不同”这是大家最常问的问题。简单说:
| 维度 | Claude Code | Cursor |
|---|---|---|
| 上下文大小 | 200K token | 类似量级,但按模型不同 |
| 上下文管理 | 你来掌控,显式 @文件、/clear、/compact |
编辑器自动管理,相对透明 |
| 满了的表现 | 悄悄变笨,需要你主动觉察 | 类似,但 UI 会提示 |
| 解决方式 | /compact、/clear、Subagents 隔离 |
开新 chat、@codebase 重建索引 |
最大的差别在掌控权:Cursor 把上下文管理藏在编辑器背后,你大致知道它读了什么但不完全可控;Claude Code 是透明的——你 @ 了什么它就读什么,跑了什么命令输出都进上下文,你对桌上放什么有完全的掌控。这既是自由,也是责任。
怎么管理这张桌子
Section titled “怎么管理这张桌子”管好上下文,是 Claude Code 进阶的第一课。核心招数有六招:
1. 勤清场:/clear 和 /compact
Section titled “1. 勤清场:/clear 和 /compact”/clear:直接把桌子抹干净,开新对话。适合切换任务时用。代价是前文全忘。/compact [focus]:把桌子收拾一下,压缩成摘要。适合想保留线索但腾空间时用。可以指定聚焦点,比如/compact 保留认证模块的讨论。
2. 精准投喂:@文件 而不是整目录
Section titled “2. 精准投喂:@文件 而不是整目录”不要让 Claude 自己去 grep 整个仓库。用 @src/auth/login.ts 精准引用,比让它读 500 个文件省得多。
3. 用 Subagents 把活外包
Section titled “3. 用 Subagents 把活外包”子代理有独立的上下文窗口。让 Explore 子代理去通读整个代码库、写一份摘要回来,它读的 10 万 token 都不占你主桌面的位置,回来的只是一份摘要。这是「另开一张桌子干活」。
4. 写进 CLAUDE.md 而不是反复说
Section titled “4. 写进 CLAUDE.md 而不是反复说”如果你每次都要叮嘱「测试用 vitest、别用 jest」,不如写进 CLAUDE.md。它每次会话自动读,你不用反复打字,省 token 又不漏。
5. 盯着用量:/cost 和状态栏
Section titled “5. 盯着用量:/cost 和状态栏”用 /cost 看当前会话用了多少 token,或者配一个 Status Line 实时显示上下文用量百分比。看到逼近 80% 就该考虑压缩或开新会话了。
6. 长上下文模型:sonnet[1m]
Section titled “6. 长上下文模型:sonnet[1m]”如果任务确实需要超大上下文(比如读一整个大仓库),可以用 sonnet[1m] 模型别名,它支持 100 万 token 上下文。代价是更贵、更慢,留给真正需要的场景。
一个常见的坑:命令输出吃 token
Section titled “一个常见的坑:命令输出吃 token”很多人不知道,命令的输出也会进上下文。你让 Claude 跑一条 npm test,如果输出 2000 行日志,那就是几万 token 进了桌子。然后你还在纳闷「怎么没聊几句就满了」。
解决:
- 用 Hooks 在 PostToolUse 时只保留关键输出。
- 让 Claude 跑命令时加
| tail -20之类的过滤。 - 探索阶段用 Subagents,输出不进主上下文。
上下文窗口是 Claude 的短期记忆,200K 听着大但填得快。勤清场、精投喂、善外包,是管好这张桌子的三招。
下一站,去 记忆系统 Memory 看看怎么把「常驻便签」写进 CLAUDE.md。🚀