
Agent Memory 模块综述:按记忆类型梳理代表性架构与 开源项目
大语言模型本身通常是无状态的。一次推理结束后,模型不会自然保留用户偏好、历史任务、失败经验或环境变化。虽然可以把聊天记录不断追加到上下文窗口中,但随着对话增长,这种方式会带来更高的 Token 成本、更长的响应延迟,以及越来越严重的信息噪声。
因此,Agent Memory 不能简单理解为“保存聊天记录”。一个完整的记忆系统通常包含记忆写入、信息抽取、冲突处理、存储、检索、重排、上下文注入、遗忘和权限治理等环节。
按照记忆所保存的信息和发挥的作用,Agent Memory 可以分为以下几类:
- 工作记忆(Working Memory)
- 情景记忆(Episodic Memory)
- 语义记忆(Semantic Memory)
- 程序性记忆(Procedural Memory)
- 时间与关系记忆(Temporal and Relational Memory)
- 共享记忆(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 效果的,通常不是使用了哪一种数据库,而是系统如何判断什么值得记住、如何处理矛盾和过期信息、如何检索真正相关的记忆,以及如何持续评测记忆对最终任务的帮助。