Memory System —— Agent记忆系统
引言:Agent的“失忆症”与解药
在之前的文章中,我们拆解了Agent的核心架构、主流范式与工具调用机制。然而,无论架构多精巧、范式多先进,所有Agent都面临一个根本性的瓶颈——记忆。
LLM本身是无状态的。每一次调用,模型都像第一次见到用户一样——它不记得昨天的对话,不记得用户的偏好,不记得自己五分钟前得出的结论。对于单轮问答,这不是问题。但对于需要持续交互、跨会话学习、长程推理的Agent来说,这是致命的。
传统的解决方案简单粗暴:把整段对话历史塞进上下文窗口。这种方法在生产环境中问题重重——满上下文不仅带来17秒的p95延迟和14倍的token开销,还会导致模型对早期指令的注意力下降,且没有策展的记忆会把一次性错误固化成永久谎言。一个中等规模SaaS,每月1000万次Agent调用,若走满上下文仅LLM token就大约要花100万美元;同样的工作负载换成选择性记忆会降到约10万美元。
Agent记忆系统正是为此而生。本文将系统讲解Agent记忆系统的三个核心层次:
- 向量数据库:记忆的存储底座
- 记忆的读写、更新与遗忘:记忆的生命周期管理
- MemGPT(分层缓存) :将上下文视为操作系统的内存-磁盘交换
- 记忆压缩(Summary Memory) :让记忆在有限空间中高效存活
一、向量数据库——记忆的存储底座
1.1 为什么Agent需要向量数据库
Agent的记忆需要满足三个核心要求:持久化(跨会话不丢失)、可检索(按语义快速查找)、可扩展(支持海量记忆)。传统的关系数据库无法高效支持语义检索,而向量数据库正是为此而生。
向量数据库的核心抽象极其简洁:将非结构化数据(文本、图像等)转换为高维向量,通过向量相似度实现语义检索。
Agent将信息(如用户偏好、历史对话)嵌入为向量存储在Pinecone、Milvus或腾讯云向量数据库等系统中,当需要回忆时,通过快速相似度搜索检索相关历史数据。
1.2 核心抽象:Collection、Index与Embedding
无论选择Milvus还是Pinecone,向量数据库都围绕三个核心概念展开:
Collection(集合) :相当于关系数据库中的“表”,是存储和管理向量的组织单位。在Milvus中,一个实例可以处理多个集合;在Pinecone中,索引与硬件(Pods)紧密结合。
Index(索引) :向量数据库的核心提速依赖向量索引算法,通过“提前构建索引结构”,把全量比对变成局部比对,将检索复杂度从 O(n) 降到 O(log n) 或更低。主流索引包括HNSW、IVF-FLAT、IVF-PQ等。
Embedding(嵌入) :将文本转换为高维向量的过程。嵌入模型的选择直接影响记忆检索的质量——维度决定了表达的丰富度与存储成本之间的权衡。
1.3 向量数据库在记忆系统中的定位
在实践中,向量数据库很少单独使用。一个成熟的记忆系统通常采用混合存储架构:
- 短期记忆:使用内存数据库(如Redis)保证低延迟
- 长期记忆:通过向量数据库(如Milvus、Pinecone)实现高效语义检索
- 元数据:将元数据与原始文本存储在PostgreSQL中,实现“元数据过滤+向量搜索”的混合检索策略
实践建议:初期可采用Redis作为缓存层存储短期对话,MongoDB存储长期历史;向量数据库仅在需要语义扩展时引入。
二、记忆的生命周期——写入、检索、更新与遗忘
2.1 记忆的四种类型
在深入生命周期管理之前,有必要先理解Agent记忆的分类。《Memory in the Age of AI Agents》提出了标准分类法:
| 记忆类型 | 存放什么 | 存储位置 | 生命周期 |
|---|---|---|---|
| 工作记忆 | 当前对话、工具结果、中间推理 | 上下文窗口内部 | 仅限当前会话 |
| 情景记忆 | 过往具体会话记录,带时间戳 | 带元数据的向量数据库 | 数周到数月,带衰减 |
| 语义记忆 | 用户偏好、实体关系、可复用知识 | 向量数据库、知识图谱 | 持久化,带冲突解决 |
| 过程记忆 | 技能、操作流程 | 结构化存储 | 持久化 |
这四种记忆类型各自有独立的后端、生命周期与失效模式。一个好的记忆系统需要同时管理这四种记忆,并让它们协同工作。
2.2 写入策略:从“存一切”到“存精华”
最朴素的写入策略是把所有对话历史原封不动地存入向量数据库。但这种策略的问题很明显——原始对话充斥冗余信息,导致检索时召回大量无关内容。
更先进的写入策略包括:
抽取式写入(Extraction) :从对话中提取关键事实、用户偏好等结构化信息,而非存储原始文本。
摘要式写入(Summarization) :将对话历史压缩为摘要存入长期记忆。
重要性评分写入:基于记忆的重要性(如艾宾浩斯遗忘曲线理论)动态调整存储优先级。
2.3 检索策略:从关键词到语义
记忆检索的核心是从向量数据库中召回与当前查询最相关的记忆片段。检索质量直接决定了Agent能否“想起”正确的事情。
主流检索策略包括:
- 纯向量检索:基于余弦相似度或欧氏距离
- 混合检索:向量检索 + 关键词检索(全文搜索)的融合
- 元数据过滤:先按时间、类型等元数据过滤,再在过滤结果上进行向量检索
2.4 更新与冲突解决:当记忆相互矛盾
记忆不是一成不变的。当Agent获得新信息时,可能需要更新已有的记忆。但更新带来了一个棘手的问题:新旧记忆可能相互矛盾。
例如,Agent之前记住了“用户喜欢Python”,但后来用户说“我现在主要用Rust了”。这时记忆系统需要能够检测冲突并解决矛盾。
冲突解决的策略包括:
- 时间戳优先:较新的记忆覆盖较旧的
- 置信度优先:置信度高的记忆优先
- 人工介入:将冲突标记出来,由用户或管理员裁决
2.5 遗忘策略:不是失败,而是feature
“遗忘”是记忆系统中最反直觉却最重要的设计。
在传统信息系统中,保存是首要原则,删除意味着数据丢失。但在Agent记忆系统中,战略性遗忘(Strategic Forgetting)不是失败,而是essential feature。
遗忘的必要性来自三个现实约束:
- 存储成本:无限存储无限记忆,成本不可控
- 检索质量:记忆越多,信噪比越低,检索准确率下降
- 上下文窗口:即使有检索,能注入上下文的记忆数量仍然有限
常见的遗忘策略包括:
- LRU(Least Recently Used) :淘汰最久未访问的记忆
- 自动衰减(Automatic Decay) :记忆随时间的推移而减弱
- 重要性阈值:低于重要性阈值的记忆被自动遗忘
- 容量限制:达到容量上限后,按策略淘汰
三、MemGPT——将上下文视为内存-磁盘交换
3.1 问题:固定上下文窗口的致命局限
大语言模型最根本的硬约束是固定长度的上下文窗口。即使是GPT-4,其上下文窗口也有限——这意味着模型一次能“看”的token数是固定的。
这个局限的后果是灾难性的:
- 在长对话中,模型必须不断丢弃早期信息
- 在文档分析中,无法一次性处理长文档
- 在多会话交互中,无法跨会话保持记忆
直接扩展上下文窗口在技术上可行,但Transformer的自注意力机制导致计算时间和内存成本呈二次方增长。即使克服了计算挑战,研究也表明长上下文模型难以有效利用额外上下文。
3.2 核心思想:从操作系统学来的分层记忆
MemGPT(Memory-GPT)由UC Berkeley的Packer等人于2023年提出。其核心思想极其优雅:从传统操作系统的分层内存管理中获得灵感。
在操作系统中,物理内存(RAM)容量有限,但通过虚拟内存分页(virtual memory paging) 技术,操作系统在物理内存和磁盘之间交换数据,为应用程序提供了无限虚拟内存的幻觉。
MemGPT将这一范式直接移植到LLM的上下文管理上:
MemGPT将LLM的固定上下文窗口视为“物理内存”,将外部向量数据库视为“磁盘”,通过智能的数据交换,提供“无限上下文”的幻觉。
3.3 分层记忆架构
MemGPT的分层记忆架构包含两个主要层次:
主上下文(Main Context) :类比于RAM/物理内存。这是LLM的固定上下文窗口,包含系统指令、对话内容和工作记忆三部分。主上下文是LLM直接可访问的“工作空间”,但容量有限。
外部上下文(External Context) :类比于磁盘存储。这是LLM上下文窗口之外的任何信息,存储在向量数据库(如LanceDB)中。外部上下文是一个巨大的、可搜索的档案库,存储着海量的历史交互。
MemGPT还进一步将记忆细分为三个层次:
- Core Memory(核心记忆) :始终在上下文中的压缩表示,存储Agent的人设和关于用户的关键信息
- Recall Memory(回忆记忆) :可搜索的数据库,通过语义搜索重建特定记忆
- Archival Memory(归档记忆) :长期存储重要信息,可按需移回核心或回忆记忆
3.4 工作机制:Agent自主管理记忆
MemGPT最革命性的设计在于:让LLM自己成为记忆管理器。
传统的RAG系统中,记忆管理由外部规则系统处理。而MemGPT通过工具调用(function calling) 让Agent自主决定:
- 什么时候将信息从主上下文移到外部上下文
- 什么时候从外部上下文召回信息到主上下文
- 什么信息需要被总结
- 什么信息需要被遗忘
具体来说,MemGPT在上下文中保留了一个可编辑的“系统提示”区域(in-context memory),并给Agent提供了读写工具:
1# MemGPT的核心记忆编辑工具2def core_memory_append(self, name: str, content: str):3 """追加内容到核心记忆"""4 self.memory[name].value += "\n" + content5
6def core_memory_replace(self, name: str, old_content: str, new_content: str):7 """替换核心记忆中的内容"""8 self.memory[name].value = self.memory[name].value.replace(old_content, new_content)Agent通过调用这些工具来主动管理自己的记忆内容——这是传统AI系统中前所未见的自主性。
3.5 分页与中断:类OS的控制流
MemGPT还引入了两个操作系统级别的控制机制:
分页(Paging) :当主上下文即将溢出时,MemGPT将“不活跃”的信息移出主上下文,存储到外部上下文中。当需要时,再将相关信息从外部上下文“换入”主上下文。
中断(Interrupts) :MemGPT利用中断来管理自身与用户之间的控制流。例如,当Agent需要用户输入或确认时,可以触发中断暂停执行。
3.6 实验数据:MemGPT的效果
MemGPT在两个关键领域进行了评估:
- 文档分析:MemGPT能够分析远超底层LLM上下文窗口的大型文档
- 多会话聊天:MemGPT能够创建记住、反思和动态进化的对话Agent
在100轮以上的对话中,MemGPT的上下文一致性比传统LLM提升了67%。通过智能的记忆管理,MemGPT可以将推理成本降低90%以上。
3.7 从MemGPT到Letta:记忆优先的Agent框架
MemGPT的研究成果已经演化为Letta(曾用名MemGPT)——一个记忆优先(memory-first)的Agent框架。
Letta将记忆视为一等架构关切(first-class architectural concern) ,而非事后补丁。在Letta中,Agent不仅使用记忆——它们运行在Letta内部,由框架统一管理Agent循环、工具执行、记忆管理和状态持久化。
四、记忆压缩(Summary Memory)——让记忆在有限空间中高效存活
4.1 为什么需要记忆压缩
即使有了MemGPT式的分层管理,主上下文仍然是有限的。在长任务执行过程中,每一轮“调用工具→拿到结果→再思考”都会往历史里追加大量内容。几十轮下来,历史轻松膨胀到几十万token。
撞上窗口上限会发生三件糟心事:
- 请求被拒:provider直接报context overflow
- 费用飙升:每轮都把全部历史重发一遍
- 早期信息丢失:粗暴截断会把最初的任务目标也一起截掉
记忆压缩(Summarization / Compaction) 正是为此而生——把“旧的、暂时用不上的”折叠成摘要,腾出空间继续干活。
4.2 压缩的核心机制
记忆压缩的核心逻辑可以概括为:
当消息条数超过阈值时,把旧的对话历史交给LLM生成一段摘要,然后用
[system, 摘要, 最近几条消息]替换掉原来的长历史。
这个“判阈值→选切点→切分→生成摘要”的流程是LangChain等框架的压缩内核。
更先进的压缩策略包括:
两级摘要记忆:将原始对话压缩为两层摘要——单任务摘要(细粒度)和宏观摘要(粗粒度),在保持恒定上下文长度的同时保留最重要的信息和决策脉络。
层级摘要打包(Hierarchical Summary Packing) :将大的记忆区域压缩为渐进式、保留来源的摘要,在需要时可以从摘要展开回原始材料。
无损上下文管理(Lossless Context Management) :主动归档每条消息,构建层级摘要结构,可在需要时注入回上下文。
4.3 压缩的工程实践要点
压缩时机:压缩通常在“每次调用大模型之前”触发。当检测到上下文即将溢出时,自动执行压缩。
非破坏性压缩:好的压缩策略不删原稿——原始对话被归档保存,压缩只产生一个“视图”用于当前推理。
渐进式策略:从最便宜的优化手段开始。例如,DeepAgents先尝试截断超长工具参数(如一次性写入几千行文件内容),如果还不够再触发完整的摘要压缩。
手动压缩:让Agent通过工具调用自主决定“我要清场”,给Agent更大的控制权。
五、总结:从“存下来”到“管起来”
Agent记忆系统的演化,本质上是从 “存下来”到“管起来” 的跃迁。
| 阶段 | 核心思想 | 代表技术 |
|---|---|---|
| 存储 | 把记忆存下来 | 向量数据库(Milvus/Pinecone) |
| 管理 | 决定存什么、怎么取、何时忘 | 写入策略、检索策略、遗忘策略 |
| 分层 | 像OS一样管理有限上下文 | MemGPT / Letta |
| 压缩 | 在有限空间中高效存活 | Summary Memory / Compaction |
这四个层次并非替代关系,而是层层递进、互为补充。一个生产级的Agent记忆系统,需要:
- 向量数据库提供存储底座
- 生命周期管理(写入→检索→更新→遗忘)确保记忆的质量
- MemGPT式分层解决上下文窗口的硬约束
- 记忆压缩在有限空间中最大化信息的密度
正如MemGPT论文所揭示的:**“我们研究如何在继续使用固定上下文模型的同时,提供无限上下文的幻觉。”**这不仅是技术挑战,更是对AI智能本质的深刻思考——真正的智能,不在于拥有多大的“工作台”,而在于知道什么该放在手边、什么该归档、什么该遗忘。
Some information may be outdated