跳转到内容
灵墨笔记

Mem0: 新一代AI Agent持久记忆系统本地自托管生产环境部署指南

更新于:
编辑本页

我的 AI Agent(Hermes)每天要处理大量对话——选题、收集素材、收集AI新闻、数据分析等任务。每次新会话开始,我不得不反复交代上下文。其实这是所有 AI Agent 的通病:会话一关,记忆就没了,一个会话中上下文超出窗口后也损失了很多信息。

评估了几周,我发现Mem0 这款插件可以很好地解决这个问题。

它的工作原理不复杂。每次Agent触发记忆读写就会把对话内容发给它,mem0配置的LLM大模型从中提炼出值得记住的关键信息(比如”用户偏好简洁回答”,“用户熟悉的领域”),Embedding 模型把这些信息转成向量存入数据库。下次新对话需要时,Agent 去搜索相关记忆,Mem0 插件通过向量相似度匹配把历史上下文中的核心信息满血召回。

有了 Mem0 之后,Agent 跨会话的协作效率提升非常明显,你不用每次重复交代背景,多天协作一个项目时记忆会持续累。自此Agent成为一个真正懂你的助手了!

如果你也想把 Mem0 接到自己的 Agent 里长期使用,我建议一开始就按”生产可用”的标准来搭建,至少满足如下目的。

数据不出机器:记忆落在本地生产级数据库例如postgresql,免费可控且方便备份、升级

可视化:搭建如官方有的Dashboard ,能查、能删、能定位问题

可持续运行:服务开机自启、崩了能拉起来,避免每次手动启动

成本可控:Embedding 走本地 Ollama模型,LLM 可使用中等模型。

本文记录的是我自己跑通的一套方案:官方 self-hosted Server + PostgreSQL + pgvector + Ollama(本地 Embedding)+ Web Dashboard,全部跑在本机。照着做大概一小时能跑通,中间有几个容易踩的坑我会标出来,需求能帮你打通这套方案。欢迎点赞收藏!

1 先理一下架构

Mem0 不是单独一个程序,而是一套协同工作机制,一共四层:

从下往上:

  • 数据层(PostgreSQL + pgvector):记忆的最终归宿,pgvector 扩展提供向量相似度检索能力
  • 向量化层(Ollama + bge-m3):把文本转成向量,是记忆搜索的基础
  • 服务层(Mem0 Server):整个系统的核心,接收请求、调用 LLM 提炼记忆、调用 Embedding 生成向量、读写数据库
  • 模型层(LLM):负责从对话内容中提炼出值得记住的结构化信息,不需要强模型,中端够用

理解这个流程很重要,后面每个组件的配置都是为了让记忆写入和召回这条通路跑通。我们从下到上一起来看下如何配置。

2 数据层 PostgreSQL + pgvector

所有记忆最终存在 PostgreSQL 里,pgvector 扩展提供向量检索能力。

安装方法:

# 安装
brew install postgresql@16
brew install pgvector

# 启动
brew services start postgresql@16

# 创建用户和两个数据库
createuser -P mem0
createdb -O mem0 mem0        # 记忆存储(带向量索引)
createdb -O mem0 mem0_app    # 用户认证和API密钥管理

启用 pgvector 扩展:

psql -U mem0 -d mem0 -c "CREATE EXTENSION IF NOT EXISTS vector;"

验证安装:

psql -U mem0 -d mem0 -c "SELECT extname, extversion FROM pg_extension WHERE extname='vector';"
# vector | 0.8.2

关于驱动版本:Mem0 Server 需要 psycopg≥3.2(不是 psycopg2)。这两个包可以共存,但有时会互相干扰导致连接异常。如果后面启动 Server 时报数据库连接错误,先检查是不是装了旧版 psycopg2,卸载它然后安装新版。

pip uninstall psycopg2 psycopg2-binary 2>/dev/null
pip install "psycopg>=3.2" "psycopg-pool>=3.2.6"

3 向量化层 Ollama + bge-m3

Embedding 模型负责把文本转成向量,这是记忆搜索的基础。

BGE-M3 本地Ollama部署即可,这个模型中英文表现都比较均衡。

安装方法:

