如果你用过Claude Code,可能会有这样一个模糊的感觉:这玩意儿好像什么都知道一点。记得上一次对话里的内容,能自动找到合适的配置文件,甚至在某些时候表现得像是提前做过功课。
但其实,Claude Code并不是真的拥有"记忆"。它所有的"知道",都来源于一个东西------上下文窗口。
简单来说,每一次和Claude Code的交互,都像是一场临时搭建的舞台。所有对话历史、读取过的文件内容、各种配置指令,都会被塞进这个"舞台"(也就是上下文窗口)里。Claude的所有回应,都基于这个舞台上此刻摆放着的材料。
这个窗口是有容量上限的(目前大约是20万个token,也就是一个相当庞大的文本量)。那么,这个窗口究竟是怎么被填满的?哪些东西会自动跑进去,哪些需要手动请进来?不同操作又各自消耗多少"空间"?
这篇文章就来拆解一下,Claude Code的上下文窗口在一个典型会话中,是如何一步步被构建出来的。

还没开始打字,舞台已经搭好了
很多人以为,运行claude命令后,看到输入框出现,才开始往上下文里塞东西。
其实不是的。
在用户敲下第一个字之前,大量的"幕后工作"已经完成了。
系统会自动加载以下几类内容:
- CLAUDE.md文件:这是用户或项目存放长期指令的地方。无论是项目级的规范,还是个人偏好的设置,都会在这里被读入上下文。
- Memory(记忆):这里指的是"自动记忆"功能,保存了跨会话的偏好或信息。它们会像CLAUDE.md一样,在启动阶段就静默加载。
- Skills(技能):如果定义了特定的技能(比如"以专家口吻回答"或"输出JSON格式"),技能的描述也会预先装入上下文。
- MCP工具 :如果配置了MCP(模型上下文协议)工具,它们的工具名称和描述也会在此时加载。注意,只是工具的名字和说明,工具本身的实际逻辑并不在里面。
所以,当终端界面显示一个输入框,等待用户输入第一条消息时,背后其实已经悄悄加载了相当多的内容。用户在终端里看到的只是一个等待输入的提示,而所有这些预加载的内容,都在幕后默默地准备就绪。
工作过程中,内容如何一步步累积
当开始和Claude Code交互,上下文窗口里的内容就开始随着操作动态增长了。
1. 读取文件:每一次读取都有成本
当Claude Code需要查看一个文件时,这个文件的内容就会被加入到上下文窗口中。这很直观------它需要看到代码才能分析代码。
但值得留意的是,每一次文件读取都是有"成本"的。一个5000行的文件被读入,就会占据对应大小的上下文空间。如果会话中读取了多个大文件,上下文窗口的占用就会快速上升。
2. 规则(Rules):自动跟随文件加载
规则系统在这里扮演了一个聪明的角色。如果用户定义了针对特定路径的规则(比如"当读取/src/api下的文件时,遵守API设计规范"),那么当Claude Code读取该路径下的文件时,这些规则会自动加载到上下文中。
这避免了把所有规则一股脑塞进去的浪费,做到了"用到哪条规则,就加载哪条"。
3. 钩子(Hooks):执行特定动作后触发
钩子是在特定事件发生时执行的脚本。在模拟的会话中,展示了一个PostToolUse钩子的场景------在Claude Code每次使用工具(比如编辑文件)之后,这个钩子会触发,并且它的输出(比如日志、校验结果)也会被追加到上下文窗口中。
这提供了一种在关键节点注入信息的方式,让Claude能根据这些后续信息调整下一步动作。
后续操作中的特殊处理
会话不会永远是一条直线。当用户提出一个复杂需求,比如"去调研一下某个新技术方案",处理方式会有所不同。
子代理(Subagent)的独立窗口
这时候,Claude Code可以启动一个子代理来处理这个任务。关键在于:子代理拥有自己独立的上下文窗口。
这意味着,子代理为了调研而读取的大量文档、网页,都只填充它自己的窗口,而不会占用主会话的宝贵空间。当子代理完成任务后,它只会把一份摘要和少量的元数据传回主会话。
这样一来,主会话的上下文窗口就保持了相对精简的状态,既节省了空间,也让主会话的Claude能继续专注于核心任务,不会被大量调研信息干扰。
当窗口快满时:压缩与重置
长时间的会话累积,最终会逼近上下文窗口的上限。这时就需要一个整理舞台的工具。
/compact命令的作用
用户可以在会话中运行/compact命令。它的工作方式很有趣:
- 压缩对话:它会将当前会话中已有的对话历史,替换成一个结构化的摘要。这个摘要把之前漫长的来回对话,浓缩成了一段精炼的叙述。
- 自动重载 :压缩完成后,Claude Code会自动重新加载 启动时的那批内容------比如
CLAUDE.md、记忆(Memory)等。这确保了核心指令和偏好不会丢失。 - 一个例外 :技能(Skills)的列表是唯一的例外,它不会在
/compact后自动重载。
这个机制就像一场舞台剧的"幕间整理"。把之前用过的旧道具(详细对话)收起来换成一张清单(摘要),同时确保主要布景(核心指令)还在原位,让演出能继续进行。
如何查看自己的上下文使用情况
对于一个实际运行的会话,用户如果想了解当下的上下文窗口里到底有什么,占用了多少空间,可以用一个简单的命令:
/context
这个命令会给出一个实时分类的统计,展示系统提示、消息、文件等内容各自占用了多少token,甚至还会附带优化建议。
另一个有用的命令是**/memory**,它可以用来检查在会话启动时,哪些CLAUDE.md文件和自动记忆内容被成功加载了。
总结
把Claude Code的上下文窗口想象成一个精心管理的白板:
- 开始前,白板上已经写好了项目规范、个人偏好、可用工具等基础信息。
- 工作中,每打开一个文件,内容就写上去一部分;相关的规则会跟着文件自动出现;特定操作后,钩子的反馈也会追加。
- 复杂任务,可以交给一个拿着自己白板的助手(子代理),最后只带回结论。
- 白板快满时 ,可以用
/compact把讨论纪要擦掉,换成一份总结,同时保留最初的基础信息。
理解这个机制,就能更好地解释Claude Code的一些行为,也能在使用中更有策略地管理这个最核心的资源。毕竟,一个清晰、高效的上下文窗口,才是获得高质量回应的前提。