阶段 1:为什么需要记忆过期?
🧠 生活类比:你的大脑
想象你的大脑永远不会忘记任何事:
- 你记得 3 年前某天中午吃了什么
- 你记得上周二打开过哪个网页
- 你也记得你妈妈的生日
当有人问你”最近有什么重要的事?“,你的大脑要在海量垃圾信息中翻找,效率极低。
这就是 Mem0 不设过期时间时面临的问题 — 记忆膨胀(Memory Bloat)。
🔥 记忆膨胀的三个危害
用户存了 1000 条记忆
├── 5 条是真正重要的偏好设置(深色模式、邮件通知...)
├── 200 条是30天前的聊天记录
└── 795 条是过期的会话上下文("正在浏览电子产品"...3个月前的)
- 搜索质量下降 — 语义搜索时,旧的无关记忆和真正有用的记忆”抢位置”
- 存储成本上升 — 垃圾数据越积越多
- 检索速度变慢 — 数据量大了,查询自然慢
🎯 核心问题:不是所有记忆都需要永久保存。
阶段 2:默认行为 — 永久记忆
Mem0 默认情况下,所有记忆永不过期:
from mem0 import MemoryClient
client = MemoryClient(api_key="your-api-key")
# 这两条记忆都会永久存在
client.add("用户喜欢深色模式", user_id="sarah") # ✅ 值得永久保留
client.add("正在浏览电子产品分类", user_id="sarah") # ❌ 这是临时状态!6 个月后查询:
results = client.get_all(filters={"user_id": "sarah"})
print(f"总记忆数: {len(results['results'])}")
# 输出: 总记忆数: 2 ← 两条都还在!“正在浏览电子产品分类” 这条信息半年前就没用了,但它还在系统里,污染搜索结果。
💡 思考题
如果你在做一个客服 AI,用户半年前说过”我在看退货政策”,这条信息今天还有用吗?
答案显然是 没用。这就是我们需要短期记忆的原因。
阶段 3:短期记忆 — expiration_date
核心 API
只需要加一个参数 expiration_date,记忆就会在指定时间后自动消失:
from datetime import datetime, timedelta
# 计算 7 天后的时间,转成 ISO 格式字符串
expires_at = (datetime.now() + timedelta(days=7)).isoformat()
# 例如: "2026-02-15T14:30:00.123456"
client.add(
"正在浏览电子产品分类",
user_id="sarah",
expiration_date=expires_at # 👈 关键参数
)🔑 关键点解释
datetime.now() + timedelta(days=7) 这行做了什么?
from datetime import datetime, timedelta
now = datetime.now()
print(now) # 2026-02-08 10:00:00
future = now + timedelta(days=7)
print(future) # 2026-02-15 10:00:00
print(future.isoformat()) # "2026-02-15T10:00:00.000000"
# ↑ ISO 8601 标准格式,Mem0 要求这个格式timedelta 就是”时间差”,你可以用:
| 参数 | 含义 | 例子 |
|---|---|---|
days=7 | 7 天后 | 会话上下文 |
hours=24 | 24 小时后 | 实时状态 |
days=30 | 30 天后 | 近期聊天记录 |
days=365 | 1 年后 | 年度总结 |
对比:短期 vs 长期
# ❶ 短期记忆:7 天后自动消失
expires_at = (datetime.now() + timedelta(days=7)).isoformat()
client.add(
"正在浏览电子产品分类",
user_id="sarah",
expiration_date=expires_at
)
# ❷ 长期记忆:永不过期(不传 expiration_date)
client.add(
"用户喜欢深色模式",
user_id="sarah"
)✨ Mem0 会自动清理过期记忆,你不需要写定时任务(cron job),不需要手动删除。
阶段 4:分层留存策略
不同类型的数据应该有不同的”寿命”。我用一个客服 AI 的场景来说明:
🏗️ 三层记忆架构
┌─────────────────────────────────────────────────┐
│ 永久层(无过期时间) │
│ 用户偏好、账户信息、里程碑事件 │
│ 例: "用户喜欢邮件通知"、"生日是3月15日" │
├─────────────────────────────────────────────────┤
│ 中期层(30 天过期) │
│ 近期对话摘要、问题记录 │
│ 例: "用户询问过保修政策" │
├─────────────────────────────────────────────────┤
│ 短期层(7 天过期) │
│ 当前会话状态、浏览行为 │
│ 例: "正在查看 MacBook Pro 页面" │
└─────────────────────────────────────────────────┘
代码实现
from datetime import datetime, timedelta
# === 短期层:7 天 ===
expires_7d = (datetime.now() + timedelta(days=7)).isoformat()
client.add("正在浏览电子产品", user_id="sarah", expiration_date=expires_7d)
# === 中期层:30 天 ===
expires_30d = (datetime.now() + timedelta(days=30)).isoformat()
client.add("用户询问过退货政策", user_id="sarah", expiration_date=expires_30d)
# === 永久层:不传 expiration_date ===
client.add("用户喜欢深色模式", user_id="sarah")📋 分类速查表
| 数据类型 | 留存策略 | 过期时间 | 例子 |
|---|---|---|---|
| 用户偏好/设置 | 永久 | 无 | 深色模式、通知方式 |
| 账户信息 | 永久 | 无 | 生日、注册日期 |
| 重要里程碑 | 永久 | 无 | 完成新手引导 |
| 近期聊天摘要 | 中期 | 30 天 | 询问过保修政策 |
| 临时提醒 | 中期 | 30 天 | 下周要续费 |
| 当前会话状态 | 短期 | 7 天 | 正在浏览某页面 |
| 缓存数据 | 短期 | 7 天 | 最近搜索关键词 |
💡 经验法则:先从短的开始设(保守策略),之后根据使用情况再延长。清理过度留存的旧数据比延长过期时间难得多。
阶段 5:元数据标签 + 过滤查询
光设过期时间还不够,我们还需要分类管理记忆。这就用到 metadata。
为什么需要 metadata?
想象你有 500 条记忆,你想:
- 只查”用户偏好”类的记忆
- 只查”会话上下文”类的记忆
没有标签的话,你得遍历所有 500 条去判断。有了标签,一次查询就搞定。
添加标签
expires_7d = (datetime.now() + timedelta(days=7)).isoformat()
# 会话类记忆 + 标签
client.add(
"正在浏览电子产品",
user_id="sarah",
expiration_date=expires_7d,
metadata={"type": "session"} # 👈 打标签
)
# 偏好类记忆 + 标签
client.add(
"用户喜欢深色模式",
user_id="sarah",
metadata={"type": "preference"} # 👈 打标签
)按标签查询
# 只查偏好类记忆
preferences = client.get_all(
filters={
"AND": [
{"user_id": "sarah"},
{"metadata": {"type": "preference"}}
]
}
)"AND" 表示同时满足两个条件:属于 sarah 且 类型是 preference。
检查过期状态
这段代码可以让你一目了然地看到哪些记忆是临时的、何时过期:
results = client.get_all(filters={"user_id": "sarah"})
for memory in results['results']:
exp_date = memory.get('expiration_date') # 尝试获取过期时间
if exp_date:
print(f"🕐 临时: {memory['memory']}")
print(f" 过期时间: {exp_date}\n")
else:
print(f"🔒 永久: {memory['memory']}\n")输出:
🕐 临时: 正在浏览电子产品
过期时间: 2026-02-15T10:30:00
🔒 永久: 用户喜欢深色模式
🔒 永久: 用户喜欢邮件通知
阶段 6:实战综合 — 自清洁记忆系统
把所有知识串起来,构建一个完整的记忆管理器:
from mem0 import MemoryClient
from datetime import datetime, timedelta
client = MemoryClient(api_key="your-api-key")
# === 工具函数:根据类型自动设置过期策略 ===
def add_memory(content: str, user_id: str, memory_type: str):
"""
memory_type: "session" | "chat" | "preference"
"""
config = {
"session": {"days": 7, "type": "session"},
"chat": {"days": 30, "type": "chat"},
"preference": {"days": None, "type": "preference"}, # 永久
}
setting = config[memory_type]
kwargs = {
"user_id": user_id,
"metadata": {"type": setting["type"]}
}
if setting["days"] is not None:
kwargs["expiration_date"] = (
datetime.now() + timedelta(days=setting["days"])
).isoformat()
client.add(content, **kwargs)
print(f"✅ 已存储 [{memory_type}]: {content}")
# === 使用 ===
add_memory("正在浏览 MacBook Pro", "sarah", "session") # 7天后过期
add_memory("询问过退货政策", "sarah", "chat") # 30天后过期
add_memory("喜欢深色模式", "sarah", "preference") # 永不过期这个 add_memory 函数封装了所有逻辑:
- 根据
memory_type自动决定过期时间 - 自动打上 metadata 标签
- 调用者只需要关心”这是什么类型的记忆”
🧭 总结:一张图搞定
Mem0 记忆过期机制
│
┌────────────┼────────────┐
▼ ▼ ▼
永久记忆 中期记忆 短期记忆
(无 expiration) (30天过期) (7天过期)
│ │ │
用户偏好 聊天记录 会话状态
账户信息 临时提醒 浏览行为
里程碑 问题记录 缓存数据
│ │ │
└────────────┴────────────┘
│
metadata 标签分类管理
{"type": "preference"}
│
按标签过滤查询 (AND)
│
Mem0 自动清理过期数据 ✨
🎯 核心要点回顾
- 默认永久 — 不传
expiration_date的记忆永不消失 expiration_date— ISO 格式字符串,到期自动删除,无需 cron- 分层策略 — 7 天(会话)/ 30 天(聊天)/ 永久(偏好)
- metadata 标签 — 给记忆分类,方便按类型查询
- 保守优先 — 先设短过期,再根据检索质量调整
有什么不清楚的地方,随时问我!🚀