大模型技术全景(十三):记忆管理 Memory


📚 本文收录于「流浪」的系列专栏

🐧 Linux系统 ⚙️ C++
📊 数据结构与算法 🐍 Python
🔗 LangChain & LangGraph 🗄️ MySQL 数据库
🌿 Git 工具 🌐 计算机网络
🤖 LLM 💯 大厂面试、八股
📚 学习筑基专栏

🏠 博客主页:流浪 | 📝 原创首发于 CSDN


上上篇把 Agent 之间「怎么说话、怎么传话」讲透了,上篇讲了「哪些动作必须等人点头」。但 Agent 光会通信、会刹车还不够------它还得「记得住」:跨会话保留用户偏好、跨任务累积经验。 这一篇讲记忆管理(Memory),把 Agent 的「外部记忆系统」从定义、分类、短期处理到长期记忆全生命周期一次说清。


一、什么是记忆管理

1.1 Agent Memory 的定义

Agent Memory 是专门为 AI 智能体设计的、能够跨会话、跨任务 持久保留和召回信息的外部记忆机制。三个关键词缺一不可:

  • 专给 Agent:区别于人类记忆,它是为自动化系统服务的状态外置层。
  • 跨会话 / 跨任务:强调持久化,不是单次推理的中间变量。
  • 外部:存在模型权重之外(向量库、数据库、知识图谱),而不是塞进模型本身。

1.2 无记忆 vs 有记忆:两个锚点类比

1 无记忆 Agent

像每天重置的临时工:

  • 每次开口都礼貌地问「您贵姓」;
  • 告诉他「姓王」,五分钟后换话题再问「您贵姓」;
  • 从不留任何记录,每一次对话都是全新的开始。
2 有记忆 Agent

像随身携带「全能档案夹」的专属秘书:

  • 你今天说「喜欢靠窗、对芒果过敏」,他当场记下;
  • 明天订机票,他直接问「还是靠窗吗」;
  • 后天推荐餐厅,他主动提醒「这家甜品没芒果,可以放心」;
  • 三个月前你随口提的「讨厌嘈杂环境」,现在找咖啡馆他会避开网红店。

记忆管理的本质是把状态外置到模型权重之外,补 LLM 无状态这一根本短板------它解决的不是「模型更聪明」,而是「Agent 能积累」。

二、为什么需要记忆

2.1 LLM 没有状态

大语言模型从根本上是无状态的,这带来两个直接后果:

  • 每次新对话都是一块白板:发送一条消息产生一个回复;
  • 模型本身是个巨型函数,输入 token 出 token,权重中没有任何持久化存储能在会话间保留历史。

简单聊天机器人不在乎这一点(让它写封求职信,写完就结束,不需要连续性)。但 Agent 面对的情况截然不同:它要处理长期运行的任务、随时间学习用户偏好,还要跨多个会话与其他 Agent 协作。

无状态性构成根本性障碍------没有人能接受一个每周一早上都要重新自我介绍的私人助理。

2.2 上下文问题:不能靠无限扩窗

业界最初以为「用巨大上下文窗口填满所有信息」就能解决,现实击碎了幻想:

1 上下文腐烂(Context Rot)
  • 当上下文塞满无关信息,模型要在更大空间里找相关内容,注意力被稀释;
  • 关键信息(如「用户要求用摄氏度而非华氏度」)反而被淹没。

本质不是「信息变旧」,而是信噪比急剧下降。

2 Lost in the Middle(中间内容遗忘)

关键信息位于窗口正中时召回率最低,不如放在开头(Primacy 效应)或结尾(Recency 效应)。

3 Attention Dilution(注意力稀释)

无关废话越多,模型必须把原本集中在「关键信息」上的概率权重,强行分给成千上万个无意义词语。

4 Context Interference(上下文干扰)

无关信息不只占位置,其语义特征还会在向量空间与有效信息产生负向交互------像把意见相左的人拉进同一场辩论会,互相打架。

5 检索昂贵

长上下文检索成本随长度平方级增长,上下文越长,定位相关信息的代价越高。

6 成本失控

每次请求都要携带大量历史 token,哪怕一年前的废话也得重新打包发给模型,token 成本随对话轮次不断累积。

2.3 追踪长期目标,胜任复杂任务

