短期状态 vs 长期记忆:各自存什么、何时读写
这一块解决的是:信息要一直塞在“当前对话上下文”里,还是放到某种长期记忆(向量库/数据库)里,什么时候该做哪个选择。
各自存什么:机制视角
可以先粗暴地把东西分两类:
| 类型 | 存在哪里 | 内容特点 | 生命周期 | 代价与风险 |
|---|---|---|---|---|
| 短期状态 | 上下文、会话内 state | 与当前任务强相关的中间结果、局部变量 | 只活在这次任务/这条链路中 | token 成本高,但易控制、不残留 |
| 长期记忆 | 向量库、知识库、DB | 多任务共享、可复用的事实或用户偏好 | 跨会话、跨任务 | 写入需审慎,一旦脏就长期污染 |
短期状态(short-term state)更像程序里的局部变量:
- 放:
- 当前子任务的目标
- 最近调用工具的输出
- planner 生成的当前计划
- 一些临时的约束(“这轮只查 2024 年数据”)
- 用:
- executor 再决策时直接读,不用重新从外部查
- 控制分支(if-else,循环计数、
step累加)
长期记忆(long-term memory)更像数据库/向量库:
- 放:
- 用户稳定偏好(“我默认用中文回答”“我常用城市是上海”)
- 可重复使用的事实总结(某个项目的调研结果、某份合同条款的 embedding)
- 对特定对象的画像(某客户的长期行为模式)
- 用:
- 新任务到来时,从向量库按 query 召回相关块,拼进短期上下文
- 帮助缩短对话:不用每次从头问偏好
具体例子:什么时候该写入长期记忆?
设想你做一个“个人理财助理”代理,用户连续几天对话:
- 对话 1:
用户:“以后和你聊股票时,默认我只想看 A 股,不看美股。” - 对话 2(第二天):
用户:“最近有什么科技股值得关注?”
如果你只用短期状态:
- 第一轮对话结束,所有信息都在那一轮的上下文里
- 第二天是新的会话,没有第一天的 token,上下文为空
- 结果:第二天回答科技股时,你可能推美股,违背用户偏好
如果你把偏好写入长期记忆:
- 对话 1 结束前,检测到“长期偏好”类信息
→ 写入向量库文档:
"用户股票偏好:只想看 A 股,不看美股。时间:2026-06" - 对话 2 开始时:
- 根据用户 ID 查询长期记忆
- 召回“股票偏好”这条
- 拼进 prompt 中:
“该用户有以下长期偏好:只看 A 股,不看美股。”
为什么这是长期记忆,而不是一直塞上下文?
- 会话跨天,旧上下文 token 早就丢了
- 即便你技术上能“加载历史全部对话”到上下文,会非常贵:
- token 成本暴涨
- 模型会被无关旧对话干扰
- 这条偏好对多个后续任务都有用(看大盘、选股、调仓),典型“跨任务可复用”
再反过来举一个不该进长期记忆、只适合短期状态的例子:
- 同一个理财助理,对话里用户说:
“这轮帮我查一下 2024 年的券商研报,重点看 Q3 季报。”
这条约束:
- 只对当前这次“查研报”的任务生效
- 过几天用户再来聊天,可能就不希望默认只看 2024 Q3 了
所以:
- 适合存在当前 agent loop 的短期状态里(
state.current_task.filter.year = 2024) - 不写入长期记忆,避免未来任务被“鬼约束”干扰
一个实用判断:
“几天后在另一个任务里,这条信息还应该自然地起作用吗?”
- 是 → 值得考虑写入长期记忆
- 否 → 只放短期状态
何时读写:时机与失败模式
写长期记忆的典型时机:
- 任务完成后,总结:
“这次关于 X 的研究结论是……”,写成结构化文档 + embedding - 检测到某类“元信息”:
- 用户自述长期偏好
- 静态事实更新(公司新政策、配置变动)
读长期记忆的典型时机:
- 接到新任务时:
先用用户 query + 上下文做一次向量检索,拿出相关记忆,拼进 prompt - 在 planner 规划时:
用记忆来影响策略,比如对某用户默认倾向保守投资方案
常见坑:
- 记忆过度:什么都写入,导致向量库充满噪音,召回结果乱七八糟
- 记忆污染:错误信息被当成“事实”长期存储,之后到处引用
- 隐私和合规:未经授权把敏感信息写入长期记忆,生产里是大雷
1 / 5