探针 5|为什么 AI 聊着聊着,就忘了你前面说的话

ClawLihai · · 共 1,298 字 · 约 4 分钟读完

探针 5 封面:AI 为什么会忘事——不是渐渐忘,是窗口装不下被挤掉

你跟 AI 聊多了,它就开始「忘事」

你大概撞见过:跟 AI 聊了半天,背景、需求、约束都交代了个遍,聊到后头,它忽然不记得你最开头说的那句话了。

你可能会想:它是不是像人一样,记忆会慢慢衰退?还是它「脑子不够好」?

这篇就挖这个。

先纠正一个误会:它不是「渐渐忘」,是「装不下被挤掉」

很多人以为 AI 像人,记忆随时间变淡。

不是。AI 的「记忆」是一个固定大小的窗口,叫上下文窗口(context window)——它一次能「看到」多少 token(对,又是 token,探针 2 讲过这个单位)。

窗口大小是固定的,比如某个模型是 20 万 token。你聊的内容,从最新的到最旧的,按顺序排在这个窗口里。一旦总长度超过窗口,最旧的内容就被挤出去了——一刀切,不是慢慢淡。

所以它「忘」的,不是最近的事,而是你最早说的那些。而且一旦超窗,是整段整段地丢,不是变模糊,是彻底看不见了。

上下文窗口是固定大小的管道:新内容进来,最旧的被一刀切挤出(FIFO),不是渐渐变淡

那 AI 怎么「记住」窗口里的内容?靠一个叫 KV Cache 的东西

那还在窗口里的内容,它怎么「记」着?这里有个关键机制,叫 KV Cache

先说一个反常识的点:模型其实不会「主动回忆」。它每生成一个字,都要把窗口里所有内容从头「看」一遍——这个「看」的动作,叫注意力(attention)。它具体在算什么,留到后面的总成篇专门拆。

每看一遍,要算的中间结果里,有两样东西行话叫 K 和 V。如果每生成一个字都从头算一遍前面所有的,太慢。所以模型把每个位置的 K、V 提前存起来,下次直接拿来用——这份缓存,就是 KV Cache。

有了它,生成新字的时候不用重算前面所有位置,快得多。这也是为什么 AI 处理你发的那一大段话,第一句会慢一点(行话叫 prefill 阶段,要一次性把所有 K、V 算出来填进缓存),后面就越答越快——缓存放那儿了。

KV Cache:每个位置的 K/V 存起来重复用,不用每次重算——所以第一句慢、后面快

为什么窗口不能开到无限大?因为记得越多,越烧钱

那干嘛不把窗口开到无限大,让它永远不忘?

因为「记得多」是有代价的,而且代价涨得特别快。

第一,KV Cache 占内存。窗口越长,要存的 K、V 越多,内存跟着涨。

第二,更要命的是注意力本身。窗口里的字,任意两个之间都要算一次关系(这才算彻底「看」过一遍)。1 个字没啥可算;100 个字两两算,是 100×100 = 1 万次;1 万个字,1 亿次——它不是线性涨,是平方涨。行话叫 (N 个字,算 N×N 次)。这里说的「字」是为了好理解,严格是按 token 算的。

这就是窗口不能无限大的根本原因:长度翻一倍,注意力的计算量翻四倍。开到几十万、上百万 token,算力和内存就爆了。所以窗口大小,是工程上硬卡出来的——不是 AI 不想记,是记不动、也记不起。

注意力计算量随窗口长度平方增长(N²):1 万字 = 1 亿次,所以窗口不能无限大

想亲手感受?打开 上下文窗口 · N² 演示:往窗口里加消息,看最旧的怎么被一刀切挤掉;再拖序列长度 N,看计算量怎么平方爆炸。

反直觉:AI 的「记忆」,和你想的完全不一样

讲到这,几个反直觉的点凑一块儿。

你以为 AI 像人,记忆有深有浅、会渐渐忘。其实它的记忆是个固定大小的窗口,超出就硬挤出去,没商量——不是衰退,是容量到了。

你以为它「记得牢」是因为反复强化。其实它每次生成一个字,都是把整个窗口从头「看」一遍算出来的,不存在「前面记得更清楚」这回事——窗口里的东西,它每个都看一遍,只是权重不同(相关的多看,不相关的几乎不看)。

你以为记得越多越好。其实记得越多,算得越久、越贵(那个 N²),所以窗口是被工程硬卡住的极限。

顺带这就解释了,为什么各家模型都在拼「长上下文」:谁能把窗口开得更大、还撑得住那个 N² 的代价,谁就能让 AI 记得更多、记得更久。这背后是大量硬核工程(怎么压缩、怎么稀疏、怎么堆硬件),是现在大模型竞争的一条主战线。

这根探针挖到了什么

一个「AI 怎么聊着聊着就忘事」的疑问,底下连着这些:上下文窗口(固定大小、用 token 计量、超出就挤出)、KV Cache(记住窗口内容的缓存)、还有注意力 N² 这个让窗口不能无限大的原罪。

这一趟,上下文窗口、KV Cache、N²、token 这些词,你都摸过了。以后再刷到,你大概就知道在讲哪一环。

下一篇,换个方向:只会处理文字的 AI,到底是怎么看懂一张图的?下回聊。

双击或滚轮缩放 · 拖动平移 · Esc 关闭