返回知识库
🧠

Mem0 记忆系统深度解析

Universal Memory Layer for AI Agents

57.3k
GitHub Stars
6.5k
Forks
2200+
Commits
Python
SDK
💡

什么是 Mem0?

核心概念

Mem0(原名 Memo)是一个通用的 AI 记忆层,为大语言模型(LLM)提供跨会话的持久化记忆能力。它解决的核心问题是:

🎯
传统 LLM 每次对话都是「失忆」的——没有上下文延续,用户不得不反复解释相同的偏好和背景信息。Mem0 让 AI Agent 拥有长期记忆,像人类一样记住过去的交互。
🔄

跨会话记忆

记忆在不同对话间持久化,Agent 能记住用户的历史偏好、习惯和上下文。

🧩

自动提取

从对话中自动识别并提取关键信息,无需用户手动标记或记忆。

智能检索

基于语义相似度检索相关记忆,而非简单的关键词匹配。

🏗️

系统架构

Architecture

Mem0 采用多信号检索架构:语义相似度 + 关键词匹配 + NLP 实体链接,三路并行打分后融合排序,用不到 7000 tokens 实现高精度记忆检索。

Mem0 多信号检索架构(2026.04 新算法)
👤 用户对话 / Agent 交互
🔌 Memory API 层
add() · search() · update() · delete()
🧠 单次 LLM 提取(ADD-only)
对话 → 结构化事实(仅新增)
🔗 去重 & 实体链接
NLP 实体抽取 → 嵌入存储
📊
语义相似度
向量 Embedding 匹配
🔤
关键词匹配
词形归一化 + BM25
🏷️
实体链接
NLP 实体 → 排序加权
🎯 融合排序 → Top-K 记忆结果
为什么用 NLP 实体链接替代图数据库? 旧方案(mem0ᵍ)需要部署 Neo4j/FalkorDB 图数据库,运维成本高。新方案用 LLM 做 NLP 实体抽取,将实体嵌入后存入独立查找层,查询时通过实体匹配加权排序——不需要图数据库也能实现关系推理,且延迟降低 50%+。
🗂️

记忆类型

Memory Types

Mem0 将记忆分为三个层级,类似于人类记忆的分层结构:

📝 短期记忆(Working Memory)

类似人类的「工作记忆」,存储当前会话中的临时信息。

📌
典型场景:用户在对话中提到"我正在处理一个紧急 bug",短期记忆会记住这个上下文,但不会永久保存。
short_term_memory.py
# 短期记忆:基于滑动窗口的对话历史
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)

📚 长期记忆(Long-term Memory)

Mem0 的核心能力——从对话中自动提取关键事实并持久化存储。

🔑
关键机制:LLM 分析对话内容,识别用户偏好、个人信息、重要事件等,转化为结构化的记忆条目,存入向量数据库。
add_memory.py
from mem0 import Memory

m = Memory()

# 添加记忆 —— Mem0 自动提取关键信息
result = m.add(
    "我喜欢喝美式咖啡,不加糖不加奶。每周五会去星巴克。",
    user_id="alice"
)
# 输出: [{"memory": "喜欢美式咖啡,不加糖不加奶",
#          "event": "每周五去星巴克"}]

# 搜索记忆 —— 语义检索
memories = m.search("咖啡偏好", user_id="alice")

🔬 语义记忆(Semantic Memory)

基于向量嵌入的语义理解,支持模糊匹配和概念关联。

💡
语义记忆不是简单的关键词匹配。搜索"旅行偏好"能匹配到"喜欢去海边度假",因为两者在语义空间中相近。
语义检索流程
查询文本
Embedding 模型
向量相似度搜索
Top-K 结果

🏷️ 实体链接(Entity Linking)

Mem0 2026.04 新算法的核心特性——用 NLP 实体抽取替代图数据库,实现轻量级关系推理。

🔑
工作原理:每条记忆经过 LLM 分析,抽取专有名词、引用文本、复合名词短语等实体。这些实体被嵌入后存入独立查找层,链接到同一人、地点或概念的记忆。查询时,从问题中识别的实体与查找层匹配,相关记忆获得排序加权。
💡
对比旧方案:不再需要部署 Neo4j/FalkorDB 图数据库。NLP 实体链接在查询时通过嵌入相似度匹配实体,配合语义检索和关键词匹配,三路融合排序——效果更好,运维更简单。
entity_linking.py
from mem0 import Memory

# 新算法默认启用实体链接,无需额外配置
m = Memory()

m.add("Alice 和 Bob 是大学同学,他们都很喜欢徒步",
      user_id="alice")
# 自动抽取实体: Alice, Bob, 徒步
# 实体被嵌入存入独立查找层

# 查询时,实体匹配会加权排序
results = m.search("Bob 喜欢什么运动", user_id="alice")
# "Bob" 实体匹配 → 相关记忆排名靠前
⚙️

记忆处理流水线

Pipeline

当调用 m.add() 时,Mem0 内部执行以下处理流程:

1

📥 输入接收

接收原始对话消息(支持文本、结构化数据),关联 user_idagent_idrun_id 等元数据标识。

2

🧠 单次 LLM 提取(ADD-only)

使用 LLM(默认 GPT-4o-mini)分析对话,提取关键事实、偏好、事件。新算法只执行 ADD 操作——每条事实成为独立记录,信息变更时新旧共存而非覆盖,保留完整演变历史。Agent 生成的事实(如确认操作)现在也被同等对待。

3

🔗 去重与实体链接

