Skip to content

Mem0 项目原理深度分析

项目地址: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 中定义了核心配置:

1
2
3
4
5
6
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) 时:

  1. 消息预处理:

    1
    2
    3
    # 转换消息格式,支持字符串、字典或列表
    if isinstance(messages, str):
        messages = [{"role": "user", "content": messages}]
    

  2. 智能事实提取:

  3. 使用LLM分析对话内容
  4. 根据提示词模板(FACT_RETRIEVAL_PROMPT)提取关键事实
  5. 仅从用户消息中提取信息(避免包含助手消息)

  6. LLM提取过程:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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: 相似性检查

在存储新事实前,检查是否与现有记忆重复:

1
2
3
4
5
6
existing_memories = self.vector_store.search(
    query=new_mem,
    vectors=embeddings,
    limit=5,  # 检索最相似的5个记忆
    filters=search_filters,
)

步骤4: 智能决策(ADD/UPDATE/DELETE/NONE)

使用LLM决定如何处理新事实与现有记忆的关系:

1
2
3
4
5
6
7
8
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 记忆检索流程

  1. 查询嵌入:

    query_embeddings = self.embedding_model.embed(query, "search")
    

  2. 向量搜索:

    1
    2
    3
    4
    5
    6
    memories = self.vector_store.search(
        query=query,
        vectors=query_embeddings,
        limit=limit,
        filters=filters,
    )
    

  3. 可选重排序:

    if rerank and self.reranker:
        reranked_memories = self.reranker.rerank(query, original_memories, limit)
    

  4. 返回结果:

    1
    2
    3
    4
    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: 单次对话级别记忆

1
2
3
4
5
6
7
8
9
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 和消息类型决定使用哪种提取模式:

1
2
3
4
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)

程序性记忆用于存储工作流程和步骤序列,特别适合智能体场景:

1
2
3
4
5
6
7
8
9
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)

可选功能,使用图数据库存储实体关系:

1
2
3
if self.config.graph_store.config:
    self.graph = GraphStoreFactory.create(provider, self.config)
    self.enable_graph = True

支持多种图数据库: - Memgraph - Neo4j - Kùzu

图记忆提供: - 实体提取和关系建模 - 上下文关系查询 - 知识图谱构建

7. 重排序(Reranking)

可选功能,用于提高检索准确性:

1
2
3
4
5
if config.reranker:
    self.reranker = RerankerFactory.create(
        config.reranker.provider,
        config.reranker.config
    )

支持的算法: - LLM-based重排序 - Sentence Transformers - Cohere重排序 - Zero-entropy重排序

8. 异步支持

提供完整的异步接口(AsyncMemory类):

1
2
3
4
5
6
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. 技术优势

  1. 高性能:
  2. +26% 准确率 vs OpenAI Memory
  3. 91% 更快响应速度
  4. 90% 更少Token使用

  5. 可扩展性:

  6. 插件化架构支持多种后端
  7. 水平扩展友好
  8. 云原生设计

  9. 易用性:

  10. 简洁的API设计
  11. 详细文档和示例
  12. 快速入门

  13. 可靠性:

  14. 历史追踪
  15. 版本控制支持
  16. 错误处理

12. 适用场景

  • AI助手: 个性化对话
  • 客户支持: 历史问题追踪
  • 医疗: 患者偏好记录
  • 教育: 学习进度跟踪
  • 智能体: 长期任务记忆
  • 电商: 用户偏好分析

13. 总结

Mem0通过结合向量搜索、LLM理解和智能去重,为AI应用提供了强大的记忆能力。其模块化设计使其能够适应各种场景需求,是构建个性化AI系统的理想选择。

核心价值在于将非结构化对话转换为结构化记忆,并通过语义相似性实现高效检索和智能更新,从而实现真正的AI个性化。