Agent Memory 模块综述:按记忆类型梳理代表性架构与 开源项目

大语言模型本身通常是无状态的。一次推理结束后,模型不会自然保留用户偏好、历史任务、失败经验或环境变化。虽然可以把聊天记录不断追加到上下文窗口中,但随着对话增长,这种方式会带来更高的 Token 成本、更长的响应延迟,以及越来越严重的信息噪声。

因此,Agent Memory 不能简单理解为“保存聊天记录”。一个完整的记忆系统通常包含记忆写入、信息抽取、冲突处理、存储、检索、重排、上下文注入、遗忘和权限治理等环节。

按照记忆所保存的信息和发挥的作用,Agent Memory 可以分为以下几类:

  1. 工作记忆(Working Memory)
  2. 情景记忆(Episodic Memory)
  3. 语义记忆(Semantic Memory)
  4. 程序性记忆(Procedural Memory)
  5. 时间与关系记忆(Temporal and Relational Memory)
  6. 共享记忆(Shared Memory)

实际系统往往同时包含多种记忆,而不是只属于其中一类。

一、工作记忆:保存当前任务和会话状态

工作记忆主要保存 Agent 当前正在处理的信息,例如:

  • 当前对话历史;
  • 任务执行到了哪一步;
  • 已调用过哪些工具;
  • 工具返回了什么结果;
  • 当前计划和中间推理结果;
  • 工作流中的临时变量;
  • 中断后恢复任务所需的状态。

工作记忆的生命周期通常较短,大多绑定在一个会话、线程或任务上。它解决的不是“几个月后还记得用户”,而是“下一轮推理时不要忘记上一轮发生了什么”。

1. LangGraph

GitHub:

https://github.com/langchain-ai/langgraph

LangGraph 是目前比较典型的有状态 Agent 编排框架。它将 Agent 表达为一个状态图,并通过 Checkpointer 保存线程内状态。

LangGraph 的记忆主要分为两部分:

  • Checkpointer:保存单个线程的短期状态;
  • Store:保存跨线程、跨会话的长期数据。

Checkpointer 适合保存消息历史、任务节点、中间输出和工具执行结果。当 Agent 因故障、人工审批或系统重启而中断时,可以从之前的 checkpoint 恢复。

因此,LangGraph 的优势不只是“记住聊天”,而是把记忆和可恢复工作流结合起来。

2. LlamaIndex Memory

GitHub:

https://github.com/run-llama/llama_index

LlamaIndex 的新 Memory API 将短期记忆组织为一个受 Token 预算限制的 FIFO 消息队列。

近期消息保留在工作记忆中。当消息超过预算时,较早的内容可以被转移到长期 Memory Block 中。

LlamaIndex 提供了三种代表性的 Memory Block:

  • StaticMemoryBlock:保存固定的核心信息;
  • FactExtractionMemoryBlock:从历史消息中抽取事实;
  • VectorMemoryBlock:把历史消息写入向量数据库并按相关性召回。

需要注意的是,LlamaIndex 的 Memory 与 Workflow Context 并不是同一个概念:

  • Memory 主要保存聊天消息和长期记忆;
  • Workflow Context 保存工作流执行状态和运行时变量。

复杂 Agent 通常需要同时使用两者。

3. Microsoft Agent Framework

GitHub:

https://github.com/microsoft/agent-framework

Microsoft Agent Framework 是 AutoGen 和 Semantic Kernel 的后继框架。它使用 Session 保存会话状态,并使用 Context Provider 在 Agent 调用前注入上下文、在调用后处理新的信息。

Context Provider 可以用来实现:

  • 对话历史记忆;
  • 用户画像注入;
  • 向量数据库检索;
  • 外部知识检索;
  • 执行结果持久化;
  • 基于历史交互的上下文更新。

Microsoft Agent Framework 更适合需要 Python、.NET、多 Agent 工作流、可恢复性和企业级可观测性的系统。

需要注意的是,AutoGen 当前已经进入维护模式。新项目一般应优先考虑 Microsoft Agent Framework。

AutoGen GitHub:

https://github.com/microsoft/autogen

二、情景记忆:保存 Agent 经历过的事件

情景记忆描述的是“过去发生了什么”,通常带有明确的时间、场景、参与者和结果。

例如:

  • 用户上周咨询过退款问题;
  • Agent 曾经调用某个接口,但因为权限不足而失败;
  • 某项任务使用方案 A 成功完成;
  • 用户在上一次会议中否决了某个方案;
  • Agent 曾经与另一个 Agent 协作完成数据分析。

