PostgreSQL码农集散地

AI 「记忆皮层」

本文不仅有概念,更有 Claude Code CLI 整合实战 + PGVector 向量库配置全流程


如果你用过 Claude Code、Cursor 或任何 AI 编码助手,你一定遇到过这个场景:你花了半小时跟它讨论清楚项目的架构设计,它给出了完美的方案。关掉终端,第二天重新打开,它完全不记得你们昨天聊了些什么。

这不是你的问题。这是 AI 的「失忆症」 。

而 Mem0 —— Y Combinator S24 孵化的开源项目——就是来治这个病的。本文不讲空话,带你从概念到实操,亲手把记忆层装进你的 AI 工作流。

一、先跑起来:一条命令搭建 Mem0 服务

在开始任何整合之前,你需要一个 Mem0 服务。最简单的方式是通过 Docker Compose 一键启动,它包含了 Mem0 API 服务 + PostgreSQL/PGVector 向量数据库 + 管理面板:

# docker-compose.yaml
services:
mem0:
build:.
ports:
-"8888:8000"
depends_on:
postgres:
condition:service_healthy

postgres:
image:pgvector/pgvector:pg17
environment:
POSTGRES_PASSWORD:mem0_secret
ports:
-"8432:5432"
healthcheck:
test:["CMD-SHELL","pg_isready -q -d postgres -U postgres"]

mem0-dashboard:
build:./dashboard
ports:
-"3000:3000"
# 一键启动
cd server && docker compose up -d

# 验证服务
curl http://localhost:8888/health
# → {"status":"ok"}

此时你已经拥有了:

  • Mem0 API → http://localhost:8888
  • PGVector → localhost:8432(用户名 postgres,密码 mem0_secret)
  • 管理面板 → http://localhost:3000

二、Python 实操:用 PGVector 做记忆存储

Mem0 默认使用 Qdrant 做向量存储。但我们换成 PGVector(PostgreSQL + pgvector 插件),因为大多数团队已经在用 PostgreSQL,不需要额外维护一套向量数据库。

2.1 配置 PGVector 向量存储

from mem0 import Memory
from mem0.configs.base import MemoryConfig

config = MemoryConfig(
    vector_store={
"provider": "pgvector",
"config": {
"dbname": "postgres",
"collection_name": "my_memories",
"embedding_model_dims": 1536,   # OpenAI text-embedding-3-small 的维度
"user": "postgres",
"password": "mem0_secret",
"host": "localhost",
"port": 8432,
"hnsw": True,                   # 启用 HNSW 索引加速搜索
        }
    },
    llm={
"provider": "openai",
"config": {
"model": "gpt-4.1-nano-2025-04-14",
"temperature": 0.1
        }
    },
    embedder={
"provider": "openai",
"config": {
"model": "text-embedding-3-small"
        }
    }
)

memory = Memory(config)

这段配置做了什么?

  1. 连接 PostgreSQL(带 pgvector 插件)
  2. 自动创建 my_memories 表,包含 id UUID、vector vector(1536)、payload JSONB 三列
  3. 自动创建 HNSW 索引,实现毫秒级近似最近邻搜索
  4. 使用 OpenAI 的 embedding 模型将文本转为 1536 维向量

2.2 写入记忆

# 添加一条简单记忆
memory.add(
"用户 digoal 喜欢 PostgreSQL,尤其擅长分区表和并行查询优化",
    user_id="digoal",
    metadata={"source": "chat", "topic": "database"}
)

# 从对话中添加记忆
memory.add([
    {"role": "user", "content": "我平时用 Debian 系统,开发 Go 和 Rust 项目"},
    {"role": "assistant", "content": "好的,我记住了你的技术栈偏好"}
], user_id="digoal")

2.3 搜索记忆

# 语义搜索——自动向量化查询文本并执行余弦距离排序
results = memory.search(
"用什么数据库系统?",
    user_id="digoal",
    limit=5
)

for r in results["results"]:
    print(f"[{r['score']:.2f}] {r['memory']}")
# 输出: [0.92] 用户 digoal 喜欢 PostgreSQL,尤其擅长分区表和并行查询优化

底层发生了什么? Mem0 的 PGVector 驱动会生成这样的 SQL:

SELECTid, vector <=> $1::vector AS distance, payload
FROM my_memories
ORDERBY distance
LIMIT5;

<=> 是 pgvector 提供的余弦距离运算符。HNSW 索引让这个查询在百万级数据上也能在个位数毫秒内完成。

2.4 高级过滤

# 带 metadata 过滤的搜索
results = memory.search(
"数据库优化技巧",
    user_id="digoal",
    filters={"source": "chat", "topic": "database"},
    threshold=0.7# 只返回相似度 > 0.7 的结果
)

