Appearance
上下文与记忆:聊得越久,AI 为什么反而越糊涂
「跟着 AI 学任何东西」系列第 39 篇,「向 AI 学 AI」第 4 篇。前三篇讲了它怎么工作、为什么会胡说、以及怎么问它。这一篇讲一个你每天都在踩、但几乎没人解释过的坑。
⚠️ 本文不给任何具体的上下文窗口大小或性能数字——那类数字写下来就会过期。这里讲的是不会变的那部分:机制和它的后果。
一个几乎所有人都经历过的现象
对话刚开始的时候,它很聪明。聊到第三十轮,它开始前言不搭后语:你二十轮前明确说过的约束,它像没看见;你让它改的地方,它改回去了;你问它「我刚才说的那个方案」,它开始编。
大多数人的解释是「它累了」「它记性不好」。
真实情况更奇怪:
它根本没有记性——它每一轮都在把你们的全部对话,从头到尾重读一遍。
一、先纠正一个根本的误解:它是无状态的
你以为的过程是:模型记住了你们聊过的内容,在此基础上继续。
实际发生的是:
- 你发出一条新消息;
- 产品把之前的全部对话历史打包,连同这条新消息一起,送进模型;
- 模型从头读一遍,吐出下一段话;
- 然后把这一切忘得干干净净。
下一轮再来一次。
所以「记忆」这个功能根本不在模型里,它在产品层:是软件替你保存了历史,每次重新贴上去。模型自己从来不知道「上一轮」是什么——每一次,对它来说都是第一次读。
这个认识有一个可以验证的推论:同样一句话,你在第 30 轮问,比在第 1 轮问要贵得多、慢得多——因为它每次都得把前面 29 轮重读一遍。
这已经能解释一半现象了:不是它忘了,是那段历史根本没被给它。
二、为什么不能无限长:窗口,以及它的代价
模型一次能读进去的量有上限,这个上限就是上下文窗口。
为什么会有上限?核心在注意力机制:模型在理解一段文本时,要让每个词和其他所有词两两比对,以判断谁和谁有关。
n 个词,就是 n × n 次比对。
长度翻倍,计算量变成四倍。
这就是长上下文昂贵的根源。(业界有大量工程手段在缓解这一点,但「平方」这个基本形状,是理解「为什么长对话又慢又贵」的关键。)
一旦超出窗口,产品只能做两件事之一:把最老的内容丢掉,或者把它压缩成一段摘要。
无论哪种,你看到的都是同一个现象——它「忘了」。而准确的说法是:
它没有忘,它是没被给到。
三、更反直觉的一层:就算塞得进去,中间那段也会被忽略
上面两节还算符合直觉。这一节不。
Liu 等人做过一个很干净的实验(后发表于 TACL):把一段关键信息放进长上下文里,然后只改变它所在的位置,其他一切不变,测模型还能不能找到它。
结果是一条 U 形曲线:
- 放在开头 → 准确率最高
- 放在结尾 → 次高
- 放在中间 → 明显下降
而且还有一句更扎心的结论:上下文越长,整体表现越差——包括那些专门宣称支持超长上下文的模型。
这件事的含义很硬:
「我把资料都发给它了」不等于「它都看到了」。 塞进窗口只是必要条件,不是充分条件。
四、于是有四个能立刻改的动作
① 别死磕一个长对话,新开一个,把结论粘过去。 这是收益最大的一个动作。长对话不只是慢和贵,它在稀释注意力——你越往后聊,前面的关键约束越可能落进那个 U 形曲线的谷底。正确做法是:把当前已确定的结论、约束、目标整理成一段,开个新对话贴上去。
② 最重要的东西放开头或结尾。 尤其是你的核心指令。别把「必须用中文回答」「不要改动其他文件」这种硬约束,埋在一大段背景资料的中间。
③ 与其指望它「记住」,不如显式重述。 每隔一段,把当前目标、已确定的结论、不能碰的约束重新写一遍。这不是啰嗦——它是在把关键信息搬到「结尾」那个高准确率的位置上。
④ 长文档先摘要再提问,而不是整篇塞进去。 一次给它十万字然后问一个细节,正是这个机制最不擅长的场景。
五、⚠️ 三条边界
第一,本文不给任何具体数字。 窗口大小、长上下文的实际表现,各家一直在变,几个月就不一样。写下来的数字只会误导。
第二,「平方复杂度」是理解方向,不是当前性能的准确描述。 稀疏注意力、缓存复用等一堆工程手段都在改善它。你该带走的是「长上下文有真实代价」这个判断,不是某个具体的计算量。
第三,「中间被忽略」是在特定任务上测出来的(多文档问答、键值检索),说的是倾向,不是必然。不能推广成「AI 看不见中间的任何东西」——它只是更容易漏掉那里的东西。
收尾
把这个系列前四篇串起来看:
- 它是一台预测下一个词的机器;
- 所以它会自信地胡说;
- 所以换个问法,答案能好十倍;
- 而现在还要加一条:它的注意力是有限的,而且分布不均匀。
它不是一个记得你的人,是一个每次都从头重读、而且读得不均匀的读者。
你能做的,是把最重要的话,放在它一定会读到的地方。
附:这次我是怎么问 AI 的
- 先问「这个现象的机制是什么」,而不是「怎么解决」。 直接问「怎么让 AI 记住更多」,只会得到一堆技巧。问「它到底记不记得住」,才问出了「无状态 + 每次重读」这个真正的地基——而所有技巧都是从这个地基上推出来的。
- 追问「那为什么不能做得更大」。 这一问从产品层掉到了机制层:平方复杂度。遇到任何「为什么有上限」,都值得追一句「上限是被什么定住的」。
- 专门去找反直觉的实验结果。 我问了一句「有没有那种『看起来应该行、实测却不行』的发现」——问出了 lost in the middle。这是全篇最实用的一节,而顺着「窗口有多大」问永远问不到它。
- 写完之后,把结论倒推成我明天就会改的动作。 四条动作里最值钱的是第一条(新开对话),而它不是从知识里直接读出来的,是从「注意力被稀释」这个后果倒推出来的。
参考来源
- Liu NF, Lin K, Hewitt J, Paranjape A, Bevilacqua M, Petroni F, Liang P. Lost in the Middle: How Language Models Use Long Contexts. Transactions of the Association for Computational Linguistics, 2024;12:157–173.(多文档问答与键值检索两类任务;性能随关键信息位置呈 U 形,开头最高、结尾次之、中间最低;且随上下文变长整体下降,长上下文模型亦然)
- 自注意力机制中每对 token 两两计算,复杂度随序列长度呈平方增长:Transformer 架构的标准性质。
- 「模型无状态、对话历史由产品层每轮重新提交」:当前主流对话式产品的通用实现方式。
本文不涉及任何具体产品的参数与性能指标;相关数字变化很快,请以各家最新文档为准。