上下文窗口是什么?

上下文窗口:大模型的"记忆之窗"到底能看多远?
你有没有遇到过这种情况:给AI投喂了一长串背景资料,心想"这下它应该全记住了吧",结果问到中间某个细节时,它一脸茫然地表示"我没看到过这个信息"?
别急着骂它"记性差"。微调技术让模型学会新能力,但学会之后能不能用上,还取决于另一个关键因素——模型一次能处理多少信息。这就是今天要聊的上下文窗口,以及一个反直觉的事实:窗口大,不代表模型真的能记住一切。
上下文窗口究竟是什么?
上下文窗口,英文叫 Context Window,说白了就是模型一次"看"进去的总字数上限。
这个上限不是按"字符"算的,而是按 Token 算。Token 是模型处理信息的基本单位,中文里一个汉字通常对应 1-2 个 Token,英文里一个单词可能拆成好几个 Token。
你可以把上下文窗口想象成一块黑板。模型回答问题前,先把所有相关内容和历史对话都写在黑板上。写满了怎么办?后面的内容会挤掉前面的,黑板就那么大,写了新内容就必须擦掉旧内容。
用户输入 → 黑板(上下文窗口)写入 → 模型读取并思考 → 生成回答。如果对话太长,最开始说的内容就会被"擦掉"。

举个例子。假设上下文窗口是 4K tokens,你和 AI 聊了 3000 字的历史对话,又粘贴了一篇 2000 字的文章让它总结。这时候文章的前面部分会被挤掉,AI 只能看到后半截。
这不是 AI 故意忽略你,而是物理限制——黑板就那么大,多写了新的就必须擦旧的。
为什么窗口大小会有物理极限?
既然窗口这么受限,把窗口做大不就行了?
理论上可以,实际上代价极高。这要从大模型的核心机制说起。
大模型靠"注意力机制"理解文本。简单说,每个词都要和其他所有词建立关联,计算它们之间的"关系强度"。这意味着:2 个词要比 2×2=4 次,100 个词要比 10000 次,1000 个词要比 100 万次。
数学上,这种计算复杂度是 O(n²)。n 翻一倍,计算量要翻四倍。
这就好比请客吃饭。10 道菜你还能记住每道菜的味道,50 道菜就开始混淆了,500 道菜?光记住菜名就要了你的命。
更具体地说,窗口从 4K 扩展到 128K,计算量增加 1024 倍。存储注意力结果(KV Cache)的显存也跟着暴涨。一块顶配 GPU 的显存是有限的,窗口太大,显存直接爆掉。
还有一个被忽视的限制:位置编码。
模型需要知道每个 Token 在序列中的位置。就像你读书,"第三章"和"尾声"带给你的感受完全不同。模型通过"位置编码"给每个 Token 贴上位置标签。
但这种编码方式有有效范围。超出范围,模型对位置的感知就会"失灵"——它分不清 10000 位和 10001 位的区别了。

这就是为什么窗口大小不能无限扩张。算不动、存不下、位置还会乱。一句话总结:不是不想做大,是代价太高。
模型居然"记两头忘中间"?
现在有一个更诡异的问题:就算把内容塞进窗口里了,模型真的会用好每一处信息吗?
斯坦福大学 2023 年做了一个实验。他们给模型投喂一篇很长的文档,在不同位置插入关键信息,然后测试模型能不能准确回忆。结果发现一个惊人的规律:
模型对开头和结尾的信息利用最好,中间的最容易"迷失"。
这就是著名的 "Lost in the Middle"(中间迷失)现象。
你的记忆有没有这种体验?读一本 300 页的小说,第一章和最后一章的剧情你记得最清楚,中间几百页往往印象模糊。大模型的"首因效应"和"近因效应"比人类还严重。
研究人员画了一条曲线,横轴是信息在上下文中的位置,纵轴是模型对该信息的利用率。曲线呈现明显的 U 型——两头高,中间低。

