跳转至

Mem0 AI 记忆层

为什么要学

当前的 AI 助手有个根本问题:每次对话都是"失忆"的。Mem0 为 AI Agent 添加持久化的长期记忆:

  • 跨会话记忆:AI 记住用户的偏好、历史和上下文
  • 个性化体验:每个用户拥有独立的记忆档案
  • Agent 增强:让 Agent 从历史交互中学习和适应
  • 简单集成:几行代码即可为任何 LLM 应用添加记忆
  • 智能管理:自动提取、更新、删除过时记忆

Mem0 让你的 AI 应用从"每次从零开始"变成"越用越懂你"。

核心概念

白话解释

  • Memory(记忆):从对话中提取的关键信息片段
  • User/Agent/Session:记忆关联的维度——谁的记忆/哪个AI的/哪次会话的
  • Add:从新对话中提取并存储记忆
  • Search:根据当前上下文检索相关记忆
  • Update:当新信息与旧记忆冲突时,自动更新

核心概念对照表

概念说明类比
Memory一条提取的记忆(事实/偏好)笔记本中的一条笔记
User Memory关于特定用户的记忆用户画像
Agent MemoryAgent自己的经验记忆工作笔记
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 的区别?

特性Mem0RAG
数据来源对话历史外部文档
更新方式自动提取/更新手动导入
目的个性化/记忆知识增强
粒度事实级文档级

Q5: 开源版和 Cloud 版区别?

特性开源Cloud
部署自托管托管
存储自选向量DB内置
图谱需配置Neo4j内置
扩展性自行管理自动扩缩
价格免费按用量

参考资源