阶段 1:为什么需要记忆过期?

🧠 生活类比:你的大脑

想象你的大脑永远不会忘记任何事

  • 你记得 3 年前某天中午吃了什么
  • 你记得上周二打开过哪个网页
  • 你也记得你妈妈的生日

当有人问你”最近有什么重要的事?“,你的大脑要在海量垃圾信息中翻找,效率极低。

这就是 Mem0 不设过期时间时面临的问题 — 记忆膨胀(Memory Bloat)

🔥 记忆膨胀的三个危害

用户存了 1000 条记忆
├── 5 条是真正重要的偏好设置(深色模式、邮件通知...)
├── 200 条是30天前的聊天记录
└── 795 条是过期的会话上下文("正在浏览电子产品"...3个月前的)
  1. 搜索质量下降 — 语义搜索时,旧的无关记忆和真正有用的记忆”抢位置”
  2. 存储成本上升 — 垃圾数据越积越多
  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=77 天后会话上下文
hours=2424 小时后实时状态
days=3030 天后近期聊天记录
days=3651 年后年度总结

对比:短期 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 函数封装了所有逻辑:

  1. 根据 memory_type 自动决定过期时间
  2. 自动打上 metadata 标签
  3. 调用者只需要关心”这是什么类型的记忆”

🧭 总结:一张图搞定

                    Mem0 记忆过期机制
                         │
            ┌────────────┼────────────┐
            ▼            ▼            ▼
       永久记忆       中期记忆       短期记忆
    (无 expiration)  (30天过期)    (7天过期)
            │            │            │
       用户偏好       聊天记录      会话状态
       账户信息       临时提醒      浏览行为
       里程碑         问题记录      缓存数据
            │            │            │
            └────────────┴────────────┘
                         │
              metadata 标签分类管理
              {"type": "preference"}
                         │
              按标签过滤查询 (AND)
                         │
              Mem0 自动清理过期数据 ✨

🎯 核心要点回顾

  1. 默认永久 — 不传 expiration_date 的记忆永不消失
  2. expiration_date — ISO 格式字符串,到期自动删除,无需 cron
  3. 分层策略 — 7 天(会话)/ 30 天(聊天)/ 永久(偏好)
  4. metadata 标签 — 给记忆分类,方便按类型查询
  5. 保守优先 — 先设短过期,再根据检索质量调整

有什么不清楚的地方,随时问我!🚀