上下文窗口是什么:大模型这一次到底能看到多少内容
讲清上下文窗口包含什么、为什么会遗忘、长资料如何处理,以及 RAG 为什么要把相关片段放进上下文。
相关工具
上下文窗口就是模型这一次能看到的内容范围
和模型对话时,很多人会自然地以为它像人一样“记得刚才发生过什么”。这句话只对了一半。大语言模型在生成当前回答时,主要依赖当前输入里的内容。这个输入里装下的系统消息、用户问题、资料、历史对话和正在生成的答案,就是我们常说的上下文窗口。
LLM 全教程总结在聊天机器人章节里讲得很直白:每次和语言模型交互本来是独立的,如果希望模型引用早期交流,就必须把早期交流放进模型输入中。教程里有个例子,用户直接问“你能提醒我我的名字是什么吗”,模型不知道;但如果前面的消息里包含“Hi,我是 Isa”,并且这段消息被一起传入,模型就能回答名字是 Isa。
所以,上下文窗口不是长期记忆,也不是模型训练知识的完整展开。它更像一张临时工作台。工作台上有什么,模型就能看着什么回答;工作台外面的内容,即使你曾经发过,如果这次没有放进去,模型也不能稳定引用。

系统消息、用户问题、提供的资料、历史回复和正在生成的答案都会占用上下文,也都会影响当前输出。
上下文和训练知识不是一回事
模型训练时读过大量公开文本,这让它学会语言规律、常见事实、写作格式和推理模式。但训练知识不等于当前上下文。训练知识更像模型参数里压缩过的经验,当前上下文则是这一次明确交给模型看的材料。
这个区别很重要。你问“法国首都是哪里”,模型可以根据训练知识回答巴黎;你问“我们公司最新报销制度里交通补贴怎么写”,如果没有把制度文档放进上下文,模型就不该被当成知道答案。LLM 全教程总结在私有数据部分也提到,通用模型无法直接使用用户自身数据,也无法自动获得用户最新产生的实时资料。
很多幻觉问题就出在这里。用户以为模型知道某份资料,模型其实没看到;模型又擅长生成完整文本,于是容易补出一段像样但没有依据的回答。把训练知识和上下文分开看,才能知道哪些问题可以直接问,哪些问题必须先给资料。
系统消息、用户消息和助手回复会一起起作用
LLM 全教程总结讲 chat format 时,把消息分成不同角色:system、user、assistant。系统消息通常用于设定整体行为,比如“你是一个友好的聊天机器人”或“所有答复只能是一句话”。用户消息是当前问题。助手回复如果被继续放进输入,也会成为后续回答的上下文。
这就解释了多轮对话为什么能连起来。你第一轮说“我叫 Isa”,模型回复问候;第二轮问“你还记得我叫什么吗”,只要前面的用户消息和助手回复还在上下文里,模型就能从中找到名字。如果上下文里没有这段,它就不知道。
也正因为多种消息会一起起作用,写 Prompt 时要注意边界。系统消息里写的规则、用户粘贴的资料、历史对话里的旧说法,可能会互相影响。做正式任务时,不要把太多无关历史一起带进去。上下文越干净,模型越容易抓到当前任务。
窗口有限,长资料不可能无限塞
上下文窗口有 token 上限。第三篇已经讲过,Prompt 和 Completion 共享同一个预算。输入占用越多,留给输出的空间越少。这里再补一层:当资料超过窗口时,系统必须做选择。要么截断,要么压缩,要么只放最相关的部分。
这就是为什么长 资料、长网页、长日志不能随便整份丢给模型。资料看起来都在同一个文件里,但模型真正能看到的,只是当前窗口装得下的那一部分。如果开头塞了大量目录、页眉、版权说明、重复导航,真正有用的正文反而可能进不来。
处理长资料时,先清理,再切分,再按问题挑选片段。清理是删掉页码、页眉、无关导航和重复段落;切分是按章节、标题、语义边界拆开;挑选是只把与当前问题相关的内容放进上下文。这样比盲目追求更长窗口更稳。

