第一阶段:为什么需要分类?
🏠 生活类比
想象你搬了新家,所有东西——衣服、书、厨具、工具——全扔在一个大箱子里。
你要找一把螺丝刀?翻遍整个箱子。 你要找冬天的外套?再翻一遍。
这就是 没有分类 的记忆存储。
💼 真实业务场景
一个客服平台,客户 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 会自动:
- 读取内容:
"Maria was charged twice..."→ 语义是”重复扣款” - 对比分类描述:
"Payment history and billing questions"← 最匹配! - 自动打上
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 类别 ∈ {跑鞋, 篮球鞋}
同样的逻辑,只是用在了记忆检索上。
第六阶段:重新分类
什么时候需要重新分类?
- 你 新增了分类(比如新加了
"escalation"类别) - 你 修改了分类描述(让描述更准确)
- 之前有些记忆被归入了
"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"},
]