AI Agent 的记忆机制

AI Agent 的记忆机制

记忆 是 Agent 和「一次性聊天机器人」的根本分界线。能记住你昨天说过什么、记得自己擅长什么、记得项目里术语怎么用——这才像个「能长期协作的 Agent」。但 LLM 本身是「无状态」的,它没有记忆,所有「记忆」都要靠外部机制模拟。

本文借用认知心理学的记忆分类框架(工作记忆 / 情景记忆 / 程序性记忆),系统讲透 Agent 的记忆怎么设计、为什么会「失忆」、各类记忆的对应策略。如果你已读过本博客的「AI Agent 技能实战解析」,那篇讲的 Skills 其实就是本文说的「程序性记忆」——两篇互为补充。

先想一个很常见的场景:

你昨天让 Agent 帮你把登录功能重构,今天打开新会话说:

把昨天那个功能加个验证。

如果 Agent 能知道「那个功能」是哪个功能,还知道项目代码结构、测试用例,你会觉得它像一个连续协作的助手;如果它反问「哪个功能?代码结构是什么?」,你就会明显感觉它“断片”了。

这背后不是模型突然聪明或突然变笨,而是记忆系统有没有把正确的信息带到这一次调用里

本文脉络:
一 为什么 Agent 需要记忆:LLM 的「无状态」困境
二 借用认知心理学:人类记忆的三分类
三 工作记忆:上下文窗口与压缩
四 情景记忆:会话历史与跨会话记忆
五 程序性记忆:Skills 与知识库
六 三类记忆的协同:一次完整调用怎么走
七 常见「失忆」症状与诊断
八 设计原则与陷阱
九 面试速答

一、为什么 Agent 需要记忆:LLM 的「无状态」困境

先点破一个常见误解:LLM 本身没有记忆

你以为的 Agent:
你昨天告诉它「我用 React 18」,今天它应该记得

实际的 LLM:
每次调用都是一次「重生」——
它能看到什么,完全取决于这次请求里塞进了多少上下文
昨天的对话,如果不在今天的 prompt 里,对它就不存在

LLM 的「记忆」本质:把过去的对话/知识/规则,塞进当前请求的上下文窗口里。所谓「让 Agent 有记忆」,就是设计一套机制,决定哪些历史信息、用什么形式、在什么时候塞进窗口

记忆机制要回答的三个核心问题:

① 留什么:哪些信息值得记?(全记会爆窗口)
② 怎么存:原文 / 摘要 / 向量?(影响取用成本)
③ 何时取:每次都带 / 按需检索?(影响 token 消耗)

这三个问题,贯穿下文所有记忆类型。

二、借用认知心理学:人类记忆的三分类

讲 Agent 记忆最清晰的框架,是借用认知心理学对人类记忆的经典分类。这不是生搬硬套——AI Agent 的记忆设计,本质上就是在工程上模拟人脑的记忆系统。

AI Agent 的三类记忆

为什么这个框架有用

很多人讨论 Agent 记忆时混为一锅——
「上下文太长」「忘记昨天说的」「不会按规范写代码」
其实是三类完全不同的问题,对应三种不同的记忆机制。

例:
「上下文太长」→ 工作记忆的容量问题(该压缩/截断)
「忘记昨天说的」→ 情景记忆的存取问题(该外部化)
「不按规范写」→ 程序性记忆的缺失(该做成 Skill)

诊断错了类型,下错药只会越改越乱。

用一个更生活化的类比:

记忆类型 像什么 解决什么问题
工作记忆 当前桌面上摊开的资料 这一次对话/任务马上要用什么
情景记忆 档案柜里的项目记录 上次聊过什么、做过什么、用户偏好是什么
程序性记忆 操作手册 / SOP 遇到某类任务时应该怎么做

所以,Agent 不是“脑子里天然有记忆”,而是系统在每次调用前,决定要从档案柜和操作手册里拿哪些东西,放到当前桌面上。

