日习一技 - Mem0
type: channel
link: https://i-study-everyday.online/category/mem0
description: Mem0 学习笔记
items: 使用 OpenMemory MCP 跨客户端共享记忆
items: 学习 Mem0 的 API 接口
items: 深入剖析 Mem0 的图谱记忆源码
items: 学习 Mem0 的图谱记忆
items: 学习 Mem0 的高级配置（续）
items: 学习 Mem0 的高级配置
items: 学习 Mem0 的记忆存储
items: Mem0 介绍：为 AI 应用提供智能记忆层

使用 OpenMemory MCP 跨客户端共享记忆
type: item
date: 2025-06-04T06:17:00+00:00
description: 在人工智能飞速发展的今天，大型语言模型已经深刻改变了我们与技术交互的方式。然而，这些强大的 AI 助手却有一个显著的局限性 —— 它们无法在不同对话之间保持记忆，每次交互都如同初次见面。不仅如此，随着现在的 AI 助手越来越多，比如 Cursor、Claude Desktop、Windsurf、Cline 等等，记忆的碎片化只会越来越严重，我们要不断的告诉这些 AI 助手关于你的偏好、工作习惯和历史对话。今天，给大家介绍一个由 Mem0 提出的解决方案 —— OpenMemory MCP，基于 Mem0 技术构建的私有化、本地优先的 AI 记忆层，以及 MCP 标准协议，在自己的设备上打造一个专属 AI 的记忆系统，能够让所有支持 MCP 协议的 AI 助手获得持久的、上下文感知的记忆能力。核心特性OpenMemory 的核心特性如下：个性化互动（Personalise Interaction） - 让你的 AI 助手记住你的风格、你的偏好、过去的问题以及首选解决方案；跨客户端支持（Supported Clients） - 兼容所有支持 MCP 协议的客户端，如 Cursor、Claude Desktop、Windsurf、Cline 等，在不同的客户端之间切换时不会丢失你的记忆；私有的持久存储（Private, Persistent Storage） - 隐私优先设计，所有的记忆内容都安全地存储在你的本地设备；完全控制（Full Memory Control） - 你对你的记忆拥有完全的控制权，你可以决定保存什么，何时过期，以及哪些 MCP 客户端可以访问它。环境搭建接下来，我们在本地安装 OpenMemory MCP Server。首先，克隆代码并进入 openmemory 目录：$ git clone https://github.com/mem0ai/mem0.git $ cd mem0/openmemory创建环境变量文件：$ make env这个命令会在 api 目录和 ui 目录下各创建一个 .env 文件。我们需要在 api/.env 文件中配上 OPEN_API_KEY 参数，如果使用的是兼容 OpenAI 的三方接口，还需要配上 OPENAI_BASE_URL 参数：OPENAI_API_KEY=sk-xxx OPENAI_BASE_URL=https://api.bianxie.ai/v1接下来，构建镜像：$ make build这个命令会基于当前目录下的 docker-compose.yml 文件创建两个镜像：mem0/openmemory-mcp - 包含后端 API 和 MCP 服务器；mem0/openmemory-ui - 前端 React 应用程序，OpenMemory 控制台页面；如果镜像构建没问题，就可以启动服务了：$ make up在 Docker Desktop 中查看运行的三个容器（除了前后端，还有一个 Qdrant 向量存储）：OpenMemory MCP Server 地址为 http://localhost:8765，可以通过 http://localhost:8765/docs 查看 OpenMemory API 文档：另外，访问 http://localhost:3000/ 进入 OpenMemory 控制台：在 Cherry Studio 中使用 OpenMemory MCP接下来，让我们体验下 OpenMemory MCP 是如何工作的。这里我使用了 Cherry Studio 客户端，这是一款国产开源的 AI 客户端，支持绝大多数大模型服务商，也支持知识库、绘图、搜索、翻译、MCP 等特色功能：下载并安装客户端后，进入 “设置” -> “MCP 服务器” 页面，直接配置 SSE 地址：http://localhost:8765/mcp/openmemory/sse/aneasystoneCherry Studio 和 MCP Server 建立连接后，会列出所有可用工具：可以看到 OpenMemory MCP 提供了四个工具：add_memories : 存储新的记忆对象search_memory : 检索相关记忆list_memories : 查看所有存储的记忆delete_all_memories : 完全清除记忆然后打开新会话，将 MCP Server 启用：将自己的信息告诉它，让他记住：可以看到它成功调用 add_memories 工具，将我的信息保存到记忆中。接下来，再开一个新会话，测试下它是否真的记住了我：在 Claude Desktop 中使用 OpenMemory MCP此时我们可以在 OpenMemory 控制台的 Apps 页面查看由 Cherry…