#安装Ollama
brew install ollama
ollama serve &

# 拉取模型(约2GB,首次下载需要几分钟)
ollama pull bge-m3:latest

验证模型就位:

curl http://localhost:11434/api/tags
# 应该能看到 "bge-m3:latest"

BGE-M3 运行时内存占用约 1.5GB。如果机器内存紧张(比如 8GB),可以考虑换成 nomic-embed-text(约 274MB),中文效果会稍弱一些,但基本可用。

4 LLM 层

Mem0 提取记忆时需要调用大模型,把对话内容提炼成结构化的记忆条目。官方默认对接 OpenAI,但任何兼容 OpenAI API 格式的服务都可以。

我用的是本地 LiteLLM 代理(localhost:6600),它把各种模型的 API 统一包装成 OpenAI 格式,实际跑的是 MiniMax-M2.7——记忆提取这个任务不需要很强的模型,中端就够了,成本很低。

如果你没有代理层,直接在 Mem0 配置里填 大模型 的 Key 也可以,效果没区别。

5 核心服务 Mem0 Server

5.1 安装

Mem0 Server 的代码位于官方仓库的 server/ 目录下:

git clone https://github.com/mem0ai/mem0.git mem0-server
cd mem0-server

python3 -m venv venv
source venv/bin/activate
pip install -r server/requirements.txt

当前版本是 v1.0.11

5.2 配置

server/ 目录下创建 .env 文件。这是整个部署中最关键的一步,每个配置项都对应架构图中的一个组件:

# === LLM(记忆提取用的大模型) ===
OPENAI_API_KEY=*** Key
OPENAI_BASE_URL=http://localhost:6600/v1
MEM0_DEFAULT_LLM_MODEL=MiniMax-M2.7

# === Embedding(文本向量化) ===
MEM0_DEFAULT_EMBEDDER_MODEL=bge-m3:latest
OLLAMA_BASE_URL=http://localhost:11434

# === PostgreSQL(记忆存储) ===
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_DB=mem0
POSTGRES_USER=mem0
POSTGRES_PASSWORD=***
POSTGRES_COLLECTION_NAME=memories

# === 认证 ===
ADMIN_API_KEY=***
JWT_SECRET=***
AUTH_DISABLED=***
DASHBOARD_URL=http://localhost:3000
APP_DB_NAME=mem0_app

# === 其他 ===
MEM0_TELEMETRY=false
REQUEST_LOG_RETENTION_DAYS=30

