01

AI 为什么总是忘记你?

你和 AI 聊了一个月,下次开新对话它却对你一无所知——这个根本性问题,Mem0 正在解决。

想象这个场景

你花了两小时告诉 AI 你的编程风格偏好、技术栈、项目背景。第二天早上开一个新对话——AI 对这些一无所知,你得重新解释一遍。

这不是 AI 笨,这是架构问题:上下文窗口是临时的,每次对话都是全新的开始。

🧠

短期记忆(上下文)

只在当前对话里有效。关闭窗口,全部消失。就像工作记忆,思考完就忘了。

💾

长期记忆(Mem0 解决的)

跨对话、跨时间持久保存。用户偏好、历史决策、学习进度——全部记住。

🎯

语义记忆(智能检索)

不是死板存储,而是理解语义。问"我喜欢什么语言?"能关联到"偏好 Python 的记录"。

旧方案为什么不够好

开发者通常用两种方法实现"AI 记忆",但都有明显缺陷:

📋
把历史塞入上下文

把所有聊天记录每次都发给 AI。问题:很快超过 token 限制,成本线性增长,且关联性差——AI 要在垃圾堆里找有用信息。

🗄️
自己写数据库逻辑

手动存 向量数据库、写检索逻辑、处理更新冲突……每个 AI 应用都要重新造轮子,且没有智能去重和更新机制。

💡
Mem0 的核心主张

记忆层不应该是每个应用自己实现的业务逻辑,而应该是一个专注于"记忆智能"的独立基础设施层——就像你不会自己写数据库引擎,而是用 PostgreSQL。

Mem0 是什么?

Mem0(读作"mem-zero")是一个开源的 AI 记忆层,Y Combinator S24 孵化,PyPI 月下载量超过 100 万次。它把"让 AI 记住事情"这个通用需求做成了一个专用库。

1

对话发生

2

Mem0 提取关键信息

3

智能存入记忆库

4

下次对话自动注入

关键特性:自动提取、智能去重、语义检索、支持 user/agent/session 三级隔离。

理解检验

你在构建一个 AI 辅导应用,学生每天都会聊 30 分钟。用"把所有聊天记录每次都发给 AI"的方案,最快会遇到什么问题?

02

Mem0 的三层架构:记忆是怎么存进去的

从一句"我喜欢用 Python"到安全存储在向量数据库里,Mem0 经历了哪些处理步骤?

记忆系统的三个角色

就像一个人记忆事情需要"理解、整理、存储"三步,Mem0 也有三个核心组件各司其职:

🧪
LLM(理解层)

读取对话,判断哪些信息值得记忆,提取结构化事实。默认用 GPT-4,可替换为任意模型。

🔢
Embedder(编码层)

把文字转成 向量,让"喜欢 Python"和"偏好 Python 语言"这两句话能被识别为"相同含义"。

🗄️
Vector Store(存储层)

向量数据库,存储记忆的向量表示。默认用 Qdrant,支持 Pinecone、Chroma、Weaviate 等。

一条记忆是怎么被写入的

💬
用户对话
🤖
LLM 提取
📐
Embedder
🗄️
Vector Store
点击"下一步"追踪记忆写入过程

Memory 类的初始化代码

这是 Mem0 核心类 Memory__init__ 方法(来自 mem0/memory/main.py):

CODE

class Memory(MemoryBase):
  def __init__(self,
    config: MemoryConfig):

    self.embedding_model =
      EmbedderFactory.create(
        config.embedder.provider,
        config.embedder.config,
      )
    self.vector_store =
      VectorStoreFactory.create(
        config.vector_store.provider,
        config.vector_store.config,
      )
    self.llm =
      LlmFactory.create(
        config.llm.provider,
        config.llm.config,
      )
    self.db =
      SQLiteManager(
        config.history_db_path,
      )
          
PLAIN ENGLISH

Memory 类继承自 MemoryBase,是所有记忆操作的入口

