✦ 本文目录

  1. 一个尴尬的事实:模型会「中间丢失」
  2. 为什么会这样:注意力偏差与 Attention Sink
  3. 借镜认知科学:人类的记忆是怎么工作的
  4. AI Agent 的七种记忆
  5. 记忆的生命周期:记住、遗忘、反思
  6. 框架对比与实践指南
  7. 一句话总结

一个尴尬的事实:模型会「中间丢失」

你给模型塞了 20 篇文档,答案就在第 10 篇里——结果它偏偏答错了。这不是个例,而是一个普遍规律。

问题发现

2023 年,Stanford 的研究者做了一个实验:给大模型一篇问题 + N 篇文档(只有 1 篇含答案),然后改变答案文档的位置。结果发现了一条 U 形曲线——答案放在开头或结尾时,模型答得很好;放在中间时,性能断崖式下降。

性能
  ↑
  ██                                 ██
  ██                                 ██
  ██                                  ██
  ██                                   ██
  ████                              ████
      ████                      ████
          ██████████████████████
  └──────────────────────────────────────→ 信息位置
     开头           中间           结尾

U 形曲线:开头和结尾好,中间差

更扎心的是几个后续发现:

💡 实验中发现的残酷事实:
更大的上下文窗口没用——GPT-3.5 的 16K 版本和 4K 版本表现几乎一样,窗口大了不代表用得好
更大的模型也没用——GPT-4 绝对性能更高,但 U 形退化模式一模一样
RAG 检索文档从 20 篇增到 50 篇,性能只提升 ~1.5%——塞得越多,噪声越多,模型反而更迷茫
指令微调不能消除偏差——绝对性能提升,但 U 形依然存在
⚠️ 这对你的 Prompt 意味着什么:最关键的信息绝对不要埋在中间。系统指令放开头,当前任务放结尾,检索到的参考资料放中间——这是目前最稳的位置策略。

为什么会这样:注意力偏差与 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 始终可见(自回归特性),所以它们最容易成为「注意力倾泻口」。

💡 一个精彩的实验证明:研究者把开头的 Token 换成 \n(换行符),模型依然死死盯着它们——关注的是位置,不是内容。就像一个人进门就盯着门口的垃圾桶看,不管垃圾桶里装的是什么。

基于这个发现,他们提出了 StreamingLLM 方案:保留开头的 4 个「Sink Token」不动,后面用滑动窗口只保留最近的 Token。这样模型可以处理超过 400 万个 Token 的超长序列,速度比传统方法快 22 倍。

⚠️ 但要注意:StreamingLLM 不能扩展模型的有效上下文长度。它只是让模型能稳定运行在不断延长的序列上,但模型真正能「利用」的信息只有窗口内的最近 Token。就像一个人可以连续听 400 万句话不崩溃,但他只记得最后几句。

三篇论文的内在关联

Lost in the Middle (2023) — 发现问题:U 形性能曲线
Found in the Middle (2024) — 找到根因:U 形注意力偏差 → 提出校准
StreamingLLM (2024) — 更深层机制:Attention Sink → SoftMax 数学强制

三篇论文构成了「问题发现 → 根因分析 → 工程方案」的完整闭环。从「模型在中间表现差」到「因为 SoftMax 必须把注意力倒掉」,一层层挖到了数学本质。

借镜认知科学:人类的记忆是怎么工作的

模型有「中间丢失」的问题,人类有吗?人类是怎么记住事情的?认知心理学早在 60 年前就给出了答案——而 AI Agent 的记忆架构,几乎是一比一地搬运了这些理论。

理论溯源

理解认知科学不是为了学术正确,而是为了避免重蹈认知科学已经走过的弯路。下面四个经典理论,构成了 AI Agent 记忆架构的理论地基。

1

Atkinson & Shiffrin 多存储模型(1968)→ 存储层级

人类有三种结构上分离的记忆:感觉记忆(0.5 秒,刚看到的画面)→ 短期记忆(20-30 秒,当前在想的事)→ 长期记忆(永久存储)。AI 对应:Embedding 层(感知编码)→ Context Window(工作记忆)→ 向量数据库 + KV Store(长期存储)。LangGraph 的 Checkpointer / Store 两层架构就是直接照搬这个模型。

2

Tulving 情景 vs 语义二分法(1972)→ 记忆分类

Tulving 把长期记忆一分为二:情景记忆是「我记得我去过巴黎」(有明确时间标签,像日记)——对应 AI 的 Episodic Store(向量 DB + 时间戳);语义记忆是「我知道巴黎是法国首都」(无时间标签,像百科全书)——对应 AI 的 Semantic Store(KV Store / 用户画像)。两者的检索方式完全不同:情景记忆用「语义相似度 × 时间衰减 × 重要性」混合检索,语义记忆用精确键匹配或全量注入。

3

Baddeley 工作记忆模型(1974)→ Context Window 管理

Baddeley 反对把短期记忆看成「被动存储」。他的核心主张:工作记忆是一个主动加工系统——中央执行器负责分配注意力,语音回路维持语言信息,视空间画板处理非语言信息,情景缓冲区整合多源信息。AI 对应:Context Window 不是「消息仓库」而是「推理车间」,LLM 的 Attention 机制就是中央执行器。人类的容量限制是 7±2 个组块,AI 的限制是 Token 数——但本质都是注意力资源有限

