Skip to content

2026 年自建 AI Agent:用 n8n + Ollama + Mem0 打造有长期记忆的本地智能体

毛佳国

📌 核心速览 (TL;DR)

  • 大模型的阿喀琉斯之踵:无论上下文窗口(Context Window)有多大,跨会话记忆依然极其昂贵且容易发生“注意力遗忘”。
  • Mem0 (记忆新范式):相比传统全量对话存储或简单的 RAG 检索,Mem0 专门提取用户画像、事实偏好并动态演进更新,支持自托管并可与 Qdrant 向量数据库无缝集成。
  • 黄金三角架构:Ollama (推理引擎) + Mem0 (动态长期记忆) + n8n (ReAct 思考与工具执行中枢)。
  • 真实场景:AI 助手不仅能根据历史偏好为你定制技术方案(例如记住你只用 Debian、讨厌 Docker Swarm、倾向于写 Rust),还能自主调用内网工具。

如果你日常深度使用过各类 AI 助手,一定会产生一种强烈的割裂感: 每一次开启新的对话窗口,你都得像面对一个患有“重度失忆症”的陌生人一样,重新告诉它你的技术栈、你的工作习惯,甚至你的服务器 IP 拓扑。

在 2026 年,单纯堆砌上下文长度(例如 1M Token)并不能优雅地解决这个问题——因为把过去几个月的聊天记录全量喂给大模型,不仅处理极慢、容易产生严重的“中间遗忘”,更会让算力成本成倍飙升。

今天,我们将引入目前开源社区最火热的记忆层引擎 —— Mem0,结合我们自建的 Ollama 与 n8n,搭建一个真正拥有长期成长记忆的本地私有 AI 智能体!


一、什么是 Mem0?它和传统 RAG / 聊天历史有什么区别?

很多朋友会有疑问:我们在之前文章里已经学过把文档切片存进向量数据库(RAG),难道不能用 RAG 来做记忆吗?

还真不行。

对比维度传统 Chat History传统 RAG 文档检索Mem0 智能记忆系统
存储内容逐字逐句的对话原文静态文档切片 (Chunk)提炼后的结构化事实与用户画像
动态更新只增不减,越来越臃肿需手动重新导入与构建索引自动识别冲突、更新过期记忆、合并认知
提取颗粒度粗放,噪音极大依赖关键词/语义相似匹配精准识别如“用户更换了主力 NAS 系统”
检索效率极低(随时间线性拖慢)中等极高(仅召回关联当前意图的核心记忆)

例如,上周你跟它说:“我最近在折腾 PVE,NAS 用的是群晖。”今天你说:“我把群晖卖了,全部迁移到了 TrueNAS SCALE。” Mem0 会自动在记忆图中将关于“用户 NAS 选型”的事实进行覆盖更新,而不是把两个冲突的记忆混乱地并存。


二、架构拓扑:本地 AI 智能体“大脑”流水线

┌────────────────────────────────────────────────────────┐
│                        用户终端                        │
│             (Telegram / 网页聊天端 / Webhook)           │
└───────────────────────────┬────────────────────────────┘
                            │
                            ▼
┌────────────────────────────────────────────────────────┐
│                   n8n AI Agent 编排                    │
│                                                        │
│  ┌──────────────────────────────────────────────────┐  │
│  │ 1. 拦截输入,调用 Mem0 API 检索当前用户关联事实     │  │
│  └──────────────────────────┬───────────────────────┘  │
│                             │                          │
│                             ▼                          │
│  ┌──────────────────────────────────────────────────┐  │
│  │ 2. 注入动态记忆上下文 -> 发送给 Ollama 本地模型    │  │
│  │    (Qwen 2.5 14B / DeepSeek-R1-Distill)          │  │
│  └──────────────────────────┬───────────────────────┘  │
│                             │                          │
│                             ▼                          │
│  ┌──────────────────────────────────────────────────┐  │
│  │ 3. 执行 ReAct 工具调用 (MCP / 监控查询 / 自动化)   │  │
│  └──────────────────────────┬───────────────────────┘  │
│                             │                          │
│                             ▼                          │
│  ┌──────────────────────────────────────────────────┐  │
│  │ 4. 异步将本轮对话发送给 Mem0 提炼增量记忆           │  │
│  └──────────────────────────────────────────────────┘  │
└────────────────────────────────────────────────────────┘

三、Docker Compose 私有化部署 Mem0 记忆引擎

Mem0 支持完全开源自托管。我们编写一个 compose.yml,使用 Qdrant 作为底层向量存储,完全脱离云端:

