Universal Memory Layer for AI Agents
Mem0(原名 Memo)是一个通用的 AI 记忆层,为大语言模型(LLM)提供跨会话的持久化记忆能力。它解决的核心问题是:
记忆在不同对话间持久化,Agent 能记住用户的历史偏好、习惯和上下文。
从对话中自动识别并提取关键信息,无需用户手动标记或记忆。
基于语义相似度检索相关记忆,而非简单的关键词匹配。
Mem0 采用多信号检索架构:语义相似度 + 关键词匹配 + NLP 实体链接,三路并行打分后融合排序,用不到 7000 tokens 实现高精度记忆检索。
Mem0 将记忆分为三个层级,类似于人类记忆的分层结构:
类似人类的「工作记忆」,存储当前会话中的临时信息。
# 短期记忆:基于滑动窗口的对话历史 class ShortTermMemory: def __init__(self, window_size=10): self.buffer = [] self.window_size = window_size def add(self, message): self.buffer.append(message) # 超出窗口大小时丢弃最早的记忆 if len(self.buffer) > self.window_size: self.buffer.pop(0)
Mem0 的核心能力——从对话中自动提取关键事实并持久化存储。
from mem0 import Memory m = Memory() # 添加记忆 —— Mem0 自动提取关键信息 result = m.add( "我喜欢喝美式咖啡,不加糖不加奶。每周五会去星巴克。", user_id="alice" ) # 输出: [{"memory": "喜欢美式咖啡,不加糖不加奶", # "event": "每周五去星巴克"}] # 搜索记忆 —— 语义检索 memories = m.search("咖啡偏好", user_id="alice")
基于向量嵌入的语义理解,支持模糊匹配和概念关联。
Mem0 2026.04 新算法的核心特性——用 NLP 实体抽取替代图数据库,实现轻量级关系推理。
from mem0 import Memory # 新算法默认启用实体链接,无需额外配置 m = Memory() m.add("Alice 和 Bob 是大学同学,他们都很喜欢徒步", user_id="alice") # 自动抽取实体: Alice, Bob, 徒步 # 实体被嵌入存入独立查找层 # 查询时,实体匹配会加权排序 results = m.search("Bob 喜欢什么运动", user_id="alice") # "Bob" 实体匹配 → 相关记忆排名靠前
当调用 m.add() 时,Mem0 内部执行以下处理流程:
接收原始对话消息(支持文本、结构化数据),关联 user_id、agent_id、run_id 等元数据标识。
使用 LLM(默认 GPT-4o-mini)分析对话,提取关键事实、偏好、事件。新算法只执行 ADD 操作——每条事实成为独立记录,信息变更时新旧共存而非覆盖,保留完整演变历史。Agent 生成的事实(如确认操作)现在也被同等对待。
将新提取的记忆与已有记忆进行去重比对。同时执行 NLP 实体抽取——识别专有名词、引用文本、复合名词短语,将实体嵌入后存入独立查找层,建立记忆间的实体关联。
使用 Embedding 模型将记忆文本转化为向量,存入向量数据库(Qdrant / Pinecone / ChromaDB 等)。同时写入元数据用于过滤。
抽取的实体(人名、地点、概念)通过 Embedding 模型转化为向量,存入独立的实体查找层。查询时,问题中的实体与该层匹配,为相关记忆提供排序加权——替代了旧方案的图数据库依赖。
Mem0 提供简洁的四大操作:Add、Search、Update、Delete,设计哲学是「一个函数完成一件事」。
from mem0 import Memory # 初始化(开箱即用,无需配置向量数据库) m = Memory() # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ # 1. ADD —— 添加记忆 # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ m.add("我是一名 Python 开发者,喜欢用 VS Code", user_id="alice") m.add(["我喜欢黑色主题", "常用 PyCharm 和 Vim"], user_id="alice") # 从对话历史添加 messages = [ {"role": "user", "content": "我想学 Rust"}, {"role": "assistant", "content": "Rust 很适合系统编程!"}, {"role": "user", "content": "是的,我主要做嵌入式开发"} ] m.add(messages, user_id="alice") # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ # 2. SEARCH —— 语义搜索记忆 # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ results = m.search("编程语言偏好", user_id="alice", limit=5) # [{"memory": "Python 开发者", "score": 0.92, ...}, # {"memory": "想学 Rust,做嵌入式开发", "score": 0.87, ...}] # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ # 3. UPDATE —— 更新已有记忆 # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ m.update(memory_id, "现在主要用 Go 开发") # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ # 4. DELETE —— 删除记忆 # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ m.delete(memory_id) # 删除单条 m.delete_all(user_id="alice") # 删除用户所有记忆
Mem0 最精妙的设计之一是它的记忆更新策略——不是简单地追加新记忆,而是智能地管理记忆生命周期。
全新信息,直接创建记忆条目。例如首次提到"我住在北京"。
已有记忆被新信息覆盖。例如"住在北京" → "搬到了上海"。
用户明确否定某条记忆。例如"我不再喝咖啡了" → 删除咖啡偏好。
新信息与已有记忆一致,无需操作。避免重复存储相同事实。
# 第一次添加 m.add("我喜欢 Python", user_id="alice") # Memory: "Alice 喜欢 Python" ← 新增 # 第二次添加(更新场景) m.add("我现在改用 Go 了,Python 用得少了", user_id="alice") # Memory: "Alice 现在主要用 Go,Python 用得少了" ← 更新旧记忆 # 第三次添加(确认场景) m.add("我最喜欢的编程语言还是 Go", user_id="alice") # 无变化 —— 与已有记忆一致 ← 跳过
| 存储后端 | 类型 | 特点 | 适用场景 |
|---|---|---|---|
| Qdrant | 向量数据库 | 高性能,Rust 实现,支持过滤 | 生产环境首选 |
| Pinecone | 云向量服务 | 全托管,免运维,按量付费 | 快速上线,不想管基础设施 |
| ChromaDB | 向量数据库 | 轻量,Python 原生,易嵌入 | 本地开发 / 原型验证 |
| Weaviate | 向量数据库 | GraphQL API,多模态支持 | 需要复杂查询的场景 |
| pgvector | PG 扩展 | PostgreSQL 生态,事务支持 | 已有 PG 基础设施 |
| Neo4j | 图数据库 | 旧方案 mem0ᵍ 默认后端 | ⚠️ 已被 NLP 实体链接替代 |
| FalkorDB | 图数据库 | Redis 兼容,低延迟 | ⚠️ 已被 NLP 实体链接替代 |
Mem0 支持多种 Embedding 模型,用于将记忆文本转化为高维向量:
# 使用 OpenAI Embeddings(默认) config = { "embedder": { "provider": "openai", "config": { "model": "text-embedding-3-small", "embedding_dims": 1536 } } } # 使用本地 HuggingFace 模型 config = { "embedder": { "provider": "huggingface", "config": { "model": "sentence-transformers/all-MiniLM-L6-v2" } } } # 使用 Ollama 本地推理 config = { "embedder": { "provider": "ollama", "config": { "model": "nomic-embed-text" } } }
| 特性 | Mem0 | LangChain Memory | Zep | 自建 RAG |
|---|---|---|---|---|
| 自动记忆提取 | ✅ 内置 | ❌ 需手动 | ✅ 内置 | ❌ 需自建 |
| 冲突解决 | ✅ 智能合并 | ❌ 无 | ⚠️ 基础 | ❌ 需自建 |
| 实体链接(NLP) | ✅ 内置 | ❌ 无 | ❌ 无 | ❌ 需自建 |
| 多用户隔离 | ✅ 原生 | ⚠️ 手动 | ✅ 原生 | ⚠️ 需设计 |
| 部署复杂度 | ✅ 低 | ✅ 低 | ⚠️ 中 | ❌ 高 |
| 可定制性 | ⚠️ 中 | ✅ 高 | ⚠️ 中 | ✅ 完全 |
| 社区活跃度 | ⭐ 57k stars | ⭐ 100k+ | ⭐ 3k | — |
记住用户的偏好、习惯、日程,提供个性化服务。例如记住"用户不喜欢早起开会"。
记住客户的历史问题和解决方案,避免重复询问。提升客户体验和解决效率。
追踪学生的学习进度、薄弱知识点,提供针对性的复习建议和学习路径。
记住患者的病史、过敏信息、用药记录,提供连续性的医疗服务。
记住用户的购物偏好、尺码、品牌喜好,提供精准的个性化推荐。
记住开发者的编码风格、技术栈偏好、项目上下文,提供更贴合的代码建议。
Mem0 的记忆不是「写了就忘」,而是有完整的生命周期管理:
每次更新记录变更历史,支持回溯
支持自定义 metadata 过滤和分类
内置评估框架衡量记忆质量
# 安装 pip install mem0ai # 设置 OpenAI API Key(用于 LLM 提取和 Embedding) export OPENAI_API_KEY="sk-..."
from mem0 import Memory # 初始化(默认使用本地 SQLite + OpenAI) m = Memory() # 模拟一段对话 messages = [ {"role": "user", "content": "我叫小明,住在上海,是一名设计师"}, {"role": "assistant", "content": "你好小明!上海的设计师~"}, {"role": "user", "content": "我喜欢极简风格,讨厌花哨的设计"}, ] # 添加记忆 result = m.add(messages, user_id="xiaoming") print(result) # {'results': [ # {'event': 'ADD', 'memory': '小明住在上海,是设计师'}, # {'event': 'ADD', 'memory': '喜欢极简风格,讨厌花哨设计'} # ]} # 搜索记忆 memories = m.search("设计偏好", user_id="xiaoming") print(memories) # [{'memory': '喜欢极简风格,讨厌花哨设计', 'score': 0.89}] # 获取所有记忆 all_memories = m.get_all(user_id="xiaoming")