情景记忆通常保存原始经历或经历摘要。它特别适合长期助手、游戏 NPC、客服 Agent 和能够从历史任务中学习的自主 Agent。

1. Generative Agents

GitHub:

https://github.com/joonspk-research/generative_agents

Generative Agents 是 Agent Memory 研究中非常有代表性的项目。它为每个 Agent 建立一个 Memory Stream,用于按时间保存 Agent 的观察、行为和经历。

在检索记忆时,系统综合考虑三个因素:

  • Recency:记忆距离当前时间有多近;
  • Relevance:记忆与当前情境有多相关;
  • Importance:记忆本身有多重要。

除了保存原始经历,Generative Agents 还会周期性地执行 Reflection,将多个低层次事件总结成更高层次的认识。

例如,系统可能从多次交互中总结出:

“某个角色似乎对社区活动非常积极。”

这种反思结果又会成为新的记忆,并影响后续计划和行为。

Generative Agents 更适合作为情景记忆、反思机制和虚拟角色设计的研究参考,而不是直接作为生产级记忆服务使用。

2. MemoryBank

GitHub:

https://github.com/zhongwanjun/MemoryBank-SiliconFriend

MemoryBank 面向长期对话和个性化陪伴场景。它将用户与模型之间的历史交互保存为记忆,并引入类似艾宾浩斯遗忘曲线的机制。

其主要思想包括:

  • 根据时间衰减记忆;
  • 根据重要性决定记忆保留程度;
  • 通过重复访问强化记忆;
  • 从历史交互中总结用户性格和偏好。

MemoryBank 的价值主要在于展示“遗忘”和“强化”如何进入 Agent Memory,而不是让记忆无限增长。

3. Mem0

GitHub:

https://github.com/mem0ai/mem0

Mem0 是一个可以接入现有 Agent 的长期记忆层。它可以从用户与 Agent 的交互中抽取值得保存的信息,并按照用户、会话和 Agent 等作用域组织记忆。

Mem0 特别适合保存:

  • 用户过去提出的问题;
  • 历史服务记录;
  • 用户与 Agent 共同完成的任务;
  • Agent 已经确认执行的操作;
  • 对未来交互有帮助的历史事件。

相比直接保存全部聊天记录,Mem0 更强调从对话中抽取高价值记忆,再在后续会话中按相关性召回。

需要注意的是,Mem0 开源版与托管平台的功能并不完全相同。当前开源版本没有可独立查询的 Graph Memory,因此不能直接把托管平台的所有能力和评测结果视为开源版能力。

三、语义记忆:保存事实、概念和用户画像

语义记忆保存的是已经从具体经历中抽取出来的稳定知识。

例如:

  • 用户喜欢简洁的回答;
  • 用户使用 Python 开发;
  • 项目数据库是 PostgreSQL;
  • 公司规定所有生产变更都需要代码审查;
  • 某个 API 使用 OAuth 2.0;
  • 张三是项目负责人。

情景记忆强调“什么时候发生了什么”,语义记忆强调“我们现在知道什么”。

语义记忆通常以结构化字段、JSON 文档、向量、实体或知识图谱节点的形式保存。

1. Mem0

Mem0 是用户偏好和事实记忆中最典型的工程项目之一。

它可以把原始对话:

“我之后的代码示例尽量用 Python,不要用 Java。”

转换为更稳定的语义记忆:

“用户偏好 Python 代码示例,不希望使用 Java。”

后续会话不需要重新加载全部历史,只需要检索这条偏好并注入模型上下文。

这种方式特别适合:

  • 个性化助手;
  • 客服系统;
  • 教育 Agent;
  • 医疗或健康助手中的非诊断性偏好;
  • 游戏角色和长期陪伴 Agent。

2. LangMem

GitHub:

https://github.com/langchain-ai/langmem

LangMem 是 LangChain 生态中专门面向长期记忆和 Agent 学习的组件。

它支持两种主要记忆写入方式:

  • Hot Path:Agent 在当前交互中主动调用工具写入或搜索记忆;
  • Background Path:后台任务从历史对话中抽取、合并和更新记忆。

LangMem 可以从对话中提取事实、用户偏好和长期知识,并保存到 LangGraph Store 或其他存储系统中。

它的优势是可以把记忆管理与 LangGraph 工作流结合起来,同时允许应用自行设计数据结构、命名空间和存储后端。