# /opt/mem0/compose.yml
services:
  qdrant:
    image: qdrant/qdrant:latest
    container_name: mem0-qdrant
    restart: unless-stopped
    ports:
      - "6333:6333"
    volumes:
      - ./qdrant_storage:/qdrant/storage
    networks:
      - ai-agent-net

  mem0-server:
    image: mem0/mem0:latest
    container_name: mem0-service
    restart: unless-stopped
    ports:
      - "127.0.0.1:8888:8888"
    environment:
      # 指定本地 Ollama 提供 Embedding 与记忆提炼提取
      - EMBEDDER_PROVIDER=ollama
      - EMBEDDER_CONFIG={"model":"bge-m3","base_url":"http://host.docker.internal:11434"}
      - LLM_PROVIDER=ollama
      - LLM_CONFIG={"model":"qwen2.5:7b-instruct","base_url":"http://host.docker.internal:11434"}
      # 指定底层向量库连接
      - VECTOR_STORE_PROVIDER=qdrant
      - VECTOR_STORE_CONFIG={"host":"qdrant","port":6333}
    depends_on:
      - qdrant
    extra_hosts:
      - "host.docker.internal:host-gateway"
    networks:
      - ai-agent-net

networks:
  ai-agent-net:
    name: ai-agent-net

启动记忆服务:

docker compose up -d

验证运行状态:访问 http://localhost:8888/docs 查看 OpenAPI 交互文档,服务就绪!


四、在 n8n 中组装带记忆的 AI Agent

我们进入 n8n 工作台,新建一个工作流,串联起记忆的生命周期:

1. 记忆检索与前置注入

在接收到用户发来的 Prompt(例如:“我想给我的服务器写一个自动备份脚本,帮我出个方案”)时:

  1. HTTP Request 节点 (查询记忆):
    • Method: POST
    • URL: http://mem0-service:8888/v1/memories/search
    • Body:
      {
        "query": "{{ $json.user_message }}",
        "user_id": "maojiaguo"
      }
  2. Code 节点 (组装 Context): 提取返回的记忆列表(如:["用户倾向于使用 Restic 进行加密增量备份", "用户不喜欢用复杂的云服务,偏好本地 NAS 挂载"]),格式化为提示词前缀。

2. 核心 AI Agent 执行

在 AI Agent 节点的 System Message 中配置:

你是一个专属于用户的私人高级架构师助手。
你对用户的了解如下(这是你的长期记忆,请务必在回答中遵循这些已知偏好):
{{ $json.memories_context }}

请根据用户的要求与上述偏好进行方案制定与工具调度。

此时,你即使没提“用什么工具”,Qwen 模型也会根据记忆精准回答:“考虑到您一直使用 Restic 并偏好 NAS 本地备份,我为您推荐以下符合您环境的自动化脚本……”

3. 异步记忆归纳与持久化

在 Agent 回答生成完毕返回给用户后,分支拉出另一个异步 HTTP Request 节点:

Mem0 容器会在后台启动 qwen2.5:7b 自动从这轮对话中提炼出新的偏好或事实并写入 Qdrant,整个过程对前端响应零阻塞、零延迟!


五、真实体验:一个越来越懂你的赛博助手

经过几周的磨合,你会发现你的本地 AI 发生了惊人的质变:


❓ 常见问题与 AI 快问快答 (FAQ)

Q:Mem0 会不会记住无关废话导致记忆污染?

A:Mem0 内部内置了严格的判别 Prompt,只会提取具有持久价值的“事实”(Facts)和“偏好”(Preferences)。对于闲聊、语气词或即时状态通常会被自动过滤丢弃。此外,你也可以通过 Mem0 的 Web 界面随时对误存的记忆进行手动删除或编辑。

Q:这个架构多用户适用吗?

A:非常适用!Mem0 天然设计了 user_id 和 agent_id 租户隔离机制。你可以为家庭成员(老婆、孩子、朋友)各自分配独立的 ID,不同人的偏好与记忆互不干扰。

Q:本地跑 Mem0 提炼事实对显存消耗大吗?

A:不大。记忆提炼可以使用体积小巧的量化模型(如 qwen2.5:3b 或 7b),且提炼任务是异步跑在后台队列里的,对实时对话显存占用影响极小。

上一篇
别让 AI 工作流变成后门:n8n + MCP Homelab 的权限隔离与安全审计最佳实践
下一篇
sing-box-windows 实战:1.14 内核 + TUN DNS 接管模式全解析(2026版)