embedding_model:文字编码器,把文字变成向量。通过工厂模式创建,支持 OpenAI、Hugging Face 等

vector_store:向量数据库,存储和检索记忆向量。默认 Qdrant,也可以换成 Pinecone

llm:大语言模型,负责从对话中提取关键事实,以及决定是新增还是更新记忆

db:SQLite 本地数据库,记录所有记忆操作的历史(谁在什么时候存了什么),用于审计和回滚

工厂模式:为什么组件可以随意替换

Mem0 大量使用 工厂模式,让使用者可以自由替换底层实现:

🤖

LLM 层可替换

不想用 OpenAI?换成 Anthropic Claude、Google Gemini、或本地运行的 Ollama,代码逻辑完全不变。

🔢

Embedder 层可替换

从 OpenAI text-embedding-3-small 换到本地的 sentence-transformers,只需改一行配置。

🗄️

Vector Store 层可替换

开发用 Qdrant(本地),生产换 Pinecone(云托管),测试用 Chroma(内存),零代码修改。

🎯
给 AI 助手的精准描述

当你要配置 Mem0 时,可以这样跟 AI 说:"帮我配置 Mem0,LLM 用 Anthropic Claude,Embedder 用 OpenAI text-embedding-3-small,Vector Store 用 Qdrant 本地模式。"有了这三个维度的词汇,AI 能给出精确的配置代码。

架构理解

用户在 3 周前告诉你的 AI "我偏好 Python 编程"。今天她问 AI "我最喜欢什么编程语言?"——Mem0 需要把这两句话关联起来。负责这个语义理解的核心组件是哪个?

03

记忆的 CRUD:增查改删的智能背后

Mem0 的 add、search、get_all、delete 方法背后发生了什么——为什么 add 不是简单地"存一条记录"?

add() 不是"存入",是"理解后存入"

最关键的认知:mem.add("我今天开始学 Go 语言") 不是把这句话直接存进数据库。它会经历一个 LLM 提取流程:

1
LLM 提取阶段

用预设 Prompt 让 LLM 从对话中抽取"值得记忆的事实",过滤掉无关信息。"今天天气不错"不会被存储。

2
相似性检查阶段

在向量数据库里搜索相似记忆。如果之前存过"偏好 Python",新存"开始学 Go"可能触发一次更新或并存。

3
ADD-only 写入(v3 新算法)

Mem0 v3 采用纯增量策略:只 ADD,不覆盖旧记忆。多条相关记忆共存,检索时按分数排序。

4
实体链接阶段

提取对话中的实体("Go 语言"、"Python"),存入实体索引,加速后续检索时的实体匹配。

add() 方法的真实代码

这是 mem0/memory/main.pyadd() 方法的关键部分:

CODE

def add(self, messages, *,
    user_id=None,
    infer=True,
    metadata=None):

  if isinstance(messages, str):
    messages = [
      {"role": "user",
       "content": messages}
    ]

  vector_store_result = self._add_to_vector_store(
    messages, metadata, filters, infer
  )
  return {"results": vector_store_result}
          
PLAIN ENGLISH

add() 接受消息(字符串或对话列表)、用户 ID、是否启用 LLM 推理

infer=True(默认):用 LLM 智能提取;infer=False:直接存储原文(批量导入历史数据时用)

如果传入一个字符串,自动包装成标准的对话格式 [{role, content}]

调用内部的 _add_to_vector_store 完成实际的提取、检索、存储流程

返回结果包含每条被处理记忆的 ID 和操作类型(ADD / UPDATE)

search():多信号融合检索

Mem0 v3 的检索不只是向量相似度搜索,而是三种信号融合:

🎯

语义检索

向量相似度搜索,找到"意思最接近"的记忆。问"编程偏好"能找到"喜欢 Python"。

🔍

BM25 关键词检索

传统关键词搜索,找到包含特定词的记忆。对专有名词(技术名称、人名)特别有效。

🔗