将新提取的记忆与已有记忆进行去重比对。同时执行 NLP 实体抽取——识别专有名词、引用文本、复合名词短语,将实体嵌入后存入独立查找层,建立记忆间的实体关联。

4

💾 向量化存储

使用 Embedding 模型将记忆文本转化为向量,存入向量数据库(Qdrant / Pinecone / ChromaDB 等)。同时写入元数据用于过滤。

5

🏷️ 实体嵌入存储

抽取的实体(人名、地点、概念)通过 Embedding 模型转化为向量,存入独立的实体查找层。查询时,问题中的实体与该层匹配,为相关记忆提供排序加权——替代了旧方案的图数据库依赖。

🔌

核心 API 设计

API Reference

Mem0 提供简洁的四大操作:Add、Search、Update、Delete,设计哲学是「一个函数完成一件事」。

mem0_api_demo.py — 完整 CRUD 操作
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")  # 删除用户所有记忆
⚠️
Platform vs Open Source:开源版本需要自行配置向量数据库和 LLM API Key;Platform 版本是托管服务,开箱即用但有调用量限制。
🔀

去重与冲突解决机制

Core Logic

Mem0 最精妙的设计之一是它的记忆更新策略——不是简单地追加新记忆,而是智能地管理记忆生命周期。

新增(New)

全新信息,直接创建记忆条目。例如首次提到"我住在北京"。

创建
🔄

更新(Update)

已有记忆被新信息覆盖。例如"住在北京" → "搬到了上海"。

原地更新
🗑️

删除(Delete)

用户明确否定某条记忆。例如"我不再喝咖啡了" → 删除咖啡偏好。

删除
🤝

不变(No Change)

新信息与已有记忆一致,无需操作。避免重复存储相同事实。

跳过
conflict_resolution.py — 冲突解决示例
# 第一次添加
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")
# 无变化 —— 与已有记忆一致  ← 跳过
💾

存储后端支持

Backends
存储后端 类型 特点 适用场景
Qdrant 向量数据库 高性能,Rust 实现,支持过滤 生产环境首选
Pinecone 云向量服务 全托管,免运维,按量付费 快速上线,不想管基础设施
ChromaDB 向量数据库 轻量,Python 原生,易嵌入 本地开发 / 原型验证
Weaviate 向量数据库 GraphQL API,多模态支持 需要复杂查询的场景
pgvector PG 扩展 PostgreSQL 生态,事务支持 已有 PG 基础设施
Neo4j 图数据库 旧方案 mem0ᵍ 默认后端 ⚠️ 已被 NLP 实体链接替代
FalkorDB 图数据库 Redis 兼容,低延迟 ⚠️ 已被 NLP 实体链接替代
📐

Embedding 模型配置

Embeddings

Mem0 支持多种 Embedding 模型,用于将记忆文本转化为高维向量:

embedding_config.py
# 使用 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"
        }
    }
}
⚖️

与其他记忆方案对比

Comparison
特性 Mem0 LangChain Memory Zep 自建 RAG
自动记忆提取 ✅ 内置 ❌ 需手动 ✅ 内置 ❌ 需自建
冲突解决 ✅ 智能合并 ❌ 无 ⚠️ 基础 ❌ 需自建
实体链接(NLP) ✅ 内置 ❌ 无 ❌ 无 ❌ 需自建
多用户隔离 ✅ 原生 ⚠️ 手动 ✅ 原生 ⚠️ 需设计
部署复杂度 ✅ 低 ✅ 低 ⚠️ 中 ❌ 高
可定制性 ⚠️ 中 ✅ 高 ⚠️ 中 ✅ 完全
社区活跃度 ⭐ 57k stars ⭐ 100k+ ⭐ 3k
🏆
选择建议:如果你需要「开箱即用的记忆能力」,Mem0 是最佳选择;如果需要高度定制化,可以基于 LangChain 自建;如果已有 PostgreSQL 基础设施,可以考虑 pgvector 方案。
🚀

典型应用场景

Use Cases
🤖

个人 AI 助手

记住用户的偏好、习惯、日程,提供个性化服务。例如记住"用户不喜欢早起开会"。

💬

客服机器人

记住客户的历史问题和解决方案,避免重复询问。提升客户体验和解决效率。

📚

学习助手

追踪学生的学习进度、薄弱知识点,提供针对性的复习建议和学习路径。

🏥

医疗问诊

记住患者的病史、过敏信息、用药记录,提供连续性的医疗服务。

🛒

电商推荐

记住用户的购物偏好、尺码、品牌喜好,提供精准的个性化推荐。

👨‍💻

编程 Copilot

记住开发者的编码风格、技术栈偏好、项目上下文,提供更贴合的代码建议。

🔬

记忆生命周期管理

Advanced

Mem0 的记忆不是「写了就忘」,而是有完整的生命周期管理:

记忆生命周期
🌱 创建
从对话提取
🔍 检索
语义搜索匹配
✏️ 更新
新信息合并
🗑️ 过期/删除
主动或被动清理
📊

版本追踪

每次更新记录变更历史,支持回溯

🏷️

元数据标注

支持自定义 metadata 过滤和分类

📈

记忆评估

内置评估框架衡量记忆质量

快速开始

Quick Start
terminal
# 安装
pip install mem0ai

# 设置 OpenAI API Key(用于 LLM 提取和 Embedding)
export OPENAI_API_KEY="sk-..."
quickstart.py — 5 分钟上手
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")
🔗

相关资源

Resources