Loading...

文章背景图

Mem0:为 LLM 与 AI Agent 提供长期记忆层的自托管方案|部署与使用全指南

2026-10-27
1
- 字
- 分钟
|

Mem0:为 LLM 与 AI Agent 提供长期记忆层的自托管方案|部署与使用全指南

本文基于 2026 年 10 月的官方资料撰写:开源仓库 mem0ai/mem0(main 分支),Python SDK mem0ai 当前 PyPI 最新版为 2.2.1(2026-09-25 发布),自托管服务端随仓库 server/ 目录持续迭代,自托管 REST 服务标注版本 1.0+(认证默认开启)。仓库目前约 67,800+ stars、8,000+ forks,Apache-2.0 许可,由 YC S24 公司 Mem0 维护,提交活跃(月均数百次提交)。需要特别注意:官方在 2026 年 4 月发布了新一代记忆算法(v3 管线,ADD-only 提取 + 混合检索),并对 OSS SDK 做了破坏性变更,本文全部内容以 v3 行为为准。

Mem0 banner

Mem0(读作 "mem-zero")是一个为 AI 助手和 Agent 设计的智能记忆层:它把对话中值得记住的事实(用户偏好、决策、背景信息)用 LLM 提取出来,向量化后存入你指定的向量库,在后续对话中按语义 + 关键词 + 实体三类信号混合检索,把"相关记忆"注入 system prompt,从而让 Agent 跨会话记住用户。它可以作为 Python/TS 库内嵌进你的应用,也可以通过官方 server/ 提供的 Docker Compose 栈以自托管 REST 服务(含 Web 仪表盘、按用户 API Key、请求审计日志)的方式运行,数据完全留在你自己的基础设施里。注意:Mem0 分为开源版(Mem0 OSS,即本教程主角)与托管版(Mem0 Platform,app.mem0.ai),两者共享同一套心智模型但能力边界不同,本文会在关键位置明确区分,避免把 Platform 托管特性误写成自托管可用。

Mem0 在 Agent 技术栈中的位置:Memory Reader / Memory Writer 与 Orchestrator、RAG、LLM 并列

一、项目介绍与适用场景

Mem0 的定位是 "Memory Layer for Personalized AI"——介于你的应用与 LLM 之间的一层持久化记忆服务。它解决的核心问题是:LLM 是无状态的,多轮对话和跨会话场景下,用户每次都要重复说明自己的偏好和背景;把全部历史塞进 context 又贵又容易爆窗口。Mem0 的做法是"提取-存储-召回":add() 时用 LLM 一次性抽取事实(v3 管线为 ADD-only,不覆盖不删除),search() 时按混合检索打分返回最相关的记忆条目。

技术定位:

  • 开源版(Mem0 OSS):Apache-2.0,Python 3.10+ / Node.js 18+,可作库内嵌(Memory / AsyncMemory),也可用仓库内 server/ 目录的 FastAPI + Postgres(pgvector) + Next.js 仪表盘栈自托管。

  • 托管版(Mem0 Platform):SaaS,app.mem0.ai 注册拿 API Key,MemoryClient 调用,托管特性(Graph Memory、Memory Decay、Temporal Reasoning、Dream、Webhooks、自定义分类、批量操作、组织/项目等)仅在此可用。

  • 新算法(2026-04 v3):单次 LLM 调用 ADD-only 提取;实体抽取/链接;语义 + BM25 关键词 + 实体匹配三路并行打分融合检索;官方基准 LoCoMo 92.5、LongMemEval 94.4(注意官方声明:该分数基于托管平台,含专有优化,OSS 用户应预期"方向一致但数值不同"的收益)。

适用人群:

人群

是否适合

说明

做客服机器人 / AI 助手团队的工程师

非常适合

记住用户历史工单与偏好,跨会话个性化

自建 Agent 平台、要求数据不出内网的企业

非常适合

OSS 自托管 + 自选向量库/LLM,数据 100% 自持

想给 Cursor / Claude Code 等编码 Agent 加长期记忆的个人开发者

适合

CLI/MCP 路径(见第八章),或 OSS 库自建

教学、原型验证

适合

pip install mem0ai 五分钟跑通 add/search

需要"知识库全文问答"(传统 RAG)

不适合

Mem0 管的是对话产生的"记忆",不是文档库检索;文档 RAG 请用向量库 + RAG 框架

想在自托管里用图数据库(Neo4j)做 Graph Memory

不适合(v3 起)

官方明确:v3 起 OSS 移除了外部图存储(Neo4j/Memgraph/Kuzu/Apache AGE)集成,Graph Memory 只在 Platform 提供

无任何 LLM API Key 且不想本地跑模型

不适合

Mem0 必须有一个 LLM 来做事实提取(可用 Ollama 本地模型替代)

不适合的场景:超低延迟(<100ms)强实时链路(add 涉及一次 LLM 调用);完全离线且无 GPU 的环境(提取模型与 embedding 都需要算力或 API);需要合规审计的托管报表能力(审计日志在自托管仪表盘里有,但 org/project 治理只有 Platform 有)。

二、核心功能逐条拆解

  1. 多层级记忆作用域:每条记忆可用 user_id、agent_id、run_id 三个标识分层隔离(v3 起 OSS 仅支持这三个,app_id 是 Platform 专属)。检索时必须通过 filters 传入作用域,例如 m.search("q", filters={"user_id": "alice"})。

  2. ADD-only 事实提取(v3):add() 用一次 LLM 调用从对话中抽取事实,只新增不更新不删除(返回事件只有 ADD),记忆自然累积;实体 ID 约定与 Platform 对齐。

Mem0 记忆提取管线:Store New Memories → Context Lookup → Extract Memories → Deduplicate + Embed → Entity Linking,落到 SQL/向量/实体三类持久存储

