AM
专题网页
Agent Memory
9. Open-source Implementations

开源 Agent Memory 实现项目对比

筛选标准限定为已经实现 agent memory 能力的开源项目:至少具备记忆写入、持久化存储、召回检索与上下文注入中的关键链路;仅具备会话压缩、任务状态保存或通用 agent 编排能力的项目不纳入主列表。

核心样本包括 memory-first 项目与明确提供 agent memory 模块的框架实现。mem0、Letta、Cognee、MemOS、EverOS、LangMem、A-MEM 和 Graphiti 属于主线样本;CrewAI、AutoGen、LlamaIndex、Agno 属于框架内 memory 实现样本;LangGraph 仅作为 long-term store 与 checkpoint 边界参考。opencode、Pi agent、Codex 类工具、Harness-1、AutoGPT、CAMEL 不作为 agent memory 项目主例,原因是其主要能力分别落在 coding session、search harness 或 agent platform,而非完整 memory 系统。

Route Map

先按实现路线合并,而不是按项目名平铺

很多项目看起来都在做 memory,但其实落点不同。更稳的读法是先把它们归到几条路线里: 哪些解决长期事实,哪些解决工作流状态,哪些解决 coding agent 上下文续航,哪些在做经验和 skill 演化。

1
Long-term service

长期记忆服务 / Memory Service

mem0CogneeMemOSEverOS
Solves

让 agent 跨会话记住事实、偏好、知识和经验,不必每次从零开始。

Read It As

看 add/search/update/delete 是否形成完整链路,以及是否有作用域、来源和冲突治理。

Typical Stack

LLM fact extraction + embedding + vector / graph / SQL + metadata filtering。

Caveat

有长期存储不等于好记忆;写入门控和污染治理才决定长期效果。

2
Local-first OS

本地优先 Memory OS / Local-first Runtime

EverOS
Solves

把 memory 做成本地可读、可审计、可索引的长期运行时,而不是只提供远端 API 或单一向量库。

Read It As

重点看 memorize/search/cascade/prompt slots 如何衔接,以及 Markdown、SQLite、LanceDB 三层如何保持一致。

Typical Stack

Markdown-first memory cells + SQLite metadata/state + LanceDB hybrid retrieval + cascade worker。

Caveat

本地优先路线的价值在可控和可迁移;代价是需要管理索引同步、文件变更和运行时维护。

3
Layered runtime

分层 Agent Memory Runtime

LettaCrewAI
Solves

把 core memory、archival memory、recall、summary、context budget 拆成不同层。

Read It As

看哪些内容常驻 prompt,哪些内容外部检索,哪些内容由 LLM 决策写入或更新。

Typical Stack

Core blocks + archival passages + recall flow + context window calculator。

Caveat

层次越清楚越可控,但 source of truth 和跨层同步会变复杂。

4
Framework API

Framework Memory Interface / Blocks

AutoGenLlamaIndexLangMemAgno
Solves

在 agent framework 中提供可插拔 memory 接口、记忆块或长期记忆管理器。

Read It As

重点核查接口是否覆盖写入、召回、上下文注入,以及是否支持长期记忆更新。

Typical Stack

Memory interface + chat store + vector/fact blocks + adapter backend。

Caveat

框架项目本体不等于 memory 项目;只有明确 memory 模块才纳入实现案例。

5
Graph route

Temporal Graph / Knowledge Graph Memory

GraphitiCognee
Solves

把人、事件、项目、关系和时间变化存成图,而不是只存相似文本块。

Read It As

看实体抽取、关系抽取、去重消歧、图遍历和时间过滤如何配合检索。

Typical Stack

Entity extraction + graph DB + vector/BM25 hybrid search + rerank。

Caveat

适合关系密集场景;如果业务只是普通问答,图谱可能太重。

6
Learning route

Experience / Skill Evolution Memory

A-MEMMemOS
Solves

从任务轨迹、反思和反馈中提炼可复用经验,使记忆不只保存事实,还能支持能力演化。

Read It As

核查经验什么时候写入、如何组织、如何召回、是否存在验证和修正机制。

Typical Stack