学习 Mem0 的 API 接口
type: item
date: 2025-06-03T06:15:00+00:00
description: Mem0 提供了 Python 和 TypeScript 两种 SDK 供开发者选用，并且支持将其接口暴露成 REST API 以方便其他语言和工具集成。我们今天系统地学习下 Mem0 提供的这些接口。记忆管理我们以 Python SDK 为例，介绍下 Mem0 记忆管理相关的接口。首先初始化 Memory 实例：from mem0 import Memory m = Memory()如果要对 Memory 进行自定义配置，则通过 Memory.from_config() 初始化：from mem0 import Memory config = { // ... } m = Memory.from_config(config)关于自定义配置选项，前几天已经详细地学习过，可以参考前几天的内容。添加记忆add() 方法用于添加新的记忆，其中 messages 参数可以是一个字符串：messages = "你好，我叫张三" result = m.add(messages, user_id="zhangsan")也可以是一个对象：messages = { "role": "user", "content": "你好，我叫张三" } result = m.add(messages, user_id="zhangsan")还可以是一个数组：messages = [{ "role": "user", "content": "你好，我叫张三" }, { "role": "assistant", "content": "您好，张三，请问有什么需要我帮助？" }] result = m.add(messages, user_id="zhangsan")多模态支持Mem0 支持多模态，可以在对话中添加图片：messages = [{ "role": "user", "content": "你好，我叫张三" }, { "role": "assistant", "content": "您好，张三，请问有什么需要我帮助？" }, { "role": "user", "content": "帮我翻译下这张图上的文字" }, { "role": "user", "content": { "type": "image_url", "image_url": { "url": "<image-url>" } } }] result = m.add(messages, user_id="zhangsan")如果使用 Mem0 平台，除了支持图片内容，还支持 在对话中添加文档，比如 TXT、MDX、PDF 等。助手记忆我们除了为用户添加记忆之外，也可以为助手添加记忆，比如你正在开发一个文本写作智能体，使用助手记忆维持长上下文的一致性：result = m.add(messages, agent_id="writer-agent")关闭推导默认情况下，我们在添加记忆时，会经过提取和更新两个阶段，Mem0 提供了一个参数可以 关闭这个推导过程，直接存储原始消息：result = m.add(messages, user_id="zhangsan", infer=False)查询记忆在数据库中搜索与用户问题最相关的记忆：related_memories = m.search("我是谁？", user_id="zhangsan")Mem0 平台的搜索接口还有几个 高级参数，比如 keyword_search=True 开启关键词搜索，增强搜索召回率，rerank=True 开启重排序，确保最相关的记忆优先出现，filter_memories=True 开启过滤，去除无关的记忆，提高搜索精度。另外，我们还可以根据 user_id 获取指定用户的所有记忆：all_memories = m.get_all(user_id="zhangsan")根据 memory_id 获取指定记忆：specific_memory = m.get("<id>")获取指定记忆的变更历史：history = m.history(memory_id="<id>")更新记忆如果发现大模型自动维护的记忆不对，我们可以手动对记忆进行修改：result = m.update(memory_id="<id>", data="我叫张三丰")删除记忆删除指定记忆：m.delete(memory_id="<id>")删除用户的所有记忆：m.delete_all(user_id="zhangsan")清空所有记忆：m.reset()异步记忆Mem0 提供了一个异步操作记忆的 AsyncMemory 类，它的所有操作都是非阻塞的，这在开发高并发应用程序时非常有用：from mem0 import AsyncMemory m …

深入剖析 Mem0 的图谱记忆源码
type: item
date: 2025-05-31T06:11:00+00:00
description: 昨天我们学习了 Mem0 的图谱记忆功能，了解了 Mem0ᵍ 是如何通过提取和更新两个阶段，将用户消息从非结构化文本转化为结构化图表示的。为了更加深入地理解这块的逻辑，我决定今天来扒一扒 Mem0 的源码，看看具体的实现。从 add() 方法开始我们知道，Mem0 支持 Neo4j 和 Memgraph 两种图数据库，针对不同的图数据库，图谱构建的实现也略有差异，分别位于 graph_memory.py 和 memgraph_memory.py 文件里。虽然流程有一些差异，但是整体框架是一样的。我们以 Neo4j 的实现为例，图谱构建的入口在 MemoryGraph 的 add() 方法：从代码中可以看到一共调用了六个方法，这六个方法大致就可以对应提取阶段和更新阶段的四大步骤。_retrieve_nodes_from_data() 方法从方法名字就可以看出这一步做的是 实体提取（Entity Extractor），Mem0 在这里巧妙地使用了大模型的工具调用能力，它首先定义了一个工具：它把这个工具的名字叫做 extract_entities，它只有一个数组类型的参数 entities，数组里是实体的定义，包括实体名称 entity 和 实体类型 entity_type 两个字段。然后将这个工具提供给大模型进行调用：如果大模型支持工具调用的话，将返回 tool_calls 字段，其中必然有一个 tool_call 的名称叫 extract_entities，参数是提取出来的实体数组，类似于下面这样：extract_entities([ { "entity": "desmond", "entity_type": "person" }, { "entity": "sister", "entity_type": "family_member" } ])通过这个方法，我们从对话中识别并提取出一组实体，以及每个实体对应的类型。_establish_nodes_relations_from_data() 方法这一步是对上面提取的实体进行分析，确认实体之间的关系，Mem0 在这里仍然是使用工具调用的技巧，定义的工具如下：工具名称叫 establish_relationships，工具的参数为数组类型，数组里是关系三元组，包括源实体 source、目标实体 destination 以及两个实体之间的关系 relationship 三个字段。然后将这个工具提供给大模型进行调用：这里的系统 Prompt 如下：EXTRACT_RELATIONS_PROMPT = """ 您是一个设计用于从文本中提取结构化信息以构建知识图谱的高级算法。 您的目标是捕获全面且准确的信息。请遵循以下关键原则： 1. 仅从文本中提取明确陈述的信息。 2. 在提供的实体之间建立关系。 3. 在用户消息中使用"USER_ID"作为任何自我引用（例如"我"、"我的"等）的源实体。 关系： - 使用一致、通用和永恒的关系类型。 - 示例：优先使用"教授"而非"成为_教授"。 - 关系只应在用户消息中明确提及的实体之间建立。 实体一致性： - 确保关系是连贯的，并在逻辑上与消息的上下文相符。 - 在提取的数据中保持实体命名的一致性。 努力通过在实体之间建立所有关系并遵循用户的上下文，构建一个连贯且易于理解的知识图谱。 严格遵守这些指导方针，以确保高质量的知识图谱提取。"""如果一切正常，大模型将返回工具调用的结果，包括工具名称和工具参数，这个参数就是实体之间的关系三元组，类似于下面这样：establish_relationships([ { "source": "desmond", "destination": "sister", "relationship": "has" } ])通过这个方法，我们在这些实体之间推导出了有意义的连接，建立了一批关系三元组，这批关系后面将会添加到我们的记忆图谱中。_search_graph_db() 方法经过上面两步其实已经完成了 Mem0ᵍ 的提取阶段，我们成功从输入的对话消息中提取出了实体和关系三元组。接下来这个方法是为后面的更新阶段做准备，我们遍历所有新提取出来的实体，计算它们的 Embedding 向量，然后搜索出相似度高于阈值的现有节点。这里使用了一个看起来相当复杂的 Cypher 查询，但是实际上非常简单，可以将其拆成三个部分来看。第一部分根据 user_id 和 embedding 筛选出属于当前用户且相似度高于 $threshold 的节点 n：MATCH (n {self.node_label}) WHERE n.embedding IS NOT NULL AND n.user_id = $user_id WITH n, roun…

学习 Mem0 的图谱记忆
type: item
date: 2025-05-30T06:09:00+00:00
description: 关于 Mem0 的配置选项，还差最后一个 graph_store 没有学习，该配置用于指定一个图数据库。Mem0 支持将抽取的记忆保存到图数据库中，生成的记忆图谱可以包含记忆之间的复杂关系，通过对图进行子图检索和语义三元组匹配，在复杂多跳、时间推理和开放领域等问题上表现更好。Mem0 的图谱记忆功能又被称为 Mem0ᵍ，通过将记忆存储为有向标记图来增强 Mem0。今天我们就来看看 Mem0 是如何结合图数据库来做记忆管理的。图谱记忆实战要使用 Mem0 图谱记忆功能，我们先得有图数据库。目前，Mem0 支持 Neo4j 和 Memgraph 两种图数据库。Neo4j 是图数据库领域的老牌选手，处于行业领先地位，拥有成熟的生态和广泛的商业落地案例，以及庞大的社区和丰富的文档，但是社区版本功能受限，而且开源协议是 GPLv3，商业使用注意合规问题，建议购买企业版授权。Memgraph 是近几年崛起的新锐选手，采用内存优先架构，主打高性能和实时分析，而且采用 Apache 2.0 开源协议，允许闭源商用，只是资料不多，成熟度有所欠缺。这两种图数据库都提供了在线服务，也支持本地部署。下面我们以 Neo4j 作为示例。安装 Neo4j首先，使用 Docker 在本地运行 Neo4j 图数据库：$ docker run -d --name neo4j \ -p 7474:7474 -p 7687:7687 \ -e NEO4J_AUTH=neo4j/password \ -e 'NEO4J_PLUGINS=["apoc"]' \ neo4j:2025.04环境变量 NEO4J_AUTH 用于指定数据库的用户名和密码，NEO4J_PLUGINS 用于开启 APOC 插件，Neo4j 的 APOC（Awesome Procedures On Cypher） 插件是一个功能强大的扩展库，为 Neo4j 提供了大量额外的存储过程和函数。注意这里使用了 Neo4j 的最新版本 neo4j:2025.04，有些老版本可能会由于不支持 CALL (n) 这样的子查询语法而报错。启动成功后，在浏览器输入 http://localhost:7474/ 进入 Neo4j 的 Web 控制台：可以点击下面的 "Let's go" 按钮，切换到新版界面。配置图数据库接着使用 pip 安装所需的依赖：$ pip install "mem0ai[graph]"然后在我们的 config 中加上图数据库相关的配置：from mem0 import Memory config = { "graph_store": { "provider": "neo4j", "config": { "url": "neo4j://localhost:7687", "username": "neo4j", "password": "password" } } } memory = Memory.from_config(config)验证图谱记忆Mem0 的文档中有个不错的例子，展示了图谱记忆是如何一步步构建出来的：https://docs.mem0.ai/open-source/graph_memory/overview接下来，我们也亲自实践验证一下，使用 memory.add() 往图谱中添加记忆：memory.add("Hi, my name is Desmond.", user_id="desmond")添加之后，图谱记忆如下：可以看到 Mem0 自动创建了一个 person 节点和一条 is_named 边，并为每个节点创建了 user_id、created、mentions、name、embedding 五个属性：每条边上也有 created 和 mentions 两个属性：我们接着往图谱中添加记忆：memory.add("I have a sister.", user_id="desmond")图谱更新如下：新增了一个 famili_member 节点和一条 has 边。 继续添加记忆：memory.add("Her name is Jesica.", user_id="desmond")图谱更新如下：这次的更新有点差强人意，它再次添加了一个 jesica 节点，但是创建了一条 is 边，而不是复用之前的 is_named 边，而且 sister 和 jesica 之间也没有关系。这个时候如果我问 “我的姐姐叫什么”，通过图谱显然是回答不上来的。所以，图谱的好坏直接影响图谱记忆的效果，要提升图谱记忆的效果，关键在于图谱构建的过程。图谱构建原理和向量记忆的存储一样，图谱记忆的存储也是由两个阶段组成：提取阶段（Extraction） 和 更新阶段（Update）：提取阶段在提取阶…

学习 Mem0 的高级配置（续）
type: item
date: 2025-05-29T06:07:00+00:00
description: Mem0 提供了很多配置选项，可以根据用户的需求进行自定义，包括：向量存储、语言模型、嵌入模型、图存储 以及一些 通用配置。目前我们已经学习了 vector_store 向量存储、llm 语言模型和 embedder 嵌入模型三大配置，图存储相关的配置我打算放在后面再介绍，今天先来看下通用配置，主要是下面这几个：config = { "version": "v1.1", "history_db_path": "/path/to/history.db", "custom_fact_extraction_prompt": "Optional custom prompt for fact extraction for memory", "custom_update_memory_prompt": "Optional custom prompt for update memory" }版本号Mem0 目前支持 v1.0 和 v1.1 两个版本，默认使用的是最新的 v1.1 版本。这个配置参数主要是为了兼容老版本，看 Memory 的 add() 方法，在 v1.0 版本里直接返回 vector_store_result，而最新版本是封装在一个对象的 results 字段里：if self.api_version == "v1.0": warnings.warn( "The current add API output format is deprecated. " "To use the latest format, set `api_version='v1.1'`. " "The current format will be removed in mem0ai 1.1.0 and later versions.", category=DeprecationWarning, stacklevel=2, ) return vector_store_result return {"results": vector_store_result}除非是历史遗留系统使用了 Mem0 的老版本，否则这个参数可以不用管。历史数据库Mem0 每次生成新记忆时，不仅会保存在向量数据库里，而且还在本地数据库中留有一份副本。这个本地数据库使用的是 SQLite，默认位置在 ~/.mem0/history.db，可以通过 history_db_path 配置修改历史数据库的位置。对数据库里的内容感兴趣的朋友可以通过 sqlite3 命令打开该文件：$ sqlite3 ~/.mem0/history.db SQLite version 3.43.2 2023-10-10 13:08:14 Enter ".help" for usage hints.通过 .tables 查看表：sqlite> .tables history可以看到就一张 history 表，通过 .schema 查看表结构：sqlite> .schema history CREATE TABLE history ( id TEXT PRIMARY KEY, memory_id TEXT, old_memory TEXT, new_memory TEXT, event TEXT, created_at DATETIME, updated_at DATETIME, is_deleted INTEGER, actor_id TEXT, role TEXT );通过 select 查询表中的记忆历史：sqlite> select memory_id, old_memory, new_memory, event from history; e40f3ba7-6d63-40d0-9489-3df6c2661dc9||Name is Desmond|ADD d4a05df9-2474-4fe0-9c4d-b37ed47e1ffb||Has a sister|ADD d4a05df9-2474-4fe0-9c4d-b37ed47e1ffb|Has a sister|Has a sister named Jesica|UPDATE 599154a0-f8a6-48f1-a58c-92c88e58d4a7||Jesica has a dog|ADD可以看到一共有四条记录，这四条记录实际上代表三条记忆，其中第二条和第三条的 memory_id 一样，所以是同一条记忆。这四条记录是通过下面的对话产生的：> Hi, my name is Desmond. > I have a sister. > Her name is Jesica. > She has a dog.当我说 “我的名字叫 Desmond” 时，新增了一条…

学习 Mem0 的高级配置
type: item
date: 2025-05-28T06:05:00+00:00
description: 昨天我们学习了 Mem0 记忆存储的原理，并通过自定义 Qdrant 配置实现了记忆的持久化存储，以及通过 vector_store 切换其他的向量数据库。关于 Mem0 的配置，除了 vector_store 之外，还有其他的一些高级配置，我们今天就来看看这一部分。Mem0 配置概览Mem0 提供了很多配置选项，可以根据用户的需求进行自定义。这些配置涵盖了不同的组件，包括：向量存储、语言模型、嵌入模型、图存储 以及一些通用配置。下面是一份完整配置的示例：config = { "vector_store": { "provider": "qdrant", "config": { "host": "localhost", "port": 6333 } }, "llm": { "provider": "openai", "config": { "api_key": "your-api-key", "model": "gpt-4" } }, "embedder": { "provider": "openai", "config": { "api_key": "your-api-key", "model": "text-embedding-3-small" } }, "graph_store": { "provider": "neo4j", "config": { "url": "neo4j+s://your-instance", "username": "neo4j", "password": "password" } }, "history_db_path": "/path/to/history.db", "version": "v1.1", "custom_fact_extraction_prompt": "Optional custom prompt for fact extraction for memory", "custom_update_memory_prompt": "Optional custom prompt for update memory" }语言模型Mem0 对各种主流的大语言模型提供内置支持，包括：OpenAI - 如 gpt-4o、gpt-4o-mini、gpt-o3 等；Anthropic - 如 claude-sonnet-3.7、claude-sonnet-4 等；Gemini - 如 gemini-1.5、gemini-1.5-flash 等；DeepSeek - 如 deepseek-chat、deepseek-reasoner 等；xAI - 如 grok-3-beta 等；Sarvam AI - 如 sarvam-m 等；如果没有配置，默认使用的 OpenAI 的 gpt-4o-mini。Mem0 也支持一些模型聚合服务，包括：Azure OpenAI - https://azure.microsoft.com/AWS Bedrock - https://aws.amazon.com/bedrock/Together - https://www.together.ai/Groq - https://groq.com/还支持接入本地大模型，比如：Ollama - https://ollama.com/LM Studio - https://lmstudio.ai/此外，Mem0 也支持一些 LLM 开发框架，比如 LangChain 和 Litellm 等：LangChain - 通过 LangChain 的 Chat models，支持绝大多数大模型服务；Litellm - 一个小巧精悍的 Python 库，兼容 100+ 不同的大模型，所有模型都使用标准化的输入/输出格式；最后，针对 OpenAI 的模型，Mem0 还有一项特别的功能，它同时支持 OpenAI 的 结构化输出 和 非结构化输出 两种格式。结构化输出可以返回结构化响应（比如 JSON 对象），好处是方便解析，一般用于数据提取、表单填写、API 调用等场景；非结构化输出返回开放式、自然语言的响应，输出格式更灵活性。通过下面的配置使用 OpenAI 的结构化输出功能：config = { "llm": { "provider": "openai_structured", "config": { "model": "gpt-4o-mini", "temperature": 0.0, } } }嵌入模型同样的，Mem0 内置支持很多嵌入模型服务，包括：OpenAI - 如 text-embedding-3-large 等；Azure OpenAIVertex AI - 如 text-embedding-004 等；Gemini …

学习 Mem0 的记忆存储
type: item
date: 2025-05-27T06:04:00+00:00
description: 昨天我们学习了 Mem0 的基本用法，并给出了一个简单的示例程序。和传统的大模型对话不同的是，我们没有将历史会话拼接起来，而是先检索记忆，然后将记忆拼接到系统 Prompt 中回答用户问题，最后再将这次对话保存到记忆。这里涉及两个记忆的核心操作：检索 和 存储，这也是 Mem0 的两个核心方法。# 检索记忆 relevant_memories = memory.search(query=message, user_id=user_id, limit=3) # 保存记忆 memory.add(messages, user_id=user_id)今天我们先学习记忆是如何存储的。Mem0 的记忆存储原理Mem0 的记忆存储流程由两个阶段组成：提取阶段（Extraction） 和 更新阶段（Update）：在提取阶段，Mem0 主要关注三个信息：最新的一轮对话，通常由用户消息和助手响应组成；滚动摘要，从向量数据库检索得到，代表整个历史对话的语义内容；最近的 m 条消息，提供了细粒度的时间上下文，可能包含摘要中未整合的相关细节；然后通过 LLM 从这些信息中提取出一组简明扼要的候选记忆，并在后台异步地刷新对话摘要，刷新过程不阻塞主流程，所以不用担心会引入延迟。在更新阶段，针对新消息从向量数据库中检索出最相似的前 s 个条目进行比较，然后通过 LLM 的工具调用能力，选择四种操作之一：ADD - 在没有语义等效记忆存在时创建新记忆；UPDATE - 用补充信息增强现有记忆；DELETE - 删除和新信息所矛盾的记忆；NOOP - 当候选事实不需要对知识库进行修改时；更新阶段使得记忆存储保持一致、无冗余，并能立即准备好应对下一个查询。综上所述，提取阶段负责处理最新消息和历史上下文以创建新记忆；更新阶段将这些提取的记忆与类似的现有记忆进行评估，通过工具调用机制应用适当的操作。通过 Mem0 的两阶段记忆管道，确保仅存储和检索最相关的事实，最小化令牌和延迟，实现可扩展的长期推理。配置 Qdrant 数据库昨天我们在运行示例程序的时候发现，每次程序重启后记忆就没有了，当时我还以为记忆是保存在内存里的。后来看源码才发现其实不对，Mem0 的默认存储是 Qdrant 向量数据库，只不过使用了本地文件，可以在临时目录 /tmp/qdrant 中找到，每次程序启动时都会删掉重建。可以通过 Memory.from_config() 自定义记忆配置：config = { "vector_store": { "provider": "qdrant", "config": { "path": "/tmp/qdrant_data", "on_disk": True } }, } memory = Memory.from_config(config)在上面的配置中，我们将 Qdrant 数据库位置修改为 /tmp/qdrant_data，并开启了持久化存储。此外，我们也可以本地部署一个 Qdrant 数据库：$ docker run -d -p 6333:6333 -p 6334:6334 qdrant/qdrant然后通过 Memory.from_config() 配上向量数据库地址和集合名称：config = { "vector_store": { "provider": "qdrant", "config": { "collection_name": "test", "host": "localhost", "port": 6333, } }, } memory = Memory.from_config(config)这时我们的记忆就是持久化的了，可以在 Qdrant 的 Dashboard 页面 http://localhost:6333/dashboard 对记忆进行可视化查询和管理：除了上面几个配置参数，Qdrant 的完整配置参数如下：配置其他的向量数据库Mem0 的向量存储统一使用下面的格式配置：config = { "vector_store": { "provider": "your_chosen_provider", "config": { # Provider-specific settings go here } } }其中 provider 表示向量存储的名称，比如 chroma、pgvector、qdrant 等，而 config 是针对不同存储的特定配置，每种向量存储配置可能都不一样，具体配置项可参考 Mem0 的文档：https://docs.mem0.ai/components/vectordbs/configMem0 对各种流行的向量数据库提供了内置支持，包括：Qdrant - https://qdrant.tech/Chrom…

Mem0 介绍：为 AI 应用提供智能记忆层
type: item
date: 2025-05-26T05:59:00+00:00
description: 今年被称为智能体爆发元年，随着推理模型和多模态模型的不断发展，各家 AI 助手和智能体的能力不断提升，应用场景也在不断扩展。但是大模型存在一个先天缺陷，它们往往缺乏持久记忆能力，无法真正实现个性化交互。如何让 AI 系统能够记住用户偏好、适应个人需求并随时间持续学习，成为一个亟待解决的问题。今天给大家介绍一个开源项目 Mem0（读作 "mem-zero"），正是为解决这一挑战而生。Mem0 其实并不算新项目，去年就已经推出了，推出之后社区反响不错，迅速登上了 Github 趋势榜，受到了开发者们的广泛关注，并成为 Y Combinator S24 孵化的项目。当时我简单瞅了一眼，发现它的源码和使用案例非常的简单和粗糙，只有几个和记忆相关的增删改查的接口，实在搞不懂为啥能拿到 10K+ 的星标。这两天这个项目又上了趋势榜，再看的时候星标数已经突破了 32K+，看源码结构和官方文档都比之前丰富了不少，于是准备花点时间仔细研究下它，看看它到底有何过人之处。研究亮点如今的大模型在长时间的交互中会忘记关键事实，打破上下文，让用户缺乏信任感。仅仅扩大上下文窗口只会延迟问题 —— 模型变得更慢、更昂贵，但仍然会忽视关键细节。Mem0 直接针对这个问题，采用可扩展的记忆架构，动态提取、整合和检索对话中的重要信息。根据官方发布的一份研究报告，Mem0 在记忆管理方面的效果令人瞩目。https://mem0.ai/research在 LOCOMO 基准测试中，使用 大模型作为评判者（LLM-as-a-Judge） 计算准确率得分，Mem0 取得 66.9% 的成绩，相对于 OpenAI 的 52.9% 提升了 26%，突显了其卓越的事实准确性和连贯性。除了质量，相对于全上下文，Mem0 的 选择性检索管道（selective retrieval pipeline） 通过处理简洁的记忆事实而不是重新处理整个聊天记录，将 p95 延迟降低了 91%，Mem0 是 1.44 秒，而全上下文多达 17.12 秒。此外，Mem0 还实现了 90% 的令牌消耗减少，每次对话仅需约 1.8K 个令牌，而全上下文方法则需要 26K 个令牌。下图展示了每种记忆方法 端到端（记忆检索 + 答案生成） 的测试情况：可以看到全上下文方法虽然有 72.9% 的高准确率，但中位数延迟为 9.87 秒，95 百分位延迟更是高达 17.12 秒。相比之下，Mem0 的准确率是 66.9%，中位数延迟仅 0.71 秒，95 百分位延迟也只有 1.44 秒。综合来看，这些结果展示了 Mem0 如何平衡最先进的推理效果、实时响应和成本效率 —— 使长期对话记忆在规模上变得可行。核心特性Mem0 作为一个为 AI 助手和智能体提供智能记忆层的开源项目，旨在实现个性化 AI 交互。它的核心特性如下：多级记忆：无缝保留用户、会话和智能体状态，实现自适应个性化；开发者友好：提供直观的 API、跨平台 SDK 和完全托管的服务选项；Mem0 在多种场景中都有广泛应用：AI 助手：提供一致、富有上下文的对话体验；客户支持：记住过去的工单和用户历史，提供量身定制的帮助；医疗保健：跟踪患者偏好和历史，实现个性化护理；生产力与游戏：基于用户行为的自适应工作流和环境；快速入门Mem0 提供了 Python 和 TypeScript 两种 SDK 供开发者选用。下面将通过一个 Python 示例展示了 Mem0 的基本用法。首先，通过 pip 安装 Mem0 和 OpenAI 的 SDK：$ pip install mem0ai openai然后编写示例代码如下：from openai import OpenAI from mem0 import Memory openai_client = OpenAI() memory = Memory() def chat_with_memories(message: str, user_id: str = "default_user") -> str: # 检索相关记忆 relevant_memories = memory.search(query=message, user_id=user_id, limit=3) memories_str = "\n".join(f"- {entry['memory']}" for entry in relevant_memories["results"]) # 生成助手回复 system_prompt = f"你是我的私人助理，请根据我的记忆回答我的问题。\n我的记忆：\n{memories_str}" messages = [{"role": "system", "content": system_prompt}, {"r…