3. 多信号混合检索:search 同时跑语义向量、BM25 关键词、实体匹配三路信号并融合打分。Python 端使用 Qdrant 时 BM25 依赖 fastembed 编码稀疏向量,不装则静默退化为纯语义检索(首次 search 会打 warning);其余向量库用各自原生全文能力。 4. 实体感知排序:OSS 仍会从记忆文本中抽取实体并跨记忆链接,检索时对共享实体的结果加权——但与 Platform 不同,OSS 没有"可查询的图"、没有 relations 字段。 5. 可插拔组件:LLM(OpenAI/Anthropic/Gemini/Groq/Ollama/Azure OpenAI/LiteLLM 等)、Embedder(OpenAI/Gemini/Ollama/HuggingFace/VertexAI 等)、向量库(Qdrant/pgvector/Chroma/Pinecone/Redis/Weaviate/Milvus/Elasticsearch 等 25+)、Reranker(Cohere/HuggingFace/SentenceTransformer 等 7+)全部可通过 Memory.from_config 替换。 6. 自托管 REST 服务 + 仪表盘:server/ 目录一条 make bootstrap 起一套 Docker Compose:FastAPI API(宿主 8888)+ Next.js 仪表盘(宿主 3000)+ Postgres/pgvector,内置管理员账号、按用户 API Key(m0sk_ 前缀)、请求审计日志、运行时配置页。 7. 鉴权默认开启:仪表盘走 JWT 登录,程序化访问走 X-API-Key 请求头,旧的 ADMIN_API_KEY 共享密钥保留做兼容,AUTH_DISABLED=true 仅限本地开发。 8. AsyncMemory 异步接口:方法与同步版一一对应(await memory.add/search/get_all/...),适合 FastAPI、asyncio worker 内嵌。 9. 多模态输入:OSS 支持把图片/音频等作为记忆输入(走支持多模态的 LLM 提取),与 Platform 的多模态支持同源。 10. 自定义提取指令:custom_instructions(v2 的 custom_fact_extraction_prompt 已改名,custom_update_memory_prompt 已废弃)控制"记什么、怎么记";自托管服务端可通过 POST /configure 设置。 11. 元数据过滤:任意 metadata 键可直接过滤(无 Platform 的字段白名单限制),支持 eq/ne/gt/gte/lt/lte/in/nin/contains/icontains 等算子(实际可用性取决于所选向量库)。 12. 记忆过期与历史:add(..., expiration_date="2030-01-31") 让记忆到期自动从检索中隐藏;memory.history(memory_id) 提供单条记忆的变更审计(OSS 没有项目级事件流,那是 Platform 的 GET /v1/events/)。

三、全套官方链接

资源

地址

GitHub 仓库

https://github.com/mem0ai/mem0

官方文档站

https://docs.mem0.ai

OSS 自托管总览

https://docs.mem0.ai/open-source/overview

OSS 自托管部署(Self-Hosted Setup)

https://docs.mem0.ai/open-source/setup

OSS 配置参考

https://docs.mem0.ai/open-source/configuration

OSS REST API 参考

https://docs.mem0.ai/open-source/features/rest-api

组件目录(LLM/Embedder/向量库)

https://docs.mem0.ai/components/llms/overview

Platform vs OSS 对比

https://docs.mem0.ai/platform/platform-vs-oss

v2→v3 迁移指南

https://docs.mem0.ai/migration/oss-v2-to-v3

PyPI 包

https://pypi.org/project/mem0ai/

npm 包

https://www.npmjs.com/package/mem0ai

Mem0 MCP(托管)

https://mcp.mem0.ai/mcp

Mem0 CLI

pip install mem0-cli / npm install -g @mem0/cli

研究论文(arXiv 2504.19413)

https://mem0.ai/research

Discord 社区

https://mem0.dev/DiG

License(Apache-2.0)

https://github.com/mem0ai/mem0/blob/main/LICENSE

说明:历史上有一个独立仓库 mem0ai/openmemory 提供"OpenMemory MCP"本地记忆 MCP 服务器;截至本文撰写时该仓库已被官方改造为"编码工具会话迁移工具"(在 Claude Code / Codex / OpenCode 之间搬运会话),不再提供记忆 MCP 服务。官方当前推荐的 MCP 接入路径是托管服务 https://mcp.mem0.ai/mcp(需 Platform 账号),自托管用户对接编辑器的正确方式是第八章的自建 REST 调用或自封装 MCP 工具。

四、硬件与环境前置要求

项目

要求

操作系统

Linux(Ubuntu 22.04+/Debian 12 推荐)、macOS 13+、Windows 10/11(库模式原生支持;自托管服务端官方以 Docker/Make 为参考路径,Windows 建议 WSL2 或 Docker Desktop)

Python

3.10 – 3.12([nlp] 扩展的 spaCy 依赖暂无 3.13 预编译 wheel,3.13 上会构建失败;基础包支持 3.10+)

Node.js

18+(TS SDK;OSS sqlite 特性要求 Node 20+)

Docker / Compose

自托管服务端必备(Compose V2,docker compose 子命令)

CPU / 内存

库模式 2 核 / 2GB 起步;自托管栈(API + 仪表盘 + Postgres)建议 2 核 / 4GB 起步,生产 4 核 / 8GB

GPU

非必需。默认走 OpenAI 云 API;若用 Ollama/sentence-transformers 本地模型,按模型规模另备 GPU 或充足内存

磁盘

自托管栈 10GB 起步(镜像约 1–2GB,Postgres 数据随记忆量增长;请求日志表在高 QPS 下每天可达约 86 万行)

网络

需访问所选 LLM/Embedder 提供商的 API(默认 OpenAI);全离线方案需自备 Ollama + 本地 embedding

