Mem0 项目原理深度分析
发布于 2025-11-12
项目地址:https://github.com/mem0ai/mem0
1. 项目概述
Mem0("mem-zero")是一个为AI助手和智能体提供智能记忆层的开源平台。它通过多级记忆系统帮助AI记住用户偏好、适应个体需求并持续学习,从而实现个性化AI交互。
核心特性
- 多级记忆: 支持用户级、会话级和智能体级记忆
- 智能提取: 使用LLM自动从对话中提取关键信息
- 自适应个性化: 根据历史记忆调整AI响应
- 向量搜索: 基于嵌入向量的语义相似性搜索
- 图记忆: 可选的图结构记忆存储关系信息
- 重排序: 可选的智能重排序功能提高检索准确性
2. 架构设计
2.1 核心组件
Mem0的架构基于插件化设计,主要包含以下组件:
| ┌─────────────────────────────────────────┐
│ Memory 类 │
├─────────────────────────────────────────┤
│ ┌───────────┐ ┌──────────┐ ┌────────┐ │
│ │ Embedding │ │ Vector │ │ LLM │ │
│ │ Model │ │ Store │ │ │ │
│ └───────────┘ └──────────┘ └────────┘ │
├─────────────────────────────────────────┤
│ ┌───────────┐ ┌──────────┐ │
│ │ Rerank │ │ Graph │ │
│ │ er │ │ Store │ │
│ └───────────┘ └──────────┘ │
└─────────────────────────────────────────┘
|
2.2 配置系统
在 mem0/configs/base.py 中定义了核心配置:
| class MemoryConfig(BaseModel):
vector_store: VectorStoreConfig # 向量存储配置
llm: LlmConfig # LLM配置
embedder: EmbedderConfig # 嵌入模型配置
graph_store: GraphStoreConfig # 图存储配置
reranker: Optional[RerankerConfig] # 重排序器配置
|
支持的存储方案:
- 向量存储: FAISS, Pinecone, Qdrant, Chroma, Redis, Milvus, Weaviate等
- LLM: OpenAI, Anthropic, Azure OpenAI, AWS Bedrock, Ollama, LM Studio等
- 嵌入模型: OpenAI, Azure OpenAI, HuggingFace, Ollama等
3. 核心工作原理
3.1 记忆存储流程
步骤1: 事实提取 (_add_to_vector_store)
当调用 memory.add(messages) 时:
-
消息预处理:
| # 转换消息格式,支持字符串、字典或列表
if isinstance(messages, str):
messages = [{"role": "user", "content": messages}]
|
-
智能事实提取:
- 使用LLM分析对话内容
- 根据提示词模板(
FACT_RETRIEVAL_PROMPT)提取关键事实
-
仅从用户消息中提取信息(避免包含助手消息)
-
LLM提取过程:
| response = self.llm.generate_response(
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_prompt},
],
response_format={"type": "json_object"},
)
# 提取JSON格式的事实列表
new_retrieved_facts = json.loads(response)["facts"]
|
步骤2: 向量嵌入
每个提取的事实被转换为嵌入向量:
| embeddings = self.embedding_model.embed(fact_text, memory_action="add")
|
步骤3: 相似性检查
在存储新事实前,检查是否与现有记忆重复:
| existing_memories = self.vector_store.search(
query=new_mem,
vectors=embeddings,
limit=5, # 检索最相似的5个记忆
filters=search_filters,
)
|
步骤4: 智能决策(ADD/UPDATE/DELETE/NONE)
使用LLM决定如何处理新事实与现有记忆的关系:
| function_calling_prompt = get_update_memory_messages(
retrieved_old_memory, new_retrieved_facts, custom_prompt
)
response = self.llm.generate_response(
messages=[{"role": "user", "content": function_calling_prompt}],
response_format={"type": "json_object"},
)
|
决策结果:
- ADD: 创建新记忆
- UPDATE: 更新现有记忆
- DELETE: 删除过时记忆
- NONE: 跳过(内容相似但需要更新元数据)
步骤5: 存储到向量数据库
| memory_id = str(uuid.uuid4())
metadata = {
"data": fact_text,
"hash": hashlib.md5(fact_text.encode()).hexdigest(),
"created_at": datetime.now(pytz.timezone("US/Pacific")).isoformat(),
"user_id": user_id, # 会话标识
"agent_id": agent_id,
"run_id": run_id,
"actor_id": actor_name, # 发言人
"role": message["role"], # user/assistant
}
self.vector_store.insert(
vectors=[embeddings],
ids=[memory_id],
payloads=[metadata],
)
|
3.2 记忆检索流程
search() 方法工作流程
-
查询嵌入:
| query_embeddings = self.embedding_model.embed(query, "search")
|
-
向量搜索:
| memories = self.vector_store.search(
query=query,
vectors=query_embeddings,
limit=limit,
filters=filters,
)
|
-
可选重排序:
| if rerank and self.reranker:
reranked_memories = self.reranker.rerank(query, original_memories, limit)
|
-
返回结果:
| return {
"results": memories,
"relations": graph_entities if self.enable_graph else None
}
|
3.3 记忆更新和删除
更新记忆 (_update_memory)
- 保留创建时间,更新修改时间
- 重新计算嵌入向量
- 保留会话标识(user_id, agent_id, run_id)
- 记录历史变更
删除记忆 (_delete_memory)
- 从向量存储中删除
- 记录删除历史
- 支持批量删除(
delete_all)
3.4 历史追踪
使用SQLite数据库 (history.db) 记录所有变更:
| self.db.add_history(
memory_id,
prev_value,
new_value,
"UPDATE", # ADD/UPDATE/DELETE
created_at=...,
updated_at=...,
actor_id=actor_id,
role=role,
)
|
4. 多级记忆系统
4.1 会话标识符
Mem0支持三种记忆作用域:
- user_id: 用户级别记忆(跨所有会话)
- agent_id: 智能体级别记忆(特定AI助手)
- run_id: 单次对话级别记忆
| def _build_filters_and_metadata(
user_id, agent_id, run_id, actor_id, input_metadata, input_filters
):
base_metadata_template = {...} # 用于存储
effective_query_filters = {...} # 用于检索
# 所有操作必须至少提供一个标识符
if not any([user_id, agent_id, run_id]):
raise Mem0ValidationError("至少需要提供一个标识符")
|
4.2 智能体记忆 vs 用户记忆
根据 agent_id 和消息类型决定使用哪种提取模式:
| def _should_use_agent_memory_extraction(self, messages, metadata):
has_agent_id = metadata.get("agent_id") is not None
has_assistant_messages = any(msg.get("role") == "assistant" for msg in messages)
return has_agent_id and has_assistant_messages
|
- 用户记忆: 提取用户偏好、计划、兴趣等
- 智能体记忆: 提取智能体行为模式、工作流程等
5. 程序性记忆(Procedural Memory)
程序性记忆用于存储工作流程和步骤序列,特别适合智能体场景:
| def _create_procedural_memory(self, messages, metadata, prompt):
parsed_messages = [
{"role": "system", "content": prompt or PROCEDURAL_MEMORY_SYSTEM_PROMPT},
*messages,
{"role": "user", "content": "Create procedural memory of the above conversation."},
]
procedural_memory = self.llm.generate_response(messages=parsed_messages)
metadata["memory_type"] = MemoryType.PROCEDURAL.value
# 存储为特殊类型的记忆
|
6. 图记忆(Graph Memory)
可选功能,使用图数据库存储实体关系:
| if self.config.graph_store.config:
self.graph = GraphStoreFactory.create(provider, self.config)
self.enable_graph = True
|
支持多种图数据库:
- Memgraph
- Neo4j
- Kùzu
图记忆提供:
- 实体提取和关系建模
- 上下文关系查询
- 知识图谱构建
7. 重排序(Reranking)
可选功能,用于提高检索准确性:
| if config.reranker:
self.reranker = RerankerFactory.create(
config.reranker.provider,
config.reranker.config
)
|
支持的算法:
- LLM-based重排序
- Sentence Transformers
- Cohere重排序
- Zero-entropy重排序
8. 异步支持
提供完整的异步接口(AsyncMemory类):
| async def add(self, messages, ...):
vector_store_task = asyncio.create_task(
self._add_to_vector_store(messages, metadata, filters, infer)
)
graph_task = asyncio.create_task(self._add_to_graph(messages, filters))
vector_store_result, graph_result = await asyncio.gather(vector_store_task, graph_task)
|
9. 性能优化
9.1 并行处理
- 向量存储和图存储操作并行执行
- 多线程/异步I/O避免阻塞
9.2 缓存和重用
- 嵌入向量缓存(
existing_embeddings)
- 避免重复计算
9.3 批量操作
10. 使用示例
基本用法
| from mem0 import Memory
from openai import OpenAI
# 初始化
openai_client = OpenAI()
memory = Memory()
# 添加记忆
messages = [
{"role": "user", "content": "我的名字是张三,我住在上海"},
{"role": "assistant", "content": "很高兴认识你,张三!"},
]
memory.add(messages, user_id="user_123")
# 搜索记忆
relevant_memories = memory.search(
query="用户住在哪里",
user_id="user_123",
limit=3
)
# 更新记忆
memory.update(memory_id="mem_xxx", data="张三住在上海,喜欢咖啡")
|
高级配置
| from mem0 import Memory
from mem0.configs.base import MemoryConfig
config = MemoryConfig(
vector_store={
"provider": "qdrant",
"config": {"host": "localhost", "port": 6333}
},
embedder={
"provider": "openai",
"config": {"api_key": "...", "model": "text-embedding-3-small"}
},
llm={
"provider": "openai",
"config": {"api_key": "...", "model": "gpt-4"}
},
reranker={
"provider": "sentence_transformer",
"config": {"model_name": "all-MiniLM-L6-v2"}
},
graph_store={
"provider": "memgraph",
"config": {"host": "localhost", "port": 7687}
}
)
memory = Memory(config)
|
11. 技术优势
- 高性能:
- +26% 准确率 vs OpenAI Memory
- 91% 更快响应速度
-
90% 更少Token使用
-
可扩展性:
- 插件化架构支持多种后端
- 水平扩展友好
-
云原生设计
-
易用性:
- 简洁的API设计
- 详细文档和示例
-
快速入门
-
可靠性:
- 历史追踪
- 版本控制支持
- 错误处理
12. 适用场景
- AI助手: 个性化对话
- 客户支持: 历史问题追踪
- 医疗: 患者偏好记录
- 教育: 学习进度跟踪
- 智能体: 长期任务记忆
- 电商: 用户偏好分析
13. 总结
Mem0通过结合向量搜索、LLM理解和智能去重,为AI应用提供了强大的记忆能力。其模块化设计使其能够适应各种场景需求,是构建个性化AI系统的理想选择。
核心价值在于将非结构化对话转换为结构化记忆,并通过语义相似性实现高效检索和智能更新,从而实现真正的AI个性化。