这就解释了开头的那个现象。你精心准备了一段长背景,中间藏着关键细节,满心以为 AI 会注意到。结果它完全忽略了——因为它"看"得到,但没真正"注意"到。
问题不在于窗口装不下,而在于装进去之后,注意力被分散了。中间的信息淹没在海量 tokens 里,模型很难把有限注意力分配给每个位置。
128K 大窗口也不等于"真正记住"
现在主流模型的上下文窗口已经很大了。Claude 3 支持 200K tokens,Gemini 1.5 更是宣称 100 万 tokens。
128K tokens 约等于 9 万汉字,一本中篇小说塞进去绰绰有余。
但问题来了:窗口大 = 记住一切吗?
绝对不是。
窗口大只是"能放进去",不代表模型会认真"看"每一处。
假设你面前摆着两份资料:
- 第一份:一本 500 页的会议记录,充满了无意义的寒暄、重复的讨论、偶尔闪过的关键结论
- 第二份:一份 10 页的摘要,把所有关键点浓缩成了清单,逻辑清晰,重点突出
让你根据这两份资料回答问题,你觉得哪份回答得更准?
很可能是第二份。
给模型喂 128K tokens 的"大杂烩",模型面对的是信噪比极低的混乱场景。有效信息被稀释在大量无关内容里,模型需要在海量 tokens 中"打捞"有用的东西。
这种打捞能力受限于注意力机制本身——它不可能平均分配注意力给 10 万个 Token。总有些地方会被"略过"。

所以现在有一种观点:与其追求大窗口,不如学会聪明地"喂"信息。
信息放在窗口的哪个位置、内容有没有结构、噪声比例高不高——这些因素对最终效果的影响,可能比窗口大小本身更重要。
上下文窗口的进化史
回顾历史,大模型的上下文窗口经历了飞速扩张。
2019 年 GPT-2 时代,窗口只有 1024 tokens,约 700 个汉字。勉强够写一段话,问个简单问题。
2020 年 GPT-3 把窗口推到 4096 tokens,4 倍提升。那时候的 AI 已经开始能进行多轮对话了。
2023 年 GPT-4 Turbo 登场,128K tokens 震惊业界。相当于能一口气读完两本《活着》,或者三集电视剧的剧本。
同期的 Claude 3 支持 200K tokens,而 Gemini 1.5 直接宣称 100 万 tokens——相当于一本《战争与和平》的长度。
数字增长令人振奋,但别高兴太早。
前面说的 U 型曲线问题、技术限制问题,一个都没解决。2M tokens 的窗口依然存在"中间迷失",128K 之后还有计算瓶颈,位置编码的物理极限依然横亘在那里。
窗口变大解决了一部分问题,但新问题也随之产生。技术在进步,挑战也在升级。
与其追求大窗口,不如学会"喂信息"
既然窗口大小有物理极限,U 型曲线又客观存在,那实际使用中该怎么办?
有几个被验证有效的策略。
第一种是截断分片。把长内容切成多个片段,每个片段不超过窗口大小。需要完整信息时,模型分多次处理,最后综合结论。
第二种是主动记忆机制。不依赖上下文窗口"顺便"记住关键信息,而是专门设计记忆模块,把重要的内容单独存储、随时调用。
第三种是关键词标记。把关键内容放在窗口开头或结尾,并用显式标记强调。开头和结尾天然受模型关注,放对了位置就成功了一半。
第四种是 RAG——检索增强生成。
这是目前最流行的方案。模型不再"闷头读"所有内容,而是先通过检索找到和问题相关的片段,然后把相关片段注入上下文。
用户提问 → 系统检索相关段落 → 把相关段落和原始问题一起发给模型 → 模型生成回答。

这就像你写论文时,不需要把整图书馆的书都背下来,而是知道去哪个书架找哪本书,需要时再翻阅。
核心原则很清晰:精心选择放进上下文的内容,比追求更大的窗口更重要。
给厨师一整仓库的食材让他自己找,不如提前把要用的食材洗干净切好摆在他面前。
下一步的悬念
回到开头的问题:上下文窗口不是越大越好,"能塞进去"和"能记住"完全是两回事。
下次当你抱怨 AI"没看到"你提供的信息时,先想想是不是把它放在了上下文的"中间地带"。
技术还在进步。FlashAttention 等优化算法正在缓解计算压力,让更大窗口成为可能。位置编码也在持续改进,期望有一天模型能真正"一视同仁"地关注每个位置。
但即便如此,生成式 AI 的本质是"逐个预测下一个词",这个过程天然是顺序的、有历史依赖的。加速这个过程,又能从哪些角度入手?
这就引出了下一个话题——KV Cache。模型生成每个新词时,都要回头重新看一遍之前的所有内容吗?如果每次都从头算,效率是不是太低了?
你可能已经猜到答案了:不是每次都从头算。中间的计算结果被缓存起来,复用给下一轮生成。但具体是怎么实现的?缓存了些什么?为什么要缓存?
这就是下一篇要聊的了。
