Mem0:为 LLM 与 AI Agent 提供长期记忆层的自托管方案|部署与使用全指南
本文基于 2026 年 10 月的官方资料撰写:开源仓库
mem0ai/mem0(main 分支),Python SDKmem0ai当前 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(读作 "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 的定位是 "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 用户应预期"方向一致但数值不同"的收益)。
适用人群:
不适合的场景:超低延迟(<100ms)强实时链路(add 涉及一次 LLM 调用);完全离线且无 GPU 的环境(提取模型与 embedding 都需要算力或 API);需要合规审计的托管报表能力(审计日志在自托管仪表盘里有,但 org/project 治理只有 Platform 有)。
二、核心功能逐条拆解
多层级记忆作用域:每条记忆可用
user_id、agent_id、run_id三个标识分层隔离(v3 起 OSS 仅支持这三个,app_id是 Platform 专属)。检索时必须通过filters传入作用域,例如m.search("q", filters={"user_id": "alice"})。ADD-only 事实提取(v3):
add()用一次 LLM 调用从对话中抽取事实,只新增不更新不删除(返回事件只有ADD),记忆自然累积;实体 ID 约定与 Platform 对齐。

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/)。
三、全套官方链接
说明:历史上有一个独立仓库 mem0ai/openmemory 提供"OpenMemory MCP"本地记忆 MCP 服务器;截至本文撰写时该仓库已被官方改造为"编码工具会话迁移工具"(在 Claude Code / Codex / OpenCode 之间搬运会话),不再提供记忆 MCP 服务。官方当前推荐的 MCP 接入路径是托管服务 https://mcp.mem0.ai/mcp(需 Platform 账号),自托管用户对接编辑器的正确方式是第八章的自建 REST 调用或自封装 MCP 工具。
四、硬件与环境前置要求
五、多平台部署步骤
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 工具),替代方案如下:
安装 Docker Desktop 并启用 WSL2 后端;
在 WSL2(Ubuntu)里按 5.2 节步骤执行;或
不用 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):
Embedder 通用参数(Python):
向量库通用参数(Python,按所选库取用):
支持的 provider 字符串(Python 常用):
带注释的完整配置示例(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/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"

交互式调试:浏览器打开 http://localhost:8888/docs(裸 Docker/uvicorn 为 8000),点 Authorize 填入 Bearer <token> 或 API Key 即可在线执行。
8.4 实操四:API Key 管理与审计日志
仪表盘(3000)→ API Keys 页 → 创建 Key,
m0sk_...完整值只显示一次,立即保存;服务器只存前缀与 bcrypt 哈希。Key 继承创建者的作用域;
GET /api-keys列表、DELETE /api-keys/{id}吊销(需 JWT)。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 即可。
九、全套报错故障排查
十、升级、回滚与卸载
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