Agent Memory 科普:用 Mem0 给 AI 加上长时记忆
- 约 8 分钟读完 - 全文 2915 字Agent Memory 科普:用 Mem0 给 AI 加上长时记忆
做 AI 应用时,经常会遇到一个尴尬:用户上一句还在说「我 gluten-free」,下一句推荐餐厅时模型就忘了。上下文窗口再长也解决不了「跨会话记忆」的问题,这就需要 Agent Memory。
一、为什么需要 Agent Memory?
大语言模型有两个和记忆相关的瓶颈:
- 上下文窗口有限:模型只能看到当前输入的若干 token,超出部分会被截断或遗忘。
- 无法跨会话保留信息:每次对话都是独立请求,模型不会记住你上周说过的话。
Agent Memory 就是用来解决这些问题的:它把重要信息从对话中提取出来,持久化存储,在后续交互中按需召回。
二、记忆的分类
记忆通常可以分为短期记忆和长期记忆两大类。
2.1 短期记忆
- 语义缓存:临时把刚刚检索到的外部知识(比如 RAG 召回结果)放在当前上下文里。
- 工作记忆:当前会话的临时工作区,会话结束后清除。
短期记忆主要依赖上下文窗口,属于「基于会话」的记忆。
2.2 长期记忆
- 程序性记忆(Procedural):工作流、工具调用、技能等执行层面的记忆。
- 语义记忆(Semantic):知识库、个人信息、实体(人物、地点、组织)等事实性记忆。
- 情景记忆(Episodic):某次对话的摘要、经历、事件细节。
长期记忆需要外部存储,并且能被检索和更新。
三、Agent Memory 项目概览
目前社区里有一些比较有代表性的记忆项目:
| 项目 | 核心特点 |
|---|---|
| Text2Mem | 给所有记忆系统定义「操作指令集」,12 个原子操作 + 五元 JSON 契约 + 双层验证 |
| Mem0 | GitHub Star 最多的记忆中间件,5 个工厂 / 双存储 / 三种记忆类型 |
| Letta | 把 OS 虚拟内存思想搬进 Agent,Git 版本化记忆 + Sleeptime 异步后台学习 |
| ReMe | 阿里 AgentScope 出品,「文件即记忆」,记忆对用户完全透明可直接编辑 |
| memU | 让记忆本身变成一个 24/7 后台主动 Agent |
这篇文章重点介绍 Mem0,因为它是目前工程化落地最方便、生态最好的一个。
四、Mem0 简介
Mem0 是一个为大模型应用设计的长时记忆中间件。它把「记忆」这件事从业务代码中抽离出来,变成一个独立、可配置的组件。
简单理解,Mem0 在 LLM 和向量数据库之间加了一层「记忆管理层」。你只需要调用统一的 Memory 接口去 add、search、get_all,底层用的是哪家向量库、哪个 Embedding 服务、是否接图数据库,它都帮你封装好了。
4.1 核心架构
Mem0 主要由三部分组成:
- Embedder(向量化模块):支持 OpenAI、Ollama、HuggingFace、Azure OpenAI、Gemini 等。
- VectorStore(向量存储):支持 Upstash Vector、Qdrant、OpenSearch、PGVector、Milvus、Chroma 等。
- Memory 层:对外暴露统一的
Memory/AsyncMemory类,负责把对话、事件等转换成向量并写入/读出,同时可选接入图数据库和本地 SQLite 历史库。
4.2 一个最小 Demo
下面是用 Upstash Vector 做向量库、vLLM 部署大模型和 Embedding 模型的最小示例:
from mem0 import Memory
config = {
"embedder": {
"provider": "openai",
"config": {
"api_key": "EMPTY",
"openai_base_url": "http://localhost:5001/v1",
"model": "custom_embedding",
},
},
"vector_store": {
"provider": "upstash_vector",
"config": {
"url": "xxx",
"token": "xxx",
"collection_name": "memory_test",
"enable_embeddings": False,
}
},
"llm": {
"provider": "vllm",
"config": {
"model": "qwen25",
"vllm_base_url": "http://localhost:5002/v1",
"api_key": "EMPTY",
},
},
}
memory = Memory.from_config(config)
conversation_history = []
def chat_with_memories(user_input: str, user_id: str = "default_user") -> str:
# 1. 先检索相关记忆
relevant_memories = memory.search(query=user_input, user_id=user_id, limit=3)
memories_str = "\n".join(f"- {entry['memory']}" for entry in relevant_memories["results"])
system_prompt = f"You are a helpful AI. Answer based on query and memories.\nUser Memories:\n{memories_str}"
# 2. 调用 LLM 生成回复
messages = [{"role": "system", "content": system_prompt}]
messages.extend(conversation_history)
messages.append({"role": "user", "content": user_input})
assistant_response = call_llm(messages=messages)
conversation_history.append({"role": "user", "content": user_input})
conversation_history.append({"role": "assistant", "content": assistant_response})
# 3. 把对话写回记忆库
memory.add(messages, user_id=user_id)
return assistant_response这个 Demo 展示了 Mem0 最核心的用法:
search:在回复前检索相关记忆。add:把对话写回记忆库,让 LLM 自动抽取事实。
五、Mem0 的适配逻辑
Memory.from_config(config) 初始化时,会同时初始化多个组件:
class Memory(MemoryBase):
def __init__(self, config: MemoryConfig = MemoryConfig()):
self.config = config
self.embedding_model = EmbedderFactory.create(...)
self.vector_store = VectorStoreFactory.create(...)
self.llm = LlmFactory.create(...)
self.db = SQLiteManager(self.config.history_db_path)5.1 数据库适配
VectorStoreFactory 通过一个 provider_to_class 映射,把 provider 名称映射到对应的向量库类:
class VectorStoreFactory:
provider_to_class = {
"qdrant": "mem0.vector_stores.qdrant.Qdrant",
"chroma": "mem0.vector_stores.chroma.ChromaDB",
"pgvector": "mem0.vector_stores.pgvector.PGVector",
"upstash_vector": "mem0.vector_stores.upstash_vector.UpstashVector",
...
}只要实现 VectorStoreBase 的抽象方法,就可以接入自定义向量库。
5.2 LLM 适配
LlmFactory 除了返回模型类,还会返回对应的配置类:
class LlmFactory:
provider_to_class = {
"ollama": ("mem0.llms.ollama.OllamaLLM", OllamaConfig),
"openai": ("mem0.llms.openai.OpenAILLM", OpenAIConfig),
"vllm": ("mem0.llms.vllm.VllmLLM", VllmConfig),
...
}以 VllmConfig 为例,它的 temperature 默认是 0.1,top_p 默认是 0.1,说明 Mem0 官方推荐记忆操作尽量保持确定性,避免随机性导致记忆抽取不一致。
5.3 Embedding 适配
EmbedderFactory 同样用 provider 映射实现:
class EmbedderFactory:
provider_to_class = {
"openai": "mem0.embeddings.openai.OpenAIEmbedding",
"ollama": "mem0.embeddings.ollama.OllamaEmbedding",
"huggingface": "mem0.embeddings.huggingface.HuggingFaceEmbedding",
...
}因为 vLLM 兼容 OpenAI 协议,所以部署本地 Embedding 模型时可以直接配置 provider: openai。
六、Mem0 的核心流程
Mem0 最重要的两个函数是 search 和 add。
6.1 search:检索记忆
search 的逻辑很直接:
- 把 query 转成 embedding 向量。
- 在向量库中按
user_id/agent_id/run_id过滤后做相似度搜索。 - 如果配置了 reranker,对结果做重排序。
- 可选启用图存储,同时检索实体/关系。
def _search_vector_store(self, query, filters, limit, threshold=None):
embeddings = self.embedding_model.embed(query, "search")
memories = self.vector_store.search(
query=query, vectors=embeddings, limit=limit, filters=filters
)
# 整理结果,过滤低于 threshold 的项
...6.2 add:写入记忆
add 是 Mem0 最复杂的函数。它会先让 LLM 从对话中抽取事实,再决定每条事实应该新增、更新、删除还是保持不变。
第一步:事实抽取
Mem0 会根据是否有 agent_id 以及消息角色,选择不同的抽取 prompt:
- 用户记忆抽取 prompt:只从用户消息中提取事实,比如个人偏好、计划、职业信息等。
- 助手记忆抽取 prompt:只从助手消息中提取事实,比如助手的偏好、能力、性格特征等。
返回格式是一个 JSON:
{"facts": ["姓名是 John", "正在旧金山找餐厅"]}第二步:冲突检测与决策
对每个新事实,Mem0 会在向量库中搜索相似的已有记忆,然后把「新事实 + 已有记忆」一起交给 LLM,让它判断每条记忆应该执行:
- ADD:新增一条记忆。
- UPDATE:更新已有记忆。
- DELETE:删除矛盾或过时的记忆。
- NONE:无需变更。
为了避免 LLM 幻觉 UUID,Mem0 会把已有记忆的 UUID 映射成 0, 1, 2... 这样的临时 ID,LLM 决策后再映射回真实 ID 执行操作。
6.3 流程记忆(Procedural Memory)
Mem0 还有一种特殊的 procedural_memory,专门面向多步任务 Agent。它记录的是:
- 任务目标与当前进度
- 按序执行的每一步动作
- 每步动作的原始输出
- 关键发现、浏览历史、错误与挑战
- 当前上下文与下一步计划
这种记忆适合需要跨多轮继续执行的复杂任务,比如自动化网页操作、数据采集等。
七、Mem0 的优势与适用场景
7.1 优势
- 接口简单:
add/search/get_all就能覆盖大部分需求。 - 解耦底层:向量库、Embedding、LLM 都可以替换。
- 自动抽取与消冲突:不需要自己写事实抽取和去重逻辑。
- 工程化友好:配置驱动,容易接入现有项目。
7.2 适用场景
- 多轮对话助手:记住用户偏好、历史需求。
- 个性化推荐/客服:结合用户画像做推荐。
- 多步任务 Agent:记录任务进度和中间结果。
- 知识库 + 用户偏好结合:既检索文档,也记住用户个人情况。
八、与其他记忆项目的关系
Agent Memory 是一个正在快速发展的领域,不同项目侧重点不同:
- 如果你需要快速落地一个带记忆的 LLM 应用,Mem0 是目前最稳妥的选择。
- 如果你需要严格的记忆操作语义,可以关注 Text2Mem。
- 如果你需要版本化和后台学习,Letta 更有趣。
- 如果你希望记忆对用户透明可编辑,ReMe 是另一种思路。
- 如果你希望记忆本身变成主动 Agent,memU 的方向更激进。
九、总结
Agent Memory 是 LLM 应用从「一次性问答」进化到「长期陪伴型产品」的关键基础设施。Mem0 把这个能力做成了一个可插拔的中间件:
- 统一接口:
add/search/get_all。 - 三层解耦:Embedder、VectorStore、LLM 自由组合。
- LLM 驱动:自动抽取事实、检测冲突、决定增删改。
- 三种记忆:语义记忆、情景记忆、流程记忆,覆盖不同场景。
对于需要长期记忆的 AI 应用来说,Mem0 是一个值得优先考虑的底座。
参考:Mem0 官方文档与 GitHub 仓库