1. 背景:大模型的“记忆幻觉”
很多人以为,GPT-4、Claude、DeepSeek 这种动辄数百亿参数的大模型,拥有“无限记忆”,输入多少内容都能完整掌握。
但事实是:
👉 大模型处理信息依旧依赖滑动窗口机制。
所谓滑动窗口,就是模型在一次计算中 只能看到一段有限的上下文。随着新的内容不断进入,最早的部分会被逐步淘汰。
这就像人类的短时记忆:
-
你能记住眼前对话的几句话
-
但如果内容不断推进,早前的细节就被遗忘
-
除非写下来,或通过“笔记/提示”反复提醒
对于 LLM 来说,“写下来”就是外部工具,“遗忘”就是滑动窗口的自然产物。

2. 原理:滑动窗口是怎么来的?
2.1 Transformer 的注意力机制
现代大模型(GPT 系列、LLaMA、Qwen、Mistral)大多基于 Transformer 架构。
Transformer 的核心是 自注意力(Self-Attention),它要计算每个 token 与上下文中所有其他 token 的关系。
如果序列长度是 N,则计算复杂度是:
O(N²)
也就是说:
-
输入 1,000 个 token → 需要 100 万次注意力计算
-
输入 100,000 个 token → 需要 100 亿次注意力计算
当 N 很大时,计算和显存消耗呈 平方级爆炸,这让“无限上下文”几乎不可能。
2.2 滑动窗口的工程折中
为了控制计算开销,模型在实际应用中采用 滑动窗口 (Sliding Window):
-
设定一个最大长度(如 4K、8K、32K、128K token)
-
新输入进入时,超出窗口的旧内容被截断
-
模型只在窗口范围内做注意力计算
示意图:
graph LR
A[输入: token1...token4000] -->|窗口满| B[窗口 4K 大小]
B --> C[新 token 进入]
C --> D[旧 token1 被淘汰]
D --> E[窗口依旧保持 4K 长度]
这意味着:即便你输入一本完整的书,模型也只能看到其中的一部分,其余部分被遗忘。
2.3 长上下文模型的改进思路
近年来,研究者提出了一些方法缓解滑动窗口的限制:
-
稀疏注意力(Sparse Attention):只计算部分 token 的依赖关系,例如 Longformer、BigBird。
-
分块注意力(Chunking):将序列分成若干小块,再跨块总结,例如 MPT、Claude 的长上下文。
-
位置编码改进:使用 RoPE、ALiBi 等方法,使模型在更长的序列上仍能保持有效注意力。
-
外部记忆机制:结合数据库、向量检索,把窗口外的信息以“检索补充”的方式喂给模型(典型应用就是 RAG)。
但即便如此,窗口依旧是有限的。目前最强的 Claude 3.5 Sonnet 虽然支持 200K token,但和“无限记忆”还是有差距。
3. 实践:滑动窗口的限制如何影响应用?
3.1 长文档总结
假设我们要用 GPT 处理一本 50 万字的小说,窗口只有 32K token(约 2.5 万字)。
直接丢进去 → 超过窗口长度 → 前半本书会被遗忘。
解决方法:
-
分块 + 总结:先把小说切成章节,分别总结,再做二次汇总。
-
检索增强生成 (RAG):建立向量索引,模型只检索相关片段。
3.2 对话上下文遗忘
在多轮对话中,用户常常发现:
“为什么模型忘了我前面说过的话?”
这是因为 对话轮次超过窗口长度,最早的几轮被截断。
实际体验:
-
窗口 4K → 只保留最近几页对话
-
窗口 200K → 可以保留几百轮,但依旧不是无限
工程上常见的解决方案:
-
会话记忆池:把早期对话存到数据库,需要时再检索
-
压缩记忆:用模型生成“对话摘要”,替代原始长文本
3.3 代码场景:窗口模拟
我们可以用 Python 模拟一个 4K 窗口的文本输入:
class SlidingWindow:
def __init__(self, size=4096):
self.size = size
self.tokens = []
def add(self, token):
self.tokens.append(token)
if len(self.tokens) > self.size:
self.tokens.pop(0) # 淘汰最旧的
return self.tokens
# 模拟输入
window = SlidingWindow(10) # 用 10 代替 4096
for i in range(15):
print(window.add(f"token_{i}"))
输出结果表明:当 token 超过窗口容量,最早的内容会被自动删除,始终维持固定长度。
这与大模型的上下文窗口完全一致。
4. 对比:滑动窗口与“长期记忆”
| 机制 | 特点 | 优点 | 缺点 |
|---|---|---|---|
| 滑动窗口 | 固定长度 | 简单、直接,推理快 | 容量有限,旧信息被遗忘 |
| 向量检索 (RAG) | 外部数据库存储 | 能扩展“无限知识” | 检索质量决定效果 |
| 记忆压缩 | 生成摘要替代原文 | 节省窗口 | 可能丢失细节 |
| 混合方案 | 窗口 + 检索 + 压缩 | 综合平衡 | 工程实现复杂 |
目前大模型普遍采用 混合记忆:
-
最近对话放窗口
-
历史信息放数据库
-
需要时检索补充
这就是我们常说的 “上下文管理”。
5. 图示:滑动窗口信息流动
flowchart TD
A[新输入 token] --> B[加入窗口]
B --> C{窗口是否超限?}
C -- 否 --> D[保持内容]
C -- 是 --> E[删除最旧 token]
E --> D
D --> F[模型做注意力计算]
可以看到,窗口始终是 固定大小的容器,超出容量的部分会被“遗忘”。
6. 总结与升华
即使在 2025 年,大模型依旧依赖滑动窗口来处理信息。
-
这是工程与计算的必然结果:注意力复杂度 O(N²) 决定了序列不可能无限扩展。
-
窗口是短时记忆,而 长期记忆必须依赖外部工具:RAG、数据库、知识图谱。
-
这不是缺陷,而是架构选择:通过窗口+检索+压缩的组合,大模型才能在有限算力下高效运行。
就像人类一样:
-
我们的大脑短时记忆容量有限(7±2 个元素)
-
但我们通过 笔记、文档、知识库 来延伸长期记忆
所以,当你和 GPT 或 Claude 聊天时,它“忘记”前面对话,并不是智商问题,而是 窗口淘汰机制在发挥作用。
未来可能的突破方向:
-
更高效的注意力算法(O(N log N) 或 O(N))
-
原生长期记忆机制,让模型无需依赖外部数据库
-
混合推理架构:窗口处理短时上下文,长期记忆交给符号系统
📚 推荐阅读
3761

被折叠的 条评论
为什么被折叠?



