🧠 大模型记忆全景
从「中间丢失」到认知科学,再到 Agent 记忆工程——三篇文章的抽象总结与绘声绘色的解读
✦ 本文目录
一个尴尬的事实:模型会「中间丢失」
你给模型塞了 20 篇文档,答案就在第 10 篇里——结果它偏偏答错了。这不是个例,而是一个普遍规律。
问题发现2023 年,Stanford 的研究者做了一个实验:给大模型一篇问题 + N 篇文档(只有 1 篇含答案),然后改变答案文档的位置。结果发现了一条 U 形曲线——答案放在开头或结尾时,模型答得很好;放在中间时,性能断崖式下降。
性能
↑
██ ██
██ ██
██ ██
██ ██
████ ████
████ ████
██████████████████████
└──────────────────────────────────────→ 信息位置
开头 中间 结尾
U 形曲线:开头和结尾好,中间差
更扎心的是几个后续发现:
• 更大的上下文窗口没用——GPT-3.5 的 16K 版本和 4K 版本表现几乎一样,窗口大了不代表用得好
• 更大的模型也没用——GPT-4 绝对性能更高,但 U 形退化模式一模一样
• RAG 检索文档从 20 篇增到 50 篇,性能只提升 ~1.5%——塞得越多,噪声越多,模型反而更迷茫
• 指令微调不能消除偏差——绝对性能提升,但 U 形依然存在
为什么会这样:注意力偏差与 Attention Sink
问题找到了,根因呢?两篇后续论文分别从「注意力偏差」和「数学本质」两个层面给出了答案。
根因分析根因一:U 形注意力偏差
2024 年,University of Washington 的研究者发现:模型存在内在的 U 形注意力偏差——无论内容是否相关,模型天然对开头和结尾的 Token 赋予更高的注意力权重,对中间的注意力显著降低。
= 内容相关性 + 位置偏差
真实内容相关性被掩盖
实际注意力 − 位置偏差 = 真实相关性
他们提出了一个不需要训练的校准方案:先在空白内容上测量纯位置导致的注意力分布,再从实际注意力中减去这个偏差。结果中间位置的性能提升了约 9 个百分点,Recall@3 比已有方法高出 48 分。
核心洞察:模型其实有能力注意到中间的内容,只是位置偏差淹没了它。就像一个人在嘈杂的酒吧里——他不是听不见你说话,是背景噪音太大盖住了你的声音。校准就是降噪。
根因二:Attention Sink——第一个 Token 是「垃圾桶」
2024 年 ICLR 上,MIT 和 Meta AI 的团队揭示了一个更底层的现象:Attention Sink(注意力汇)。他们发现,在绝大多数层和注意力头上,模型给序列开头的几个 Token 分配了极高比例的注意力——常常超过 50%——无论这些 Token 的语义是否重要。
为什么会这样?因为 SoftMax 的数学约束:注意力分数之和必须等于 1。即使当前的 query 和绝大部分 Token 都不相关,模型也必须找一个地方「倾倒」多余的注意力概率。而序列开头的 Token 对所有后续 Token 始终可见(自回归特性),所以它们最容易成为「注意力倾泻口」。
\n(换行符),模型依然死死盯着它们——关注的是位置,不是内容。就像一个人进门就盯着门口的垃圾桶看,不管垃圾桶里装的是什么。
基于这个发现,他们提出了 StreamingLLM 方案:保留开头的 4 个「Sink Token」不动,后面用滑动窗口只保留最近的 Token。这样模型可以处理超过 400 万个 Token 的超长序列,速度比传统方法快 22 倍。
三篇论文的内在关联
三篇论文构成了「问题发现 → 根因分析 → 工程方案」的完整闭环。从「模型在中间表现差」到「因为 SoftMax 必须把注意力倒掉」,一层层挖到了数学本质。
借镜认知科学:人类的记忆是怎么工作的
模型有「中间丢失」的问题,人类有吗?人类是怎么记住事情的?认知心理学早在 60 年前就给出了答案——而 AI Agent 的记忆架构,几乎是一比一地搬运了这些理论。
理论溯源理解认知科学不是为了学术正确,而是为了避免重蹈认知科学已经走过的弯路。下面四个经典理论,构成了 AI Agent 记忆架构的理论地基。
Atkinson & Shiffrin 多存储模型(1968)→ 存储层级
人类有三种结构上分离的记忆:感觉记忆(0.5 秒,刚看到的画面)→ 短期记忆(20-30 秒,当前在想的事)→ 长期记忆(永久存储)。AI 对应:Embedding 层(感知编码)→ Context Window(工作记忆)→ 向量数据库 + KV Store(长期存储)。LangGraph 的 Checkpointer / Store 两层架构就是直接照搬这个模型。
Tulving 情景 vs 语义二分法(1972)→ 记忆分类
Tulving 把长期记忆一分为二:情景记忆是「我记得我去过巴黎」(有明确时间标签,像日记)——对应 AI 的 Episodic Store(向量 DB + 时间戳);语义记忆是「我知道巴黎是法国首都」(无时间标签,像百科全书)——对应 AI 的 Semantic Store(KV Store / 用户画像)。两者的检索方式完全不同:情景记忆用「语义相似度 × 时间衰减 × 重要性」混合检索,语义记忆用精确键匹配或全量注入。
Baddeley 工作记忆模型(1974)→ Context Window 管理
Baddeley 反对把短期记忆看成「被动存储」。他的核心主张:工作记忆是一个主动加工系统——中央执行器负责分配注意力,语音回路维持语言信息,视空间画板处理非语言信息,情景缓冲区整合多源信息。AI 对应:Context Window 不是「消息仓库」而是「推理车间」,LLM 的 Attention 机制就是中央执行器。人类的容量限制是 7±2 个组块,AI 的限制是 Token 数——但本质都是注意力资源有限。
Cohen & Squire 陈述性 vs 程序性(1980)→ System Prompt
遗忘症患者 H.M. 切除海马体后,无法形成新的陈述性记忆(每天都不认识同一个护士),但可以学习新的程序性技能(镜像绘画越练越好,虽然他不记得自己练过)。这证明两种记忆的神经基础是分离的。AI 对应:陈述性 = Episodic + Semantic Memory(可被检索、读取、修改);程序性 = System Prompt + Tool Definitions + Few-shot Examples + Fine-tuned Weights(始终生效,通过行为体现)。这就是为什么「改了 System Prompt 但模型还是老样子」——程序性记忆改了,但模型需要重新适应。
AI 工程在哪些地方「用错了」
做对了的
- 三层存储分离(感觉/工作/长期)——几乎所有框架都遵循
- 区分 Episodic 和 Semantic 存储——结构设计正确
- 认识到 Context Window 不止是「存消息」,而是推理的唯一场所
- System Prompt 作为程序性记忆的实现方式
做错了的 / 没做的
- 遗忘衰减被严重低估——旧消息和新消息权重相同,长对话中早期上下文被稀释
- 没有多通道独立容量管理——文字和图片混在一起算 Token,而人类语音回路和视空间画板有独立容量
- Chunking 策略几乎不存在——人类专家能通过组块化突破 7±2 限制,AI 消息原样堆叠
- 程序性记忆的动态固化路径缺失——Agent 从对话中学到行为模式后,很少自动固化为 System Prompt 规则
- 编码特异性原则被忽视——记忆存储时没有记录「编码上下文」,导致检索时缺乏场景匹配
四个被 AI 忽视的关键认知发现
编码特异性原则
你在水下学的东西,在水下考试比在陆地上考更好。记忆提取取决于提取环境与编码环境的相似度。AI 检索记忆时没有「场景匹配」机制。
间距效应
分 3 天每天学 1 小时比 1 天学 3 小时记得更牢。AI 的情景存储中,同一天堆积的大量相似事件应被压缩,但很少有框架这样做。
遗忘曲线
学完后 20 分钟忘 40%,1 天后忘 66%,之后趋于平缓。Generative Agents 用了指数衰减,但大多框架不区分「重要信息」和「普通信息」的衰减速率。
错误记忆
人类记忆是重构性的,每次回忆都在「重新构建」,容易被误导。AI 的 Reflection 机制本质上就是在「重构」记忆——可能产生与原始事件不同的「错误洞察」,但没有任何框架检测或防止这一点。
AI Agent 的七种记忆
四种核心 + 三种常被忽略。搞清楚每种记忆存什么、怎么检索、活多久,才能设计出靠谱的 Agent。
分类体系四种核心记忆
① 感知记忆 Perceptual
存什么:不存储,只编码。文本用 text-embedding,图片用 CLIP,音频用 Whisper。活多久:实时。检索方式:输出向量供下游使用。一句话:Agent 的「眼睛和耳朵」,把世界变成向量。
② 工作记忆 Working
存什么:Agent 此刻正在思考的一切——系统指令 + 检索结果 + 当前输入 + 历史消息。活多久:秒级,一次推理。检索方式:LLM 的 Attention 机制。一句话:不是「存」出来的,是「管」出来的。
③ 情景记忆 Episodic
存什么:过往交互的记录序列,每条带时间戳和重要性评分。活多久:日/周级。检索方式:语义相似度 × 时间衰减 × 重要性,三者混合评分。一句话:Agent 的「日记本」,记得而非知道。
④ 语义记忆 Semantic
存什么:结构化的长期知识——用户画像、领域知识、Agent 人格。活多久:长期。检索方式:常驻上下文或精确键匹配。一句话:Agent 的「百科全书」,知道而非记得。
三种常被忽略的记忆
⑤ 程序性记忆 Procedural
「知道怎么做」而非「知道是什么」。四个层次:System Prompt(行为规则)→ Tool Definitions(能力边界)→ Few-shot Examples(验证过的模式)→ Fine-tuned Weights(模型本能)。Voyager 的 Skill Library 是最纯粹的实现——学到的技能以可执行代码存储,可组合、可复用。
⑥ 前瞻记忆 Prospective
唯一面向未来的记忆——「将来要做什么」。存储活跃目标、计划任务、中断任务(含恢复上下文)。AutoGPT 最大的失败模式就是 goal drift——Agent 在复杂任务中忘记最初目标。前瞻记忆专为解决这个问题而生。
⑦ 集体记忆 Collective
多 Agent 系统的共享知识池。共享情景记忆(所有 Agent 可见的事件日志)+ 共享语义记忆(知识图谱)+ Agent 私有记忆。ChatDev 中 CEO、CTO、Programmer 三个 Agent 共享 project memory,但各自有独立工作记忆。
| 类型 | 核心问题 | 存储 | 检索 | 生命周期 |
|---|---|---|---|---|
| 感知 | 输入如何编码? | —(编码层) | — | 实时 |
| 工作 | 此刻在思考什么? | Context Window | Attention | 秒级 |
| 情景 | 过去发生了什么? | 向量 DB + 时间索引 | 时间+语义混合 | 日/周级 |
| 语义 | 知道什么事实? | KV Store | 常驻或精确匹配 | 长期 |
| 程序性 | 怎么做? | System Prompt + Tools | 始终生效 | 版本级 |
| 前瞻 | 将来要做什么? | 任务队列 | 优先级 + 状态 | 会话/跨会话 |
| 集体 | 团队知道什么? | 共享向量/图存储 | 权限 + 共享检索 | 长期 |
记忆的生命周期:记住、遗忘、反思
记忆不是静态的仓库,而是一个活的过程——信息在不同记忆类型之间流动、转化、压缩、消亡。
动态管理四条转化路径
这四条路径构成了一个记忆固化链:刚发生的事先进入工作记忆 → 会话结束沉淀为情景记忆 → 经过反思提炼为语义知识 → 最终固化为程序性技能。就像人类:今天学会了一个快捷键(工作记忆)→ 记住了今天用过它(情景记忆)→ 总结出「这个快捷键很常用」(语义知识)→ 形成肌肉记忆不用想就会按(程序性记忆)。
遗忘是特征,不是 Bug
从 Ebbinghaus 的遗忘曲线到 Loftus 的错误记忆,认知科学反复证明:遗忘和错误是有效记忆的必要代价。AI Agent 如果试图「记住一切」,检索质量反而下降——因为噪声密度上升,真正相关的信息被淹没。
| 策略 | 实现方式 | 代表系统 | 优缺点 |
|---|---|---|---|
| FIFO 覆盖 | 固定 buffer,最旧出队 | RET-LLM | 简单可控,但可能丢重要旧信息 |
| 重要性衰减 | Importance *= exp(-DecayRate × days) | Generative Agents | 软遗忘不丢数据,但仍占存储 |
| 合并压缩 | N 条同类 → LLM 总结为 1 条 | GITM | 保留核心减少存储,但丢失细节 |
| 硬遗忘 | 定期清理低重要性 + 超龄记录 | (学术盲区) | 释放存储提升检索,但需调阈值 |
Reflection:从经验中提炼智慧
Reflection 是情景记忆 → 语义记忆的核心转化机制。它不是简单的摘要,而是从多条原始记录中提炼出新的洞察——就像人类在睡梦中整理白天的记忆,把零散的经历变成可复用的经验。
最近 24h ≥ 3 条情景记录
生成 Insights
≥ 0.7 才写入
与已有语义知识比对
框架对比与实践指南
五大主流框架各自的记忆设计哲学,以及你应该怎么选。
工程选型| 框架 | 情景记忆 | 语义记忆 | 核心创新 | 设计哲学 |
|---|---|---|---|---|
| Generative Agents | Memory Stream | Reflections 写回 Stream | Reflection 机制 | 学术完整性优先 |
| Letta (MemGPT) | Archival Memory (向量DB) | Memory Blocks(常驻、自编辑) | Agent 自己管理记忆 | Agent 自主管理优先 |
| LangGraph | Store ("episodic" ns) | Store ("semantic" ns) | namespace 隔离通用 Store | 灵活性优先 |
| CrewAI | Unified Memory | Unified Memory | 复合评分 (0.5/0.3/0.2) | 简单统一优先 |
| EM-LLM | Event-based (Bayesian Surprise) | —(不单独区分) | 认知式事件分割 | 认知逼真度优先 |
关键分歧:Letta 让 Agent 自己管理语义记忆(通过 tool calling 自行编辑 Memory Blocks),这是最「认知真实」的做法——你不需要「检索」自己的名字——但也最激进。LangGraph 把分类决策完全交给开发者,最灵活也最需要设计能力。
渐进式记忆架构设计建议
| 你的需求 | 最小方案 | 完整方案 |
|---|---|---|
| 记一个会话就行 | 裸 Context Window | + Checkpointer 持久化 |
| 跨会话记住用户 | + Semantic Store | + 每次注入用户画像 |
| 智能召回历史对话 | + Episodic Store | + 时间语义混合检索 + 置信度门控 |
| 从经验中自我改进 | + Reflection 定时任务 | + Memory Blocks 自编辑 |
| 全都要 | 四类完整实现 + 前瞻记忆 | + 生命周期管理 + 遗忘调度 |
一句话总结
认知科学给 AI 的三个终极教训:
分离不等于割裂
三种存储器、情景/语义二分都在说「分开存」,但这些记忆之间需要持续的交互通道。Reflection、注入、固化就是这些通道。
遗忘是特征不是 Bug
从遗忘曲线到错误记忆,认知科学反复证明——遗忘和错误是有效记忆的必要代价。试图「记住一切」反而让系统更差。
记忆是加工不是存储
工作记忆的核心不是「能存多少」而是「能加工多快」。Context Window 不应该被当作消息仓库,而应该被当作推理车间。