Reflection + skill library + episodic memory + validation / retrieval。

Caveat

研究原型中的经验记忆需要谨慎区分:有 memory 系统实现才纳入主列表。

Plain Guide

这些 memory 实现机制到底在干嘛

先别急着记术语。可以把不同 memory 路线理解成几种不同的“记事方式”:有的像通讯录, 有的像档案馆,有的像案件证据板,有的像游戏存档,有的像程序员的工作台。

长期记忆服务:像一个会帮你整理的通讯录和笔记库

像什么:你告诉它几件事,它不会只把原话贴进本子,而是提炼成“这个用户喜欢什么、项目是什么、以后可能会用到什么”。
核心想法

把重要事实从对话里抽出来,变成以后能搜索、能更新、能删除的长期记录。

怎么工作

通常先用 LLM 抽取事实,再做 embedding,存进向量库/图谱/数据库;下次根据问题把相关记忆找回来。

别误会

不是所有聊天记录都该写进去。临时情绪、一次性指令、错误工具输出如果乱写,就会变成记忆污染。

本地优先 Memory OS:像可搜索、可整理、可搬家的个人资料库

像什么:不是把记忆锁在某个黑盒数据库里,而是像把资料放进有目录、有索引、有管理员的本地档案柜。
核心想法

让 agent 记忆既能被机器检索,也能被人直接查看、备份和迁移。

怎么工作

记忆先被抽取成事实、用户画像、经验或技能,再落到 Markdown/文件结构里,同时用 SQLite 和 LanceDB 建索引;后台 cascade 负责持续整理。

别误会

本地优先不代表自动可靠。文件、索引和抽取策略如果不同步,记忆仍然会乱。

分层记忆:像桌面、抽屉和档案馆分工

像什么:正在用的纸放桌面,常用信息放抽屉,旧资料放档案馆。不是所有东西都摊在眼前。
核心想法

把记忆按使用频率和重要程度分层:核心记忆常驻,历史资料按需检索,旧对话必要时摘要。

怎么工作

core memory 直接进 prompt;archival memory 或 passages 通过检索进入;上下文太长时由 summary 接住旧内容。

别误会

分层不是越多越好。层多之后最怕同一条信息在多个地方版本不一致。

框架接口:像给不同记忆后端准备的插座

像什么:墙上有统一插座,台灯、电脑、充电器都能插,但插座本身不等于电器已经帮你选好了。
核心想法

框架先规定 memory 怎么接入 agent,再让你替换列表、向量库、Redis、Mem0 等不同后端。

怎么工作

agent 推理前调用 memory.update_context 或类似接口,把检索结果塞进当前上下文。

别误会

有接口不代表有完整 memory 系统。写入策略、去重、排序、遗忘通常还得自己设计。

图谱记忆:像案件墙上的人物关系和时间线

像什么:不是只记一堆便签,而是把谁认识谁、哪件事导致哪件事、什么时候发生,都用线连起来。
核心想法

当记忆重点是实体、关系和变化过程时,用图比单纯文本块更容易表达。

怎么工作

从文本/事件里抽取实体和关系,写成节点和边;查询时结合图遍历、关键词、向量和重排。

别误会

不是所有应用都需要图谱。如果只是普通文档问答,强行建图可能更重、更难维护。

经验/技能记忆:像把踩坑记录变成下次可用的攻略

像什么:打游戏通关后,你不只是记得发生过什么,还会写下“下次遇到这个怪该怎么打”。
核心想法

从成功/失败轨迹中提炼可复用经验、策略、代码片段或 skill,让 agent 下次做得更好。

怎么工作

系统保存任务轨迹和反馈,做 reflection 或 consolidation,再把经验放进 skill library 或经验库里检索复用。

别误会

最难的是验证。坏经验如果被正式沉淀,agent 会越来越自信地重复错误。

Primary Code Comparison

最符合要求的 Agent Memory 核心实现