许多现实任务不是一次性的,记忆在此承担两类职责:

  • 任务连续性:记住「任务进行到哪一步了」(订机票→选座→支付),或「哪些方案已经被否决过」;
  • 目标一致性:确保在跨越数天、数周的任务中,Agent 的行为始终围绕最终目标。

2.4 构建个性化画像,从「通用」到「专属」

当 Agent 能回忆过去对话,它更个人化、更协作,情感连续性建立信任:

1 失忆 AI(机械)

你深夜说「我最近特别焦虑」,它回「焦虑是常见情绪,建议深呼吸」------答案正确,但像在听录音机。

2 记忆 AI(共情)

它回「记得上个月你搞定那个难缠客户时,也说过同样的『做不好』」,接着补一句:「后来复盘发现,其实是你对自己要求太高了。今天是不是又遇到类似『全盘否定自己』的瞬间?要不要像上次那样,先把大目标拆成三个今天能做的小事?」

记忆不是「把上下文塞满」,而是用 外部存储 + 检索替代「全量上下文」------从根本上对抗上下文腐烂与成本爆炸,让 Agent 从「一次性工具」变「长期伙伴」。

三、记忆分类

学术界和工程界最常见的分类,是借鉴人类认知科学的二分法:短期记忆 + 长期记忆。

3.1 短期记忆

短期记忆指在当前一次对话或任务执行过程中,临时存储的、上下文相关的信息。

1 核心作用

维持对话的连贯性,支撑多步推理。

2 技术本质

通常就是大语言模型的 上下文窗口(Context Window) 内的内容,刚聊的对话、当前用户提供的临时指令(「查一下明天北京的天气」)都放在这个「工作台」上。

3 特点
  • 容量有限:受限于模型支持的最大 token 数(如 4K、128K、1M);
  • 生命周期短:对话结束时通常被直接清除,不保存到数据库;
  • 访问极快:直接作为输入的一部分传给模型,无需检索。

3.2 长期记忆

长期记忆指跨会话、持久化存储的信息,包括用户的历史行为、偏好、事实知识等。

1 核心作用

实现个性化,支持持续学习与知识积累。

2 技术本质

通常通过外部向量数据库(如 Chroma、Pinecone)或传统数据库实现,Agent 需要时按当前问题去检索相关的历史记忆片段。

3 特点
  • 容量近乎无限:理论上可以存储海量信息;
  • 生命周期长:可以保存数天、数月甚至永久;
  • 访问较慢:需要经过「检索 - 排序」的过程,不能直接使用。

3.3 长期记忆的三子类(心理学划分)

长期记忆在心理学上又分为三类,对应三种「货架」:

1 语义记忆 = What(是什么)
  • 存储客观事实、概念、知识,与个人经历无关,像大脑里的百科全书;
  • 例:勾股定理 a²+b²=c²、水的沸点 100℃、Paris 是法国的首都。
2 程序记忆 = How(怎么做)
  • 存储如何做某件事的技能、流程、习惯,通常难以用语言说清(内隐记忆);
  • 例:如何调用天气 API------先获取城市代码 → 拼接 URL → 解析 JSON 返回温度。
3 情景记忆 = When / Where / Who / What
  • 存储个人经历的特定事件,包括时间、地点、情绪,是自传体式记忆;
  • 例:「昨天下午 3 点,小明问过我一个方程 2x+5=15,他当时要求我解释每一步」。

3.4 短期记忆与长期记忆的区别

维度 短期记忆(工作记忆) 长期记忆
生命周期 单次会话,对话结束即清空或滚动遗忘 跨会话,持久化存储,本周、下月甚至永久
物理载体 上下文窗口,即每次请求发给模型的 Prompt 内容 外部向量库、关系库或键值存储,不占用上下文窗口
存储内容 最近几轮对话、当前任务中间态(如「进行到第三步支付确认」) 长期偏好、历史事件摘要、学到的技能路径、项目背景
容量瓶颈 严格受限于 Context Length(如 128K、1M),越长越贵越慢 理论上无限,可横向扩展
典型例子 刚告诉 Agent「今天去北京出差」它能听懂,明天再说就忘 Agent 记得「常住上海、出差首选靠窗、讨厌国航餐食」,哪怕一年前的记录

