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:8888PGVector → 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)
这段配置做了什么?
连接 PostgreSQL(带 pgvector 插件) 自动创建 my_memories表,包含id UUID、vector vector(1536)、payload JSONB三列自动创建 HNSW 索引,实现毫秒级近似最近邻搜索 使用 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
这会安装三样东西:
MCP 服务器 — Claude Code 通过它调用 Mem0 API 生命周期钩子 — 自动捕获对话中的关键信息 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
向导会自动:
验证 API Key 和 MCP 连接 检测并导入项目文件( CLAUDE.md、AGENTS.md、.cursorrules)安装编码优化的记忆分类体系 显示你的身份和环境信息
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 索引:
得益于 2026 年 4 月的新算法,每次检索只需 一次 LLM 调用(旧算法需要多次调用),整体延迟从 2-3 秒降至 0.88-1.09 秒:
| 92.5 | ||||
| 94.4 | ||||
| 64.1 |
常见问题
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