主题
第 5 章 · 上下文窗口的真相
上一章,我们见证了一个刚出生的模型如何通过预训练、微调和偏好对齐,从一堆随机数变成了学识渊博、彬彬有礼的智能体。
现在,你兴致勃勃地打开一个 AI 聊天界面,输入了上万字的世界观和角色设定,又和这个角色聊了上百个回合。你们从今天的晚饭聊到宇宙的边缘,剧情跌宕起伏。 正当你准备让模型回收五十个回合前埋下的一个伏笔时—— 它忘得一干二净。
它不仅忘了那个伏笔,甚至连你们最初是在哪里相遇的都忘了。它开始用一种“虽然我不知道你在说什么,但我配合你演一下”的敷衍态度附和。
你可能会愤怒地想:“这个模型明明读过几万亿字的书,为什么连我们刚才聊过的话都记不住?”
这是因为,你混淆了模型的 “长期记忆” 与 “短期记忆”。 这一章,我们将直面 Transformer 架构最冷酷的物理极限,也是你未来在与 AI 交互时需要每时每刻与之搏斗的终极定律——上下文窗口(Context Window)。
章节概要
- 大脑的两种记忆:模型的“学识”在权重里,而你们的“对话”全在上下文窗口里。
- 物理极限的由来:Attention 的
魔咒,为什么文本越长,计算代价会以平方级暴涨? - 隐形的显存吞噬者:KV 缓存如何随上下文长度膨胀,卡住你显卡的脖子。
- 清理案板的两把斧:当空间不够时,消息截断与上下文压缩是如何抢救记忆的。
- 首因、近因与中部迷失:哪怕有 100 万 token 的窗口,注意力也绝不是平均分配的。
- 提示词工程的本质:它不是魔法,而是在物理极限下,对信息密度与摆放位置的极致博弈。
一、长期记忆 vs 短期记忆与“无状态”
首先,我们需要理清一个最基础的认知误区。
当我们说一个模型“懂物理”、“知道《红楼梦》的情节”、“掌握了傲娇的语气”时,这些知识储存在哪里? 它们储存在我们在第 3 章中提到的 FFN(前馈网络)的键值表里,也就是那几十亿甚至上千亿的参数权重中。 这是模型在训练阶段花了几千万美元电费硬生生刻进脑子里的。一旦训练结束,这些记忆就固定了。这就像人类的长期记忆。
但是,当你和模型开始对话时,你说的话并没有改变模型脑子里的任何一个参数。 模型处理当前对话的地方,叫作上下文窗口(Context Window)。
为了直观理解,你可以把模型想象成一位技艺精湛的顶级大厨,而上下文窗口,就是他面前的一张案板(操作台)。
- 大厨脑子里的基本功和菜谱(长期记忆),决定了他知道西红柿能配鸡蛋,知道什么是清蒸、什么是红烧。
- 但大厨当前这一秒钟能炒出什么菜,完全取决于你往这张案板上摆了什么食材。
每次你点击“发送”按钮,系统就会把你写的话、角色设定、以及你们之前的历史聊天记录,全部打包成一堆食材,“啪”地一声倒在大厨的案板上。 大厨扫视一眼案板上的所有东西(这就是 Attention 机制的全局扫描),然后端出一盘新菜(新的一句话)给你。
请注意这里的可怕之处,也是大模型最核心的物理定律:大语言模型在本质上是“无状态”(Stateless)的。
什么是无状态?这意味着这位大厨患有极其严重的“瞬间健忘症”。 每次他根据案板上的食材端出新菜(生成完一句话)后,他的工作记忆就会立刻清零。 如果你跟他说了一句“你好”,他回了“你好呀”。紧接着你发第二句话:“讲个笑话”。 如果系统只把“讲个笑话”这四个字递给大厨,他根本不知道你是谁,也不知道你们刚才打过招呼。为了让他能完美地接上话,系统必须把你上一回合的“你好”、他的回复“你好呀”,以及最新的“讲个笑话”,完整地打包在一起,当成一份全新的订单,重新倒在案板上。
也就是说,大厨(模型)从来没有真正“记住”过你们的对话,它也没有一个连续思考的“灵魂”。它只是每次都在以极快的速度,把你(前端系统)重新发给它的所有历史记录从头到尾“重读”了一遍,然后假装自己一直记得。 由于大厨的脑子(模型参数)在训练结束后就不会再改变,所有的对话“记忆”都只能通过这种“每次都把全部家当重新搬上案板”的笨办法来维持。
既然是案板,它就有物理面积的限制。你不可能往一张桌子上无限量地堆食材。 这张案板的大小,就是上下文窗口长度(通常用 Token 数量来衡量)。
为什么案板不能无限大?
二、Attention 的算力黑洞: 魔咒
你在第 2 章听过,Transformer 打破了 RNN 的短记忆墙,让句子里任意两个词可以直接“看到”对方。 这听起来很完美,但凡事皆有代价。
回忆一下 Attention(注意力)的本质:让每个 token 从其他所有 token 那里借一点意义。 这就好比,大厨在做菜时,必须让案板上的每一种食材都和其他所有食材搭配尝一口,来决定最终的调味(计算相关度分数)。
我们来做一道简单的算术题:
- 如果案板上有 10 种食材,大家互相搭配尝味道,需要尝多少次?大约 10 × 10 = 100 次。
- 如果有 100 种食材,需要尝多少次?100 × 100 = 10,000 次。
- 如果你有 8,000 个 Token(类似一篇短篇小说的长度)呢?8000 × 8000 = 64,000,000 次计算!
发现问题了吗? 文本长度每翻一倍,Attention 的计算量和内存占用就会变成原来的 4 倍。 这在计算机科学中被称为
到了 2026 年,像 DeepSeek-V4、Claude Fable 5、Gemini 3.1 Pro 这样的顶尖大模型,虽然借助 FlashAttention、稀疏注意力等各种极限的工程优化,勉强把这根上限推到了 100 万 token 级别。 但这并不意味着你就可以把几本书的内容随便往里塞。这不仅仅是 API 账单价格或者硬件显存的问题,更深层的问题在于“信息的稀释”。
即使大厨能从物理上“看清”这 100 万种食材,他的“注意力”也不可能在 100 万种食材中绝对平均地分配。当案板上的东西堆积如山时,那些真正有用的关键线索,不可避免地会被浩如烟海的杂音所掩盖。
隐形的显存吞噬者:KV 缓存
上面说的
回到第 3 章讲过的 Q、K、V:每个 token 在经过注意力层时,都会产生一组 Key 向量和一组 Value 向量,供后面的 token 查询使用。问题是,模型每生成一个新字,都要让这个新字去"看"所有旧字。如果什么都不存,那每写一个新字就得把前面所有字重新算一遍——写第 1000 个字时要把前 999 个字重算一次,写第 1001 个字时又要重算 1000 个字。这是纯粹的浪费。
解决办法很直接:把每个 token 算出的 Key 和 Value 存起来,下次直接读,不重算。这个缓存就叫 KV 缓存(Key-Value Cache)。
代价是显存。每多一个 token,就要在模型的每一层、每一个注意力头里存两组向量。以一个 70 亿参数的常见本地模型为例,模型本身的参数在 4-bit 量化后大约占 4 GB 显存。而如果按原版 Transformer 的多头注意力老老实实地存,把上下文开到 32000 token,KV 缓存就要再吃掉大约 16 GB——是模型本身的四倍。你买了一张 8 GB 显存的显卡,装得下模型,却开不起长上下文,瓶颈不在模型大小,在缓存的膨胀。
这也是为什么各家厂商拼命研发省缓存的注意力变体。最普及的一种叫 GQA,即分组查询注意力——让多个注意力头共享同一份 KV 缓存,一刀把这块开销砍到原来的四分之一甚至八分之一。DeepSeek 的 MLA 走得更远,把键值对压缩进更小的潜在向量里,砍掉了九成以上。但无论怎么优化,KV 缓存依然随上下文长度线性膨胀,只是斜率被压低了。
三、当案板塞满之后:消息截断与上下文压缩
不管你使用的是 8K 的小模型,还是 100 万 token 的顶尖模型,只要对话无限进行,案板总有被塞满的一刻。当历史消息总量超过极限时,模型会直接报错崩溃吗?
不会。因为前端系统(如你使用的聊天 UI 或 Agent 框架)会替大厨“清理案板”。
目前的系统通常采用两种策略来抢救空间:
1. 简单粗暴的消息截断
早期的基础聊天系统,也包括未安装记忆插件的 SillyTavern,就像一个无情的帮厨,当食材逼近案板边缘时,他会自动把最古老的聊天记录从案板上拿走,直接倒进垃圾桶。 这解释了本文开头的那个惨案:为什么五十回合后,AI 忘了你们相遇的情景?因为那一刻,最古老的回忆已经被物理意义上剔除出了上下文。大厨只能看着剩下的几根葱姜蒜,开始他的“合理推测”,也就是产生幻觉。 顺带一提,这种截断和模型架构里的“滑动窗口注意力”不是一回事:后者是模型自身的注意力设计,而这里说的是前端系统在把数据送进模型之前做的裁剪。两者都丢弃旧内容,但发生在完全不同的层面。
2. 聪明的“上下文压缩”(Context Compression)
如今,以 Claude Code 为代表的许多先进 Agent 框架,以及高阶角色扮演系统,已经不再单纯扔数据了,而是采用了更巧妙的上下文压缩(Compression / Summarization)机制。
这就好比帮厨在清理案板前,把那些快要掉下桌子的老旧食材,放进锅里熬成了一块“浓缩汤料块”。 系统会调用模型,把最老的几十回合对话总结成一段简短的摘要,比如“你们曾在酒吧相遇,并约定去打败恶龙”,然后把原对话删掉,只把这块高度凝练的“汤料”重新摆在案板边缘。 这种机制下,模型不会完全“失忆”,它保留了故事的主干大纲,但依然丢失了高分辨率的细节——它记得你们去了酒吧,但忘了你当时喝的是什么酒,也忘了你们吵架时的原话。
特权阶级:系统提示词
无论是消息截断还是压缩机制,系统在清理案板时都会给系统提示词开特权——System Prompt,通常装着核心人设和世界观。这就好比贴在案板最上方的一张“客人绝对忌口清单”。无论底下的聊天记录怎么清理,这张清单永远死死地钉在那里。这也是为什么,哪怕角色丢失了以前的情节细节,却依然能维持最初设定的语气。
四、注意力的分配不均:首因、近因与中部迷失
“好,既然如此,”你心想,“那我就用像 Claude Fable 5 这种拥有百万 token 上下文的模型!这样案板像广场一样大,不用丢聊天记录,也不用压缩丢失细节,它总该全记住了吧?”
现实依然残酷。斯坦福大学的研究者在 2023 年就揭示了长上下文模型的一个致命缺陷。随着模型窗口在近几年不断膨胀,这个缺陷不仅没有消失,反而变得更加值得关注。 面对超大号案板时,大厨的注意力分配呈现出一个极其规律的 U 型曲线。这种现象可以拆解为三个心理学/统计学概念:
1. 首因效应(Primacy Effect)
摆在案板最顶部的内容,会被模型视为“最高法则”。 一部分原因确实和训练数据有关——模型预训练读过的海量文章里,开头往往是标题、导语、核心论点。但更根本的原因藏在架构本身:Transformer 的注意力机制有一种叫"因果掩码"的设计,规定后面的词可以看到前面的词,但前面的词看不到后面的词。这意味着排在最前面的内容会被后面所有的词反复"注视",天然积累更多的关注度。 如果一段信息放在对话的最顶部,大厨会牢牢记住它,并用它来定下整道菜的基调。
2. 近因效应(Recency Effect)
摆在案板最末尾、紧贴着大厨手边的那句话,是直接的“当前刺激”。 模型的工作原理是预测“下一个词”。在人类写下的几乎所有文本里,下一个词都和它紧前方的内容关联最强,模型在训练中把这条规律刻进了骨子里。主流的位置编码在数学上也自带“随距离衰减”的倾向,让注意力天然偏向近处。因此,模型对文本的最末尾——比如你刚刚发出的那句话,或者夹在末尾的格式要求——有着极其敏锐的反应。
3. 中部迷失(Lost in the Middle)
这是最致命的盲区。当首因效应和近因效应瓜分了大部分的注意力权重后,堆在案板正中央的那一大盆杂乱配菜,就成了事实上的黑洞。
2023 年,斯坦福大学的研究者用一个巧妙的实验揭示了这一点。他们给模型一堆维基百科的文档片段,其中只有一段包含问题的答案,其余全是干扰项,然后调整那段"正确文档"在整个输入中的位置。论文中用的一个例子是问:
who got the first nobel prize in physics (谁获得了第一个诺贝尔物理学奖)
答案是威廉·伦琴,藏在其中一份文档里。实验结果令人震惊:
- 如果包含答案的文档放在最开头,模型准确率很高。
- 如果放在最末尾,准确率也很高。
- 但是,一旦把答案文档挪到中间位置,准确率就出现断崖式下跌。
更夸张的是,当答案放在中间时,GPT-3.5-Turbo 的表现甚至不如完全不给它任何文档、让它纯凭自己脑子里的知识闭卷回答。也就是说,模型宁愿无视眼前摆着的正确资料去瞎猜,也不愿意去读中间那段文字。
这个现象对任何基于文本生成的控制都是毁灭性的: 如果你把一段非常重要的约束条件,比如“请务必使用第二人称”,写在了一份长文档的正中间,当文本量稍大时,模型大概率会对这条设定视而不见,直接无视你的要求。
五、这对提示词工程意味着什么?
讲到这里,你已经看清了 Transformer 在上下文处理上的物理极限。 现在,你应该明白为什么我们在导言中说“提示词不是念咒语”了。
写提示词,本质上是在做一名案板规划师。 无论将来你使用什么样的工具,面对多强大的模型,只要你还在和基于 Attention 机制的架构打交道,你就必须遵循以下几条基于物理规律的底层法则:
- 寸土寸金的克制:既然信息密度会被稀释,那写提示词就绝对不是“越长越好”。把冗余的细节塞满案板,只会干扰大厨对核心食材的注意力。
- 位置决定命运:因为 U 型曲线的存在,你必须把长效的、全局的设定(如人物性格)放在最顶端;把即时的、强制的指令(如输出格式约束)放在最底端。把重要信息扔在中间,等于把它扔进了垃圾桶。
- 动态检索的必要性:面对海量的背景资料,不要一股脑地全部堆上案板。必须建立一种机制(如挂载外部知识库或触发词系统),让资料平时放在冰柜里(不占用窗口),只有当需要时,才精准取出摆上台面。
六、写给下一章
到这里,我们已经把大语言模型这台机器本身看了个通透—— 从七十年的来路,到 Transformer 的引擎内部, 从训练管线,到刚刚直面的记忆瓶颈与物理极限。
屏幕背后的那个大脑,对你而言已经不再是黑盒了。
但第一部还差最后一块拼图。 你已经理解了“一台”模型的原理,可今天你拉开模型列表, 看到的是几十个名字:GPT、Claude、Gemini、DeepSeek、Qwen…… 它们同宗同源,为什么会分化成如此庞大的家族? 闭源巨头和开源社区各自走过了怎样的路? 近两年火热的“推理模型”,又究竟是怎么一回事?
下一章,我们把镜头拉远,用一整章梳理 Transformer 诞生之后这九年的进化史。 看清一个模型是从哪条技术路线上走来的,你才能预判它的脾气、长处与边界。
要点回顾
- 无状态的本质:AI 是没有连续记忆的,它每次生成回复,都在把你发给它的所有历史记录重新“读”一遍。
- 记忆的分野:长期的知识固化在模型的“权重”(厨师的手艺)里;而短期的情境完全依赖于当前的“上下文窗口”(案板上的食材)。
魔咒:由于 Attention 机制的特性,文本越长,计算成本以平方级暴涨,信息密度也会被严重稀释。- KV 缓存:为了避免反复重算,模型会缓存每个 token 的 Key 和 Value 向量。这个缓存随上下文长度线性膨胀,常常成为显卡显存的头号杀手。
- 清理机制:当超出物理极限时,前端系统会丢弃最早记录(消息截断),或将其总结为摘要(上下文压缩),这解释了模型丢失细节的原因。
- U 型注意力曲线:即使窗口无限大,模型的注意力也集中在文本的开头和结尾,大量夹在中间的信息会被忽视。这个现象既有架构上的根源,也有训练数据分布的影响,无法靠单纯加大窗口来根治。
- 提示词法则的由来:控制信息量、精细排布提示词的顺序,是所有高阶 AI 交互必须掌握的基础。
参考文献
- Liu, N. F., Lin, K., Hewitt, J., Paranjape, A., Bevilacqua, M., Petroni, F., & Liang, P. (2024). Lost in the Middle: How Language Models Use Long Contexts. Transactions of the Association for Computational Linguistics, 12, 157–173. arXiv:2307.03172.
- Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N., Kaiser, Ł., & Polosukhin, I. (2017). Attention Is All You Need. In Advances in Neural Information Processing Systems (NIPS 2017), pp. 5998–6008. arXiv:1706.03762.
- Dao, T., Fu, D. Y., Ermon, S., Rudra, A., & Ré, C. (2022). FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness. In Advances in Neural Information Processing Systems (NeurIPS 2022). arXiv:2205.14135.