📌 隶属于架构蓝图: 企业级 AI Agent 与本地 GPU 算力自动化 → L2: 混合大模型网关与受控 Agent 闭环

我如何在私有存储节点上自托管 Mem0 记忆栈(让 AI 助手拥有持久记忆)

· 5 分钟 · 工程案例 mem0dockerpostgrespgvectorlitellmaisharing

一个每次对话后都忘光一切的 AI 助手,就是一个每轮都要你重新自我介绍的工具。我的 AI 助手(就是驱动这个博客工作流的那个)曾经每场会话都从零开始——直到我给它加了一层记忆:一套自托管的 mem0 栈,负责存储它学到的事实、按语义检索、并跨会话存活。

这就是我在自托管生产存储节点(Synology DS1821+)上部署这套系统的工程实践——私有、完全由我掌控、数据绝不离开我的局域网。

为什么这件事重要

记忆层改变的是一个助手真正能为企业做的事:

对任何跑 AI 助手(售后机器人、研究助手、个人自动化)的人来说,问题不是助手要不要记住——而是这份记忆是一份私有资产,还是第三方的数据。

mem0 做了什么

Mem0 是给 LLM 应用用的「开箱即用的记忆」。你不用手搓嵌入表和相似度检索,它给一个小 API,把记忆需要的三件事都做了:

  1. 加一条记忆 —— POST /memories 传一条事实或一段对话;它抽取、去重并存储(可选由 LLM 分类)。
  2. 检索 —— POST /search 带一个 JSON 请求体,返回按语义相似度排序的相关事实。
  3. 按用户隔离 —— 记忆归属 user_id,所以可以按客户、按项目、按会话分开,互不串扰。

「记忆」就是抽取出来的事实;「检索」就是向量相似度。哪怕你从没亲手碰过向量数据库,也能让助手有记忆。

技术栈

Synology DS1821+ 上用 Portainer compose 栈跑三个容器:

┌──────────────┐      /search & /memories       ┌──────────────────┐
│ AI agent /   │ ──── X-Api-Key + JSON ───────▶ │  mem0 API :20015 │
│ Hermes / bot │                                └────────┬─────────┘
└──────────────┘                                         │ pgvector
                                                         ▼
                                             PostgreSQL 17 + pgvector
┌──────────────┐     model calls (extract)    ┌──────────────────┐
│ OpenAI etc.  │ ◀───────── LiteLLM ──────────│ fact-classifier  │
└──────────────┘                              └──────────────────┘

一份有代表性的 compose 长这样:

📄 docker-compose.yml(30 行)— Mem0 + LiteLLM + pgvector 生产编排配置
services:
  mem0-postgres:
    image: pgvector/pgvector:pg17
    environment:
      POSTGRES_USER: mem0
      POSTGRES_PASSWORD: ${MEM0_DB_PASSWORD}
      POSTGRES_DB: mem0
    volumes:
      - ./data/pg:/var/lib/postgresql/data
    restart: unless-stopped

  mem0-litellm:
    image: ghcr.io/berriai/litellm:main-stable
    command: ["--config", "/app/config.yaml"]
    volumes:
      - ./litellm-config.yaml:/app/config.yaml
    restart: unless-stopped

  mem0-api:
    build: ./mem0-api
    environment:
      OPENAI_API_KEY: ${OPENAI_API_KEY}
      OPENAI_API_BASE: http://mem0-litellm:4000/v1   # 穿过网关
      MEM0_API_KEY: ${MEM0_API_KEY}                  # /search 与 /memories 的 X-Api-Key
      POSTGRES_URL: postgresql://mem0:***@mem0-postgres/mem0
    ports:
      - "20015:8000"
    restart: unless-stopped

(我的镜像是从 mem0 仓库构建的,模型/事实抽取指向 LiteLLM;具体 tag 是我维护的本地构建版本,真正的 API key 我不放在 compose 里——由环境密文注入。)

使用

服务起来之后,API 简单得让人神清气爽。写入一条事实(快速、原样存储):

curl -X POST http://nas-node.internal:20015/memories \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: ***" \
  -d '{
    "user_id": "customer-2211",
    "text": "Customer 2211 prefers email over WhatsApp for order updates."
  }'

之后再取最相关的记忆:

curl -X POST http://nas-node.internal:20015/search \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: ***" \
  -d '{
    "user_id": "customer-2211",
    "query": "how should I reach this customer?",
    "limit": 5
  }'

然后把返回的事实塞进助手回答前的系统提示词(或上下文)。这就是全部循环:存事实、召回相关的、在下一句回复里用上。

让我花了一天时间的 infer 坑

我栈上的路由是 /search 和 /memories,没有 /v1 前缀(早期一个自以为有 /v1 的包装器 404 了一阵子),认证是朴实的 X-Api-Key 头。都是小事,但都让我费过时间。

如果重来我会怎么做

结果

一层私有、自托管的记忆,用两个小 HTTP 调用就能访问。我的助手现在跨会话记得客户、偏好和决策——而且因为整个栈都在我自己网络后面的 PostgreSQL 里,这一切都没有离开我的掌控。

如果你跑的 AI 助手动不动就忘掉上下文,自托管 mem0 是最划算、最省事的升级之一——而且你能在不把记忆送进别人数据库的前提下做到。


想让你的生意也用上带记忆的 AI 吗?

我为企业构建并自托管 AI 助手、记忆栈、网站和基础设施。如果你想让助手真正记住你的客户——或者你想聊聊雇佣我——我很乐意帮上忙:

Lee Teong Hoe

Lee Teong Hoe · Mr Hoelee

Full-stack developer & DevOps engineer based in Malaysia. I run my own production infrastructure and build web systems for small businesses — this blog is the living record.

Hiring? Profile & stack · Malaysian SME? Website design & development ↗ · All posts