第一阶段:为什么需要分类?

🏠 生活类比

想象你搬了新家,所有东西——衣服、书、厨具、工具——全扔在一个大箱子里。

你要找一把螺丝刀?翻遍整个箱子。 你要找冬天的外套?再翻一遍。

这就是 没有分类 的记忆存储。

💼 真实业务场景

一个客服平台,客户 Maria 打了很多次电话:

记忆1: Maria 来电要重置密码
记忆2: Maria 上月被重复扣款
记忆3: Maria 想升级到高级套餐
记忆4: Maria 反馈希望有暗黑模式
记忆5: Maria 修改了邮箱地址
...假设有 100 条

客服 Joseph 接到 Maria 的电话,她说:“我上次那个扣款问题解决了吗?”

没有分类时Joseph 要从 100 条记忆里一条条扫,找到和”账单”相关的那几条。

有分类时:直接筛选 billing 类别 → 只看到 2-3 条账单相关记忆 → 秒级定位。

🎯 核心痛点:数据量大时,无差别存储 = 检索噩梦。


第二阶段:Mem0 是什么?

定位

Mem0 是一个 AI 记忆层(Memory Layer),可以理解为:

你的应用 ←→ Mem0(记忆管理) ←→ 底层存储

它不是数据库,而是在数据库之上加了一层 “智能记忆管理”,核心能力:

  • 存记忆client.add() — 存入一段信息
  • 取记忆client.get_all() — 按条件检索
  • 改记忆client.update() — 更新内容
  • 语义理解:它能”读懂”你存的内容,而不只是做关键词匹配

初始化

from mem0 import MemoryClient
 
client = MemoryClient(api_key="your-api-key")

这一步就像登录你的”记忆仓库”。api_key 是你的钥匙。


第三阶段:自定义分类(Custom Categories)

🧠 核心概念

分类是在 项目级别(Project Level) 定义的,意味着:

一旦定义,所有未来新增的记忆 都会自动按这套分类体系来归类。

怎么设计分类?

custom_categories = [
    {"support_tickets": "Customer issues and resolutions"},
    {"account_info": "Account details and preferences"},
    {"billing": "Payment history and billing questions"},
    {"product_feedback": "Feature requests and feedback"},
]
 
client.project.update(custom_categories=custom_categories)

注意这个数据结构——每个分类是一个字典

{"分类名称": "分类描述"}

分类名称(key):代码里用来筛选的标识符,如 "billing" 分类描述(value):给 Mem0 的 AI 看的,它靠这段描述来判断一条记忆属于哪个分类

🔥 类比理解

这就像你给图书馆管理员一张分类表:

分类名说明(给管理员看的)
support_tickets客户遇到的问题和解决方案
account_info账户详情和偏好设置
billing支付历史和账单疑问
product_feedback功能请求和用户反馈

管理员(Mem0 的 AI)拿到一本新书(一条新记忆),读一下内容,然后放到对应的书架上。

⚠️ 设计原则

从 3-5 个分类开始,不要一上来搞 20 个。

为什么?

  • 分类太多 → AI 容易”犹豫”,分类准确度下降
  • 分类太少 → 不够用,但可以后续扩展
  • 宁少勿多,逐步迭代

第四阶段:自动打标签的原理

这是最酷的部分 🪄

不需要手动打标签。看代码:

# 存一条账单相关的记忆
client.add(
    "Maria was charged twice for last month's subscription",  # 内容
    user_id="maria",
    metadata={"priority": "high", "source": "phone_call"}    # 元数据
)

你只传了 内容元数据,并没有指定 category="billing"

但 Mem0 会自动:

  1. 读取内容:"Maria was charged twice..." → 语义是”重复扣款”
  2. 对比分类描述:"Payment history and billing questions" ← 最匹配!
  3. 自动打上 billing 标签

再看几个例子

# 这条会被自动归类为 "account_info"
client.add(
    "Maria changed her email to maria.new@example.com",
    user_id="maria",
    metadata={"source": "web_portal"}
)
 
# 这条会被自动归类为 "product_feedback"
client.add(
    "Maria requested a dark mode feature for the dashboard",
    user_id="maria",
    metadata={"source": "chat"}
)