短期 = 工作台(快但易失),长期 = 档案柜(慢但耐久);语义 / 程序 / 情景是长期记忆的三种「货架」,存储与检索策略因货架而异------这也是后面「差异化索引」的伏笔。

四、短期记忆的处理

短期记忆就是当前对话的工作台,策略的核心是:在有限的窗口里,只放最精华的信息。

4.1 四种常见处理策略

1 滑动窗口

只保留最近 N 轮对话,更早的一刀切扔掉。

2 Token 截断

只保留最近 N 个 token。(比如上下文1M)

3 摘要

不直接扔掉旧对话,而是让模型定期把「老对话」压缩成一段简短摘要,保留摘要 + 最近几轮原始对话。

4 过滤

不按轮数或 token 数切,而是识别关键信息(实体、指令、数字、偏好)单独提取,存到一个「关键信息口袋」,普通对话内容直接删。

4.2 生产级「三层记忆架构」

四种逻辑单独使用都有缺陷,组合起来才是生产级方案:

1 底层(缓存层)

用滑动窗口保留最近 5--10 轮原始对话,保证模型对当前话题的流畅接话。

2 中间层(摘要层)

对窗口之外的较早对话,采用滑动摘要(每隔 N 轮将旧摘要 + 新对话合并生成新摘要)。

3 顶层(事实层)

贯穿全程使用信息过滤,实时维护一个「事实口袋」(User Profile),并随对话动态更新。

4 上下文组装顺序

优先挂载事实层 → 其次挂载摘要层 → 最后挂载缓存层。

4.3 顺序反转:截断如何误伤系统指令

一个特别值得警惕的坑:Token 截断和滑动窗口会导致「顺序反转」------如果从最早的消息开始截断,模型会丢失「初始系统指令(System Prompt)」。工程做法是:把 System Prompt 和「关键信息口袋」永远锚定在窗口最前面,二者绝不参与滑动或截断,只让用户和助手的普通聊天内容去滚动。

短期记忆的关键不是「留多少」,而是分层取舍 + 关键信息锚定------否则截断误伤系统指令,Agent 连「自己是谁、该守什么规矩」都忘了。

五、长期记忆的基本工作流程

长期记忆围绕「存储、更新、检索、遗忘 」四个核心动作展开,不是在当前窗口里裁剪压缩,而是跨会话的持久化管理。

5.1 存储 / 写入

1 目标

将对话中的关键信息、用户偏好和任务进度,经结构化处理后持久化写入记忆存储层,供后续跨会话检索使用。

2 触发时机
  • 显式指令:用户主动要求系统记住某条信息(「记住我叫小明」「我喜欢科幻片,帮我记一下」);
  • 短期记忆溢出:上下文窗口即将满载(接近 128K),系统自动迁移最关键的部分进行摘要固化;
  • 会话终止:对话结束时自动生成本次会话摘要并归档;
  • 高频信号:同一事实或偏好在一轮对话中被反复提及(第 1、3、5 轮都说「我用 Python」),累计 ≥3 次触发自动记录(示例阈值);
  • 定期反思:每日 / 每周定时任务,对近期行为日志复盘,总结可复用的经验或改进点。
3 写入三步
  1. 类型归类:判定属语义 / 情景 / 程序记忆;
  2. 冲突检测与合并:是否存在逻辑冲突,按时间戳或粒度决议合并;
  3. 差异化索引构建(按类型分流):
    • 固定属性(标量)→ 构建 B-Tree 索引,存关系型数据库(SQL);
    • 模糊偏好 / 长文本(需理解含义)→ 构建向量索引,存向量数据库(Vector DB);
    • 实体关系数据 → 构建知识图谱(图数据库)。
4 存储数据库

向量数据库、关系数据库、图数据库三类并存。

5.2 更新

1 目标

修正或取代长期记忆中的过时、错误或偏好变更的信息,同时保留历史变更轨迹,确保记忆的准确性与可追溯性。

2 触发时机
  • 用户显式纠正:用户明确指出之前的陈述有误(「我之前说的不对,正确的是......」);
  • 用户偏好漂移:用户主动声明偏好已改变(「我现在不喜欢动作片了,改喜欢喜剧片」);
  • 系统主动校验 :检测到新旧信息明确冲突(如相似度 >0.9 但属性值矛盾)。例如旧记忆 manager = 张三,新上下文显示李四接替审批,系统主动调取企业组织架构或邮件上下文,发现张三已离职,于是自动级联更新(示例阈值 >0.9)。
