大模型底层原理 · 可视化讲解

大模型为什么
"记不住事"?

你上一句刚说过的话,下一轮对话它就忘了;你喂给它的秘密,换个窗口它一无所知。 这不是它"笨",而是 Transformer 的推理架构天生是无状态的。 下面从原理一层层拆开:为什么它没有记忆、它"记得"的到底是什么、以及真要记忆该怎么办。

第 1 步 · 先纠正一个常见误解

大模型不是"没有记忆",
而是没有「跨调用的情景记忆」

准确说法很重要:模型其实"记得"两类东西,只是都不叫"你的对话记忆"。

① 参数记忆
训练时烧进权重的通识。它"知道"北京是中国首都,但这是群体知识,不是"你的事"。
② 上下文记忆
本次输入窗口里能看到的内容。你这一轮把历史贴进来,它才"看得见"。
③ 情景记忆 ✗
"你上次说讨厌香菜""咱们上周的约定"——这种跨会话的专属记忆,它天生没有。
人的记忆 长期记忆(可跨天) 语义/事实 情景/经历 工作记忆 ✓ 自动保留、跨会话 大模型的"记忆" 参数记忆(权重) 通识/语言规律 上下文记忆(窗口) 本轮输入内容 ✗ 情景记忆:无 训练时写入 训练阶段 一次性烧入 推理时冻结 → 不再改变 权重 = 只读
图 1:人会"自动记住经历",大模型只有「只读的权重」+「一次性的窗口」,没有可写的情景记忆
一句话记住:大模型有"知识",没"回忆"。它能说出"巴黎在法国",却不会记得"你昨天告诉我你住在巴黎"。
第 2 步 · 推理的本质

一次对话 = 一次「纯函数调用」

把所有"智能"的背后化简,大模型每次回答做的,只是一个输入→输出的映射:

next_tokens = f(prompt_tokens,  固定的模型权重 W)

注意右边没有"记忆变量"。f 是个无状态函数:同样的输入,永远得到同样的输出(在温度=0时);它不读取、也不写入任何跨调用的状态。模型权重 W 在推理期间是只读的。

✗ 有状态系统(人会)

第 2 次调用时,系统里还存着第 1 次的记忆:

state₂ = step(state₁, input₂)
state₃ = step(state₂, input₃)
…记忆随调用不断累积

✓ 大模型(无状态)

每次调用彼此独立,没有 state 链路:

out₂ = f(input₂, W)
out₃ = f(input₃, W)
…两次调用互不知道对方
调用 ① 输入 A 输出 a 状态:∅(空) 调用 ② 输入 B 输出 b 状态:∅(空) 调用 ③ 输入 C 输出 c 状态:∅(空) 三次调用彼此隔离,谁也不认识谁
图 2:无状态推理——每次调用都从"空白状态"开始,调用间不共享任何记忆
这也解释了为什么你"新开一个会话"它就全忘了:所谓"会话",只是你这边把历史重新拼进下一次请求的 prompt 里而已。模型自己从没"存"过。
第 3 步 · 一次调用的生命周期

回答完,整个"工作台"就被清空了

哪怕在同一次调用内部,模型也只处理你这次送来的 token。调用一结束,它的临时计算缓存(KV Cache)立刻被丢弃,什么都不留。

① 收 prompt分词+编码 ② 注意力计算只看见窗口内 ③ 自回归生成逐 token 输出 ④ 调用结束KV Cache 丢弃 之后无残留 ⚠ KV Cache(键-值缓存): 为加速注意力而临时存的中间结果,调用一结束立即释放, 不是"记忆",下次调用不复用。 单次调用的时间线 →
图 3:一次推理的 4 个阶段——临时缓存随调用结束而销毁,没有"事后留存"
看见的
仅本次窗口内的 token:系统提示 + 你给的历史 + 当前问题。
算的
注意力只在"这一批 token"之间流动,窗口外的内容对它完全不存在。
留的
什么都没留。输出返回给你,模型侧的临时状态被清空。
第 4 步 · 架构层面的根因

三个设计,决定了它"记不住"

① 权重在推理时是只读的