实体匹配加权

识别查询中的实体,匹配记忆中的同名实体,给相关结果加分。

💡
为什么三种信号都需要?

纯语义搜索可能找不到特定名词("React"和"Vue"向量很近但含义不同)。纯关键词搜索理解不了同义词。实体加权让常被提到的人/物被优先检索。三者融合才是生产级记忆检索的正确姿势。

search() 时 Mem0 内部的协商

调试场景练习

你在批量导入用户历史聊天记录时,用 mem.add(messages, user_id="alice", infer=False)。这样做的结果是什么?

04

SDK 集成:三种范式和实体隔离

Mem0 如何确保 Alice 的记忆和 Bob 的记忆永远不会混淆——以及三种不同的集成方式。

user_id / agent_id / run_id:记忆的三个维度

Mem0 用三个 实体 ID 隔离不同来源的记忆:

user_id 用户维度的记忆。不同用户的记忆完全隔离,如"alice"的偏好不会出现在"bob"的搜索结果里。
agent_id AI 智能体维度的记忆。让某个 Agent 记住自己的工作习惯和决策历史,跨对话保持一致性。
run_id 单次运行维度的记忆。同一工作流的多个步骤共享上下文,但不同次运行互不影响。
⚠️
最常见的集成错误

忘记传 user_id 或 agent_id。所有用户的记忆会混在一起,无法隔离。Mem0 v3 已经把这个检查做成了强制验证——不传会直接报错,不再静默失败。

从本地到托管:三种集成方式

CODE — 本地开源模式

from mem0 import Memory

# 最简单:零配置启动
m = Memory()

# 存记忆
m.add(
    "我喜欢用 Python 写数据分析",
    user_id="alice"
)

# 搜记忆
result = m.search(
    "alice 的编程偏好",
    user_id="alice"
)
          
PLAIN ENGLISH

导入 Memory 类,这是 Mem0 开源版的核心类

Memory() 无参数初始化:默认用内置 Qdrant 本地向量库 + OpenAI(需设 OPENAI_API_KEY)

m.add():存入一条记忆,指定归属于 user_id="alice",与其他用户完全隔离

m.search():用自然语言查询,只返回 user_id="alice" 的相关记忆

生产环境建议显式配置 config 参数,指定向量库地址和 LLM 配置

实战:给 ChatBot 加上长期记忆

把 Mem0 集成到任何 AI 对话应用的标准模式:

CODE

def chat_with_memory(
    user_id, user_message
):
  # 1. 检索相关记忆
  memories = m.search(
      user_message,
      user_id=user_id,
      top_k=5
  )

  # 2. 把记忆注入系统提示
  system_prompt = f"""
  用户历史信息:
  {memories}
  基于以上信息回答。
  """

  # 3. 调用 AI 生成回复
  reply = llm_call(
      system_prompt, user_message
  )

  # 4. 把新对话存入记忆
  m.add(
      [{"role": "user",
        "content": user_message},
       {"role": "assistant",
        "content": reply}],
      user_id=user_id
  )
  return reply
          
PLAIN ENGLISH

chat_with_memory:一个带记忆的对话函数,接受用户 ID 和消息

步骤 1:先用当前消息搜索相关历史记忆,最多取 5 条最相关的

步骤 2:把检索到的记忆注入 AI 的系统提示,让 AI 知道用户的背景

步骤 3:带着记忆调用 AI 模型,生成更个性化的回复

步骤 4:把这轮对话(用户说了什么、AI 回了什么)存回记忆库,供下次使用

托管 API:零基础设施的方案

不想自己管理 Qdrant 数据库?Mem0 提供了托管云服务,代码更简洁:

🔌

开源自托管

from mem0 import Memory。自己管理向量库和 LLM,完全可控,适合企业内网部署。

☁️

Mem0 托管平台

from mem0 import MemoryClient。只需 API Key,无需管理基础设施,适合快速验证产品。

🔗

OpenMemory MCP

