记忆系统不是越多越好,先分清短期和长期
补档说明:本文属于「AI 工程落地周记」系列,计划发布时间为 2025-08-03 14:30。当前先保留为草稿,后续补充真实案例、代码片段和复盘细节后再发布。
“给 AI 加记忆”这件事,从概念上特别诱人。因为只要系统记住更多,它看起来就会更像一个长期协作者。
但我这两年越做越明确的一件事是:很多记忆系统不是死于“不够多”,而是死于“什么都想记”。
用户偏好想记,最近对话想记,历史任务想记,工具执行结果想记,失败原因也想记。最后系统确实拥有了很多“记忆”,但它不知道哪些该短暂保留,哪些该长期沉淀,哪些根本不该写进去。
所以我现在做记忆系统,第一步不是选向量库,也不是先做召回,而是先把短期记忆和长期记忆的边界画出来。
两类记忆解决的不是同一个问题
短期记忆解决的是“当前任务别丢线”
它通常服务于一个会话、一个工单、一次执行流程。
重点是让系统记住当前目标、当前约束、刚刚发生过什么。
例如:
- 本轮会话已经确认的需求
- 当前任务进行到第几步
- 最近一次工具调用结果
- 这次生成失败的原因
这类信息通常有明显的生命周期,任务结束后价值会迅速下降。
长期记忆解决的是“以后还值得复用什么”
它服务的不是一次请求,而是跨会话、跨任务的持续协作。
重点不在完整,而在稳定。
例如:
- 用户长期偏好的表达风格
- 经人工确认过的业务规则
- 经常复用的知识片段
- 被验证过的历史结论
这类信息一旦写错,后面会持续污染很多次交互,所以更新门槛应该更高。
真正容易踩坑的是“把它们塞进同一个桶”
很多系统最开始会做成一个大而全的 memory store:
- 所有对话都进向量库
- 所有摘要都长期保留
- 所有用户行为都尝试抽取偏好
- 所有工具结果都可被未来检索
短期看起来信息越来越全,长期会马上出现三种副作用:
1. 召回越来越脏
系统每次都能“记起很多东西”,但不代表记起的是该用的东西。
2. 偏好和状态混在一起
“用户今天想写短一点”和“用户长期偏好短句风格”不是一回事。
如果混写,系统会把一次性的要求误当成长期人格。
3. 更新策略会失控
到底什么信息可以自动写入,什么需要人工确认,什么应该带 TTL,这些规则会越来越难解释。
我现在更喜欢三层结构
第一层:运行态记忆
只服务当前任务,带明显过期时间。
{
"scope": "run_state",
"ttl": "6h",
"content": {
"goal": "完成内容发布前检查",
"currentStep": "policy_review",
"lastToolResult": "risk=medium"
}
}
这层通常放在 Redis、任务表或者工作流状态里,不要求长期可检索,只要求恢复快。
第二层:任务级沉淀
沉淀这次任务里真正有复用价值的结论,但不直接等于长期用户记忆。
例如:
- 这类文章审核时最常出错的是引用来源
- 某个工作流在第 3 步最容易超时
- 某类 bug 的排查路径已被验证
它更像“经验摘要”,不是“个性画像”。
第三层:长期记忆
只写入那些跨任务稳定成立、并且最好经过确认的信息。
例如:
- 用户明确说过偏好怎样的写作语气
- 某个项目固定使用哪套输出格式
- 某个团队长期遵守的发布规则
这层写得越克制,后面越稳。
写入策略比检索策略更重要
很多人一上来先聊召回算法,我现在反而会先问:什么信息允许进入记忆?
我会给每类记忆加三个约束:
- 写入条件
- 生存周期
- 覆盖规则
例如:
短期状态:自动写入,任务结束自动失效
任务总结:模型生成后人工抽样确认
长期偏好:只有用户明确表达或人工确认后才能写入
只要这三条没定清楚,记忆越多,污染越快。
一个我现在很少再犯的错误
以前我也做过一种很“全能”的设计:每次对话结束都自动总结,再把总结写回长期记忆。
后面很快发现,系统会把很多一次性的上下文误记成长期事实。
比如:
- 用户今天临时要严肃一点
- 某次任务里临时禁用了一个工具
- 某个异常只是当天环境波动
这些都不应该变成长期记忆。
所以我后来改成了“短期自动写,长期谨慎写,长期覆盖必须有证据”。
什么时候你根本不需要长期记忆
不是每个 AI 产品都需要长期记忆。
如果你的场景是:
- 一次性问答
- 明确表单生成
- 低频工具调用
- 单任务执行后即结束
那很多时候短期上下文就够了。
强行上长期记忆,只会增加隐私、治理和召回噪音。
总结
记忆系统不是越多越好,真正重要的是先分清短期和长期。
短期记忆要服务当前任务的连续性,长期记忆要服务未来协作的稳定性。两者一旦混在一起,系统得到的不会是更聪明的记忆,而是更难治理的噪音。对大多数团队来说,先把写入规则和生命周期设计清楚,比先堆一座“大记忆库”更关键。