账号

至少一个 LLM 提供商 API Key(默认 OPENAI_API_KEY;自托管容器内置 openai/anthropic/gemini 三家)

端口

自托管默认占用宿主 8888(API)与 3000(仪表盘),Postgres 可选暴露 8432

五、多平台部署步骤

Mem0 有两种运行形态:库模式(进程内 Memory)与自托管服务端(server/ Docker 栈)。以下分别给出各平台步骤。

5.1 库模式(全平台通用)

# 1. 建虚拟环境(Python 3.10–3.12)
python3 -m venv .venv && source .venv/bin/activate   # Windows: .venv\Scripts\activate

# 2. 安装
pip install -U mem0ai

# 3.(推荐)启用混合检索的 NLP 扩展:BM25 关键词 + 实体抽取
pip install -U "mem0ai[nlp]"
python -m spacy download en_core_web_sm

# 4. Qdrant 用户:额外安装 fastembed 以启用 BM25 稀疏向量
pip install fastembed

# 5. 设置默认提供商的 Key
export OPENAI_API_KEY="sk-..."

最小验证脚本 check.py:

from mem0 import Memory

m = Memory()  # 默认:gpt-5-mini 提取 + text-embedding-3-small + 本地 Qdrant(/tmp/qdrant) + SQLite 历史(~/.mem0/history.db)

m.add([{"role": "user", "content": "我喜欢在早上喝咖啡并散步"}], user_id="alex")
results = m.search("alex 的习惯是什么?", filters={"user_id": "alex"})
print(results)
python check.py

Node.js 库模式:

npm install mem0ai
import { Memory } from "mem0ai/oss";  // 注意:OSS 入口是 /oss 子路径,不是 "mem0ai"

const memory = new Memory();
await memory.add("I love hiking on weekends", { userId: "alex" });
const res = await memory.search("What does Alex like?", { filters: { userId: "alex" } });
console.log(res);

5.2 自托管服务端 — Linux / macOS

参考路径是官方 server/ 目录 + Docker Compose:

# 0. 前置:安装 Docker Engine + Compose v2 与 make;克隆仓库
git clone https://github.com/mem0ai/mem0.git
cd mem0/server

# 1. 配置环境变量
cp .env.example .env
# 至少填写:OPENAI_API_KEY 与 POSTGRES_PASSWORD(不设置则 compose 拒绝启动)
openssl rand -base64 48   # 生成一个 JWT_SECRET,写入 .env 的 JWT_SECRET=
cat >> .env <<EOF
POSTGRES_PASSWORD=你的强密码
JWT_SECRET=$(openssl rand -base64 48)
EOF

# 2A. Agent-first:一条命令起栈 + 建管理员 + 发第一个 API Key
make bootstrap
# 可自定义管理员凭据:
# make bootstrap EMAIL=admin@company.com PASSWORD='strong-password' NAME='Admin'

# 2B. Browser-first:只起栈,然后浏览器里走一次性 setup 向导
make up
# 打开 http://localhost:3000 ,首次会重定向到 /setup 向导

make bootstrap 会在终端打印管理员邮箱、密码与第一个 API Key(m0sk_...,只显示一次,务必保存)。

5.3 自托管服务端 — Windows

官方未提供 Windows 原生的 make/Compose 部署脚本(Makefile 依赖 lsof、curl 等 Unix 工具),替代方案如下:

  1. 安装 Docker Desktop 并启用 WSL2 后端;

  2. 在 WSL2(Ubuntu)里按 5.2 节步骤执行;或

  3. 不用 Makefile,手动执行等价命令:

git clone https://github.com/mem0ai/mem0.git
cd mem0\server
copy .env.example .env
# 编辑 .env:填 OPENAI_API_KEY、POSTGRES_PASSWORD、JWT_SECRET
docker compose up -d --build
# 打开 http://localhost:3000 走 setup 向导,或用 curl 调 /auth/register 建管理员

5.4 官方 Docker 镜像(仅 API,无仪表盘)

docker pull mem0/mem0-api-server
# 或本地构建
cd mem0/server && docker build -t mem0-api-server .

# 注意:此路径假设 Postgres(pgvector) 已在 POSTGRES_HOST:POSTGRES_PORT 可达
docker run -p 8000:8000 --env-file .env mem0-api-server
# API 在 http://localhost:8000 ,OpenAPI 文档在 /docs

端口说明:Compose 栈把容器内 8000 映射为宿主 8888;裸 Docker 与裸 uvicorn 监听 8000。

5.5 源码直接运行(不使用 Docker)

前提:已有可达的 Postgres + pgvector 实例,并已设置对应连接环境变量。

cd mem0/server
pip install -r requirements.txt
export POSTGRES_HOST=... POSTGRES_PORT=5432 POSTGRES_DB=... POSTGRES_USER=... POSTGRES_PASSWORD=...
export OPENAI_API_KEY=... JWT_SECRET=$(openssl rand -base64 48)
alembic upgrade head          # 初始化/迁移数据库表
uvicorn main:app --host 0.0.0.0 --port 8000

5.6 Docker Compose 栈组成(官方 server/docker-compose.yaml)