模型"懂什么"全写在几十亿~万亿个参数(权重)W 里,这些参数是训练阶段算出来的。推理时为了稳定和高效,权重被冻结——模型没有"写入自己"的通道。要改它,只能离线重新训练/微调,而不是"顺手记住你这句话"。

② 注意力只作用于"当前这一批 token"

Transformer 的 Self-Attention 计算的是:当前输入序列里,每个词对其他词的关联。它没有指向"过去对话"的指针。你不在输入里放历史,历史对它就是"不存在"。

本次上下文窗口(模型唯一能"看见"的范围) 系统提示 对话历史(你贴进来的) 当前问题 生成回答 更早的对话 (未放进窗口) → 对模型不可见
图 4:注意力只覆盖窗口内;窗口外的内容(哪怕你昨天说的)对模型完全不可见

③ 自回归生成:没有"边聊边存"的环节

模型是一个词一个词往外蹦(自回归)。每生成一个词,它只看"已生成的 + 输入的"。生成完,调用结束——没有一步是"把这次对话写进某处"。记忆这个动作,从架构里就不存在。

小结:如果说"记忆 = 把信息写入某个可长期读取的存储",那么大模型的推理路径里根本没有这个写入环节。它生来就是一个"只读 + 一次性计算"的机器。
第 5 步 · 那为什么不干脆"内置记忆"?

不是不能,而是"无状态"更划算、更安全

其实工程上完全可以给模型加记忆模块,但主流推理 API 故意做成无状态,是有道理的:

✓ 无状态的好处

  • 可水平扩展:任意请求可派给任意空闲实例,无需绑定"记住你"的那台机器。
  • KV Cache 复用:相同前缀的对话可复用缓存,大幅提速。
  • 多租户隔离:每个请求相互独立,天然避免串味/泄露。
  • 可复现 & 易调试:给定输入输出确定,便于排查。

✗ 若强行"内置记忆"的代价

  • 灾难性遗忘:在线改权重会覆盖旧知识。
  • 隐私/合规风险:把用户对话写进共享模型,易串号泄露。
  • 成本爆炸:为每个人永久改千亿参数,不现实。
  • 失去无状态优势:无法自由调度、缓存、复现。
所以"没有记忆"更像一个工程取舍:把"记忆"从模型内部剥离,交给外部系统(数据库、向量库、文件、会话管理服务)去做——这反而更灵活、更可控、更便宜。
第 6 步 · 真要记忆,怎么办?

记忆 ≠ 改模型,而是"外部化 + 重新喂回"

实用方案都是在模型之外存状态,再在每次调用时把相关状态拼回 prompt。常见三类:

① 历史重注入
把多轮对话存起来,下一轮把历史整段贴回 prompt。最简单,但受窗口长度限制。
② RAG / 检索
把知识存向量库,用时只取最相关的几段塞进窗口。适合"记很多外部知识"。
③ 摘要 / 长期档案
定期对历史做摘要或抽取事实,存成"用户画像",需要时读回。适合"记住你是谁"。
外部记忆库 数据库 / 向量库 文件 / 用户画像 (跨会话留存) 检索相关记忆 filter/top-k 拼回 prompt + 系统/历史 模型 f(·,W) 新对话写回存储
图 5:实用记忆方案——记忆存于模型之外,调用时"检索 → 拼回 prompt → 新内容再写回"
记忆类型存在哪跨会话?典型实现
参数记忆模型权重 W✓(但人人共享)预训练 / 微调
上下文记忆本次 prompt 窗口✗(仅本轮)把历史贴进消息
外部记忆数据库/向量库/文件✓(按用户隔离)RAG、会话服务、用户画像
收尾 · 一句话带走

所以,大模型"记不住"的真相

大模型不是没有记忆,而是没有"可写的、跨调用的情景记忆"。 它的"知识"被冻结在推理时只读的权重里,每次回答都是一次无状态函数调用, 只看得见你这次塞进窗口的内容;调用一结束,临时缓存就清空。 所谓"对话记忆",其实是你(或你的应用)在模型之外把历史存好、下一轮再喂回去—— 记忆从来不在模型脑子里,而在模型外面。