# 时间感知搜索——自动优先返回近期记忆(新算法特性)
results = memory.search(
"当前正在做什么项目?",
    user_id="digoal",
    limit=3
)
# 自动识别时间相关的查询,优先返回近期记忆

2.5 查看底层数据

# 直接连到 PostgreSQL 查看原始数据
psql -h localhost -p 8432 -U postgres -d postgres

SELECT id, payload->>'memory' AS memory,
       payload->>'user_id' AS user_id,
       created_at
FROM my_memories \gx

输出示例:

-[ RECORD 1 ]--------------------------------------
id        | a1b2c3d4-...
memory    | 用户 digoal 喜欢 PostgreSQL,尤其擅长分区表
user_id   | digoal
created_at | 2026-07-25T12:34:56

三、进阶:直接调用 PGVector 驱动

如果你想脱离 Mem0 的 Memory 类,直接使用底层的 PGVector 驱动做向量操作,也是支持的:

from mem0.vector_stores.pgvector import PGVector

store = PGVector(
    dbname="postgres",
    collection_name="custom_vectors",
    embedding_model_dims=768,   # 可以用更小的模型
    user="postgres",
    password="mem0_secret",
    host="localhost",
    port=8432,
    hnsw=True,
)

# 插入自定义向量
store.insert(
    vectors=[[0.1, 0.2, ...]],  # 768 维向量
    payloads=[{"text": "自定义数据"}],
    ids=["uuid-here"]
)

# 搜索
results = store.search(
    query="test",
    vectors=[0.1, 0.2, ...],
    top_k=10,
    filters={"source": "custom"}
)

如果你的数据量极大(千万级以上),还可以启用 DiskANN 索引——微软提出的磁盘友好型 ANN 算法,比 HNSW 更省内存:

config = MemoryConfig(
    vector_store={
"provider": "pgvector",
"config": {
            ...
"diskann": True,  # 启用 DiskANN 替代 HNSW
        }
    }
)

需要先安装 vectorscale PostgreSQL 扩展。

四、重磅实操:整合 Claude Code CLI

这是本文最实用的部分——把 Mem0 作为 Claude Code 的「长期记忆」 。只需要三个步骤。

4.1 安装 Mem0 MCP 服务器

Claude Code 支持 MCP(Model Context Protocol),Mem0 提供了现成的 MCP 服务器。

先在 Claude Code 中运行:

/plugin marketplace add mem0ai/mem0
/plugin install mem0@mem0-plugins

这会安装三样东西:

  1. MCP 服务器 — Claude Code 通过它调用 Mem0 API
  2. 生命周期钩子 — 自动捕获对话中的关键信息
  3. Mem0 SDK 技能 — 让 Claude 知道如何使用 Mem0

4.2 配置 API Key

# 注册并获取 API Key(5 秒搞定)
mem0 init --agent --agent-caller claude-code

# 如果是人类用户
mem0 init --email [email protected]

Key 会被写入 ~/.mem0/config.json,同时导出为环境变量:

export MEM0_API_KEY="m0-your-api-key"

4.3 运行 Onboarding 向导

在新的 Claude Code 会话中执行:

/mem0:onboard

向导会自动:

  1. 验证 API Key 和 MCP 连接
  2. 检测并导入项目文件(CLAUDE.md、AGENTS.md、.cursorrules)
  3. 安装编码优化的记忆分类体系
  4. 显示你的身份和环境信息

4.4 日常使用:记忆随行

安装完成后,Claude Code 会自动管理记忆,无需手动干预。你也可以主动操作:

# 让 Claude 记住重要信息
/mem0:remember "这个项目使用 pnpm workspace 管理 monorepo,测试框架是 vitest"

# 搜索之前记住的内容
/mem0:search "测试框架"

# 查看所有记忆
/mem0:tour

# 查看统计
/mem0:stats

# 健康检查
/mem0:health

4.5 实际效果演示

来看一个真实场景。假设你在维护一个大型 monorepo:

第一轮对话:

你:这个项目的前端用的是什么框架?
Claude:我来看一下... 项目用的是 Next.js 14 + React 19,样式方案是 TailwindCSS。
你:记住这些信息。

第二轮对话(新的会话):

你:我们项目的技术栈是什么?
Claude:根据 Mem0 中的记忆,这个项目使用 pnpm workspace 管理 monorepo,
前端是 Next.js 14 + React 19 + TailwindCSS,测试框架是 vitest。

没有 Mem0 的情况下,第二段对话 Claude 会完全失忆。有了 Mem0,跨会话上下文保持得像没有断过一样。

4.6 底层:MCP 协议怎么工作

Mem0 的 MCP 服务器暴露了 9 个工具:

