主题
04 · 记忆系统
「模型记得我」通常意味着应用把相关信息再次放进了请求。
三种不同的记忆
| 记忆 | 内容 | 存储位置示例 |
|---|---|---|
| 短期对话 | 当前任务的消息、工具结果 | 内存、会话表 |
| 任务状态 | 计划、已完成步骤、等待确认的动作 | Checkpoint、数据库 |
| 长期记忆 | 用户偏好、经确认的事实 | 用户资料表、可检索文档 |
任务状态和长期偏好不同。不能因为用户在某轮引用了一篇文章,就把文章中的内容永久当作用户事实。
最简单的持久化
对 普通聊天程序 可以保存完整 messages:
python
import json
from pathlib import Path
path = Path("conversation.json")
# messages 来自 chat.py;不要在公共目录保存敏感聊天
path.write_text(json.dumps(messages, ensure_ascii=False), encoding="utf-8")
restored = json.loads(path.read_text(encoding="utf-8"))这是学习示意,正式应用要校验格式、访问权限、数据期限。落盘不会让模型自动读到它,下次调用仍要传入 restored。
截断不能切断工具协议
对只包含普通文本的一问一答聊天,可以保留 system 和最近若干完整轮次。但对 Agent:
text
assistant: 请求工具 call_123
tool: 返回 call_123 的结果这两者必须匹配。若只保留 tool 或只保留 assistant 工具请求,可能产生 API 协议错误。按完整轮次或完整工具事务裁剪,不要无脑 messages[-10:]。
摘要也会丢信息
滚动摘要适合保存目标、约束、已确认事实和完成步骤;原始文件、错误栈、精确数字则应保留来源索引,需要时重新取回。
摘要是模型生成的数据,不是新的高优先级指令。不要自动把网页摘要提升为 system 规则。
用户隔离与删除
持久化索引至少包含 user_id / session_id;授权身份由服务端确认,不信任前端自报的 user_id。用户 A 不应该通过猜 session_id 读到用户 B 的历史。
长期记忆应能查看、更正、删除。密钥、密码、临时授权码不进入记忆。记录来源和时间,过期结论不要永久有效。
动手设计
为「学习助手」画一份状态表:当前课程、已完成练习、最近一次错误、长期偏好。哪些是 session 级,哪些是 user 级?哪些需要用户确认再保存?
验收:能解释历史裁剪为何影响正确性,而不仅仅影响「模型记忆力」。