3 工作过程
  1. 定位要修改的旧记忆:通过关键词、时间、场景等,把用户提及的那条旧记忆精准找出来;
  2. 判断新信息的类型:是客观事实(姓名 / 生日 / 城市)、主观偏好(喜欢的食物 / 讨厌的风格),还是可重复使用的方法(「做 PPT 先列大纲」);
  3. 决定如何处理冲突,按下序判定:
    • ① 用户今天明确纠正 → 以用户说的为准;
    • ② 新信息更具体 → 保留宽泛的旧记忆,加记具体特例(如「我喜欢科幻片」+「我不喜欢《流浪地球》」);
    • ③ 信息来源可信度更高 → 以更可信的为准;
    • ④ 以上均不满足 → 以时间最新的为准;
  4. 保存更新并保留历史:不直接覆盖旧记忆,而是把旧记忆标记为「已过期」并冻结,写入一条新记忆,附「本条替代了哪条旧记忆」的说明;若只是补充(无矛盾),则直接附加。

5.3 检索 / 读取

1 目标

根据当前用户查询和上下文,从长期记忆中高效、精准地检索出最相关的历史信息,并注入到短期上下文窗口中,以支持当前对话。

2 触发规则
  • 显式召回指令:用户明确要求回溯历史(「上周讨论的缓存方案最终选 Redis 还是 Memcached?」);
  • 强指代消解:跨会话操作,或用户突然跳出当前子任务指向隐性历史对象(新窗口说「把那个接口的超时时间改成 5 秒」);
  • 静态偏好 / 约束缺失:运维部署、固定周期报告生成、封装 API 调用等缺默认参数时。
3 检索方式
  • 向量检索:把记忆存为向量嵌入,用余弦相似度检索最相关片段;优点是快、支持语义检索,缺点难捕捉实体间复杂关系,适合开放性问答、模糊记忆召回;
  • 压缩摘要:定期将对话历史压缩为滚动摘要;优点是降低 token 消耗,缺点是信息损失不可逆,适合上下文窗口不足时的兜底;
  • 知识图谱:把记忆组织为节点和关系(人 / 地点 / 事件 / 时间);优点是精度高、支持因果推理,缺点是实现复杂、存储成本高,适合复杂推理与精确关系查询;
  • 混合检索 :结合向量相似度检索和结构化查询,前者语义匹配、后者精确匹配,有效降低漏检风险。
4 降级策略(检索失败时)
  • 向量检索全部置信度 <0.5 → 降级为关键词全文检索(BM25);
  • 知识图谱无匹配实体 → 纯向量检索 + 用户澄清;
  • 所有方式返回空 → 返回「未找到相关记忆」,引导用户重新描述;
  • 召回结果过多(>100 条)→ 先聚类压缩为 Top-10 代表性记忆,再进行重排序。

5.4 遗忘

1 目标

通过主动或被动策略,淘汰过时、低价值或违反隐私规定的记忆,并控制存储规模、维持检索的信噪比。

2 触发时机
  • 精确删除(主动):用户要求遗忘某一条具体记忆(「忘掉我刚才说的那个地址」);
  • 遗忘全部(主动):用户要求删除所有个人信息(「忘记所有关于我的事」,触发隐私合规流程,需二次确认);
  • 时间衰减(被动):某条记忆超过 90 天未被访问,系统每日后台扫描自动标记为候选(示例阈值 90 天);
  • 低访问频率(被动):某条记忆被检索次数低于 1 次 / 月,进入候选(示例阈值);
  • 容量限制(被动):记忆总数超过系统上限(如 10⁶ 条),删除重要性分数最低的 M 条(示例阈值)。
3 处理步骤
  1. 触发检测:检查是否满足遗忘条件(主动指令或被动策略);
  2. 筛选候选:根据条件查询出待遗忘的记忆 ID 列表;
  3. 执行遗忘:
    • 硬删除:物理删除,不可恢复;
    • 软删除:标记为已删除,检索时跳过;
    • 降权:降低检索得分系数(如乘以 0.2),但仍可能被召回;
  4. 级联处理:若删除的记忆存在关联依赖,同步处理关联记忆;
  5. 日志记录(可选):记录遗忘操作及原因,供后续审计追溯。