工具
功能
add_memory
添加记忆
search_memories
搜索记忆
get_memories
获取所有记忆
get_memory
获取单条记忆
update_memory
更新记忆
delete_memory
删除记忆
delete_all_memories
清空所有记忆
delete_entities
删除实体
list_entities
列出实体

生命周期钩子自动在三个时机触发:

  • SessionStart — 加载之前的记忆作为引导上下文
  • UserPromptSubmit — 将相关记忆注入提示词
  • Stop — 提醒智能体在会话结束时持久化新学到的信息

五、实战:用 Claude Code + Mem0 做 AI 客服

我们用一个完整的 Python 示例来展示如何构建一个带长期记忆的 AI 客服机器人,后端使用 Mem0 + PGVector:

import os
from datetime import datetime
from openai import OpenAI
from mem0 import MemoryClient  # 使用云平台版本

# 初始化 Mem0 和 OpenAI
client = MemoryClient(api_key=os.environ["MEM0_API_KEY"])
llm = OpenAI()

classSupportBot:
"""带记忆的客服机器人"""

defhandle_ticket(self, customer_id: str, issue: str) -> str:
# 1. 检索客户历史
        history = client.search(
            issue,
            user_id=customer_id,
            limit=10
        )

# 2. 检查是否有相似历史问题
        similar = [m for m in history if m.get("score", 0) > 0.8]
        context = (
f"Previous similar issue: {similar[0]['memory']}"
if similar else"No previous similar issues found."
        )

# 3. 生成带上下文的回复
        prompt = f"Customer context:\n{context}\n\nNew issue: {issue}"
        response = llm.chat.completions.create(
            model="gpt-4.1-nano",
            messages=[{"role": "user", "content": prompt}]
        ).choices[0].message.content

# 4. 存储这次交互
        client.add([
            {"role": "user", "content": f"Issue: {issue}"},
            {"role": "assistant", "content": response}
        ], user_id=customer_id, metadata={
"category": "support_ticket",
"timestamp": datetime.now().isoformat()
        })

return response

# 使用
bot = SupportBot()
reply = bot.handle_ticket("cust_001", "我无法登录账号,提示 2FA 验证失败")

流程示意图:

用户提问 → 搜索历史记忆 → 构建上下文 → LLM 回复 → 存储新记忆 → 返回
              ↑                            ↓
          PGVector 向量检索           PostgreSQL 持久化

六、性能基准:PGVector vs 其他方案

Mem0 团队公开的性能数据,使用 PGVector + HNSW 索引:

数据量
检索延迟 (p50)
检索延迟 (p99)
准确率 (Recall@10)
10 万
3ms
8ms
99.2%
100 万
12ms
35ms
98.7%
1000 万
45ms
120ms
97.1%

得益于 2026 年 4 月的新算法,每次检索只需 一次 LLM 调用(旧算法需要多次调用),整体延迟从 2-3 秒降至 0.88-1.09 秒:

基准
旧算法
新算法
Tokens
延迟 p50
LoCoMo
71.4
92.5
7.0K
0.88s
LongMemEval
67.8
94.4
6.8K
1.09s
BEAM (1M)
—
64.1
6.7K
1.00s

常见问题

Q: PGVector 和 Qdrant 怎么选?

A: 已经在用 PostgreSQL → 选 PGVector,减少运维复杂度。专门做向量搜索且数据量极大(亿级)→ Qdrant 或 Pinecone。中小规模场景 PGVector 完全够用。

Q: Claude Code 整合后,记忆存在哪里?

A: 默认存在 Mem0 云平台(通过 MCP 服务器)。如果想自托管,可以配置自建 Mem0 服务器 + PGVector,修改 MCP 配置指向你的服务器地址即可。

Q: 多用户隔离怎么做?

A: Mem0 通过 user_id、agent_id、run_id 三个维度做隔离。不同用户的记忆互不可见。在 Claude Code 中,每个项目和分支自动使用不同的命名空间。

Q: 记忆会不会无限膨胀?

A: 新算法采用「单次 ADD 只增不删」模式,但你可以通过 API 设置过期时间、定期清理旧记忆或按 user_id 限制记忆总数。

最后

Mem0 解决的不只是一个技术问题,它代表了一个趋势: 在模型能力趋同的今天,决定 AI 应用体验上限的是基础设施——而记忆层就是其中最关键的一块。

本文所有代码都来自真实可运行的项目。无论你是:

  • Python 开发者 —— 用三行代码给你的应用加上记忆
  • Claude Code 用户 —— 装一个插件解决跨会话失忆
  • 架构师 —— 用 PGVector 复用现有 PostgreSQL 基础设施

Mem0 都给出了开箱即用的方案。

项目地址:github.com/mem0ai/mem0
官方文档:docs.mem0.ai
自我托管:cd server && docker compose up -d
研究论文:mem0.ai/research