该文件定义三个服务:mem0(FastAPI,宿主 8888→容器 8000)、postgres(官方镜像 pgvector/pgvector:pg17,数据卷 postgres_db,可选暴露宿主 8432)、mem0-dashboard(Next.js 仪表盘,宿主 3000,环境变量 NEXT_PUBLIC_API_URL=http://localhost:8888)。API 容器启动时会自动执行 alembic upgrade head 完成建表迁移。

六、配置文件全部参数解释

6.1 库模式:Memory.from_config 配置字典

顶层键:llm、embedder、vector_store、reranker、history_db_path(TS SDK)与 custom_instructions。每个组件都是 {provider, config} 两层结构。

LLM 通用参数(Python):

参数

默认

说明

model

gpt-5-mini

模型 ID

temperature

提取建议 ≤0.2

采样温度,越低越确定

api_key

取环境变量

提供商 Key;优先级:config > 环境变量 > 默认值

max_tokens

—

生成的最大 token 数

top_p / top_k

—

核采样 / 保留最高概率 token 数

openai_base_url

—

OpenAI 兼容端点(可指向自建网关)

ollama_base_url

—

Ollama API 地址

azure_kwargs

—

Azure OpenAI 初始化参数(deployment_url、api_version 等)

http_client_proxies

—

出站代理设置

reasoning_effort

—

推理力度(low/medium/high,部分模型)

Embedder 通用参数(Python):

参数

说明

model

embedding 模型 ID(默认 text-embedding-3-small,1536 维)

api_key

提供商 Key

embedding_dims

向量维度,必须与向量库 collection 定义一致

ollama_base_url / lmstudio_base_url / openai_base_url

各家端点

azure_kwargs

Azure OpenAI 参数

vertex_credentials_json

GCP 凭据 JSON 路径

model_kwargs

HuggingFace 模型附加参数

向量库通用参数(Python,按所选库取用):

参数

说明

collection_name

集合名,生产环境务必显式命名以隔离租户

embedding_model_dims

向量维度

host / port

服务地址(如 Qdrant 6333)

user / password / dbname / url / api_key

连接凭据

path

本地路径(如 Qdrant 本地模式默认 /tmp/qdrant、Chroma 持久目录)

on_disk

Qdrant 是否落盘持久化

connection_string

pgvector/Supabase 连接串

支持的 provider 字符串(Python 常用):

组件

provider 取值

LLM

openai、anthropic、gemini、groq、ollama、aws_bedrock、azure_openai、litellm、deepseek、xai、vllm、sarvam、together、mistral、lmstudio、langchain、openrouter

Embedder

openai、gemini、azure_openai、ollama、huggingface、vertexai、aws_bedrock、fastembed、together、langchain、lmstudio

向量库

qdrant、pgvector、chroma、pinecone、redis、weaviate、milvus、elasticsearch、faiss、mongodb、opensearch、supabase、upstash_vector、neptune_analytics、s3_vectors 等共 25+

Reranker

cohere、huggingface、sentence_transformer、zero_entropy、llm_reranker 等

带注释的完整配置示例(Qdrant + 本地 Ollama):

from mem0 import Memory

config = {
    "llm": {
        "provider": "ollama",              # 换成 openai/anthropic/gemini 等即可切换
        "config": {
            "model": "llama3.1:8b",
            "temperature": 0.1,            # 提取保持低温,避免漏抓事实
            "ollama_base_url": "http://localhost:11434",
            "max_tokens": 2000,
        },
    },
    "embedder": {
        "provider": "ollama",
        "config": {
            "model": "nomic-embed-text",
            "ollama_base_url": "http://localhost:11434",
            "embedding_dims": 768,         # 必须与向量库集合维度一致
        },
    },
    "vector_store": {
        "provider": "qdrant",
        "config": {
            "host": "localhost",
            "port": 6333,
            "collection_name": "memories",  # 生产必填,隔离租户
            "embedding_model_dims": 768,
            "on_disk": True,
        },
    },
    "custom_instructions": "重点记录用户的长期偏好、项目决策与联系方式",
}

memory = Memory.from_config(config)

也可以用 YAML 文件加载:yaml.safe_load(open("config.yaml")) 后传给 Memory.from_config。

历史库:默认 SQLite,路径 ~/.mem0/history.db(服务端容器内由 HISTORY_DB_PATH 控制,默认 /app/history/history.db);TS SDK 顶层键为 historyDbPath。官方未提供把 OSS 历史库切换为 Postgres 的配置项(自托管服务端的用户/API Key/审计日志在 Postgres,那是另一套 users/api_keys/request_logs 表)。

6.2 自托管服务端:server/.env 全部变量

变量

必填

默认

说明

OPENAI_API_KEY

是

—

默认 LLM 与 embedder 提供商的 Key

JWT_SECRET

是(启用鉴权时)

—

签发访问/刷新 JWT;未设置时鉴权端点返回 500。生成:openssl rand -base64 48

POSTGRES_PASSWORD

是

—

Compose 强校验,未设置拒绝启动

POSTGRES_HOST

否

postgres

Postgres 地址(Compose 内为服务名)

POSTGRES_PORT

否

5432

Postgres 端口

POSTGRES_DB

否

postgres

数据库名

POSTGRES_USER

否

postgres

用户名

POSTGRES_COLLECTION_NAME

否

memories

pgvector 集合名

ADMIN_API_KEY

否

空

旧版共享管理员 Key(≥16 字符,否则启动告警);走 X-API-Key 头

AUTH_DISABLED

否

false

仅本地开发;置 true 时每次启动都会打警告,严禁生产

DASHBOARD_URL

否

http://localhost:3000

API 接受的 CORS 来源,自定义域名托管仪表盘时必改

APP_DB_NAME

否

mem0_app

用户/API Key/审计日志所在的业务库名

MEM0_DEFAULT_LLM_MODEL

否

gpt-5-mini

服务端默认 LLM,容器内置提供商仅 openai/anthropic/gemini

MEM0_DEFAULT_EMBEDDER_MODEL

否

text-embedding-3-small

服务端默认 embedding 模型(内置 embedder:openai/gemini)

HISTORY_DB_PATH

否

/app/history/history.db

容器内记忆历史 SQLite 路径(Compose 已挂载 ./history 卷)

MEM0_TELEMETRY

否

true

匿名遥测(PostHog,仅安装 UUID/邮箱域名/版本,无 PII);false 关闭

REQUEST_LOG_RETENTION_DAYS

否

30

make prune-logs 清理请求日志的保留天数

ANTHROPIC_API_KEY / GOOGLE_API_KEY

否

—

使用 Anthropic/Gemini 提供商时填写

内置提供商白名单:服务端镜像只捆绑 openai/anthropic/gemini(LLM)与 openai/gemini(embedder)。要用其他 provider(如 sentence-transformers 本地 embedding),需在 server/requirements.txt 加包、修改 server/main.py 中的 BUNDLED_LLM_PROVIDERS / BUNDLED_EMBEDDER_PROVIDERS,再 docker compose build 重建镜像。传白名单外 provider 会直接 400。

6.3 运行时配置

仪表盘 Configuration 页(或 POST /configure)可在运行时覆盖 LLM/embedder,改动持久化到应用数据库并在重启后重新生效,叠加在 .env 之上;仪表盘有意不允许在运行时修改提供商密钥。

七、启动、后台常驻、开机自启、改端口

7.1 前台/常规启动

cd mem0/server
make up          # 起栈并等待健康检查
make health      # 检查 API/仪表盘/Postgres 状态
make logs        # 跟踪日志(等价 docker compose logs -f)
make down        # 停栈(保留数据卷)
make clean       # 停栈并删除数据卷(毁数据!)

7.2 systemd 常驻(裸 uvicorn 方式)

自托管官方推荐 Compose;Compose 本身已配置 restart: on-failure(Postgres)与 Docker 守护进程自启。若你用 5.5 节的裸 uvicorn 方式,建议上 systemd:

# /etc/systemd/system/mem0-server.service
[Unit]
Description=Mem0 Self-hosted REST Server
After=network.target postgresql.service

[Service]
User=mem0
WorkingDirectory=/opt/mem0/server
EnvironmentFile=/opt/mem0/server/.env
ExecStart=/opt/mem0/.venv/bin/uvicorn main:app --host 0.0.0.0 --port 8000 --workers 2
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now mem0-server
systemctl status mem0-server

官方文档明确建议:为生产环境部署的 FastAPI 服务使用 systemd、Supervisor 或 PM2 之类进程管理器。

7.3 Windows 计划任务 / NSSM

官方未提供 Windows 服务化方案。用 NSSM 包装裸 uvicorn(需先按 5.3/5.5 准备好 Python 环境与 Postgres):

nssm install Mem0Server "C:\path\to\.venv\Scripts\uvicorn.exe" "main:app --host 0.0.0.0 --port 8000"
nssm set Mem0Server AppDirectory C:\opt\mem0\server
nssm set Mem0Server AppEnvironmentExtra JWT_SECRET=xxx OPENAI_API_KEY=xxx POSTGRES_HOST=xxx
nssm start Mem0Server

7.4 Docker Compose 开机自启

# 在 server/docker-compose.yaml 的 mem0 与 mem0-dashboard 服务下加:
restart: unless-stopped
# postgres 服务已有 restart: on-failure,可一并改为 unless-stopped

配合 Docker Desktop/Engine 随系统启动即可实现开机自启。

7.5 改端口

  • Compose 方式:改 server/docker-compose.yaml 中的映射,如 "18888:8000" 与 "13000:3000",然后 docker compose up -d --force-recreate。

  • 裸 uvicorn:uvicorn main:app --port 9000。

  • AgentOS 类似物:不适用(那是 agno 的概念)。

  • 环境变量:AGENT_OS_HOST/AGENT_OS_PORT 属于 agno,与 mem0 无关,勿混淆。

7.6 反向代理(Nginx + HTTPS)

server {
    listen 443 ssl;
    server_name mem0.example.com;

    location / {
        proxy_pass http://127.0.0.1:8888;      # API
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

同时把仪表盘(3000)按需代理,并将 .env 中 DASHBOARD_URL 改为仪表盘实际对外 Origin(CORS 用)。官方安全清单:开启 API Key 鉴权、在负载均衡/反代层终结 TLS、不要把服务暴露到公网内网之外、.env 与 compose 文件纳入版本管理。

八、功能实操教程

8.1 实操一:五分钟跑通 add/search 闭环(库模式)

export OPENAI_API_KEY=sk-...
pip install mem0ai
from mem0 import Memory

m = Memory()
m.add([{"role": "user", "content": "Hi, I'm Alex. I love basketball and gaming."}], user_id="alex")
print(m.search("What do you know about me?", filters={"user_id": "alex"}))

预期输出(结构):

{
  "results": [
    {
      "id": "mem_123abc",
      "memory": "Name is Alex. Enjoys basketball and gaming.",
      "user_id": "alex",
      "categories": ["personal_info"],
      "created_at": "2026-10-22T04:40:22.864647-07:00",
      "score": 0.89
    }
  ]
}

注意 v3 破坏性变更:search/get_all 的实体 ID 必须放在 filters 里,顶层传 user_id= 会直接 ValueError;top_k 默认从 100 变为 20;threshold 默认 0.1;rerank 默认 False。

8.2 实操二:把记忆接进聊天助手(官方 README 模式)

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, filters={"user_id": user_id}, top_k=3)
    memories_str = "\n".join(f"- {entry['memory']}" for entry in relevant_memories["results"])
    system_prompt = f"You are a helpful AI. Answer the question based on query and memories.\nUser Memories:\n{memories_str}"
    messages = [{"role": "system", "content": system_prompt}, {"role": "user", "content": message}]
    response = openai_client.chat.completions.create(model="gpt-5-mini", messages=messages)
    assistant_response = response.choices[0].message.content
    messages.append({"role": "assistant", "content": assistant_response})
    memory.add(messages, user_id=user_id)   # 对话结束后异步写入新记忆
    return assistant_response

8.3 实操三:自托管 REST API 全流程(v1 自托管 API,无 /v1/ 前缀)

自托管 OSS 服务端的端点没有 /v1/ 前缀(api.mem0.ai 托管平台才有),不要照搬 Platform 文档的路径。

# 1. 首个管理员注册(仅在没有用户时可用,之后返回 403)
curl -X POST http://localhost:8888/auth/register \
  -H "Content-Type: application/json" \
  -d '{"name": "Admin", "email": "admin@example.com", "password": "strong-password"}'

# 2. 登录拿 JWT
curl -X POST http://localhost:8888/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email": "admin@example.com", "password": "strong-password"}'
# 返回 access_token / refresh_token;过期后 POST /auth/refresh 换新

# 3. 用 JWT 写入记忆
curl -X POST http://localhost:8888/memories \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <access_token>" \
  -d '{"messages": [{"role": "user", "content": "I love pizza."}], "user_id": "alice"}'

# 4. 用按用户 API Key(m0sk_...)检索
curl -X POST http://localhost:8888/search \
  -H "Content-Type: application/json" \
  -H "X-API-Key: m0sk_your_key_here" \
  -d '{"query": "vegetable pizza", "user_id": "alice"}'

# 5. 打开打分解释模式,查看混合检索的评分信号
curl -X POST http://localhost:8888/search \
  -H "Content-Type: application/json" \
  -H "X-API-Key: m0sk_your_key_here" \
  -d '{"query": "vegetable pizza", "user_id": "alice", "explain": true}'

# 6. 列出 / 更新 / 删除
curl -X GET "http://localhost:8888/memories?user_id=alice" -H "X-API-Key: m0sk_your_key_here"
curl -X PUT http://localhost:8888/memories/<memory_id> -H "X-API-Key: m0sk_your_key_here" \
  -H "Content-Type: application/json" -d '{"text": "喜欢蔬菜披萨"}'
curl -X DELETE http://localhost:8888/memories/<memory_id> -H "X-API-Key: m0sk_your_key_here"
Mem0 自托管 REST API 的 OpenAPI 文档页面(/docs)

交互式调试:浏览器打开 http://localhost:8888/docs(裸 Docker/uvicorn 为 8000),点 Authorize 填入 Bearer <token> 或 API Key 即可在线执行。

8.4 实操四:API Key 管理与审计日志

  1. 仪表盘(3000)→ API Keys 页 → 创建 Key,m0sk_... 完整值只显示一次,立即保存;服务器只存前缀与 bcrypt 哈希。

  2. Key 继承创建者的作用域;GET /api-keys 列表、DELETE /api-keys/{id} 吊销(需 JWT)。

  3. Requests 页是实时审计日志:每次 API 调用的方法、路径、状态码、延迟与鉴权模式。日志表只增不减(10 req/s 下每天约 86.4 万行),生产环境定期跑:

cd server
make prune-logs                              # 默认保留 30 天
make prune-logs REQUEST_LOG_RETENTION_DAYS=7 # 自定义保留窗口

建议把该命令挂到 cron/systemd timer。

8.5 实操五:为 Cursor / Claude Desktop 等客户端接记忆

两条官方路径,注意区分:

  • 托管 MCP(需要 Platform 账号):连接 https://mcp.mem0.ai/mcp。Cursor 在 Settings → MCP 里添加:

json { "mcpServers": { "mem0-mcp": { "type": "http", "url": "https://mcp.mem0.ai/mcp" } } }

Claude Desktop 不支持 mcp-add 命令,需走 Settings → Connectors → Add custom connector,填同样的 URL,首次调用会弹浏览器 OAuth 授权。该路径的 11 个工具(add_memory、search_memories、get_memories 等)操作的是你 Mem0 云账号里的记忆。 - 自托管(无官方 MCP 服务器):OSS 服务端当前不内置 MCP 端点。自托管用户的替代做法是:让客户端通过其"自定义工具/函数调用"能力调用你自托管 REST 的 /memories、/search 端点;或在你的 Agent 代码里用 mem0.proxy.main.Mem0 的 OpenAI 兼容代理:

```python from mem0.proxy.main import Mem0

client = Mem0(config={ "vector_store": {"provider": "qdrant", "config": {"host": "localhost", "port": 6333}} }) chat_completion = client.chat.completions.create( messages=[{"role": "user", "content": "What's the capital of France?"}], model="gpt-5-mini", user_id="alice", # 传了 user_id 才会持久化记忆 ) ```

该代理与 OpenAI Chat Completions 的请求/响应结构一致(choices、usage 等字段),现有 OpenAI 中间件可直接复用。

8.6 实操六:元数据过滤与自定义提取指令

# 写入时带 metadata
m.add(messages, user_id="alice", metadata={"category": "movie_recommendations"})
# 按元数据过滤检索(OSS 任意键可过滤,不受 Platform 白名单限制)
m.search("推荐电影", filters={"user_id": "alice", "category": "movie_recommendations"})
# 范围算子(实际可用性取决于所选向量库)
m.search("q", filters={"user_id": "alice", "created_at": {"gte": "2026-01-01"}})
# 原文直存(跳过 LLM 提取,注意会与 infer=True 混出重复)
m.add("原始记录文本", user_id="alice", infer=False)
# 过期时间
m.add(messages, user_id="alice", expiration_date="2030-01-31")
# 自定义提取指令
config = {"custom_instructions": "只记录用户明确表达的长期偏好,忽略寒暄"}

8.7 实操七:AsyncMemory 用于 FastAPI 服务

import asyncio
from mem0 import AsyncMemory

memory = AsyncMemory()

async def handler(message: str):
    hits = await memory.search(message, filters={"user_id": "u1"})
    await memory.add([{"role": "user", "content": message}], user_id="u1")
    return hits["results"]

asyncio.run(handler("我想订周五的会议室"))

方法与同步版一一对应(add/search/get_all/get/update/delete/delete_all/history)。AsyncMemory 必须在事件循环内调用。

8.8 实操八:CLI 管理记忆

pip install mem0-cli          # 或 npm install -g @mem0/cli
mem0 init                      # 初始化(默认走托管平台,Key 存 ~/.mem0/config.json,权限 0600)
mem0 add "Prefers dark mode and vim keybindings" --user-id alice
mem0 search "What does Alice prefer?" --user-id alice

CLI 的 mem0 init --agent 会自动注册一个托管平台账号(每 IP 每天 5 个上限,之后可用 mem0 init --email 由人类认领)。这一步连的是 Mem0 Platform 云服务,不是你的自托管实例;想用 CLI 风格操作自托管数据,直接用 curl 即可。

九、全套报错故障排查

现象

原因

解决

pip install "mem0ai[nlp]" 在 Python 3.13 构建失败

spaCy 的 blis/thinc 尚无 3.13 预编译 wheel

用 Python 3.10–3.12 装 [nlp] 扩展;基础包不受限

每个受保护端点都返回 401

从旧版(无鉴权)升级,ADMIN_API_KEY 为空

三选一:设置长随机 ADMIN_API_KEY(≥16 字符);走 setup 向导建管理员改用按用户 Key;本地开发临时 AUTH_DISABLED=true

鉴权端点返回 500

JWT_SECRET 未设置

echo "JWT_SECRET=$(openssl rand -base64 48)" >> server/.env 后重建容器

Compose 启动即失败

POSTGRES_PASSWORD 未设置

在 server/.env 必填该变量

改了 .env 不生效

docker compose restart 不会重读 env_file

cd server && docker compose up -d --force-recreate mem0 或 make up

Provider 返回 502 Upstream provider error

提供商 API Key 错误/失效

docker compose logs mem0 看完整堆栈;在仪表盘 Configuration 页改 Key 后保存

Qdrant 连接失败

6333 端口未暴露或 API Key 不匹配

docker run -p 6333:6333 qdrant/qdrant;核对 host/port/api_key

search 返回空结果

embedder 模型名与建库时不一致导致维度错误;或过滤键大小写不匹配

核对 embedding_dims 与模型名;metadata 键区分大小写,统一小写 snake_case

日志警告 BM25 keyword search is disabled

Qdrant 后端未装 fastembed

pip install fastembed(其他向量库用原生全文,不需要)

search(user_id=...) 抛 ValueError

v3 起实体 ID 不允许作为顶层参数

改为 search(q, filters={"user_id": "..."})

decay / timestamp 参数报 "not supported by the OSS Memory SDK"

Memory Decay、Temporal Reasoning 是 Platform 专属

自托管移除这些参数;需要该能力请评估 Platform

enable_graph / graph_store 配置无效

v3 起 OSS 移除外部图存储(Neo4j 等)集成

删除相关配置;图能力仅在 Platform

custom_fact_extraction_prompt 报错/无效

v3 改名为 custom_instructions

更新配置键名

TS 端 Cannot find module 'mem0ai' 或缺 provider

从错误入口导入;provider SDK 是按需 peer 依赖

import { Memory } from "mem0ai/oss";npm install @qdrant/js-client-rest 等按需安装

alembic 迁移启动失败

数据库状态异常

docker compose logs mem0 \| grep -i alembic 排查;确认数据不可救则 docker compose down -v(毁所有数据)

3000/8888 端口被占用

其他进程占用

lsof -iTCP:3000 -sTCP:LISTEN 找到 PID kill,或改 compose 映射

OpenMemory MCP 连不上

mem0ai/openmemory 仓库已改造为会话迁移工具,不再提供记忆 MCP

用托管 https://mcp.mem0.ai/mcp,或自托管 REST 自行封装工具

请求日志表暴涨拖慢查询

request_logs 只增不减

定期 make prune-logs(BRIN 索引使范围删除保持低成本)

忘记管理员密码

—

cd server && make reset-admin-password EMAIL=... PASSWORD=...(需宿主 shell 权限)

旧 Postgres 镜像 ankane/pgvector 升级后无法启动

PG15→PG17 数据文件不兼容

按 server/README.md:先 pg_dumpall 导出 → down -v → 只起 postgres → psql 恢复 → 再起 mem0 容器

响应延迟高

每条 add 都有一次 LLM 调用;reranker 深度过大

提取温度 ≤0.2 并换轻量模型;reranker top_k 控制在 10–20;本地模型上 GPU

平台限额报错(CLI/托管)

免费额度或 Agent 注册限制

免费额度:首 30 天 1 万 adds/月、1000 检索/月,绑定自有 LLM Key 后升到 5 万/1 万;Agent 注册每 IP 每天 5 次

十、升级、回滚与卸载

10.1 版本查看

pip show mem0ai                 # 库版本
npm list mem0ai
docker compose -f server/docker-compose.yaml images   # 容器镜像版本
curl http://localhost:8888/docs -o /dev/null -w '%{http_code}\n'   # 服务健康

10.2 升级

# 库模式
pip install --upgrade mem0ai            # 大版本升级前先读迁移指南
pip install --upgrade "mem0ai[nlp]" && python -m spacy download en_core_web_sm
npm install mem0ai@latest

# 自托管服务端
cd mem0
git pull
cd server
make up        # 或 docker compose up -d --build;API 容器启动时自动跑 alembic 迁移

跨大版本(v2→v3)务必先读官方迁移指南:filters 写法、top_k/threshold/rerank 默认值、custom_instructions 改名、graph store 移除、TS 的 limit→topK 与 camelCase 等破坏性变更都在其中。

10.3 回滚

# 库模式回滚到指定版本
pip install mem0ai==2.1.0      # 以 PyPI 实际存在的版本号为准
npm install mem0ai@<version>

# 服务端回滚:checkout 旧 commit 后重建
cd mem0 && git checkout <旧 tag 或 commit>
cd server && docker compose up -d --build

Postgres 镜像从 ankane/pgvector:v0.5.1 升到 pgvector/pgvector:pg17 后若需回退,按 server/README.md 的 rollback 小节:改回旧镜像 tag → down -v → 重建 → 从 mem0_backup.sql 恢复。

10.4 完整卸载清理清单

# 自托管栈
cd mem0/server
make down                       # 停容器
docker compose down -v          # 删除容器+postgres_db 数据卷(毁数据)
docker rmi mem0/mem0-api-server 2>/dev/null
docker image prune -f
rm -rf ~/.mem0                  # 库模式本地数据:Qdrant 向量在 /tmp/qdrant,历史库在 ~/.mem0/history.db
pip uninstall mem0ai mem0-cli -y
npm uninstall -g mem0ai @mem0/cli
# systemd 方式另需:sudo systemctl disable --now mem0-server && sudo rm /etc/systemd/system/mem0-server.service

十一、商用许可与合规风险提示

  • License:Mem0 OSS 采用 Apache-2.0。你可以商用、修改、再分发,义务是保留 LICENSE 与 NOTICE、标注修改;不含商标授权——"Mem0" 名称与 logo 是 Mem0 公司的商标,对外产品命名避免直接使用。

  • 开源版能力边界:Graph Memory、Memory Decay、Temporal Reasoning、Dream、Webhooks、自定义分类、批量操作、组织/项目/app_id 作用域、项目级事件流均为 Mem0 Platform(托管)专属,自托管不可用;写方案时不要把托管功能承诺给自托管客户。Live Demo(mem0.dev/demo)、浏览器扩展、mcp.mem0.ai 也都指向托管服务。

  • LLM API 费用:add() 每次调用都产生 LLM 费用(提取事实),search() 产生 embedding 费用;默认 gpt-5-mini + text-embedding-3-small。用 Ollama 本地模型可省 API 费但需要算力。Platform 免费额度为首 30 天 1 万 adds/1000 检索每月,绑定自有 Key 后 5 万 adds/1 万检索每月,超出按用量计费——这是托管侧数字,仅供对照。

  • 数据隐私与出网:库模式与自托管模式下,你写入的记忆文本会发送给你配置的 LLM/Embedder 提供商(默认 OpenAI);向量与历史数据留在你的向量库/SQLite。全内网合规要求下应选自托管 + 本地模型(Ollama)+ 内网向量库。遥测默认开启(MEM0_TELEMETRY=false 可关),只发送安装 UUID、邮箱域名、版本等无 PII 字段。

  • 自托管安全责任:鉴权默认开启但 AUTH_DISABLED=true 与弱 ADMIN_API_KEY 是常见事故源;务必配 HTTPS、私网部署、定期 make prune-logs、JWT_SECRET 用强随机值。API Key 只显示一次,丢失只能吊销重建。

  • 生产风险:OSS 无 SLA;v3 算法官方基准分数基于托管平台(含专有优化),自托管效果需自行评测(官方开源了评测框架 github.com/mem0ai/memory-benchmarks);跨大版本升级有破坏性变更,生产环境应锁版本、先在预发验证迁移脚本。

附录:命令速查

# ---- 安装 ----
pip install -U mem0ai                        # Python 库
pip install -U "mem0ai[nlp]" && python -m spacy download en_core_web_sm   # 混合检索 NLP 扩展
pip install fastembed                        # Qdrant BM25 需要
npm install mem0ai                           # Node SDK
pip install mem0-cli                         # CLI

# ---- 自托管 ----
git clone https://github.com/mem0ai/mem0.git && cd mem0/server
cp .env.example .env                         # 必填 OPENAI_API_KEY / POSTGRES_PASSWORD / JWT_SECRET
make bootstrap                               # 一键:起栈+管理员+首个 API Key
make up                                      # 起栈,浏览器走 setup 向导
make health | make logs | make down | make clean
make reset-admin-password EMAIL=... PASSWORD=...
make prune-logs [REQUEST_LOG_RETENTION_DAYS=7]
docker pull mem0/mem0-api-server             # 仅 API 镜像
docker run -p 6333:6333 qdrant/qdrant        # 本地 Qdrant

# ---- API 快捷调用(自托管,无 /v1 前缀)----
curl -X POST http://localhost:8888/auth/login -H "Content-Type: application/json" \
  -d '{"email":"admin@example.com","password":"..."}'
curl -X POST http://localhost:8888/memories -H "X-API-Key: m0sk_..." -H "Content-Type: application/json" \
  -d '{"messages":[{"role":"user","content":"..."}],"user_id":"alice"}'
curl -X POST http://localhost:8888/search -H "X-API-Key: m0sk_..." -H "Content-Type: application/json" \
  -d '{"query":"...","user_id":"alice"}'
curl http://localhost:8888/memories?user_id=alice -H "X-API-Key: m0sk_..."
# 浏览器:http://localhost:3000 仪表盘 / http://localhost:8888/docs OpenAPI

# ---- 升级/回滚/卸载 ----
pip install --upgrade mem0ai
pip install mem0ai==<version>
cd mem0 && git pull && cd server && make up
docker compose down -v                        # 危险:清空全部数据
pip uninstall mem0ai -y && rm -rf ~/.mem0 /tmp/qdrant

评论交流

文章目录