状态与记忆、规划变体与框架映射

短期状态 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