长期记忆是「写 - 读 - 改 - 删」的完整生命周期,不是只存不理;冲突决议准绳是「以人 / 以新 / 以可信为准」,且永远保留历史可追溯------这正是它与「缓存」最本质的区别。

六、记忆开发框架

业界已有多个成熟记忆框架,选型看隔离粒度与跨会话演进能力:

6.1 八个主流框架

1 Mem0

业界广泛应用的核心记忆层,将记忆编排、检索与知识图谱结合,支持细粒度用户 / 会话隔离与结构化更新;官方宣称可节省 90% 以上 token 成本(厂商数据,待验证)。

2 LangMem

LangChain 团队推出的专属记忆 SDK,深度集成 LangGraph 生态,提供「热路径工具」(对话中实时记忆)与「优化技巧」(长期优化 Agent 行为,如更新系统提示词)。

3 Zep

构建动态的「时序知识图谱」,擅长记忆信息间随时间变化的复杂关系,并保持高效检索。

4 TencentDB Agent Memory

腾讯云数据库团队自研的独立记忆管理底座,原生提供自动写入、分层沉淀、按需召回与治理增强等核心能力。

5 Polar Agent Memory

部署于 PolarDB for AI 节点的长期记忆引擎,通过向量数据库与知识图谱双模存储,将历史对话关键信息持久化。

6 AgentKit Memory

火山引擎方案,通过统一接口对接主流记忆库(mem0、Viking 等),帮助 Agent 实现跨会话上下文感知、个性化交互与持续学习。

7 Letta(原 MemGPT)

借鉴操作系统内存管理思想,让 Agent 将上下文窗口视为有限内存,通过自主调用「记忆工具」实现管理,更具系统架构层面的灵活性。

8 MemOS

从「操作系统」高度管理 AI 记忆的全栈框架,将记忆提升为一级计算资源,采用分层架构统一调度、更新与演化。

框架差异集中在「存储底座(向量 / 图 / SQL)+ 是否内置图谱 + 是否云原生」------选型看隔离粒度与跨会话演进能力,而非单一检索指标。

七、与通信协议、人工介入的衔接(轻量,非教材原文)

7.1 与通信协议的关系

协议负责「Agent 之间怎么传」,记忆负责「传完之后记什么、怎么跨会话留」,二者共同构成 Agent 持久协作的底座。

7.2 与人工介入的关系

HITL 的 checkpoint 是「运行态断点续传」,记忆是「跨会话知识沉淀」,两者都是把状态外置,只是层级不同(运行态 vs 知识态)。


八、面试题

8.1 推导题

【推导】 从「LLM 无状态 + 上下文腐烂 / Lost in the Middle」出发,推导为什么生产级 Agent 必须内置外部记忆系统,且为什么不能靠「把所有历史塞进 Prompt」解决;并进一步推导长期记忆为什么必须是「存储 - 更新 - 检索 - 遗忘」完整生命周期,而非只存不理。

推导链:

  1. LLM 是无状态巨型函数,权重中无持久化存储,每次对话都是白板------无记忆的 Agent 每次都要重新自我介绍,无法跨会话累积偏好与经验(呼应篇九 Agent 的自主性与篇六的幻觉与不确定性)。
  2. 直觉解「把全部历史塞进 Prompt」会触发上下文腐烂:信噪比下降、Lost in the Middle(中间内容召回最低)、注意力稀释、上下文干扰;且检索成本随长度平方增长、每次请求携带全量 token 成本失控。
  3. 因此必须把状态外置到模型权重之外、用「外部存储 + 按需检索」替代「全量上下文」------这就是 Agent Memory。
  4. 但记忆一旦持久化,就必然面对:写入什么(类型归类)、如何不重复 / 不冲突(冲突检测合并)、如何修正过时信息(更新保留历史)、如何淘汰脏数据(遗忘)。所以长期记忆必须是完整生命周期,否则检索质量持续下降、甚至产生错误个性化(脏数据导致错误召回)。
  5. 这也呼应篇十一「协议负责传输」、篇十二「checkpoint 负责运行态」------记忆负责「知识态」的持久化,三者层级互补。