3. LlamaIndex FactExtractionMemoryBlock

LlamaIndex 的 FactExtractionMemoryBlock 会接收从短期记忆中移出的旧消息,并从中抽取长期事实。

例如,它可以把多轮对话压缩为:

  • 用户居住在上海;
  • 用户从事数据工程;
  • 用户喜欢使用开源模型;
  • 当前项目使用 Milvus。

与直接保存原始对话相比,事实记忆更加紧凑,但也会引入抽取错误和事实冲突。因此,生产系统最好同时保存事实来源和原始证据。

四、程序性记忆:保存方法、策略和经验

程序性记忆描述的是“怎样完成某类任务”,而不是“某件事是什么”。

它通常包括:

  • 某类任务的最佳执行步骤;
  • 已验证有效的工具调用顺序;
  • 常见错误及其解决方案;
  • 失败方案和失败原因;
  • Agent 的提示词或行为规则;
  • 可复用的代码、脚本和技能;
  • 来自用户反馈的策略改进。

程序性记忆能够让 Agent 从过去的执行经验中学习,避免每次任务都从零开始。

1. LangMem

LangMem 不仅可以保存用户事实,还支持程序性记忆,例如根据历史交互和反馈改进 Agent 的系统提示词。

如果用户多次指出:

“回答太长,希望先给结论。”

系统可以把这种反馈整合到 Agent 的长期行为规则中,而不是仅仅保存为一条普通聊天记录。

因此,LangMem 既可以管理语义记忆,也可以管理 Agent 的行为策略和提示词记忆。

2. Letta

GitHub:

https://github.com/letta-ai/letta-code

项目入口:

https://github.com/letta-ai/letta

Letta,原名 MemGPT,是 Agent Memory 领域最具代表性的项目之一。

Letta 将有限的上下文窗口类比为计算机主存,将外部长期记忆类比为可分页存储。Agent 可以主动执行记忆搜索、写入、编辑和重组。

Letta 的特点是:记忆不是模型调用之前固定执行的一次检索,而是 Agent 自己可以操作的资源。

Agent 可以维护:

  • 核心身份信息;
  • 用户长期偏好;
  • 历史对话;
  • 外部归档记忆;
  • 任务经验;
  • 技能和提示词;
  • 长期运行过程中形成的自我认识。

这种模式适合:

  • 长期运行的个人 Agent;
  • 持续维护项目的编程 Agent;
  • 具有稳定身份的虚拟角色;
  • 能够主动学习和调整自身策略的 Agent。

Letta 的代价是系统较重。它更像一套有记忆的 Agent Runtime,而不是一个简单的记忆 SDK。

另外,旧的 letta GitHub 仓库现在主要是项目入口,当前实现位于 letta-ai/letta-code。

3. A-MEM

GitHub:

https://github.com/agiresearch/A-mem

论文复现代码:

https://github.com/WujiangXu/AgenticMemory

A-MEM 受到卡片盒笔记法,也就是 Zettelkasten 的启发。

每条新记忆都会被整理成带有以下信息的记忆卡片:

  • 内容;
  • 上下文描述;
  • 关键词;
  • 标签;
  • 与已有记忆的链接;
  • 可随新信息变化的结构化属性。

系统不会只把记忆作为相互独立的向量,而是让记忆之间逐渐形成动态网络。

A-MEM 适合研究:

  • 经验之间如何建立关联;
  • 新记忆如何改变旧记忆;
  • Agent 如何主动组织长期知识;
  • 程序性经验如何逐渐形成可复用结构。

它目前更适合作为研究型实现和算法原型。

五、时间与关系记忆:保存会变化的实体和关系

很多真实世界的事实并不是永久不变的。

例如:

  • 张三原来属于销售部,现在属于产品部;
  • 某个客户以前使用基础套餐,现在升级为企业套餐;
  • 某项目负责人在 5 月发生了变化;
  • 某项政策只在特定时间段有效;
  • 用户过去住在北京,现在住在杭州。

普通向量检索可能同时召回新旧事实,却无法准确判断哪个事实当前有效。时间与关系记忆的目标就是解决这一问题。

1. Graphiti

GitHub:

https://github.com/getzep/graphiti

Graphiti 是一个面向 Agent 的时间上下文图引擎。它将记忆组织成实体、关系和事件,并记录事实的时间范围和来源。

Graphiti 的主要能力包括:

  • 增量写入新的事件和事实;
  • 保存实体之间的关系;
  • 追踪事实随时间发生的变化;
  • 保留来源和历史记录;
  • 支持关键词、向量和图关系的混合检索;
  • 支持历史时间点查询和多跳关系检索。

