大模型的上下文窗口是什么?这个限制的本质是什么?当对话或文档超出窗口时,有哪些常见的应对方案?
模型架构
口语版讲法(约2分钟)
- 一句话定义:输入输出共享的最大 token 额度
- 比喻:模型的工作台,放不下就往下挤
- 限制三层本质:平方计算量、位置编码、KV 缓存显存
- 超窗三招:截断、摘要压缩、RAG
- 埋钉子:窗口大不等于记得牢,Lost in the Middle
上下文窗口就是大模型一次推理最多能处理的 token 数量,注意是输入加输出共用一个额度。你可以把它想象成模型的工作台:桌面就那么大,系统提示、历史对话、你贴的文档、它要写的回答,全都得摊在这张桌子上,放不下就有东西被挤下去。 这个限制的本质有三层。第一,自注意力机制里每个 token 都要和其他所有 token 算一遍关系,计算量随长度平方增长,窗口翻倍,计算量差不多翻四倍。第二,位置编码,也就是让模型知道词序先后的机制,训练时只见过固定范围的长度,超出这个范围,模型对「谁在前谁在后」的感知就不可靠了。第三,推理时还有 KV 缓存,显存占用随长度线性涨,窗口开太大显存扛不住。所以窗口不是厂商故意抠门,背后是实打实的算力和显存代价。 超窗之后会发生什么?模型不会报错说「我记不住了」,而是最早的内容被悄悄截断,用户的体感就是聊着聊着,它把开头交代的设定忘了。应对方案主要三种。第一种是截断,直接丢最早的内容,实现最简单,但可能把关键信息丢掉。第二种是摘要压缩,每隔一段就把久远的对话总结成一小段摘要放回上下文,主干还在,细节没了。第三种是 RAG,也就是检索增强生成:把长资料切块存进向量库,每次提问时只把最相关的几块捞出来塞进窗口。这样资料本身可以无限大,窗口里永远只放当前需要的那部分。 实际做系统一般是组合拳:最近几轮对话保留原文,更早的滚动摘要,领域知识全部走 RAG。另外我还想补充一点,现在窗口越做越大,128K 甚至上百万,但研究发现窗口大不等于记得牢,模型对放在中间位置的信息利用率明显偏低,这个现象叫 Lost in the Middle。长上下文怎么外推、大窗口和 RAG 怎么取舍,是可以继续深挖的方向。
关键一句:上下文窗口是输入输出共享的 token 上限,本质是注意力平方计算量、位置编码范围、KV 缓存显存三重代价。
面试官可能的追问
- 【场景切入】用户要用你们的助手分析一份 300 页的合同,远超模型窗口,你会怎么设计,让它既能回答细节问题又不超窗?
- 【追问边界】现在有的模型窗口已经做到 1M token 了,是不是窗口够大就不需要 RAG 了?你怎么看这两者的关系?