关于 DeepMem
DeepMem 是与 Mem0 API 兼容的持久化记忆层,可为 AI Agent 存储事实并按语义召回。它可自托管且无需认证,也提供托管云版本,适合希望控制数据与成本的开发者。
主要功能
- 01兼容 Mem0 的 MemoryClient 接口
- 02混合检索:向量、BM25、实体提升与时间衰减
- 03异步批量提取事实,减少 LLM 调用
- 04语义缓存与按 user_id 隔离
- 05支持 GDPR 相关的删除与导出
- 06内置 MCP 服务,提供写入与检索工具
适用场景
- 01为 Agent 保存用户偏好与项目背景
- 02从 Mem0 迁移且仅修改导入语句
- 03在本地或自有基础设施中自托管记忆服务
MCP 相关
DeepMem 内置 MCP 服务,暴露 deepmem_write、deepmem_search 和 deepmem_delete 工具,Claude Desktop、Cursor 等客户端可直接读写记忆。托管云也提供远程 MCP 端点。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://deepmem.dev/mcpclaude mcp add --transport http deepmemteam-deepmem https://deepmem.dev/mcp{"mcpServers":{"deepmemteam-deepmem":{"type":"http","url":"https://deepmem.dev/mcp"}}}在 Cursor 中打开{"servers":{"deepmemteam-deepmem":{"type":"http","url":"https://deepmem.dev/mcp"}}}在 VS Code 中打开{"mcpServers":{"deepmemteam-deepmem":{"type":"http","url":"https://deepmem.dev/mcp"}}}{"mcpServers":{"deepmemteam-deepmem":{"serverUrl":"https://deepmem.dev/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
https://deepmem.dev/mcp需要授权工具
2| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| infer | boolean | 否 | |
| run_id | any | 否 | |
| api_key | string | 否 | |
| user_id | string | 否 | |
| agent_id | any | 否 | |
| messages | array | 是 |
详细介绍
DeepMem
即插即用的 AI 记忆层,响应速度提升 2 倍,成本降低 10 倍。
完全兼容 Mem0 API。5 分钟即可迁移,只需更改一行导入语句。
可自托管。无需身份验证、无需付费、没有供应商锁定。也可以使用托管云服务:deepmem.dev。
只需一行即可从 Mem0 迁移——使用相同的 MemoryClient 和方法签名:
# Before - Mem0
from mem0 import MemoryClient
client = MemoryClient(api_key="m0-...")
# After - DeepMem (only the import changes)
from deepmem import MemoryClient
client = MemoryClient(api_key="dm_live-...") # get a key at deepmem.dev
pip install deepmem-client
将对话转化为可搜索的长期记忆:在 Qdrant 向量存储前端提供 FastAPI HTTP API,并支持大模型事实提取、混合检索(向量 + BM25 + 实体加权 + 时间衰减)、语义缓存、异步批量蒸馏、GDPR 控制,以及内置 MCP 服务。它以开放模式运行——无需 API 密钥,无需用户注册——因此几分钟内即可为你自己的 Agent 部署。多租户隔离由请求正文中的 user_id 控制。
不想自托管? DeepMem Cloud 是这一引擎的托管版本,位于 deepmem.dev——API 相同,无需管理基础设施。注册并获取密钥(
dm_live_...),将基础 URL 指向https://deepmem.dev,即可使用。云服务和开源服务使用相同的 Mem0 兼容 API,因此客户端代码完全相同。
从 Mem0 迁移
已经在使用 Mem0?只需一行即可切换到 DeepMem 云服务。deepmem-client 包与 mem0.MemoryClient 保持一致——类名相同、方法签名相同、filters={"user_id": ...} 用法相同——因此导入语句之后的代码无需更改。
pip install deepmem-client
# before (Mem0)
from mem0 import MemoryClient
client = MemoryClient(api_key="m0-...")
client.add(messages, user_id="alex")
client.search("What can Alex cook?", filters={"user_id": "alex"})
# after (DeepMem cloud) - change one import line
from deepmem import MemoryClient
client = MemoryClient(api_key="dm_live_...") # key at https://deepmem.dev
client.add(messages, user_id="alex") # identical calls
client.search("What can Alex cook?", filters={"user_id": "alex"})
行为说明
- DeepMem 云服务中的
add(infer=True)(默认值)是异步的——它会返回pending=True和results=[],提取出的事实会在几秒后写入。(Mem0 云服务的add也是异步的——会返回PENDING。)传入infer=False可同步存储原始文本,并立即进行搜索。 - 没有图关系——DeepMem 使用混合向量检索(向量 + BM25 + 时间衰减),因此
relations始终为[]。不会复现 Mem0 的图功能。 reset的行为不同——Mem0 的reset会重置整个账户;DeepMem 的则针对单个user_id,并带有确认保护。
定价
DeepMem Cloud 每个付费档位的价格都比 Mem0 低 10 倍——套餐结构相同,价格仅为十分之一。
| 档位 | DeepMem | Mem0 云服务 |
|---|---|---|
| 爱好者 | 免费 | 免费 |
| 入门版 | $1.9/mo | $19/mo |
| 成长版 | $7.9/mo | $79/mo |
| 专业版 | $24.9/mo | $249/mo |
选择自托管,费用就是 $0——你只需支付自己的大模型/嵌入服务提供商费用(这也是 Mem0 在套餐价格之外收取的大模型费用),无需支付记忆服务加价。批量蒸馏还能减少约 80% 的大模型调用,因此你的服务提供商账单也会低于逐条消息提取的方案。
套餐和限额:deepmem.dev · mem0.ai。
基准测试
不挑选亮眼数据。脚本和工作负载都在
/benchmarks 中,可自行运行。以下是我们的测量结果和生成这些结果的确切配置:
| 指标 | DeepMem 可自托管 ¹ | DeepMem 云端 | Mem0 云端 |
|---|---|---|---|
| 搜索 p50 | 73 ms | 643 ms | 653 ms |
| 搜索 p95 | 86 ms | 811 ms | 710 ms |
| 搜索命中数(40 次查询) | - | 195 | 84 |
| 添加 p50(原始存储) | 899 ms ² | 792 ms | 695 ms ³ |
¹ 在 GTX 1070 GPU(2016 年左右)上运行 BGE-M3,使用本地文件 Qdrant、
infer=False、100 次操作、并发数为 1。² 耗时主要来自本地文件 Qdrant 的 I/O;使用 Qdrant 服务可大幅降低耗时。³ Mem0 没有原始存储模式;add始终会运行 LLM 抽取,因此这一行并非同类对比。
- 自托管时才能体现内在延迟——没有互联网往返时延,使用你自己的嵌入模型和 Qdrant。在旧款消费级 GPU 上,搜索 p50 为 73 ms。
- DeepMem 云端的搜索 p50 优于 Mem0 云端(643 ms 对比 653 ms),且每次搜索返回的候选项约多 2.3 倍(40 次查询中命中数为 195 对比 84)。
- 云端延迟主要由往返时延决定——两个云端数据都是通过代理从中国大陆测得的;不同运行之间的抖动约为 ±10%。如需获取自己的数据,可在往返时延较低的位置运行
/benchmarks。
为什么选择 DeepMem
Agent 框架不断重新发现它们需要持久、可检索的记忆。托管服务按调用计费,并将你的数据发送到别人的云端。DeepMem 是可自托管的替代方案:提供可直接接入的同款 Mem0 风格 API,但运行在你的设备上,使用你的嵌入模型、LLM 密钥和 Qdrant;代码也在这里,可供查验。
DeepMem 与其他 Mem0 替代方案相比如何? 大多数方案只能托管使用,或是在别人的向量数据库之上构建记忆功能。DeepMem 将三者合而为一:可自托管(数据留在你的设备上——除你自己的 LLM 密钥外,费用为 0 美元)、原生支持 MCP(Claude Desktop / Cursor 可直接以工具形式读取和写入记忆),并且完全开源——托管云端运行的也是完全相同的引擎,因此云端和自托管共用同一个 API,而非两个产品。
| 没有 DeepMem | 使用 DeepMem |
|---|---|
| 每次会话都要重新说明你是谁以及正在做什么 | Agent 会自动回忆你的身份、项目和偏好 |
| 会话之间丢失调试和研究上下文 | 可回忆过去的根本原因、走过的弯路和发现,避免重复劳动 |
| 每次会话都要手动重述偏好 | 偏好会在不同会话、Agent 和项目之间持久保留 |
| 使用按调用计费并保管你数据的托管记忆服务 | 在自己的基础设施上自托管,或使用云端——由你选择,API 相同 |
它是什么(如实说明)
- 混合检索,而非知识图谱。 搜索融合了向量相似度、BM25 关键词匹配、实体加权和时间衰减评分。它没有时序图层;如果你需要这一功能,可以看看 Zep。
- 存储偏好,而非代码倾倒内容。 LLM 抽取前会剥离大型围栏代码块,因此存储内容是持久的用户/项目事实,而不是粘贴的实现代码。
- 自带密钥,支持多家提供商。 使用你自己的 LLM(OpenAI / Anthropic / 任意 OpenAI 兼容端点)和嵌入模型(BGE-M3 / Google / OpenAI 兼容)。
- 原生支持 MCP。 随附 MCP 服务,因此 Claude Desktop / Cursor 可以直接读取和写入记忆。
快速开始
有三种运行方式。它们都使用相同的 Mem0 兼容 API。
1. 云端(无需运维)
export DEEPMEM_API_KEY=dm_live_... # from https://deepmem.dev
curl https://deepmem.dev/v1/memories \
-H "Authorization: Bearer $DEEPMEM_API_KEY" -H "Content-Type: application/json" \
-d '{"messages":[{"role":"user","content":"I am Pat, I live in Lisbon."}],"user_id":"pat","infer":false}'
curl https://deepmem.dev/v1/memories/search \
-H "Authorization: Bearer $DEEPMEM_API_KEY" -H "Content-Type: application/json" \
-d '{"query":"Where does Pat live?","user_id":"pat"}'
2. Docker(一条命令)
cp .env.example .env # add an LLM key
docker compose up --build # DeepMem (HTTP :8000 + MCP :8001) + Qdrant sidecar
curl http://localhost:8000/health
也可以拉取已发布的镜像:
docker pull langdeepmem/deepmem:latest
docker run -p 8000:8000 -p 8001:8001 -e DEEPSEEK_API_KEY=sk-... langdeepmem/deepmem:latest
镜像开放 :8000(HTTP) 和 :8001(MCP) 端口。Dockerfile 和 docker-compose.yml 涵盖 GPU 版本(CUDA torch + BGE_DEVICE=cuda)以及 BGE-M3 模型下载选项(HF 镜像、代理或本地挂载)。
3. 从源代码
git clone https://github.com/deepmemteam/deepmem.git && cd deepmem
pip install -r requirements.txt
cp .env.example .env # add an LLM key + embedder config
python server/start.py # HTTP :8000 + MCP :8001
用三行即可写入和搜索:
import httpx
httpx.post("http://localhost:8000/v1/memories",
json={"messages":[{"role":"user","content":"I'm Pat, I live in Lisbon."}],
"user_id":"pat"})
print(httpx.post("http://localhost:8000/v1/memories/search",
json={"query":"Where does Pat live?","user_id":"pat"}).json()["results"])
user_id是可选的(默认值为"default");使用不同的user_id可隔离不同终端用户。infer: false会立即存储原始文本 (方便测试);默认的infer: true会将任务加入队列,等待大模型提取事实。
功能亮点
通过配置切换多种提供方,无需修改代码。 两层都可以通过环境变量切换:
| 层 | 选项 | 选择器 |
|---|---|---|
| LLM(事实提取) | OpenAI · Anthropic(原生 SDK)· 任意兼容 OpenAI 的服务(DeepSeek / vLLM / Ollama / Groq / LM Studio) | LLM_PROVIDER + LLM_API_KEY / ANTHROPIC_API_KEY / DEEPSEEK_API_KEY |
| Embeddings | BGE-M3(本地、GPU/CPU)· Google Gemini · 任意兼容 OpenAI 的服务 | EMBEDDING_PROVIDER + BGE_M3_PATH / GOOGLE_API_KEY / OPENAI_API_KEY |
BGE_DEVICE=auto|cpu|cuda 会在 GPU 可用时选用 GPU,否则使用 CPU(小显存显卡上请强制设为
cpu,以避免多进程争用)。BYOK 可按请求覆盖 LLM。
混合检索。 将向量相似度、BM25 关键词、实体加权和时间衰减融合为一个分数。先过量获取,再重新排序,最后返回结果。
异步批量蒸馏。 写入会在静默窗口后进入队列,并以批次形式提取事实,相较于逐条消息提取,可减少约 80% 的 LLM 调用。
语义缓存。 重复的添加和搜索请求会命中相似度门控缓存,并直接返回缓存的事实,无需重新生成嵌入或再次查询 Qdrant。
存储偏好,而非代码。 extraction_filter 会在 LLM 提取前移除较大的围栏代码块,因此存储中会积累持久事实,而不是粘贴的实现代码。
MCP 服务。 为 Claude Desktop、Cursor 和任意 MCP 客户端提供 deepmem_write / deepmem_search / deepmem_delete 工具。
GDPR。 支持带保留期限的软删除、硬删除 reset、日志中的 SHA-256 ID 脱敏,以及用于迁移的导出/导入。
API
| 方法 | 路径 | 描述 |
|---|---|---|
| POST | /v1/memories | 写入消息;由 LLM 提取事实(infer=false 时存储原始内容) |
| POST | /v1/memories/search | 语义搜索(向量 + BM25 + 实体 + 时间衰减) |
| GET | /v1/memories | 列出指定 user_id 的所有记录(分页) |
| GET | /v1/memories/{id} | 按 ID 获取单条记录 |
| PUT | /v1/memories/{id} | 更新单条记忆的文本 |
| DELETE | /v1/memories/{id} | 软删除单条记录 |
| DELETE | /v1/memories | 软删除指定 user_id 的所有记录(GDPR) |
| GET | /v1/memories/{id}/history | ADD/UPDATE/DELETE 审计日志 |
| POST | /v1/reset | 硬删除所有记录及历史(需要 confirm_user_id) |
| GET | /v1/export · POST /v1/import | 可移植 JSON 导出 / 导入 |
| GET | /health · /ready | 存活 / 就绪探针 |
agent_id / run_id 可用于限定写入/读取范围(与 Mem0 的三级隔离方式一致:user -> agent -> run)。交互式文档位于 /docs。
MCP 集成
云端提供远程 MCP 端点(可流式传输的 HTTP):
URL: https://deepmem.dev/mcp
Auth: Authorization: Bearer dm_live_... (your deepmem.dev API key)
Tools: deepmem_write / deepmem_search
兼容 Claude Code、Claude Desktop、Cursor 以及任何兼容 MCP 的客户端。
Claude Code - 一条命令:
claude mcp add --transport http deepmem https://deepmem.dev/mcp \
--header "Authorization: Bearer dm_live_..."
也可以安装插件(其中包含 /deepmem:setup 命令,可指导你配置 API 密钥):
/plugin marketplace add deepmemteam/deepmem-claude-plugin
/plugin install deepmem@deepmem
Cursor → Settings → MCP → Add new MCP server,或编辑
~/.cursor/mcp.json(全局)/ .cursor/mcp.json(每个项目)。Cursor
会解析 url 和 headers 中的 ${env:NAME} 变量,因此可以将密钥存放在
环境变量中,而不是配置文件中:
{
"mcpServers": {
"deepmem": {
"url": "https://deepmem.dev/mcp",
"headers": { "Authorization": "Bearer ${env:DEEPMEM_API_KEY}" }
}
}
}
(在 shell 中导出 DEEPMEM_API_KEY=dm_live_...,也可以按需直接粘贴
明文密钥)。社区 MCP 列表中的“一键添加到 Cursor”功能可在
cursor.directory 使用;官方插件则发布在 Cursor Marketplace。
DeepSeek Harness (dsh) - 只需一个 overlay 文件,无需 dsh 插件(dsh
通过通用的 dsh-mcp-client 桥接器连接任何 MCP 服务):
export DEEPMEM_API_KEY=dm_live_...
dsh web --patch "$PWD/examples/dsh/deepmem.cordis.yml"
详情和可自托管的变体请参阅 examples/dsh。
可自托管(stdio,捆绑的服务,在开放模式下无需密钥):
{
"mcpServers": {
"deepmem": {
"command": "python",
"args": ["server/mcp_server.py"],
"env": { "DEEPMEMORY_BASE_URL": "http://localhost:8000" }
}
}
}
此仓库提供了预配置的 .cursor/mcp.json,用于连接 可自托管服务。在 Cursor 中打开此仓库,并在 Settings → MCP 中启用它。
架构
client (HTTP / MCP)
-> FastAPI (:8000)
-> rate-limit middleware (per-IP token bucket on add/search)
-> SemanticCache.check (return cached facts on similarity hit)
-> AsyncBatchDistiller.enqueue (POST /v1/memories, infer=true)
↳ silence-window or max_batch triggers on_batch_ready
↳ VectorStore.process_batch (LLM extraction -> Qdrant upsert)
-> VectorStore.search (vector + BM25 + entity + time-decay)
-> LLM: OpenAI / Anthropic / OpenAI-compatible (fact extraction)
-> BGE-M3 / Gemini / OpenAI-compatible (embeddings)
-> Qdrant (vectors) + SQLite (audit history)
-> MCP server (:8001) deepmem_write / deepmem_search / deepmem_delete
使用单个 Qdrant 集合(memories),并通过 user_id 负载进行严格筛选。
TenantValidator 会对 user_id 执行 NFC 规范化,并强制其符合
[A-Za-z0-9._:-]{1,256} 字符集——切勿信任原始请求值。
配置
配置只从环境变量(.env,自动加载)> config.json > 默认值中加载一次。
关键变量:
| 变量 | 必需 | 描述 |
|---|---|---|
DEEPSEEK_API_KEY / LLM_API_KEY / ANTHROPIC_API_KEY | 一个 LLM 密钥 | 用于事实提取的大模型 |
LLM_PROVIDER | 否 | auto / openai / anthropic / openai_compatible(默认 auto) |
EMBEDDING_PROVIDER | 否 | bge-m3 / google / openai(默认 bge-m3) |
BGE_M3_PATH | 否 | 本地 BGE-M3 目录或 HF 模型 ID(默认 BAAI/bge-m3) |
BGE_DEVICE | 否 | auto / cpu / cuda(默认 auto) |
QDRANT_URL / QDRANT_API_KEY | 否 | 远程 Qdrant;省略则使用本地文件存储 |
CORS_ORIGINS | 是 | 以逗号分隔的允许来源(生产环境中不能使用 *) |
RATE_LIMIT_ADD / RATE_LIMIT_SEARCH | 否 | 每分钟限制(默认 30 / 60) |
后端会根据环境变量自动切换——无需修改代码:
- 设置
QDRANT_URL-> 使用远程 Qdrant;未设置 -> 使用./data/qdrant下的本地文件 Qdrant。 - 除非设置
DEEPMEMORY_DEBUG=1,否则启动时会拒绝CORS_ORIGINS=*。
生产环境(systemd)
systemctl restart deepmem.service # scripts/start.sh -> uvicorn :8000
journalctl -u deepmem -f
对于 HTTPS,请在前端部署 Caddy 或 Nginx;scripts/start.sh 可在 systemd
或任何进程管理器下运行。
基准测试
/benchmarks 中提供了两个可复现的脚本:
- 云端对比云端 - DeepMem 云端与 Mem0 云端对比。在
deepmem.dev + mem0.ai 注册密钥,然后
运行
python benchmarks/benchmark_cloud.py。 - 可自托管 - 使用你自己的 DeepMem 和硬件(无需密钥或外部服务):
python benchmarks/run_benchmark.py。
两个脚本都提供自包含的工作负载,并报告 P50/P95/P99 + 吞吐量。本 README 顶部的数值由这些脚本生成——重新运行脚本,查看你自己的百分位数。
常见问题
需要云服务吗? 不需要。开源服务本身功能齐全。云服务(deepmem.dev)是免运维选项——API 相同。
可以离线使用吗? 检索和原始存储(infer=false)无需网络即可使用。LLM 事实提取(infer=true)需要 LLM 密钥;也可以运行本地 OpenAI 兼容模型(Ollama / vLLM / LM Studio),并将 LLM_BASE_URL 指向该模型。
我的数据存在哪里? 存在你的 Qdrant(本地文件或服务)和 SQLite 审计日志中。除了你配置的 LLM / 嵌入调用外,没有任何数据会离开你的机器。
支持多租户吗? 支持——使用单个 Qdrant 集合,并通过 user_id 进行硬过滤。agent_id / run_id 可添加 Agent 和会话范围。
可以用于生产环境吗? 已通过 systemd 搭配远程 Qdrant 用于生产环境。本地文件 Qdrant 适用于开发或单工作进程场景;多工作进程或高吞吐量场景请使用 Qdrant 服务。
开发
pip install -r requirements.txt
DEEPMEMORY_DEBUG=1 python -m uvicorn server.main:app --reload --host 0.0.0.0 --port 8000
pytest tests/ -x -v
许可证
MIT.
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。