上下文工程:为什么 AI 跑久了就「忘」事
Claude 的「桌面」就那么大。对话久了它会丢前面的内容、变笨、甚至胡言乱语。这一切都和上下文窗口有关。一篇讲清 token、上下文限制、/compact 是怎么救场的。
你跟 Claude Code 聊了一个小时,让它改一个复杂的功能。
突然它说:"我重新看一下需求……" 然后跑去读了一遍它自己 30 分钟前已经处理过的文件。
不是它装傻,是它真的忘了。
这就是上下文窗口(context window)在起作用。
1. 模型有一张"工作桌"
把 Claude 想象成一个正在做菜的厨师。他面前的桌子就是他能用的全部记忆。
桌子上堆着:
- 你的每一句话
- 它每一段回复
- 它读过的每个文件的内容
- 它跑过的命令的输出
- 它的"思考"过程
- 系统提示词(system prompt)—— 一开始就铺在桌底的家规
这一堆东西的总量叫 token 数——大致 1 个汉字 ≈ 1.5 token,1 个英文单词 ≈ 1.3 token。
桌子有上限。 Claude 4 系列的模型大约能装 200,000 token,新出的 Claude 4.7 能开到 1,000,000 token。听起来很多——但读几个大文件、跑几个长输出,几万 token 就没了。
2. 桌子满了会发生什么
接近上限时模型会出现明显症状:
- 重复读同一个文件(前面的 Read 结果被挤掉了)
- 忘记你的需求(最初那条用户消息被压缩或丢掉了)
- 胡言乱语 / 重复输出(注意力机制在长上下文里精度下降)
- 直接报错(超过硬上限)
Claude Code 顶部有个 token 进度条。到 80% 你就该警觉了。
3. /compact:把桌面收一半
最直接的应对方式:手动敲 /compact。
它的工作过程:
- 读一遍你和 Claude 之间所有的历史对话
- 让模型自己写一段摘要:"用户在做 X,已经读了 Y,已经改了 Z,当前在……"
- 把摘要替换掉前面所有的来回,只保留最近几轮 + 摘要
- 桌面腾空,token 占用骤降
摘要会丢细节吗? 会。但摘要里通常保留:
- 你最初的需求
- 已读过文件的列表(具体内容丢,但模型知道"我读过 README")
- 已经做过的关键操作
- 当前在干什么
够用了。compact 完之后你可以接着聊,它知道前因后果。
4. 自动压缩:不操心也行
新版本的 Claude Code 默认开了自动 compact。token 到 90% 自动触发,你看到的就是顶上有一行"Compacting…",然后桌面瞬间清出来。
也就是说你不一定要自己敲——但知道这件事在发生,能解释为什么有时候它"突然变迟钝"或"一段对话像断了片"。
5. 主动管理上下文的几招
实战里更聪明的玩家会主动控制:
a) 长文件别让它整个 Read。 如果只关心某个函数,Read 工具支持参数 offset/limit,让它只读相关部分。
b) 完成一段任务用 /clear 而不是 /compact。 比如做完功能 A 要做功能 B,直接清桌重来——A 的细节你不需要带过去。
c) 重要的项目级约定写到 CLAUDE.md。 这个文件每次启动都会被注入 system prompt,相当于"永远占着桌底一小块",不怕被 compact 掉。
d) 别让它跑特别长输出的命令。 npm install 那种几千行的 log 一塞进上下文就废了。重定向到文件,让它只读你关心的几行。
6. 上下文工程是个新工种
这两年业界开始把"怎么给模型喂上下文"当一个独立技能看,称为 Context Engineering。
它和提示词工程(Prompt Engineering)的区别:
- Prompt Engineering:怎么把一个问题问得清楚(短)。
- Context Engineering:怎么在一段长任务里给模型铺好需要的所有背景(长 + 动态)。
后者更重要,也更难。Claude Code 之所以能干大活,底层就是它把上下文管得很好:自动 compact、自动注入 CLAUDE.md、按需读文件、子代理隔离上下文(看 子代理)。
7. 一句话总结
上下文是模型的"现在"。它只活在 token 里,桌面之外什么都不存在。
理解这件事,你就理解了为什么有些 prompt 在网页版跑得好、放到 Claude Code 里反而不行(因为周围一堆别的 token 抢资源)。
想看 compact 动画?去 Claude 课 敲 /compact,进度条会从 78% 收回到 22%。