下面三章分别展开。


三、工作记忆:上下文窗口与压缩

工作记忆就是 Agent 此刻的上下文窗口。它是唯一真正「在场」的记忆——其他记忆都要先「调」进工作记忆才能用。

3.1 工作记忆的「容量危机」

工作记忆的硬约束:上下文窗口大小(如 128K tokens)

看起来很大,实际很容易塞满:
- 一段长对话历史:几万 tokens
- 几个文件全文:每个几千到几万
- 一份 Skill 全文:几百到几千
- 工具调用结果:可能很长(如搜索返回)

危险:工作记忆越满,越容易出问题——
① 「中间遗忘」:长上下文中间的信息,模型注意力下降(Lost in the Middle)
② 「超长报错」:超过窗口直接失败
③ 「成本飙升」:每次请求的 token 费用随上下文线性增长

3.2 压缩工作记忆的三种策略

压缩工作记忆的三种策略

3.3 一个反直觉的点:工作记忆不是越大越好

误区:「窗口 128K,那就尽量塞满」

现实:
- 信息越多,模型注意力越分散,关键信息反而被忽略
- Lost in the Middle 现象:开头和结尾记得清,中间容易漏
- token 成本线性增长

实践:
- 工作记忆应该「精」,不是「多」
- 重要信息放头部(system prompt / 摘要)或尾部(最新指令)
- 能用「检索」按需取的,就别常驻在工作记忆里

四、情景记忆:会话历史与跨会话记忆

情景记忆是「具体经历过的事」。对 Agent 来说,分两层:单次会话内的历史跨会话的长期记忆

4.1 会话内历史:默认全留,但要管

单次会话内:每轮对话默认都会进历史,作为下一轮的上下文
→ 这是最基础的情景记忆

问题:会话变长后,历史把工作记忆占满
→ 需要用第三章的压缩策略

关键设计:哪些历史要「原文保留」,哪些可以「摘要化」?
规则:近期原文 + 早期摘要 + 关键决策永久钉住

4.2 跨会话记忆:Agent 真正的「长期记忆」

会话结束,默认一切清空。要实现「下次还记得」,必须把关键信息外部化存储

跨会话记忆的典型实现:

ChatGPT Memory / Cursor Memory / Codex Memory 这类功能,
本质都是:

用户说"我喜欢用 TypeScript"
→ Agent 抽取成事实(preference: language = TypeScript)
→ 存到外部存储(DB / 向量库)
→ 下次会话开始,把这些事实注入 system prompt

存储形式分两种:

① 结构化事实(如 ChatGPT Memory):
{ "language": "TypeScript", "framework": "React 18", "style": "函数组件" }
查询快、可控,但需要主动抽取和维护

② 向量化语义记忆(更像人脑):
把过往对话片段 embedding 后存向量库,
每次会话按当前任务语义检索最相关的几段
查询慢一点,但能回忆「相似的过往经历」

换成人话说:

记忆形式 像什么 适合记什么
结构化事实 通讯录 / 配置表 明确偏好:常用语言、框架版本、输出风格
向量化语义记忆 模糊搜索 / 相似案例库 过去怎么处理过类似问题、类似项目里有哪些经验

如果用户说“我以后都用 TypeScript”,这更适合抽成结构化事实;如果用户问“上次我们是不是处理过类似的订单幂等问题”,这更适合用向量检索去找相似历史。

4.3 情景记忆的「衰减」与「重要性」

人脑的情景记忆:会遗忘,重要的事记得久
Agent 的情景记忆:默认全记,反而需要主动设计「遗忘」

不衰减的问题:
- 存储无限膨胀
- 检索时被无关旧事淹没
- 过时信息干扰决策(如半年前的旧偏好)

设计要点:
- 加 TTL:超过 N 天未被引用的事实,降低权重或删除
- 重要性评分:用户明确确认的 > 临时提到的;近期的 > 古老的
- 冲突处理:新信息和旧记忆冲突时(如换了技术栈),以新的为准

