把黑箱拆开:手搓一个大语言模型 书架

第 12 章 / 共 16 章

第十二章 · 它到底记不记得住:上下文窗口与'记忆'

你和一个大模型聊了两个小时,它把你的名字、你的项目、你随口提过的过敏史都记得清清楚楚。你合上电脑,第二天打开新窗口问它:"我昨天说我对什么过敏来着?"它一脸茫然。你会觉得:它怎么突然失忆了?

真相更扎心一点:它从来没记住过任何东西。昨天那个"记得",是假象。今天这个"失忆",才是它的常态。这一章我们就来拆开这个最容易骗人的幻觉——大模型到底有没有记忆。

它每次都是"失忆症患者重读纸条"

先说结论,再解释。你可以把大模型想象成电影里那种得了顺行性失忆症的人:每隔几秒钟记忆就清零,什么都留不住。为了正常生活,他随身带一张纸条,把重要的事全写在上面。每次要做决定前,他做同一件事——从头到尾把整张纸条读一遍,然后根据纸条上的内容行动。行动完,记忆又清零了。下一次,再从头读一遍。

大模型就是这个人。那张纸条,就是你和它的整段对话。

你以为的对话是:它坐在那儿,听你一句句说,脑子里慢慢积累起对你的印象。
实际发生的是:你每发一句话,系统就把之前所有的对话内容 + 你这句新话打包成一大坨文字,整个塞给模型;模型从零开始把这一大坨读一遍,算出下一个词,吐出来。它脑子里没有"上次",只有"这一坨"。

回想第一章我们反复讲的那件事:大模型唯一在干的,就是"看着前面一串词,猜下一个词"。它猜词的唯一依据,就是当下喂给它的这串词。这串词有多长,它的"视野"就有多宽。超出这个范围的东西,对它来说等于不存在——不是忘了,是压根没进它眼睛。

那张纸条有多长:上下文窗口

这张纸条的长度是有硬上限的。这个上限,就是本章的主角。

上下文窗口(context window),说白了就是"模型一次最多能看多少个词"。超过这个长度的内容,要么塞不进去被拒收,要么最前面的部分被挤出去、直接扔掉。它不是一个软软的"记忆越久越模糊",而是一刀切的硬边界:窗口内的,一视同仁地清清楚楚;窗口外的,彻彻底底地不存在。

更准确地说,窗口的计量单位不是"词",而是我们第二章讲过的 token(词元)——就是把文字剪碎后的那些小积木块,一个 token 大约是一个英文单词的一部分,或者一个汉字。所以上下文窗口的真实含义是:模型一次最多能吞下多少个 token。

这个数字这些年涨得很凶。早期的 GPT-3 大约是 2000 个 token 出头;后来的模型普遍到了几万;到今天,主流大模型的上下文窗口大多在十几万到二十万 token 这个量级,也有号称能到上百万 token 的。二十万 token 大概是什么概念?差不多是一本几百页的长篇小说的体量。听起来很大,但请记住关键点:再大,它也是个有限的、会满的、满了就往外挤东西的框。

为什么不能无限长?因为算力会爆炸

你可能会问:既然窗口越长越好用,为什么不干脆做成无限长?答案不在于"技术还没跟上"这种含糊的话,而是一个很硬的物理账。

问题出在第五章那个心脏——注意力(attention)机制上。注意力的核心动作,是让窗口里的每一个词,都去和其它每一个词互相看一眼、算一个关联分数。这是它能理解上下文的根本原因,但代价也藏在这里:如果窗口里有 N 个词,那么"每个词看每个词"的组合数,就是 N 乘以 N。

窗口翻一倍,词数从 N 变成 2N,注意力要算的关联数不是翻倍,而是变成原来的四倍(2N × 2N = 4 × N²)。窗口涨十倍,计算量涨一百倍。这就是所谓的"平方级增长"——长度线性变长,成本却像滚雪球一样往上翻。

这就是为什么上下文窗口是个要花真金白银去买的稀缺资源。它不是免费的,越长越贵,而且贵得不成比例。你每多喂一句话进去,模型下次"重读纸条"时就得多读一遍,成本实打实地增加。理解了这个平方级的账,你就理解了为什么长文档、长对话会明显变慢变贵——不是错觉,是数学。

"记性"的两种破法,和它们的真面目

那问题来了:既然它每次都失忆、纸条又会满,为什么现在的产品用起来好像"越用越懂你"、能记住你上个月说过的话?

因为工程师在模型外面动了手脚。这里要澄清一个关键区分:模型本身没有记忆,"记忆"是外面套的一层工程。常见的破法有两类:

看穿这两招,你就看穿了所有"AI 有记忆"的产品:它们无一例外,都是在想办法往那张有限的纸条上,写上最该被读到的东西。没有一个是让模型自己"记住"了。模型永远是那个失忆患者,区别只在于——递给它的纸条上,写了什么。

为什么这件事值得你较真

因为搞不清这一点,会让你对大模型产生两种相反的误判。

一种是高估:以为它像人一样,聊过就懂你、有个持续成长的"它自己"。没有。关掉窗口,那个"懂你的它"就不存在了——下一次是一个全新的、只会读眼前纸条的陌生人。它没有连续的自我,每一次回答都是一次从零开始的现算。

另一种是低估用错:不理解窗口有硬边界,于是奇怪为什么它会"忘"掉你三万字之前提的要求,或者在超长文档里丢三落四。现在你知道了:那不是它偷懒,是那部分内容被挤出了它的视野,或者虽然在窗口里、但淹没在太多词中间,注意力没分够给它。

一个能立刻上手的直觉:想让它记住什么、按什么规则做事,别指望它"记得",而要确保这些内容就在当前这段对话里、离得别太远。重要的指令放靠后、放显眼,比放在三万字之前更管用。因为它眼里只有纸条,你能做的就是帮它把重点写在纸条的好位置上。

所以本质上,它就是……

一个每次都从零开始、把整张纸条重读一遍的失忆患者。它没有昨天,没有记性,也没有一个在时间里连续存在的"自己"。你感受到的所有"它记得",都是有人(工程师,或者正在打字的你)把往事重新写进了它眼前那张有长度上限的纸条。

纸条读完,它就干净了,仿佛什么都没发生过。

可这里藏着一个更深的问题:既然它每次都只是照着眼前的纸条现算、没有记忆也没有连续的自我,那它到底是"真的理解"了纸条上的意思,还是只是一个极其高明的模仿者,把该出现的词恰好摆在了该出现的位置?这,正是下一章我们要正面硬刚的事。

把黑箱拆开:手搓一个大语言模型 · 王建硕
面向对世界有好奇心的人 · 费曼式写法 · 由多个 AI 代理撰写与互相审校