把 Mem0 作为 MCP 服务器,让 Claude、Cursor 等 AI 工具直接读写记忆。

集成设计决策

你在构建一个帮用户写代码的 AI Agent(agent_id="code-helper")。这个 Agent 服务多个用户(alice、bob 等),需要记住 Agent 自己的代码风格偏好,同时也记住每个用户的项目偏好。你应该如何设计 Mem0 的调用方式?

05

构建有记忆的 AI 应用:从零到生产

把前面所有知识串联起来——一个真实的 AI 辅导助手如何利用 Mem0 实现真正的个性化。

设计蓝图:AI 编程辅导助手

这个助手需要记住:每位学生的技术水平、学习进度、踩过的坑、偏好的解释风格。

用户层

👤
学生界面

AI 逻辑层

🤖
对话管理器
🧠
Mem0 记忆层
LLM 引擎

存储层

🗄️
Qdrant
📋
SQLite 历史
点击架构图中的组件了解详情

个性化提示的构建方式

有了 Mem0,你的系统提示从"通用"变成了"为这个学生定制":

CODE

def build_personalized_prompt(
    user_id, question
):
  memories = memory.search(
      question,
      user_id=user_id,
      top_k=5
  )

  memory_text = "\n".join([
      m["memory"]
      for m in memories["results"]
  ])

  return f"""
你是一位编程辅导助手。

关于该学生的已知信息:
{memory_text}

请基于以上信息,用适合该学生
水平的方式回答问题。
  """
          
PLAIN ENGLISH

build_personalized_prompt:为每个学生构建专属的 AI 系统提示

先搜索和当前问题最相关的 5 条历史记忆(语义+关键词+实体融合检索)

把记忆列表展开成可读文本,每条记忆单独一行

把学生的个人信息注入提示词——AI 现在知道这个学生的背景了

结果:AI 不再用通用方式回答,而是针对这个具体学生的水平和背景

记忆如何随时间成长

Mem0 的记忆不是静态的档案,而是随着每次对话不断丰富和精细化:

1
第 1 天:基础偏好建立

存入:"学生是 Python 初学者,喜欢用类比解释概念,对递归感到困惑。"

2
第 7 天:进度更新

新增:"已掌握列表和字典,开始学面向对象;上周成功独立写出了第一个类。"

3
第 30 天:深度个性化

多条记忆积累后,AI 知道"她学新概念需要看 3 个例子才能理解"、"用音乐类比效果最好"。

💡
记忆飞轮效应

记忆越丰富,AI 的回答越个性化;越个性化,用户越愿意继续使用;越继续使用,记忆越丰富。这就是有记忆的 AI 应用的护城河——竞争对手很难复制一个已经积累了大量用户记忆的系统。

生产调试:记忆不准时怎么排查

🔍
"搜到的记忆不相关"

先用 get_all(user_id="...") 查看该用户存了什么,确认记忆确实存在。再检查 Embedder 配置——搜索和存储必须用同一个 Embedding 模型,否则向量空间不匹配。

🧹
"记忆太多,搜索结果噪声大"

调低 top_k(从 10 降到 3-5),或设置 threshold 参数过滤低相似度结果。也可以定期用 delete_all() 清理过时记忆。

💰
"LLM 提取成本太高"

每次 add() 都会调用 LLM,高频写入时成本累积。考虑:批量 add(infer=False 直接存)或换更便宜的提取模型(如 gpt-4o-mini)。

综合理解测验

你接手了一个 Mem0 应用,发现搜索完全失效——即使搜索用户昨天刚说过的话也搜不到任何结果。你查看日志发现 add() 和 search() 都没有报错。最可能的原因是什么?

🎉
你掌握了 Mem0 的完整架构!

从理解 AI 记忆的本质问题,到三层架构(LLM + Embedder + Vector Store),再到生产调试技巧——你现在有能力构建真正有记忆的 AI 应用,并向 AI 助手准确描述你的需求。