窗口有限时,先清理噪声、按语义切分,再把聚焦后的内容交给模型,答案更容易围绕重点展开。
RAG 的本质是把相关资料放进上下文
知识库问答听起来像给模型加了一个大脑,其实更具体的理解是:先从资料库里检索相关片段,再把这些片段放进上下文,让模型基于资料回答。LLM 全教程里的 LangChain 部分讲 RetrievalQA 时,也是先由 retriever 找相关文档,再把文档拼进 prompt 的 context 位置。
这件事解决的是一个现实问题:模型不能把所有私有资料都永久记在当前窗口里。公司制度、产品手册、客服政策、资料 文档、会议纪要,都可以先存在外部资料库。用户提问时,系统只检索最相关的几段,放进上下文。模型不用凭空记住全部资料,只需要看着当前片段组织答案。
RAG 不是万能。检索错了,放进上下文的材料就错;资料过期了,模型也会基于旧资料回答;片段切得太碎,模型可能拿不到完整依据。但理解了“检索进上下文”这条主线,调试方向就清楚了:先看资料有没有进来,再看模型有没有按资料回答。

资料库保存大量文档,检索阶段只选出与问题相关的片段,再交给模型生成带依据的回答。
为什么模型有时会忘记前面说过的话
所谓“忘记”,很多时候不是模型情绪不稳定,而是上下文没有带上。对话越长,历史消息越多,占用的 token 越多。系统为了继续对话,可能会裁掉早期消息,或者用摘要替代原文。被裁掉的细节,模型就不一定还能准确使用。
还有一种情况是历史里有冲突信息。你一开始说要写一篇给新手看的文章,后面又粘贴了一段很专业的论文材料,再要求“保持原文风格”。模型可能在新手表达和论文风格之间摇摆。不是它不听话,而是上下文里存在多个方向。
解决办法不是每次都说“你还记得吗”,而是把关键事实重新放进当前任务说明里。比如“继续沿用上文目录,但这次只写第 4 节;读者仍然是 AI 入门用户;只参考我下面给的 资料 片段”。这比指望模型从长对话里自己捞线索更稳。
写长任务时要主动管理上下文
第一,重要要求放在靠近当前任务的位置。系统消息可以设规则,但具体任务、资料范围、输出格式最好在当前提示里再写清。第二,材料要用分隔符框起来,避免资料里的文字被模型误当成新指令。LLM 全教程提示工程章节也强调,分隔符能把指令、上下文和输入隔开,减少混淆。
第三,长资料按步骤处理。先让模型提炼目录,再写单篇文章;先抽取事实,再做表达润色;先让模型列出资料不足,再决定是否生成。第四,对需要追溯依据的内容,要求模型标注来自哪一段资料,或者在回答前先列出使用了哪些片段。
这些做法不复杂,但很管用。上下文窗口不是无限空间,而是一次任务的工作台。把工作台收拾清楚,模型就更容易做对事;把所有材料、历史、示例和要求都堆上去,它就容易在一堆信息里找错重点。
可以这样理解上下文窗口
如果要把上下文窗口讲给刚入门的人,可以这样说:模型每次回答前,会看到一包内容。这包内容里有系统要求、你的问题、你粘贴的资料、前面的对话,以及它正在生成的文字。这包内容有容量上限,超过了就必须裁剪或压缩。
它和人类记忆不一样。你昨天在另一个对话里说过的事,不会自动出现在今天这次输入里;你刚才发过的长资料,如果后面没有继续带上,也可能不在当前窗口里。模型不是故意忘,它只是没看到。
真正会用上下文的人,会做三件事:把关键资料放进来,把无关噪声拿出去,把长任务拆开。做到这三点,大模型回答会稳很多,RAG、长期记忆、Prompt 工程这些概念也会变得顺起来。
常见问题
上下文窗口是不是模型的长期记忆?
不是。上下文窗口是当前请求里模型能看到的内容。长期记忆需要额外保存、检索和写入机制,不能简单等同于上下文窗口。
为什么我前面发过资料,后面模型还会忘?
可能是对话太长,早期资料没有继续放在当前上下文里,也可能是系统做了裁剪或摘要。重要资料最好在当前任务中重新提供或检索进来。
上下文窗口越长越好吗?
不一定。长窗口能放更多内容,但无关材料也会增加噪声和成本。更重要的是清理、切分和只放相关概念。