上下文窗口 —— 他的记忆,和那块黑板
上一篇说过了,模型没有记忆。但你现在打开 deepseek,随便找个窗口跟他聊天,他明明记得你前面讲了什么。
其实这两件事并不矛盾,他不是记住了,是你前面说过的话,每一轮都被重新递到他面前。
那递过去的东西总不能无限多。这个上限,就叫上下文窗口。
把他想成一块固定大小的黑板
聊这个概念,其实最好的比喻就是黑板。
你和他的整段对话——你说的话、他回的话、中间调用工具拿到的结果、读进来的文件——全都写在这块黑板上。
黑板的大小是固定的。可能是 8K Token,也可能是 128K Token,或者现在最流行的,1M(1024K)Token。
当你一直说下去,黑板总有写满的时候。写满了怎么办?不是给你换一块新黑板,而是从最左上角开始擦。
最早写上去的内容,最先被抹掉。
这就是为什么聊了很久之后,他会突然冒出一句“我们刚才在聊什么来着”,不是他不上心,是那段内容真的被擦掉了,他看不见了。
“看不见”和“不记得”是两件事
这里要拐个弯,但理解了他能省你很多事。
还记得我说的装B圣经吗——LLM 是无状态的。(摇头晃脑)他每一轮都从零开始,唯一的输入就是你这次递给他的那堆 Token。
所以“他记不记得”,本质上等于”那块内容还在不在黑板上“。
由此能推出一个特别实用的结论:你不需要让他“记住”,你只需要让那块内容一直在场。
同一个事实,你写在最开头,可能到第 30 轮就被擦掉了;你写在这一句里,他一定看得见。这也是为什么很多时候,重新说一遍比说一句“你要记住”有用得多——后者只是个愿望,前者才是真把东西放到了他眼前。
窗口越大越好吗
不一定。这里有两个坑。
第一,贵。 窗口里的每一个 Token 都要参与计算,而且注意力的计算量跟长度是平方关系——窗口翻一倍,算力消耗翻四倍,所以长上下文的调用通常更慢、更贵,有些平台还要单独加钱。
第二,会变糊涂。 这一点知道的人不多,但是挺重要的,你注意一下:内容塞得越多,模型对中间那一段的注意力反而越差。开头和结尾他记得清楚,中间容易糊。你把一份两万字的文档整个丢进去,问他中段的某个细节,他未必比只喂那一小段回答得好。
所以“窗口大”是一种能力,不是一种用法,所以投喂上下文的时候该给多少给多少,别老是把整个仓库一股脑倒进去。
这个时候就知道有时候 Agent 做长任务为什么会崩?
如果你用过跑长时间任务的 Agent,大概见过这种场面:前面 20 步做得漂漂亮亮,到第 40 步开始胡说八道,第 60 步开始重复同一个动作。
这不是模型突然变笨了,是黑板写满了。
工具返回的结果、中间的推理、报错的堆栈,全在往黑板上堆。堆到最后,最开始那条原始任务被擦掉了——他不知道自己在干嘛了,只能抓着最近几条信息瞎猜。
有个数字很能说明问题:假设一个任务有 10 步,每一步成功的概率是 99%,整件事成功的概率只有 90%;如果每一步变成 95%,整件事直接掉到 60%。
单步都很稳,连起来就崩。这才是长任务真正的难处。
也正因如此,真正能干活的 Agent,里面有相当大一块代码专职做“上下文管理”:什么时候把历史压成摘要、什么时候把中间结果写进文件存起来、什么时候丢掉一批没用的观察。这部分我们讲到 Agent 的时候再回来看。
所以写在最后
上下文窗口是他一次能看见的全部内容。他不是在回忆,他是在现场读。所以别指望他“记住”,想办法让该看见的东西一直在场。