🤔 它是怎么做到的?

底层用的是 语义理解(类似 embedding + 分类器):

记忆内容 → 语义向量 → 与每个分类描述的语义向量比较 → 选最相似的

这就是为什么 分类描述写得好很重要——描述越清晰,AI 分类越准确。

metadata 是什么?

metadata 是你额外附加的结构化信息,Mem0 不会用它来决定分类,但你可以用它做更细粒度的筛选:

metadata={"priority": "high", "source": "phone_call"}
  • priority:优先级(你自己定义的业务字段)
  • source:来源渠道

第五阶段:按分类检索

基础筛选:单个分类

billing_issues = client.get_all(
    filters={
        "AND": [
            {"user_id": "maria"},
            {"categories": {"in": ["billing"]}}
        ]
    }
)

拆解这个 filter:

AND(同时满足):
  ├── user_id = "maria"          → 只看 Maria 的记忆
  └── categories in ["billing"]  → 只看账单类

结果:只返回 Maria 的账单相关记忆,其他全过滤掉。

输出:
- Maria was charged twice for last month's subscription

进阶筛选:多个分类

account_and_billing = client.get_all(
    filters={
        "AND": [
            {"user_id": "maria"},
            {"categories": {"in": ["account_info", "billing"]}}
        ]
    }
)

{"in": ["account_info", "billing"]} 的意思是:属于这些分类中的任意一个(OR 关系)。

输出:
[account_info] Maria changed her email to maria.new@example.com
[billing] Maria was charged twice for last month's subscription

🎯 类比

就像在电商网站筛选商品:

  • 品牌 = Nike AND 类别 ∈ {跑鞋, 篮球鞋}

同样的逻辑,只是用在了记忆检索上。


第六阶段:重新分类

什么时候需要重新分类?

  1. 新增了分类(比如新加了 "escalation" 类别)
  2. 修改了分类描述(让描述更准确)
  3. 之前有些记忆被归入了 "misc"(杂项),现在想重新归类

怎么做?

# 第一步:找到需要重新分类的记忆
needs_update = client.get_all(
    filters={
        "AND": [
            {"user_id": "maria"},
            {"categories": {"in": ["misc"]}}
        ]
    }
)
 
# 第二步:重新触发分类
for memory in needs_update['results']:
    client.update(
        memory_id=memory['id'],
        data=memory['memory']  # 内容不变,但会用新的分类体系重新分析
    )

💡 关键洞察

client.update() 调用时,即使内容没变,Mem0 也会 用当前最新的分类定义 重新分析。

这就像你给图书馆管理员换了一张新的分类表,然后让他把”杂项”书架上的书重新归类。


第七阶段:实战总结

你学到的完整流程

┌─────────────────────────────────────────────────┐
│  1. 初始化客户端                                   │
│     client = MemoryClient(api_key=...)           │
│                                                   │
│  2. 定义分类体系                                   │
│     client.project.update(custom_categories=...)  │
│                                                   │
│  3. 存入记忆(自动分类)                             │
│     client.add(content, user_id=..., metadata=...) │
│                                                   │
│  4. 按分类检索                                     │
│     client.get_all(filters={categories: in [...]}) │
│                                                   │
│  5. 需要时重新分类                                  │
│     client.update(memory_id=..., data=...)        │
└─────────────────────────────────────────────────┘

设计原则总结

原则说明
分类 3-5 个起步太多会降低自动分类准确度
描述要清晰具体AI 靠描述来判断,模糊描述 = 模糊分类
项目级别定义一次定义,全项目生效
先跑起来再优化观察 misc 类别积累情况,据此调整
metadata 做补充分类管”大类”,metadata 管”细节”(优先级、来源等)

🧪 思考练习

如果你在做一个 在线教育平台 的客服系统,你会怎么设计分类?

我的建议:

custom_categories = [
    {"course_issues": "Problems with course content, videos, or materials"},
    {"payment": "Refunds, billing, subscription, and payment problems"},
    {"technical": "App bugs, login issues, and platform errors"},
    {"certification": "Certificate requests, exam results, and credentials"},
]