几个需要注意的点:

  • ADMIN_API_KEY 长度必须 ≥16 字符,它是所有 API 调用的认证凭证
  • AUTH_DISABLED=*** 需要通过注册流程创建用户;如果只是个人用,可以设为 true` 跳过认证
  • POSTGRES_COLLECTION_NAME 默认就是 memories,不建议改,这是 pgvector 里的集合名

5.3 初始化数据库

cd server

# 创建 mem0_app 数据库
./init-db.sh

# 运行数据库迁移
python -m alembic upgrade head

5.4 启动

python -m uvicorn main:app --host 0.0.0.0 --port 6688

看到 Application startup complete 就说明成功了。API 文档在 http://localhost:6688/docs,可以直接在线测试。

5.5 验证

可以手工写一条记忆,再搜回来, 也可以让Agent自己去试。

# 写入
curl -X POST http://localhost:6688/memories \
  -H "X-API-Key: 你的ADMIN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "messages": [{"role": "user", "content": "测试本地Mem0是否正常工作"}],
    "user_id": "test_user"
  }'

# 搜索
curl -X POST http://localhost:6688/search \
  -H "X-API-Key: 你的ADMIN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query": "Mem0测试", "user_id": "test_user"}'

能搜到刚才写入的内容,说明记忆的写入和召回已经打通了。

6 mem0 server开机自启

我不想每次开机都手动启动,macOS 可以用LaunchAgent 解决。

具体方法不再详述,告诉Hermes让它帮忙创建即可。

7 Web 记忆管理dashboard

Mem0 自带一个 Next.js 写的管理面板,可以浏览、搜索、删除记忆条目。

部署跑通之后,建议第一时间打开面板看一眼写入/召回是否符合预期。

7.1 端口架构

Dashboard 默认监听 3000 端口,但只允许 127.0.0.1 本地访问。如果你尝试从局域网其他设备打开,需要一个反向代理做统一入口。

为什么不能直接把两个服务暴露出来? 因为跨域。浏览器有同源策略:页面从 3000 端口加载,JavaScript 去请求 6688 端口的 API,浏览器会直接拒绝。

所以 proxy.mjs 解决了三个问题:

  1. CORS:把前端(3000)和 API(6688)统一到同一个端口(6689),浏览器认为是同源,不再拦截
  2. 局域网访问:Dashboard 只绑 127.0.0.1,proxy 开 0.0.0.0 让局域网设备也能访问
  3. URL 重写:后端响应里的 localhost:6688 自动替换为局域网地址,前端不会请求错地址

三个端口各司其职:

端口服务说明
6689proxy.mjs对外统一入口,前端 + API 聚合
6688Mem0 Server后端 API(FastAPI)
3000Dashboard前端页面(Next.js,仅 127.0.0.1)

7.2 部署

Dashboard 的代码在 Mem0 仓库的 server/dashboard/ 目录下。核心是一个轻量的 Node.js 反向代理(proxy.mjs),把前端请求和 API 请求分别转发到 3000 和 6688:

# 目录结构
~/.local/mem0-local/
├── proxy.mjs                    # 反向代理(端口 6689)
├── start-dashboard-internal.sh  # 启动 Dashboard(端口 3000)
├── start-dashboard.sh            # 一键启动 proxy + dashboard
└── stop-dashboard.sh             # 一键停止

proxy.mjs 支持环境变量配置:

MEM0_PUBLIC_HOST=0.0.0.0     # 对外监听(0.0.0.0 允许局域网访问)
MEM0_PUBLIC_PORT=6689        # 对外端口
MEM0_DASHBOARD_HOST=127.0.0.1
MEM0_DASHBOARD_PORT=3000
MEM0_API_HOST=127.0.0.1
MEM0_API_PORT=6688

代理处理了两件关键的事:把 /backend 路径转发到 Mem0 API,同时处理跨端口登录的 Cookie Secure 标记和 Location 重定向。

7.3 CORS 配置

Dashboard 前端会向 API 发请求,Mem0 Server 需要允许跨域。在 Server 的 .env 里配置:

DASHBOARD_URL=http://localhost:6689,http://127.0.0.1:6689,http://192.168.88.88:6689

把你实际访问 Dashboard 的地址都加上,逗号分隔。改完后重启 Mem0 Server 生效。

7.4 访问

浏览器打开 http://localhost:6689,用注册的账号登录即可。

登录后看到的主页是 Requests(请求日志),展示最近的 API 调用记录和统计:

左侧导航栏中,Memories 是核心页面,可以浏览、搜索和管理所有记忆条目:

建议部署跑通后第一时间打开这两个页面——确认写入和召回是否符合预期,能显著降低后续排查成本。

8 接入AI Agent

服务跑起来后,最后一步是让 Agent 连上它。这里以我用的 Hermes 为例,讲一下完整接入过程。

8.1 安装并配置

Hermes 内置了 Mem0 支持,一条命令就能完成配置:

hermes memory setup

运行后进入交互式配置,会让你选 provider(选 mem0),然后填写连接信息:模式(local/API)、数据库地址、用户名密码、LLM 和 Embedding 的 endpoint。配完后会自动生成 ~/.hermes/mem0.json,内容大概是这样:

{
  "mode": "local",
  "user_id": "你的用户ID",
  "agent_id": "hermes",
  "llm": {
    "provider": "openai",
    "config": {
      "model": "MiniMax-M2.7",
      "openai_base_url": "http://localhost:6600/v1",
      "api_key": "***"
    }
  },
  "embedder": {
    "provider": "ollama",
    "config": {
      "model": "bge-m3:latest",
      "ollama_base_url": "http://localhost:11434"
    }
  },
  "vector_store": {
    "provider": "pgvector",
    "config": {
      "collection_name": "memories",
      "host": "localhost",
      "port": 5432,
      "user": "mem0",
      "password": "***",
      "dbname": "mem0"
    }
  }
}

几个关键配置项:

  • mode: "local":让 SDK 直连本地 PostgreSQL,不经过 Mem0 Server 的 HTTP API,少一层网络开销
  • user_id:用来隔离不同用户的记忆空间。同一个 Mem0 数据库里,不同 user_id 的记忆互不可见
  • agent_id:标识是哪个 Agent 在写入记忆,方便区分来源
  • LLM / Embedding / vector_store:需要和前面 Mem0 Server .env 里的配置保持一致,因为 SDK 直连的是同一套基础设施

配置完后可以用 hermes memory status 确认是否接入成功:

hermes memory status
# Provider:  mem0
# Status:    available ✓

8.2 Agent 怎么用 Mem0

配置好之后,Hermes 在两个时机自动和 Mem0 交互,不需要你手动触发:

写入记忆:每次对话结束时,Hermes 调用 Mem0 的 add() 方法,把对话内容发给它。Mem0 内部会用 LLM 自动从对话中提炼出值得记住的信息——比如你的偏好、项目决策、踩过的坑——存成结构化的记忆条目。你不需要告诉它”记下这个”,它是语义级别的自动提取。

召回记忆:每次新对话开始时,Hermes 用当前话题的关键词调用 search() 方法,Mem0 通过向量相似度匹配把相关的历史记忆召回,注入到对话上下文中。这样 Agent 一开始就知道你之前做过什么、偏好什么,不需要你重复交代。

8.3 SDK 版本踩坑

SDK 新版有一个行为变化需要注意:search()get_all() 方法必须通过 filters 参数传 user_id,不再支持顶层参数。如果接入后一直返回空结果,检查下是不是传参方式没更新。具体改动在 Hermes 的 plugins/memory/mem0/__init__.py 里的 _read_filters() 方法。

9 mem0能做什么

Mem0 在 Agent 工作流里做两件事:

  1. 自动提取记忆:对话结束后,Agent 把关键信息(用户偏好、项目决策、工具配置、踩过的坑)写入 Mem0。这个过程是语义级别的——Mem0 会用 LLM 从长对话中提炼出值得记住的结构化条目,不是简单的原文截取
  2. 跨会话自动召回:新对话开始时,Agent 根据当前话题自动搜索相关记忆。比如我提到”知乎选题”,Mem0 会把之前关于知乎运营策略的记忆都召回,Agent 就知道我的账号定位和内容方向

而Dashboard 面板可以让你手动搜索和删除不准确的记忆。Agent 的记忆不可能百分百正确,偶尔会有理解偏差的条目,在面板里清理掉比让它在后台一直误导 Agent 要靠谱得多。

10 使用感受

这套东西跑了一周,说几个切身体会:

跨会话连续性有效。现在 Agent 直接从记忆里调取,对话效率明显提高。尤其是多天协作一个项目的时候,记忆累积带来的效果更明显。

记忆质量看 LLM 提取能力。MiniMax-M2.7 提取中文记忆基本够用,偶尔会提取一些不太有价值的信息(比如重复记录同一条偏好),但不会遗漏重要的内容。搜索延迟在 200-500ms 之间,主要花在 Embedding 向量化上。

Dashboard 调试很关键。部署前几天我经常打开面板看 Agent 记了什么,发现有几条记忆的描述不够准确,手动删掉之后,后续对话的召回精度确实有所提升。对我来说,这个面板相当于”记忆的可视化回路”:你能看到它写了什么、为什么会写歪,然后把噪声及时清掉。

成本几乎为零。LLM 走本地代理,Embedding 跑在 Ollama 上,PostgreSQL 本机存储,没有一分钱 API 费用。唯一的资源消耗是 Ollama 常驻占 1.5GB 内存,对现代 Mac 来说不算什么。

整体来说,Mem0 解决了 AI Agent 最烦人的一个问题——每次对话都从零开始。部署成本不高,这套方案里用到的组件都很成熟,跑起来之后基本不用管。如果你也在用 AI Agent 做长期协作,这套方案值得试试。

你在用 AI Agent 的时候,有没有遇到过记忆管理的问题?怎么解决的?欢迎聊聊。


编辑本页
扫描二维码分享
打开应用扫一扫,即可分享