写入入口
长期持久化
召回注入
治理风险
项目
Project
实现路线 / 源码入口
Route / Source
写入 / 召回
Write / Read
存储 / 场景 / 风险
Storage / Fit / Risk
Memory service
实现路线
专门的,围绕 、向量写入和召回。
源码入口
mem0/memory/main.pymem0/memory/storage.pymem0/vector_stores/*
写入路径
输入消息后由 LLM 抽取候选事实,embedding 后写入 ,并用 SQLite/历史记录追踪变化。
召回路径
查询时做 ,结合 、实体信号或 rerank,把相关事实返回给 agent。
存储后端
+ history DB,可接 Qdrant、Chroma、Pinecone、pgvector 等。
适用场景
长期用户事实、偏好记忆、跨会话个性化。
主要风险
容易把临时话语写成长期事实,必须认真做。
Layered memory
实现路线
常驻上下文, 外部检索,message/recall 负责历史回看。
源码入口
letta/schemas/memory.pyletta/schemas/block.pyletta/services/passage_manager.pyletta/agents/letta_agent.py
写入路径
通过 block、passage、agent service 管理核心记忆和档案记忆,上下文超限时配合摘要与窗口计算。
召回路径
核心 block 直接进 prompt, 按需检索,消息历史按窗口和摘要策略进入上下文。
存储后端
SQL / passage store / ,按层分工。
适用场景
长期对话、项目协作、需要清晰 memory 层次的 agent。
主要风险
层间同步和冲突较难,核心记忆写错会持续影响 agent。
Temporal graph
实现路线
:把 抽成节点、边和时间事实,再做混合检索。
源码入口
graphiti_core/graphiti.pygraphiti_core/nodes.pygraphiti_core/edges.pygraphiti_core/search/search.py
写入路径
add_ 抽取实体和关系,做 dedupe/resolution 后写入 graph。
召回路径
搜索结合 、vector、、cross-encoder rerank 等信号。
存储后端
Neo4j / FalkorDB / Kuzu / Neptune 等 graph 后端。
适用场景
关系密集、事件持续变化、需要时间感的长期记忆。
主要风险
实体消歧和脏关系治理难度高,维护成本比向量库更重。
Local-first memory OS
实现路线
的 agent memory runtime,用文件化记忆承接人类可读性,用 承接状态与检索。
源码入口
src/everos/service/memorize.pysrc/everos/service/search.pysrc/everos/memory/cascade/*src/everos/infra/persistence/{sqlite,lancedb}/*
写入路径
memorize 入口把会话或事件分段后进入抽取管线,生成 user profile、atomic fact、、agent skill、foresight 等 memory cell。
召回路径
search 入口结合 recall、hierarchy、filters、shaper 与 agentic search,把相关记忆整理成可进入上下文的结果。
存储后端
memory + SQLite metadata/state + LanceDB vector/FTS tables。
适用场景
助手、小团队知识沉淀、需要人机共同审计和维护的长期记忆。
主要风险
文件、索引和后台 需要保持一致;部署更可控,但维护面比单一 memory API 更宽。
Secondary References

框架与接口型 memory 参考

项目
Project
实现路线 / 源码入口
Route / Source
写入 / 召回
Write / Read
存储 / 场景 / 风险
Storage / Fit / Risk
Unified memory
实现路线
路线:用 管写入,用 管浅召回/深召回。当前本地 sparse checkout 需补齐源码目录。
源码入口
lib/crewai/src/crewai/memory/unified_memory.pyencoding_flow.pyrecall_flow.pystorage/lancedb_storage.py
写入路径
remember/remember_many 进入编码流程:embedding、批量、相似记忆查找、 insert/update/delete/noop。
召回路径
recall 可走 shallow/deep:分析查询、生成子查询、选择 、并行搜索,再按相关性、时间、重要性排序。
存储后端
默认 LanceDB,另有 Qdrant Edge 等后端路线。
适用场景
crew/agent 协作场景中的用户事实、任务上下文和可复用记忆。
主要风险
LLM 驱动写入很灵活,但也更依赖提示、评估和质量。
Composable memory
实现路线
短期 + 的组合路线,支持 buffer、summary、vector block 等多种记忆块。
源码入口
llama_index/core/memory/memory.pymemory_blocks/vector.pychat_memory_buffer.pychat_summary_memory_buffer.py
写入路径
消息先进入 ,超出预算后可 flush 到 ,或由 vector/fact/static block 承接长期信息。
召回路径
当前消息、短期历史和 memory block 检索结果一起组装进上下文。
存储后端
SQL/simple + vector memory block + 可组合存储。
适用场景
RAG agent、文档助手、需要快速拼装不同 memory block 的应用。
主要风险
组件很多,真正效果取决于 block 选择、flush 策略和上下文预算。
Memory interface
实现路线
定义可插拔 ,具体实现可以是列表、Chroma、Redis、Mem0 或实验性任务中心记忆。
源码入口
autogen_core/memory/_base_memory.py_list_memory.pyautogen_ext/memory/*
写入路径
具体 Memory 实现负责 add/clear/close 等操作,框架层不强行规定统一写入策略。
召回路径
agent 调用 ,把 memory 检索结果注入 model context。
存储后端
List memory、ChromaDB、Redis、Mem0 adapter 等。
适用场景
多 agent 框架、需要替换 memory 后端的实验系统。
主要风险
接口灵活但默认治理弱,容易把 memory 责任留给使用者。
User memory
实现路线
,提供 add/update/delete/clear 等工具化写入能力。
源码入口
libs/agno/agno/memory/manager.pymemory/strategies/summarize.pymemory/strategies/base.py
写入路径
LLM 可调用 memory 工具新增、更新、删除用户记忆,也可用 summarize strategy 生成记忆。
召回路径
支持 last_n、first_n、agentic 等读取方式,把用户相关记忆带回当前会话。
存储后端
依赖框架配置的 memory DB / storage。
适用场景
个人助手、用户画像、轻量长期偏好管理。
主要风险
偏 profile 路线,复杂任务状态和图关系需要额外设计。
Implementation Routes

几类典型开源实现路线

Service layer

Dedicated Memory Service

以 mem0 为代表,把记忆抽取、向量化、检索、更新、历史记录做成独立服务或 SDK。agent 调用它来 add/search,而不是自己维护所有细节。

Strengths

边界清楚,容易跨应用复用,也方便单独优化写入、检索和去重。

Risks

如果写入策略或作用域治理没做好,错误事实会被服务化地稳定传播。

Best Fit

用户偏好、长期事实、跨会话个性化、需要独立 memory layer 的产品。

Layered system

Layered Agent Memory

以 Letta 为代表,把 core memory、archival memory、recall/messages、context window 管理分开,每一层负责不同距离和不同优先级的信息。

Graph route

Temporal Knowledge Graph Memory

以 Graphiti 为代表,把事件抽成实体、关系和时间边,再用图搜索、语义搜索和重排一起找回相关记忆。

Local runtime

Local-first Memory OS

以 EverOS 为代表,把 Markdown-first 记忆、SQLite/LanceDB 索引、memorize/search/cascade/prompt slots 放在同一套本地优先运行时里。

Pluggable API

Framework Memory Interface

以 AutoGen、LlamaIndex、Agno 等框架路线为代表,先定义 memory 接口和上下文注入方式,再接不同后端或策略。

Project Readings

几个代表项目怎么读

mem0:最像“独立记忆服务”的路线

mem0 的核心不是把聊天记录简单拼进 prompt,而是把 add/search/history 做成一套服务化流程。写入时抽取事实并做向量化,读取时再按语义和元数据找回。

Takeaway: 如果你要的是跨会话事实和偏好记忆,mem0 这类路线比单纯 session history 更贴近目标。

Letta:更像一套分层 memory architecture

Letta 把 core memory、archival passages、message recall 和 context window 计算分开。它不是只问“用不用向量库”,而是问哪些内容应该常驻,哪些内容应该按需查。

Takeaway: 长期 agent 常常需要分层,而不是把所有东西塞进同一个检索桶。

Cognee / Graphiti:知识图谱路线的两种侧重

Cognee 更接近面向 agent 的长期记忆平台,强调数据摄取、知识图谱、向量检索与跨会话记忆;Graphiti 更聚焦实时 temporal context graph,用实体、关系和时间变化承接动态记忆。

Takeaway: 图谱路线适合关系和时间变化重要的记忆场景,但需要承担实体抽取、消歧和图维护成本。

LangMem / A-MEM:更明确的 agent memory 工具与研究实现

LangMem 提供长期记忆抽取、管理工具和 LangGraph store 集成;A-MEM 则研究 agentic memory 如何动态组织和利用历史经验。它们比普通 agent framework 更直接围绕 memory 问题展开。

Takeaway: memory 工具库和研究型 memory 系统可以纳入主列表,但应与通用 agent 框架区分。

EverOS:本地优先的 Markdown-first memory runtime

EverOS 把 memorize、search、cascade、prompt slots 和本地持久化放在同一套运行时里。它不是只把向量检索包装成 API,而是让记忆以 Markdown-first 形态沉淀,同时用 SQLite 与 LanceDB 支撑状态、索引和召回。

Takeaway: 当记忆需要被人审阅、迁移、备份和长期维护时,本地优先 Memory OS 是区别于纯云端 memory service 的一条重要路线。
Architecture Notes

从源码实现角度看这些项目

这一部分补充的是更偏源码阅读的判断方法:不只看项目有没有 memory 字样,而是看它到底把写入、读取、存储、上下文注入和治理放在了哪一层。

比较开源实现时,先确认项目是否以 agent memory 为核心能力,或至少是否包含明确 memory 模块。
不要把 session history、checkpoint、repo instruction、search evidence state、vector memory 和 graph memory 混成同一类项目。
源码里最值得追的是入口函数:add、remember、update_context、search、consolidate、delete。
项目表里的 CrewAI 路径来自上游结构,当前本地 sparse checkout 还需要补齐源码目录后再做逐行核验。
严格筛选时,opencode、Pi agent、Codex 类工具、Harness-1、AutoGPT、CAMEL 应作为排除或边界说明,而非主列表项目。
Misconceptions

读开源 memory 项目时最容易误判的地方

误解一:开源项目只要有 memory 文件夹,就说明它实现了完整长期记忆系统。
误解二:coding agent 的 session compaction 等同于 agent memory 系统。
误解三:checkpoint、search harness 或 repo instruction 可以直接归类为 agent memory 项目。
误解四:有 vector store 就代表 memory 机制已经完整。
误解五:framework 提供 Memory 接口,就代表写入、去重、污染治理都已经替你做好。
误解六:graph memory 一定比 vector memory 更高级,实际要看关系和时间是不是核心问题。
Deep Dive

源码路线解析

按 memory 实现路线合并项目

符合主列表条件的项目可以合并为长期记忆服务、分层 runtime、framework memory interface、graph memory、experience / skill evolution 等路线。该分组排除了仅提供 session compaction、checkpoint、search evidence state 或通用 agent 编排的项目。

  • 长期 memory service 关心事实、偏好、经验能不能跨会话存在。
  • 本地优先 memory OS 关心记忆能不能可读、可审计、可迁移,并持续保持索引一致。
  • 分层 runtime 关心哪些记忆常驻、哪些检索、哪些摘要。
  • framework interface 关心 memory 如何接入 agent 生命周期。
  • graph memory 关心实体、关系、时间变化能不能被表达和检索。
  • experience / skill evolution 关心经验能不能被验证、沉淀和复用。

排除边界:相关机制不等于 memory 项目

部分项目具备 memory-like 机制,但不满足主列表的 agent memory 项目标准。opencode、Pi agent、Codex 类工具更偏 coding session 与 workspace continuity;Harness-1 更偏搜索证据状态管理;AutoGPT、CAMEL 更偏 agent 平台或多 agent 框架。

  • session/history/compaction 属于上下文续航机制,不等于长期 agent memory。
  • checkpoint/store 属于状态恢复底座,只有承接长期记忆写入与召回时才接近 memory system。
  • search evidence board 属于检索任务状态,不等于通用 agent memory。
  • 通用 agent framework 只有在明确提供 memory 模块时,才作为 memory 实现案例纳入。

写入路径最能暴露一个项目的 memory 观

源码比较应优先追踪信息写入时机。mem0、CrewAI、LangMem、A-MEM 等项目会围绕事实、偏好、经验或记忆对象设计写入流程;AutoGen、LlamaIndex、Agno 则通过框架接口或 memory block 暴露写入能力。

  • 显式 remember/add 更适合可控长期记忆。
  • 后台抽取和 consolidation 更适合从对话中沉淀长期事实。
  • 框架接口需要检查默认写入策略,而不是只看接口名称。
  • LLM 决策写入灵活,但必须配去重、冲突和可回滚机制。

读取路径决定记忆最终怎么影响模型

记忆不是存进去就结束了,关键是怎么回到 prompt。向量服务通常返回 top-k 事实;分层系统会把核心记忆常驻、档案记忆按需检索;checkpoint 会恢复状态;compaction 会用摘要替代旧历史。

  • 如果读取只按相似度排序,可能会漏掉时间、来源和作用域。
  • 如果核心记忆常驻,就要格外避免把错误内容写进去。
  • 如果靠摘要恢复旧历史,摘要的结构化程度会影响后续执行稳定性。
  • 如果只是 store API,仍要自己决定召回多少、怎么排、怎么塞进 token budget。

存储后端不是答案,只是答案的一部分

同样叫长期记忆,底层可能是向量库、SQL、graph DB、KV store、JSONL,也可能是混合结构。真正要比较的是存储后端和记忆对象是否匹配:事实相似度适合向量,关系变化适合图,执行恢复适合 checkpoint,结构化 profile 适合关系或文档存储。

  • Vector store 适合语义相似召回,但不擅长表达强关系和强约束。
  • Graph store 适合关系和时间,但抽取与维护更重。
  • SQL/KV 适合状态、profile 和审计字段。
  • JSONL/session store 很适合开发工具历史,但不是通用 memory layer。

污染治理在源码里通常比宣传里更重要

memory 一旦长期运行,真正麻烦的不是存不进去,而是存进去的东西会不会错、旧、重复、串范围。mem0、CrewAI、Graphiti 这类会处理相似记忆、去重或实体解析;但任何项目接入后都仍要按你的业务补 scope、删除、审计和冲突策略。

  • 去重不是只看文本相同,还要看语义相似、实体相同和时间是否冲突。
  • scope isolation 对多用户、多项目 agent 是硬要求。
  • 删除和更正能力比新增记忆更容易被低估。
  • 记忆越自动,越需要观测、回滚和人工纠错入口。

怎么选一个项目来参考

最实用的选型方法是先问:你要解决的是跨会话事实、长期关系、任务恢复、上下文续航,还是框架扩展?如果目标不同,最值得参考的项目也不同。

  • 做个人偏好/事实记忆,优先看 mem0、Agno、CrewAI 的写入与召回。
  • 做本地优先、可审计 memory runtime,优先看 EverOS 的 Markdown-first、SQLite/LanceDB 和 cascade 设计。
  • 做长期对话或平台 agent,优先看 Letta 的分层方式。
  • 做关系和时间记忆,优先看 Graphiti。
  • 做框架型 agent,优先看 AutoGen、LlamaIndex、Agno、LangMem 的 memory 接口和默认策略。
  • 做框架集成,优先看 AutoGen、LlamaIndex 的接口设计。
Failure Modes

常见失败模式

把 framework memory interface 当成现成 memory system,结果写入和治理全缺
把 coding agent 的 compaction 当成长期个性化记忆,最后跨会话体验仍然断裂
只看 star 数选项目,不看它解决的是事实记忆、状态恢复还是上下文续航
只接向量库,不做 metadata、scope、冲突和删除,短期看起来能用,长期变脏
盲目上 graph memory,但业务里的关系并不复杂,反而增加抽取和维护负担
没有验证写入路径,导致 agent 把临时指令、错误观察和工具噪声都当成长期记忆
Previous Chapter
8. Agent Memory Patterns

按 agent 类型看,memory 组合为什么会不一样

看不同 agent 为什么会长出不同 memory 组合

Next Chapter
10. Library Usage Guide

开源 Agent Memory 库的作用与使用方式

看开源 memory 库怎么接入真实 agent