一句话区分:长期记忆记"发生过的事",偏好记忆记"这个人是什么样的人"。
1. 数据结构完全不同
长期记忆 LongTermMemory:一个会遗忘、会合并的列表
List<MemoryItem> items // 每条 = {id, content, importance, embedding, createdAt, lastAccessed}
- 存的是事件/事实型文本,比如"用户上周在做 Spring Boot 支付模块"、"用户说项目截止日期是下周五"。
- 每条有
importance权重 +embedding向量 + 时间戳。 - 回忆靠语义相似度检索:
recall()算score = 相似度×0.7 + 重要度×0.3,取 TopK。 - 有生命周期:
consolidate()做三件事 ------ 按decayRate随时间衰减重要度、按dedupThreshold去重/合并相似条目、超ttlDays且重要度低于minImportance就过期删除。
偏好记忆 PreferenceMemory:一个永不过期的字典
Map<String,String> data // 如 {"喜好": "川菜", "姓名": "张三", "语言": "中文回复"}
- 存的是画像型键值对,key 稳定、value 被覆盖更新,不会衰减、不会过期。
- 回忆靠精确命中:
buildContext()直接把全表拼成"【用户偏好】\n喜好: 川菜..."注入 Prompt,不做向量检索。 - 写入靠规则提取:
extractAndSave()识别"我喜欢.../我叫..."这类句式自动提 key-value,也可以save()/saveBatch()直接写。
2. 举例
| 用户说了 | 进哪 | 怎么用 |
|---|---|---|
| "我喜欢用深色主题,代码用 Java 17" | 偏好记忆:{主题: 深色, Java版本: 17} |
之后每次回答默认按这个风格,不用再问 |
| "昨天我们把订单超时逻辑改成了 30 分钟" | 长期记忆:MemoryItem{content:"订单超时改为30分钟", importance:0.8, ...} |
下次问"超时是多久"时向量召回这条;几个月不用会衰减遗忘 |