五、程序性记忆:Skills 与知识库

程序性记忆是「怎么做某类事」——骑自行车、写测试、生成 commit。对 Agent 来说,这就是 Skills 和知识库

5.1 为什么 Skills 是「程序性记忆」

人脑的程序性记忆:
不需要「想」,自动执行(骑上车就会骑)
高度结构化,稳定可复用
和具体场景解耦(在哪儿都能骑)

Agent 的 Skills:
描述「某类任务怎么做」(写公众号文、做代码审查、生成 commit)
触发后自动加载、按流程执行
和具体项目解耦(一个写好的 Skill 多项目可用)

→ 这就是为什么 Skills 是 Agent 的「程序性记忆」,
而不是「工作记忆」或「情景记忆」。

本博客的「AI Agent 技能实战解析」和「Superpowers」两篇,本质上就是在讲 Agent 的程序性记忆怎么构建。这里从记忆机制的角度再串一遍。

为什么不把这些规则都写进一个超长 prompt?因为长 prompt 像是每次开工前重新培训一个人:内容越来越长,成本越来越高,还容易漏看。Skill 更像岗位操作手册:平时放在架子上,需要处理某类任务时再拿出来,既省上下文,也更容易维护。

5.2 程序性记忆的两种形态

程序性记忆的两种形态

5.3 程序性记忆的「加载」与工作记忆的关系

程序性记忆不常驻工作记忆——这正是 Skills 设计的精髓:

Skill 平时:只在元数据层(name + description),占用极小
Skill 触发后:正文加载进工作记忆,占满一部分窗口
Skill 执行完:可以视为「沉淀」,下次再触发再加载

类比人脑:
你不会一直想着「怎么写 commit」,
只在真的要写时,才把这套流程「调」出来用。
这就是程序性记忆「按需调入工作记忆」的机制。

这呼应了 ai-agent-skills 文讲的「三层加载机制」——元数据(永远在场)→ SKILL.md(触发后加载)→ references(按需读)。这个分层设计的本质,就是程序性记忆与工作记忆的协同


六、三类记忆的协同:一次完整调用怎么走

讲清三类记忆后,来看一次真实的 Agent 调用,它们是怎么配合的:

三类记忆协同的一次 Agent 调用

所以一次 Agent 调用并不是“模型突然想起来了”,而是系统先把 Skill、历史文件、用户指令拼成一个临时工作台,再让模型在这个工作台上推理和执行。记忆系统做得好,模型看起来就像真的“记得”;记忆系统做得差,模型就会不断断片、重复确认、乱套规范。

关键观察

① 工作记忆是「舞台」,其他记忆都要登场才能用
② 程序性记忆(Skills)和情景记忆(历史/文件)都是「按需调入」工作记忆
③ Agent 的「聪明程度」,很大程度取决于这三类记忆的调度是否合理
- 程序性记忆缺失 → 不会按规范做事(该写 Skill)
- 情景记忆缺失 → 忘记上下文(该外部化历史)
- 工作记忆管理差 → 关键信息被淹没(该压缩/钉住)

七、常见「失忆」症状与诊断

实际用 Agent 时遇到的问题,基本都能归到某类记忆的缺失或管理不当。

症状 诊断 对策
「聊着聊着就忘了开头说的」 工作记忆溢出,早期信息被截断 摘要压缩;关键信息钉在头部
「换了个会话就全忘了」 情景记忆未外部化 跨会话记忆库(结构化事实 / 向量化)
「每次都要重复告诉它项目规范」 程序性记忆缺失 把规范做成 Skill 或常驻 system prompt
「不按规范输出,每次格式都不一样」 程序性记忆薄弱 Skill 里给「字面示例」,examples beat rules
「该用工具时不用,不该用时乱用」 程序性记忆没写清触发条件 Skill 的 description 写清触发时机
「长对话里中间的关键信息漏了」 工作记忆的 Lost in the Middle 重要信息放首尾;按需检索代替全量塞入
「半年前的旧偏好还在影响输出」 情景记忆未衰减 加 TTL;新旧冲突时以新为准
诊断口诀:

忘了最近 → 工作记忆问题(压缩/管理)
忘了上次 → 情景记忆问题(外部化存储)
不会做事 → 程序性记忆问题(补 Skill/知识库)

八、设计原则与陷阱

8.1 设计原则

1. 分清记忆类型再下药

遇到 Agent “失忆”,先别急着加 prompt。先判断它到底是哪类问题:是当前上下文太满、跨会话信息没存,还是缺少一套稳定的做事流程。类型判断错了,后面的优化基本都会跑偏。

2. 工作记忆要「精」不要「多」

上下文窗口不是仓库,而是当前桌面。桌面上东西越多,越难找到关键材料。重要信息放首尾,能检索的内容按需取,不要长期塞在窗口里。

3. 情景记忆要「外部化 + 会衰减」

不外部化就等于没记忆;不衰减就会被旧信息淹没。用户偏好、项目决策、历史问题都应该有存储位置,但旧信息要有 TTL、重要性评分和冲突处理。

4. 程序性记忆优先做成 Skill

反复出现的规范、流程,不要每次塞进 prompt。把它固化成 Skill,让 Agent 在合适场景自动触发,比在 system prompt 里堆规则更稳定,也更容易维护。

5. 三类记忆要协同

程序性记忆执行时,往往需要情景记忆配合。例如 tech-writer Skill 告诉 Agent 怎么改文章,但具体要改哪篇文章、用户偏好是什么,还要从历史或文件里取。两者最终都要进入工作记忆,所以设计时必须考虑窗口容量。

8.2 常见陷阱

陷阱 后果 对策
把所有历史塞进工作记忆 窗口爆满、成本飙升、Lost in the Middle 摘要 + 截断 + 关键信息钉住
没有跨会话记忆 每次从零开始,体验差 抽取关键事实外部存储
情景记忆不衰减 旧信息干扰决策 加 TTL 和重要性评分
规范只写在 prompt 里 改一次问一次,不复用 固化成 Skill(程序性记忆)
Skill 全文常驻工作记忆 窗口被占满 用三层加载,按需调入
混淆记忆类型 诊断错、对策错,越改越乱 先分类再下药

九、速查表

问题 速答要点
Agent 的记忆分几类? 借用认知心理学三分类:工作记忆(上下文窗口)、情景记忆(会话历史/跨会话)、程序性记忆(Skills/知识库)
工作记忆的核心问题? 容量有限。要靠截断、摘要、滑窗 + 关键信息钉住来管理;不是越大越好,会有 Lost in the Middle
LLM 本身有记忆吗? 没有。它是无状态的,所谓「记忆」都是把历史信息塞进当前请求的上下文窗口
怎么实现跨会话记忆? 关键信息外部化:结构化事实(DB)或向量化语义记忆(向量库 + 检索);每次会话开始注入
Skills 算哪种记忆? 程序性记忆。描述「怎么做某类事」,按需调入工作记忆,和具体场景解耦
三类记忆怎么协同? 工作记忆是舞台;程序性(Skills)和情景(历史/文件)按需调入;三者调度决定 Agent 聪明程度
忘了最近说的怎么办? 工作记忆问题——压缩、摘要、关键信息钉头部
忘了上次说的怎么办? 情景记忆问题——把关键事实外部化存储,跨会话注入

总结:Agent 的记忆本质是「把过去的信息按需调入当前上下文窗口」。借用认知心理学的三分类,可以把问题拆得更清楚:工作记忆负责此刻在场,情景记忆负责经历与历史,程序性记忆负责稳定可复用的做事方法。真正可靠的 Agent,不是把所有东西都塞进 prompt,而是能在合适的时机,把合适的记忆调到合适的位置。