Graphiti 特别适合:

  • CRM 和客户关系系统;
  • 企业组织关系;
  • 用户生命周期管理;
  • 项目成员和权限变化;
  • 供应链和资产关系;
  • 需要回答“某个时间点是什么状态”的 Agent。

Graphiti 与 Zep 需要区分:

  • Graphiti 是开源的时间图引擎;
  • Zep 是建立在相关技术上的托管生产基础设施。

使用 Graphiti 时,通常需要自行准备图数据库,并实现用户、线程、权限和多租户管理。

2. Cognee

GitHub:

https://github.com/topoteretes/cognee

Cognee 将文档、文本和结构化数据转换为向量与知识图谱,为 Agent 提供持久化知识记忆。

其典型流程可以概括为:

add → cognify → memify → search

Cognee 不只保存某个用户的聊天记录,而是希望建立可以被多个 Agent 使用的知识基础设施。

它适合:

  • 企业内部知识库;
  • 跨文档实体关联;
  • 多数据源知识整合;
  • 共享团队知识;
  • GraphRAG;
  • 需要自托管的企业 Agent。

相比简单向量记忆,Cognee 能够表达实体之间的关系。但它也更重,需要考虑数据摄取、图构建、实体消歧、本体设计和存储运维。

3. HippoRAG

GitHub:

https://github.com/OSU-NLP-Group/HippoRAG

HippoRAG 是一种受人类长期记忆机制启发的检索框架。它将知识图谱、向量检索和 Personalized PageRank 等方法结合起来,强调跨文档关联和多跳检索。

HippoRAG 更适合解决:

  • 一个答案分散在多个文档中的问题;
  • 多跳事实推理;
  • 大规模知识关联;
  • 非参数持续学习;
  • 长期知识库中的关联召回。

HippoRAG 更接近“知识型长期记忆”,而不是用户聊天记忆。它适合作为文档 Agent、研究 Agent 和复杂 RAG 系统的记忆基础。

六、共享记忆:让多个 Agent 使用同一知识空间

在多 Agent 系统中,不同 Agent 往往需要共享一部分知识和任务状态。

例如:

  • 研究 Agent 找到的资料需要交给写作 Agent;
  • 编程 Agent 发现的错误原因需要被测试 Agent 使用;
  • 客服 Agent 需要共享同一个客户画像;
  • 多个 Agent 需要共同维护项目计划;
  • 一个 Agent 学到的经验需要被其他 Agent 复用。

共享记忆必须解决以下问题:

  • 哪些记忆属于单个 Agent;
  • 哪些记忆属于用户;
  • 哪些记忆属于团队;
  • 哪些记忆可以跨 Agent 读取;
  • 多个 Agent 同时更新时如何处理冲突;
  • 如何追踪是谁写入了某条记忆。

1. LangGraph Store

LangGraph Store 使用 namespace 和 key 保存跨线程数据。

可以按照以下方式划分作用域:

  • user/{user_id}:用户级记忆;
  • agent/{agent_id}:Agent 私有记忆;
  • team/{team_id}:团队共享记忆;
  • project/{project_id}:项目知识;
  • organization/{org_id}:组织级知识。

这种设计灵活,适合需要精细控制记忆范围的多 Agent 系统。

2. Cognee

Cognee 适合作为多个 Agent 共享的知识图谱。不同 Agent 可以把文档、事实和关系写入统一知识空间,再按照数据集、用户或租户进行隔离。

它更适合共享企业知识,而不是单个 Agent 的临时工作状态。

3. CrewAI

GitHub:

https://github.com/crewAIInc/crewAI

CrewAI 是一个角色化多 Agent 编排框架,提供 memory、knowledge、checkpointing 等能力。

它适合让多个角色 Agent 围绕同一个任务协作,例如:

  • 研究员负责收集信息;
  • 分析师负责形成结论;
  • 写作 Agent 负责生成报告;
  • 审核 Agent 负责检查输出。

CrewAI 的内置记忆适合快速构建多 Agent 工作流。如果系统需要复杂的时间版本、跨系统共享、精细权限或记忆冲突处理,通常仍需要接入 Mem0、Graphiti、Cognee 或自定义存储。

七、不同记忆类型与代表项目对照

https://github.com/microsoft/autogen

八、如何选择 Agent Memory 模块

