AI Agent 的记忆机制

记忆 是 Agent 和「一次性聊天机器人」的根本分界线。能记住你昨天说过什么、记得自己擅长什么、记得项目里术语怎么用——这才像个「能长期协作的 Agent」。但 LLM 本身是「无状态」的,它没有记忆,所有「记忆」都要靠外部机制模拟。
本文借用认知心理学的记忆分类框架(工作记忆 / 情景记忆 / 程序性记忆),系统讲透 Agent 的记忆怎么设计、为什么会「失忆」、各类记忆的对应策略。如果你已读过本博客的「AI Agent 技能实战解析」,那篇讲的 Skills 其实就是本文说的「程序性记忆」——两篇互为补充。
先想一个很常见的场景:
你昨天让 Agent 帮你把登录功能重构,今天打开新会话说:
把昨天那个功能加个验证。
如果 Agent 能知道「那个功能」是哪个功能,还知道项目代码结构、测试用例,你会觉得它像一个连续协作的助手;如果它反问「哪个功能?代码结构是什么?」,你就会明显感觉它“断片”了。
这背后不是模型突然聪明或突然变笨,而是记忆系统有没有把正确的信息带到这一次调用里。
本文脉络: |
一、为什么 Agent 需要记忆:LLM 的「无状态」困境
先点破一个常见误解:LLM 本身没有记忆。
你以为的 Agent: |
LLM 的「记忆」本质:把过去的对话/知识/规则,塞进当前请求的上下文窗口里。所谓「让 Agent 有记忆」,就是设计一套机制,决定哪些历史信息、用什么形式、在什么时候塞进窗口。
记忆机制要回答的三个核心问题: |
这三个问题,贯穿下文所有记忆类型。
二、借用认知心理学:人类记忆的三分类
讲 Agent 记忆最清晰的框架,是借用认知心理学对人类记忆的经典分类。这不是生搬硬套——AI Agent 的记忆设计,本质上就是在工程上模拟人脑的记忆系统。
为什么这个框架有用:
很多人讨论 Agent 记忆时混为一锅—— |
用一个更生活化的类比:
| 记忆类型 | 像什么 | 解决什么问题 |
|---|---|---|
| 工作记忆 | 当前桌面上摊开的资料 | 这一次对话/任务马上要用什么 |
| 情景记忆 | 档案柜里的项目记录 | 上次聊过什么、做过什么、用户偏好是什么 |
| 程序性记忆 | 操作手册 / SOP | 遇到某类任务时应该怎么做 |
所以,Agent 不是“脑子里天然有记忆”,而是系统在每次调用前,决定要从档案柜和操作手册里拿哪些东西,放到当前桌面上。
下面三章分别展开。
三、工作记忆:上下文窗口与压缩
工作记忆就是 Agent 此刻的上下文窗口。它是唯一真正「在场」的记忆——其他记忆都要先「调」进工作记忆才能用。
3.1 工作记忆的「容量危机」
工作记忆的硬约束:上下文窗口大小(如 128K tokens) |
3.2 压缩工作记忆的三种策略
3.3 一个反直觉的点:工作记忆不是越大越好
误区:「窗口 128K,那就尽量塞满」 |
四、情景记忆:会话历史与跨会话记忆
情景记忆是「具体经历过的事」。对 Agent 来说,分两层:单次会话内的历史和跨会话的长期记忆。
4.1 会话内历史:默认全留,但要管
单次会话内:每轮对话默认都会进历史,作为下一轮的上下文 |
4.2 跨会话记忆:Agent 真正的「长期记忆」
会话结束,默认一切清空。要实现「下次还记得」,必须把关键信息外部化存储。
跨会话记忆的典型实现: |
换成人话说:
| 记忆形式 | 像什么 | 适合记什么 |
|---|---|---|
| 结构化事实 | 通讯录 / 配置表 | 明确偏好:常用语言、框架版本、输出风格 |
| 向量化语义记忆 | 模糊搜索 / 相似案例库 | 过去怎么处理过类似问题、类似项目里有哪些经验 |
如果用户说“我以后都用 TypeScript”,这更适合抽成结构化事实;如果用户问“上次我们是不是处理过类似的订单幂等问题”,这更适合用向量检索去找相似历史。
4.3 情景记忆的「衰减」与「重要性」
人脑的情景记忆:会遗忘,重要的事记得久 |
五、程序性记忆:Skills 与知识库
程序性记忆是「怎么做某类事」——骑自行车、写测试、生成 commit。对 Agent 来说,这就是 Skills 和知识库。
5.1 为什么 Skills 是「程序性记忆」
人脑的程序性记忆: |
本博客的「AI Agent 技能实战解析」和「Superpowers」两篇,本质上就是在讲 Agent 的程序性记忆怎么构建。这里从记忆机制的角度再串一遍。
为什么不把这些规则都写进一个超长 prompt?因为长 prompt 像是每次开工前重新培训一个人:内容越来越长,成本越来越高,还容易漏看。Skill 更像岗位操作手册:平时放在架子上,需要处理某类任务时再拿出来,既省上下文,也更容易维护。
5.2 程序性记忆的两种形态
5.3 程序性记忆的「加载」与工作记忆的关系
程序性记忆不常驻工作记忆——这正是 Skills 设计的精髓: |
这呼应了 ai-agent-skills 文讲的「三层加载机制」——元数据(永远在场)→ SKILL.md(触发后加载)→ references(按需读)。这个分层设计的本质,就是程序性记忆与工作记忆的协同。
六、三类记忆的协同:一次完整调用怎么走
讲清三类记忆后,来看一次真实的 Agent 调用,它们是怎么配合的:
所以一次 Agent 调用并不是“模型突然想起来了”,而是系统先把 Skill、历史文件、用户指令拼成一个临时工作台,再让模型在这个工作台上推理和执行。记忆系统做得好,模型看起来就像真的“记得”;记忆系统做得差,模型就会不断断片、重复确认、乱套规范。
关键观察:
① 工作记忆是「舞台」,其他记忆都要登场才能用 |
七、常见「失忆」症状与诊断
实际用 Agent 时遇到的问题,基本都能归到某类记忆的缺失或管理不当。
| 症状 | 诊断 | 对策 |
|---|---|---|
| 「聊着聊着就忘了开头说的」 | 工作记忆溢出,早期信息被截断 | 摘要压缩;关键信息钉在头部 |
| 「换了个会话就全忘了」 | 情景记忆未外部化 | 跨会话记忆库(结构化事实 / 向量化) |
| 「每次都要重复告诉它项目规范」 | 程序性记忆缺失 | 把规范做成 Skill 或常驻 system prompt |
| 「不按规范输出,每次格式都不一样」 | 程序性记忆薄弱 | Skill 里给「字面示例」,examples beat rules |
| 「该用工具时不用,不该用时乱用」 | 程序性记忆没写清触发条件 | Skill 的 description 写清触发时机 |
| 「长对话里中间的关键信息漏了」 | 工作记忆的 Lost in the Middle | 重要信息放首尾;按需检索代替全量塞入 |
| 「半年前的旧偏好还在影响输出」 | 情景记忆未衰减 | 加 TTL;新旧冲突时以新为准 |
诊断口诀: |
八、设计原则与陷阱
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,而是能在合适的时机,把合适的记忆调到合适的位置。