8.2 真题

【真题·转述自字节面试题:Agent 的记忆系统怎么设计?短期记忆和长期记忆到底有什么区别?】 短期记忆和长期记忆到底有什么区别?工程上怎么配合?

思路:按维度对比------作用范围(当前会话 vs 跨会话跨任务)、保存内容(最近上下文 / 任务状态 / 工具结果 vs 稳定偏好 / 重要事实 / 历史结论)、典型技术(窗口截断 / 滚动摘要 / 状态缓存 vs Profile / 向量库 / 数据库 / 文档库)、生命周期(会话级 vs 长期持续)、核心风险(截断导致失忆 vs 脏数据导致错误召回)。配合原则:一个合理的上下文组装顺序是 System Prompt → 角色与安全约束 → 相关长期记忆 → 当前任务状态 → 短期摘要 → 最近几轮对话 → 用户最新问题;且「宁可少放几条高置信度记忆,也不要塞一堆模糊相关的历史内容」。

【真题·转述自AI 智能体与大模型应用开发面试题库 / 18 Must-Know Agent Memory Interview Questions】 长期记忆怎么设计?什么时候写入、怎么去重更新、怎么遗忘过时信息?

思路:写入触发(显式指令 / 短期溢出 / 会话终止 / 高频信号 / 定期反思);差异化索引(标量→SQL、模糊偏好→向量、实体关系→图谱);更新冲突决议(人 / 具体 / 可信 / 最新,旧记忆标 Deprecated 不覆盖);遗忘(时间衰减 >90 天 / 低访问 <1 次月 / 容量 >10⁶ 条,硬删 / 软删 / 降权 ×0.2);去重用相似度阈值做冲突检测(besthub 给 0.85)。核心是「有准入、有更新、有清理、有合并、有删除」,否则检索质量持续下降甚至错误个性化。

【真题·转述自字节面试题:Agent 的记忆系统怎么设计?(追问 1)/ AI Agent 的记忆是怎么实现的?】 记忆(Memory)和 RAG 是一回事吗?有什么区别?

思路:底层技术都可用 Embedding + 向量检索,但目的不同------RAG 面向外部知识库(文档 / 规范 / FAQ / 代码库),补充外部知识、解决「知不知道」;记忆偏用户维度和交互历史(偏好 / 历史决策 / 任务背景),保持个性化与连续性、解决「记不记得你」。数据来源与更新方式也不同(RAG 批量导入、定期同步;记忆持续写入、动态更新)。一句话:RAG 是查资料,记忆是记过程。


💬 结语: Agent 会通信、能刹车、还得记得住------短期记忆是工作台、长期记忆是档案柜,二者靠「存储 - 更新 - 检索 - 遗忘」串成完整生命周期。别把历史全塞进 Prompt,外置记忆才是正解。你打算给自己的 Agent 先接哪类记忆?评论区聊聊。觉得有收获,点个赞再走,关注流浪,大模型技术全景持续更新。

相关推荐
XLYcmy11 小时前
AI 时代,MOM(制造运营管理系统)该如何演进? 下
ai·llm·agent·智能制造·数字孪生·mom·harness
大鹏的NLP博客17 小时前
理解 Jev:让大模型从“生成”走向“判断”
llm·jev
SharpCJ19 小时前
Koog(1) —— JVM 下的 Agent 框架
llm·agent
桃西西呀19 小时前
用 Laya 把出海 App 的几百条混语评价拆成可统计的判断
人工智能·llm·ai编程
sg_knight1 天前
ZCode Bug 定位实战:把报错丢给 ZCode,它是怎么修的
llm·bug·agent·ai编程·glm·智谱·zcode
AINative软件工程1 天前
LLM 应用的 Chaos Engineering 工程实践:给 AI 系统下毒,才能知道它有多抗造
后端·llm·ai编程
吃饱了得干活2 天前
从 LLM 到 Agent:一文彻底搞懂什么是 AI Agent
llm·agent
莪_幻尘2 天前
Skill 体检:30 个 Skill 全凭感觉?体检器先自曝了 8 个“假 0 分
前端·人工智能·llm