跳转到内容

上下文窗口

想象 Claude 是个聪明的实习生,但他的工作台只有一张桌子。这张桌子就是「上下文窗口」(context window)——他只能看见桌上摊开的东西。桌子容量大约 200,000 个 token,差不多相当于 15 万字中文,或者一中型项目的全部源码。

这一篇讲清楚:这张桌子为什么是 Claude Code 一切设计的中心,塞满了会发生什么,以及怎么管好它。

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 是「把桌面收拾一下」。

这是最重要的一点:Claude 不会在上下文满的时候报错,而是会悄悄变笨

打个比方,就像一个人桌上堆满了文件,你问他「三天前我们讨论的那个 bug」,他开始翻找、出错、答非所问。具体表现是:

  • 忘记早期约定:你 20 分钟前说「别动测试文件」,它开始改测试文件了。
  • 重复劳动:已经探索过的文件,它又去读一遍。
  • 回答变水:开始给笼统、正确的废话,而不是具体的代码。
  • 指令遵循下降:CLAUDE.md 里的规矩开始被忽略。

官方文档明确说:当上下文用到 95% 时,会自动触发压缩(auto-compact)。压缩会把前面的对话浓缩成一段摘要,腾出空间。问题是,压缩是有损的——细节会丢。

这是大家最常问的问题。简单说:

维度 Claude Code Cursor
上下文大小 200K token 类似量级,但按模型不同
上下文管理 你来掌控,显式 @文件/clear/compact 编辑器自动管理,相对透明
满了的表现 悄悄变笨,需要你主动觉察 类似,但 UI 会提示
解决方式 /compact/clear、Subagents 隔离 开新 chat、@codebase 重建索引

最大的差别在掌控权:Cursor 把上下文管理藏在编辑器背后,你大致知道它读了什么但不完全可控;Claude Code 是透明的——你 @ 了什么它就读什么,跑了什么命令输出都进上下文,你对桌上放什么有完全的掌控。这既是自由,也是责任。

管好上下文,是 Claude Code 进阶的第一课。核心招数有六招:

  • /clear:直接把桌子抹干净,开新对话。适合切换任务时用。代价是前文全忘。
  • /compact [focus]:把桌子收拾一下,压缩成摘要。适合想保留线索但腾空间时用。可以指定聚焦点,比如 /compact 保留认证模块的讨论

2. 精准投喂:@文件 而不是整目录

Section titled “2. 精准投喂:@文件 而不是整目录”

不要让 Claude 自己去 grep 整个仓库。用 @src/auth/login.ts 精准引用,比让它读 500 个文件省得多。

子代理有独立的上下文窗口。让 Explore 子代理去通读整个代码库、写一份摘要回来,它读的 10 万 token 都不占你主桌面的位置,回来的只是一份摘要。这是「另开一张桌子干活」。

如果你每次都要叮嘱「测试用 vitest、别用 jest」,不如写进 CLAUDE.md。它每次会话自动读,你不用反复打字,省 token 又不漏。

/cost 看当前会话用了多少 token,或者配一个 Status Line 实时显示上下文用量百分比。看到逼近 80% 就该考虑压缩或开新会话了。

如果任务确实需要超大上下文(比如读一整个大仓库),可以用 sonnet[1m] 模型别名,它支持 100 万 token 上下文。代价是更贵、更慢,留给真正需要的场景。

一个常见的坑:命令输出吃 token

Section titled “一个常见的坑:命令输出吃 token”

很多人不知道,命令的输出也会进上下文。你让 Claude 跑一条 npm test,如果输出 2000 行日志,那就是几万 token 进了桌子。然后你还在纳闷「怎么没聊几句就满了」。

解决:

  • 用 Hooks 在 PostToolUse 时只保留关键输出。
  • 让 Claude 跑命令时加 | tail -20 之类的过滤。
  • 探索阶段用 Subagents,输出不进主上下文。

上下文窗口是 Claude 的短期记忆,200K 听着大但填得快。勤清场、精投喂、善外包,是管好这张桌子的三招。


下一站,去 记忆系统 Memory 看看怎么把「常驻便签」写进 CLAUDE.md。🚀