4

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 WindowAttention秒级
情景过去发生了什么?向量 DB + 时间索引时间+语义混合日/周级
语义知道什么事实?KV Store常驻或精确匹配长期
程序性怎么做?System Prompt + Tools始终生效版本级
前瞻将来要做什么?任务队列优先级 + 状态会话/跨会话
集体团队知道什么?共享向量/图存储权限 + 共享检索长期

记忆的生命周期:记住、遗忘、反思

记忆不是静态的仓库,而是一个活的过程——信息在不同记忆类型之间流动、转化、压缩、消亡。

动态管理

四条转化路径

工作 → 情景 — 每次会话结束自动沉淀:摘要 + 重要性评分 + Embedding → 写入向量 DB
情景 → 语义 — 定时离线反思:批量处理最近记录,LLM 生成 Insights,置信度 > 0.7 且去重后写入
语义 → 工作 — 每次会话开始注入:用户画像、偏好、领域知识自动放入 Context Window
语义 → 程序性 — 经充分验证后固化:行为模式经验证次数达标后,固化为 System Prompt 规则

这四条路径构成了一个记忆固化链:刚发生的事先进入工作记忆 → 会话结束沉淀为情景记忆 → 经过反思提炼为语义知识 → 最终固化为程序性技能。就像人类:今天学会了一个快捷键(工作记忆)→ 记住了今天用过它(情景记忆)→ 总结出「这个快捷键很常用」(语义知识)→ 形成肌肉记忆不用想就会按(程序性记忆)。

遗忘是特征,不是 Bug

从 Ebbinghaus 的遗忘曲线到 Loftus 的错误记忆,认知科学反复证明:遗忘和错误是有效记忆的必要代价。AI Agent 如果试图「记住一切」,检索质量反而下降——因为噪声密度上升,真正相关的信息被淹没。

策略 实现方式 代表系统 优缺点
FIFO 覆盖 固定 buffer,最旧出队 RET-LLM 简单可控,但可能丢重要旧信息
重要性衰减 Importance *= exp(-DecayRate × days) Generative Agents 软遗忘不丢数据,但仍占存储
合并压缩 N 条同类 → LLM 总结为 1 条 GITM 保留核心减少存储,但丢失细节
硬遗忘 定期清理低重要性 + 超龄记录 (学术盲区) 释放存储提升检索,但需调阈值
💡 实践建议:在用户不活跃时段(如凌晨 3 点)定时执行遗忘调度——重要性 < 1.0 且超 30 天的硬删除,同类记录达阈值时 LLM 合并压缩。这比「永远记住一切」效果好得多。

Reflection:从经验中提炼智慧

Reflection 是情景记忆 → 语义记忆的核心转化机制。它不是简单的摘要,而是从多条原始记录中提炼出新的洞察——就像人类在睡梦中整理白天的记忆,把零散的经历变成可复用的经验。

批量读取
最近 24h ≥ 3 条情景记录
LLM 反思
生成 Insights
置信度门控
≥ 0.7 才写入
去重
与已有语义知识比对
写入语义存储
⚠️ Reflection 的风险:它本质上是在「重构」记忆——从多条原始事件中生成一条新的 insight。就像人类的 false memory,这个 insight 可能与原始事件不符。目前没有任何框架检测或防止 Reflection 产生的「错误洞察」。这是一个被忽视但真实存在的风险。

框架对比与实践指南

五大主流框架各自的记忆设计哲学,以及你应该怎么选。

工程选型
框架 情景记忆 语义记忆 核心创新 设计哲学
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 自编辑
全都要 四类完整实现 + 前瞻记忆 + 生命周期管理 + 遗忘调度
💡 EM-LLM 的启发(ICLR 2025):它用 Bayesian Surprise 检测事件边界——不按轮次或 Token 数切割记忆,而是当内容出现「意外」时自然分割。然后做两阶段检索:先语义相似度找到相关事件,再时间邻近扩展带出相邻事件。这比固定长度的滑动窗口更接近人类处理情景记忆的方式。

一句话总结

认知科学给 AI 的三个终极教训:

🔗

分离不等于割裂

三种存储器、情景/语义二分都在说「分开存」,但这些记忆之间需要持续的交互通道。Reflection、注入、固化就是这些通道。

🗑️

遗忘是特征不是 Bug

从遗忘曲线到错误记忆,认知科学反复证明——遗忘和错误是有效记忆的必要代价。试图「记住一切」反而让系统更差。

🏭

记忆是加工不是存储

工作记忆的核心不是「能存多少」而是「能加工多快」。Context Window 不应该被当作消息仓库,而应该被当作推理车间。

Lost in the Middle — 模型在中间会「丢失」信息(U 形曲线)
Attention Sink — 根因是 SoftMax 必须把注意力「倒掉」到开头 Token
认知科学映射 — 人类记忆 = 感觉 → 工作 → 长期(情景 + 语义 + 程序性)
七种记忆 — 感知 / 工作 / 情景 / 语义 / 程序性 / 前瞻 / 集体
生命周期 — 记住(W→E)→ 反思(E→S)→ 注入(S→W)→ 固化(S→P)→ 遗忘
实践 — 关键信息放开头/结尾 · 宁精勿多 · 设置信忘策略 · Reflection 需防错误洞察
🎯 全文一句话:模型有「中间丢失」的毛病,根因是注意力的数学本质;人类的记忆体系是现成的解法蓝图——七种记忆各司其职,记住、遗忘、反思缺一不可;工程实现时,位置即命运,遗忘即智慧,加工即记忆