Mem0 AI 记忆层
为什么要学
当前的 AI 助手有个根本问题:每次对话都是"失忆"的。Mem0 为 AI Agent 添加持久化的长期记忆:
- 跨会话记忆:AI 记住用户的偏好、历史和上下文
- 个性化体验:每个用户拥有独立的记忆档案
- Agent 增强:让 Agent 从历史交互中学习和适应
- 简单集成:几行代码即可为任何 LLM 应用添加记忆
- 智能管理:自动提取、更新、删除过时记忆
Mem0 让你的 AI 应用从"每次从零开始"变成"越用越懂你"。
核心概念
白话解释
- Memory(记忆):从对话中提取的关键信息片段
- User/Agent/Session:记忆关联的维度——谁的记忆/哪个AI的/哪次会话的
- Add:从新对话中提取并存储记忆
- Search:根据当前上下文检索相关记忆
- Update:当新信息与旧记忆冲突时,自动更新
核心概念对照表
| 概念 | 说明 | 类比 |
|---|
| Memory | 一条提取的记忆(事实/偏好) | 笔记本中的一条笔记 |
| User Memory | 关于特定用户的记忆 | 用户画像 |
| Agent Memory | Agent自己的经验记忆 | 工作笔记 |
| Session Memory | 单次会话的记忆 | 会议纪要 |
| Memory Graph | 记忆之间的关系网络 | 知识图谱 |
| add() | 从对话中提取记忆 | 做笔记 |
| search() | 检索相关记忆 | 翻笔记本 |
| get_all() | 获取所有记忆 | 导出全部笔记 |
安装配置
安装
pip install mem0ai
# 或完整安装
pip install mem0ai[all]
基本配置
from mem0 import Memory
# 最简配置(使用OpenAI)
m = Memory()
# 自定义配置
config = {
"llm": {
"provider": "openai",
"config": {
"model": "gpt-4o-mini",
"temperature": 0.1
}
},
"embedder": {
"provider": "openai",
"config": {
"model": "text-embedding-3-small"
}
},
"vector_store": {
"provider": "chroma",
"config": {
"collection_name": "my_memories",
"path": "./chroma_db"
}
}
}
m = Memory.from_config(config)
使用 Mem0 Cloud
from mem0 import MemoryClient
# 使用托管服务(更简单)
client = MemoryClient(api_key="your-mem0-api-key")
快速上手
添加记忆
from mem0 import Memory
m = Memory()
# 添加用户记忆
result = m.add(
messages=[
{"role": "user", "content": "我喜欢用Python做数据分析,主要用pandas和numpy"},
{"role": "assistant", "content": "好的,了解了您的技术栈偏好"}
],
user_id="user-001"
)
print(result)
# [{'id': 'mem-xxx', 'memory': '用户喜欢Python数据分析,主要使用pandas和numpy', 'event': 'ADD'}]
# 继续添加
m.add(
messages=[
{"role": "user", "content": "我在一家生物信息公司工作,做基因组数据分析"},
],
user_id="user-001"
)
m.add(
messages=[
{"role": "user", "content": "我更喜欢简洁的代码风格,不要太多注释"}
],
user_id="user-001"
)
检索记忆
# 搜索相关记忆
results = m.search(
query="用户的技术偏好是什么?",
user_id="user-001"
)
for r in results:
print(f"- {r['memory']} (相关度: {r['score']:.2f})")
# 获取所有记忆
all_memories = m.get_all(user_id="user-001")
for mem in all_memories:
print(f"- {mem['memory']}")
在对话中使用记忆
from openai import OpenAI
openai_client = OpenAI()
def chat_with_memory(user_message: str, user_id: str) -> str:
# 1. 检索相关记忆
memories = m.search(query=user_message, user_id=user_id, limit=5)
memory_context = "\n".join([f"- {mem['memory']}" for mem in memories])
# 2. 构建带记忆的prompt
system_prompt = f"""你是一个有记忆的AI助手。以下是你对这个用户的了解:
{memory_context}
请基于这些记忆个性化你的回答。"""
# 3. 调用LLM
response = openai_client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_message}
]
)
assistant_message = response.choices[0].message.content
# 4. 保存新记忆
m.add(
messages=[
{"role": "user", "content": user_message},
{"role": "assistant", "content": assistant_message}
],
user_id=user_id
)
return assistant_message
# 使用
print(chat_with_memory("帮我写一个读取CSV的脚本", "user-001"))
# AI会根据记忆知道用户偏好Python/pandas,给出简洁风格的代码
进阶用法
1. 多维度记忆
# 用户级记忆
m.add(messages=conversation, user_id="user-001")
# Agent级记忆(Agent自己的学习)
m.add(messages=agent_logs, agent_id="code-assistant")
# 会话级记忆(单次对话的上下文)
m.add(messages=session_msgs, user_id="user-001", session_id="session-abc")
# 组合查询
results = m.search(
query="...",
user_id="user-001",
agent_id="code-assistant"
)
2. 记忆更新与冲突处理
# Mem0自动处理记忆更新
# 例如用户之前说"我用macOS",后来说"我换到Linux了"
m.add(
messages=[{"role": "user", "content": "我用macOS系统"}],
user_id="user-001"
)
# 后续对话
m.add(
messages=[{"role": "user", "content": "我最近换到Ubuntu了"}],
user_id="user-001"
)
# Mem0会自动更新记忆,不会同时保留矛盾信息
all_mems = m.get_all(user_id="user-001")
# 显示: "用户使用Ubuntu系统(之前用macOS)"
3. 记忆图谱(Memory Graph)
from mem0 import Memory
config = {
"graph_store": {
"provider": "neo4j",
"config": {
"url": "bolt://localhost:7687",
"username": "neo4j",
"password": "password"
}
},
# ... 其他配置
}
m = Memory.from_config(config)
# 添加带关系的记忆
m.add(
messages=[
{"role": "user", "content": "我和张三是同事,我们一起在做机器学习项目"}
],
user_id="user-001"
)
# 图谱会建立: user-001 --同事--> 张三, user-001 --参与--> ML项目
4. 自定义向量存储
# 使用Qdrant
config = {
"vector_store": {
"provider": "qdrant",
"config": {
"host": "localhost",
"port": 6333,
"collection_name": "memories"
}
}
}
# 使用Pinecone
config = {
"vector_store": {
"provider": "pinecone",
"config": {
"api_key": "...",
"environment": "us-west1-gcp",
"index_name": "memories"
}
}
}
# 使用PostgreSQL(pgvector)
config = {
"vector_store": {
"provider": "pgvector",
"config": {
"dbname": "memdb",
"user": "postgres",
"password": "...",
"host": "localhost"
}
}
}
5. 使用本地模型
config = {
"llm": {
"provider": "ollama",
"config": {
"model": "llama3.2",
"ollama_base_url": "http://localhost:11434"
}
},
"embedder": {
"provider": "ollama",
"config": {
"model": "nomic-embed-text",
"ollama_base_url": "http://localhost:11434"
}
},
"vector_store": {
"provider": "chroma",
"config": {
"collection_name": "local_memories",
"path": "./local_mem_db"
}
}
}
m = Memory.from_config(config)
6. 记忆管理
# 获取特定记忆
memory = m.get(memory_id="mem-xxx")
# 更新记忆
m.update(memory_id="mem-xxx", data="更新后的记忆内容")
# 删除记忆
m.delete(memory_id="mem-xxx")
# 删除用户所有记忆
m.delete_all(user_id="user-001")
# 获取记忆历史(变更记录)
history = m.history(memory_id="mem-xxx")
for h in history:
print(f"{h['event']}: {h['old_memory']} → {h['new_memory']}")
7. 与 Agent 框架集成
# 与LangChain Agent集成
from langchain.agents import AgentExecutor
from langchain.tools import Tool
def search_memory(query: str) -> str:
results = m.search(query=query, user_id="current-user")
return "\n".join([r['memory'] for r in results])
memory_tool = Tool(
name="SearchMemory",
func=search_memory,
description="搜索关于用户的历史记忆和偏好"
)
# 将memory_tool加入Agent的工具列表
常见问题
Q1: 记忆提取不准确?
- 确保对话内容足够明确
- 使用更强的 LLM(gpt-4o > gpt-4o-mini)
- 调整 temperature 到较低值(0.1)
- 对话要有足够的上下文
Q2: 记忆太多影响性能?
- 使用
limit 参数限制检索数量 - 定期清理过期记忆
- 使用 search 而非 get_all
- 向量存储选择高性能方案(Qdrant/Pinecone)
Q3: 如何处理敏感信息?
# 自定义记忆过滤
config = {
"custom_prompt": """提取记忆时,不要包含以下敏感信息:
- 密码和秘钥
- 银行账号
- 身份证号
只提取偏好、习惯和工作相关信息。"""
}
Q4: 和普通 RAG 的区别?
| 特性 | Mem0 | RAG |
|---|
| 数据来源 | 对话历史 | 外部文档 |
| 更新方式 | 自动提取/更新 | 手动导入 |
| 目的 | 个性化/记忆 | 知识增强 |
| 粒度 | 事实级 | 文档级 |
Q5: 开源版和 Cloud 版区别?
| 特性 | 开源 | Cloud |
|---|
| 部署 | 自托管 | 托管 |
| 存储 | 自选向量DB | 内置 |
| 图谱 | 需配置Neo4j | 内置 |
| 扩展性 | 自行管理 | 自动扩缩 |
| 价格 | 免费 | 按用量 |
参考资源