如果只是需要让聊天机器人记住用户偏好,可以优先考虑:

  • Mem0;
  • LangMem;
  • LlamaIndex FactExtractionMemoryBlock。

如果需要保存当前任务状态并支持中断恢复,可以考虑:

  • LangGraph Checkpointer;
  • Microsoft Agent Framework Session;
  • LlamaIndex Workflow Context。

如果需要长期运行、维护身份并主动管理自身记忆,可以考虑:

  • Letta。

如果数据中的事实会随时间变化,或者需要查询历史状态,可以考虑:

  • Graphiti;
  • Zep。

如果记忆主要来自企业文档,并且需要跨文档和实体关系检索,可以考虑:

  • Cognee;
  • HippoRAG;
  • LlamaIndex。

如果需要多个 Agent 共享记忆,可以考虑:

  • LangGraph Store;
  • Cognee;
  • CrewAI;
  • Microsoft Agent Framework。

实际项目中也可以组合使用。例如:

  • LangGraph Checkpointer 保存当前任务状态;
  • Mem0 保存用户偏好;
  • Graphiti 保存带时间版本的实体关系;
  • Cognee 保存企业知识;
  • 对象存储保存原始对话和证据;
  • 统一检索层负责对不同来源的记忆进行重排。

九、Agent Memory 落地时需要注意的问题

1. 不要保存所有内容

工具日志、模型猜测、用户明确陈述和系统确认结果的可信度不同。写入记忆前应该先分类,并保存来源、时间、主体和置信度。

2. 记忆必须支持更新和删除

如果系统只有 add 和 search,记忆库最终一定会出现大量过期和矛盾信息。

一个完整的记忆接口至少应该支持:

  • Add;
  • Search;
  • Update;
  • Delete;
  • Invalidate;
  • Audit。

3. 工作流状态和长期记忆要分开

“任务执行到第几步”属于工作流状态。

“用户喜欢简洁回答”属于长期记忆。

两者的生命周期、读取权限和删除方式不同,不应该全部保存在同一张表中。

4. 必须处理记忆冲突

例如,记忆库中可能同时存在:

  • 用户住在北京;
  • 用户住在上海。

系统需要判断这是事实更新、时间变化,还是抽取错误。常见处理方式包括:

  • 保存事实有效时间;
  • 新事实覆盖旧事实;
  • 保留多个版本;
  • 标记冲突等待确认;
  • 根据来源可信度排序。

5. 记忆是新的安全边界

恶意内容一旦进入长期记忆,可能在未来多次被召回,形成持续性的记忆投毒。

生产系统应该实现:

  • 写入内容过滤;
  • Prompt Injection 检测;
  • 用户和租户隔离;
  • 读取权限控制;
  • 敏感信息识别;
  • 记忆来源展示;
  • 删除和审计日志。

6. 需要使用真实业务数据评测

不能只测试“能不能存进去”和“能不能搜出来”。

至少应该评测:

  • 记忆写入准确率;
  • 有效记忆召回率;
  • 错误记忆注入率;
  • 冲突处理准确率;
  • 时间一致性;
  • 最终回答质量提升;
  • 端到端延迟;
  • Token 和模型调用成本;
  • 删除后是否还能被召回;
  • 多租户数据是否会串用。

十、总结

Agent Memory 的本质不是简单地给大语言模型连接一个数据库,而是建立一套能够选择、抽取、保存、更新、检索、遗忘和治理长期上下文的系统。

从记忆类型来看:

  • 工作记忆让 Agent 知道当前任务进行到哪里;
  • 情景记忆让 Agent 知道过去发生过什么;
  • 语义记忆让 Agent 掌握稳定事实和用户偏好;
  • 程序性记忆让 Agent 复用过去形成的方法和经验;
  • 时间与关系记忆让 Agent 理解事实如何变化;
  • 共享记忆让多个 Agent 在同一知识空间中协作。

如果目标是快速实现个性化,可以从 Mem0 或 LangMem 开始;如果需要可恢复的有状态工作流,可以选择 LangGraph;如果需要长期自主 Agent,可以研究 Letta;如果事实具有明显的时间和关系结构,可以选择 Graphiti;如果重点是企业知识和跨文档关联,可以考虑 Cognee、LlamaIndex 或 HippoRAG。

真正决定 Agent Memory 效果的,通常不是使用了哪一种数据库,而是系统如何判断什么值得记住、如何处理矛盾和过期信息、如何检索真正相关的记忆,以及如何持续评测记忆对最终任务的帮助。