图 1:本文封面,点明主题「上下文窗口:大模型的短期记忆限制与任务拆解」。
先看一个常见场景。你让 AI 帮你写一份两万字的行业报告。开头两章像模像样,写到第四章,它开始重复第一章的观点,你半小时前定下的格式要求也被丢得一干二净。你以为是模型「变笨了」,其实它只是「忘了」——它根本看不见那么长的前文。
核心结论一句话
大模型每生成一个字,能参考的内容总量是有上限的,这个上限叫上下文窗口;超出窗口的旧内容会被截断丢弃。而且多数模型还有一个小得多的单次输出上限。想让 AI 写长文,正确姿势不是「一口气写完」,而是先拆提纲、再分段生成、最后拼接。
先认识两个数字
上下文窗口按 token 计量,可以粗略理解为模型一次能「看到」的文本总量,你的提问、对话历史、粘贴的资料、模型的回答全部算在里面。以当前官方文档为准:OpenAI 模型文档列出的现役主力模型,上下文窗口约 105 万 token,单次最大输出 12.8 万 token;Anthropic 的 Claude 系列,主力模型窗口 100 万 token,最快的 Haiku 4.5 为 20 万 token,单次最大输出 6.4 万到 12.8 万 token。
注意两组数字的差距:能「看」一百万,不代表能「写」一百万。输出上限往往只有窗口的十分之一左右。更别说多数对话产品的实际单次输出远小于这个理论值,常见的稳定输出只有几百到一两千字。这就是为什么「帮我写十万字」这种指令注定失败。
为什么会「失忆」
当对话或文档总长度逼近窗口容量,最常见的处理是把最旧的内容挤出窗口。模型没有外置记忆,被挤出去的内容对它而言就等于不存在——于是开头定的规矩忘了,前面写过的观点又写了一遍。这不是质量问题,是容量问题。
还有一种更隐蔽的「失忆」:即使内容仍在窗口以内,模型对长上下文不同位置的利用也并不均匀——开头和结尾的信息通常比中间段落更容易被用上。所以关键约束(格式、字数、口径)不能只在前文出现过一次就放心,值得在每轮请求的显眼位置重申。
窗口是怎么被做大的
窗口不是天生这么大。主流模型普遍采用旋转位置编码(RoPE):用旋转矩阵把位置信息注入注意力计算,让模型对序列长度有灵活的适应能力,这一机制出自 RoFormer 论文,已被广泛集成。另一个思路是滑动窗口注意力:Mistral 7B 论文用它让每个位置只关注邻近的一段上下文,以更低的推理成本处理长序列。这些技术把窗口从几千推到几十万、上百万 token,但窗口再大也是有限的,成本也随之上涨。可以粗略理解为:注意力计算的代价随序列变长而显著增长,窗口每扩大一档,计算与显存的压力都不止一档——大窗口是买来的,而且越买越贵。
图 2:上下文窗口的限制与多级提纲拆解策略:每一轮生成都控制在窗口以内。
长文的正确写法:多级提纲拆解
既然单次输出有限,就把大任务拆成一串小任务:先让模型只写总提纲;再针对每一章,分别生成章节提纲;然后逐节生成正文,每次只喂相关的章节提纲和必要的背景;最后拼接成稿、统一润色。每一轮请求的输入输出都远在窗口以内,质量自然稳定。同样的思路也能解别的容量难题:示例太多装不下时,可以拆成两个模型分工——一个先提炼判断标准,另一个拿标准去做判断。
三个常见误区
误区一:窗口大就等于记得牢。接近容量上限时,模型对中间段落的利用会明显变差,关键要求值得在结尾重申。
误区二:把整本书塞进去就不用拆了。窗口再大,单次输出上限还在,长文依然要拆。
误区三:拆完直接拼。分段生成的内容风格、术语难免漂移,最后一轮通读润色不能省。
给你的行动建议
下次写长文,先试三级拆解:总提纲、章提纲、逐节正文。每开一轮新对话,把「当前章节目标、字数、格式、前后章节摘要」四项写进开头。坚持几次,你会得到一套自己的长文生产流水线。
你用 AI 写过最长的内容是多少字?它在哪一段开始「失忆」或重复的?欢迎分享你的经历。
参考资料
- Models(OpenAI 官方文档:现役主力模型上下文窗口约 105 万 token、单次最大输出 12.8 万 token) — https://developers.openai.com/api/docs/models
- Models overview(Anthropic 官方文档:Claude 主力模型上下文窗口 100 万 token、Haiku 4.5 为 20 万 token,单次最大输出 6.4 万至 12.8 万 token) — https://docs.anthropic.com/en/docs/about-claude/models/overview
- RoFormer: Enhanced Transformer with Rotary Position Embedding(RoPE 原始论文:旋转位置编码以旋转矩阵注入位置信息、使序列长度灵活适应) — https://arxiv.org/abs/2104.09864
- Mistral 7B(滑动窗口注意力出处:以更低推理成本处理长序列) — https://arxiv.org/abs/2310.06825
- Lost in the Middle: How Language Models Use Long Contexts(Liu et al. 2023,arXiv:2307.03172,长上下文中相关信息位于开头或结尾时模型表现最好、位于中间时显著下降) — https://arxiv.org/abs/2307.03172