← 回到知识图谱
概念起步笔记

记忆

本文总结把聊天记录存下来很容易,难的是让下一次真的取回对的那条、而且是最新的那条。

创建 2026-10-29更新 2026-11-02阅读约 5 分钟
Agent记忆

本页是 Agent 核心 里“记忆”一支的展开。在 主线 的报销案里,记忆出现在两个地方:第 2 站拼上下文时,带入员工的长期偏好(常驻城市上海、默认成本中心);第 4 站推进任务时,维护短期状态(查到了哪些发票、走到哪一步、还在等谁确认)。

先区分保存对象

事实、目标、假设、用户偏好和模型建议,不能一股脑写进同一个“记忆”字段。它们各自要有来源、时间,更新规则也不一样。

类型 例子 来源 更新规则
事实 员工属于华东销售部 权威业务系统 以系统为准,定期同步,不由对话改写
偏好 报销单默认抄送助理 用户明确表达 用户可随时修改、删除
目标 这次要提一张打车报销单 当前请求 任务结束即归档
事件 上周提交过一张交通报销 工具结果 只追加,带时间
经验 发票号常被误读,需要二次核对 复盘总结 先作候选,验证后才生效
模型建议 “可能是同一行程” 模型推断 不作为事实写入

为什么要分这么细,看一个混在一起的后果:模型在某次对话里推测“INV-102 和上个月那张可能是同一行程”,这句话被当成事实存进了记忆。下次员工再报这张发票,系统读到这条“事实”,直接提示重复报销,把一张正常的单卡住了。模型建议要是单独标成一类、不当事实用,这种事就不会发生。

上下文再长也不等于持久化;存下来了,也不保证下次任务能正确取回。后面这件事跟 检索 和任务范围有关。

短期、长期与上下文

  • 短期记忆:当前会话或任务的工作状态。精确的值(金额 118.5 元、发票号 INV-102)放结构化状态,最近几轮保留原文,更早的内容做滚动摘要。它要存在会话级存储里,别放在进程内存里,否则服务一重启,员工刚确认过的草稿就没了。
  • 长期记忆:跨会话还会用到、而且用户允许保留的信息。精确查找放 KV 或关系库,语义查找放向量索引;每条都带上用户 / 租户、类型、来源、时间和过期时间。
  • 上下文:这一轮模型能看到的内容,由运行时从状态、记忆和检索结果里重新拼出来。记忆存的是和这个用户有关的信息,RAG 知识库存的是领域材料,上下文则是这一轮实际摆在模型面前的内容。

一条记忆的生命周期

  1. 写入:只在用户明确要求、任务结束、关键决策点写。写之前问三个问题:下次还用得上吗,敏感吗,确认过吗。员工随口说的“这周好忙”三个问题都过不了,不用存;“以后报销单都抄送我助理”三个都过得了。
  2. 读取:先按用户和作用域过滤,再按相关度、时效、重要性排序。注入上下文时标上来源和时间,让模型知道这条信息有多新、从哪儿来。
  3. 冲突:同一主题有新旧两个值时,优先级通常是“用户明确更正 > 权威系统 > 近期观测 > 模型推断”。旧值留作历史版本,不跟新值一起被召回。
  4. 遗忘:靠 TTL、重要性衰减、容量淘汰。用户要求删除时,存储和索引里都要真的删掉。

常见失败

  • 记忆污染:什么都存,无关或错误的内容被一遍遍召回,回答越来越偏。
  • 串用户:权限过滤放在检索之后,指望模型“自觉忽略”别人的数据。哪怕只漏一次,员工 A 就可能在回复里看到员工 B 的成本中心。
  • 摘要漂移:摘要再做摘要,推测慢慢被写成了事实。原来是“员工说可能是同一行程”,三轮摘要以后成了“同一行程”。对策是关键事实走结构化通道,原文能回查。
  • 间接注入:恶意文本被写进记忆,下次被当成可信上下文读出来。记忆内容要和指令分开标注。

一条记忆至少要有哪些字段

{"memory_id": "m-001", "tenant_id": "corp-a", "user_id": "u-42",
 "type": "preference", "key": "default_cost_center",
 "value": "B", "source": "user_statement@session-17",
 "confirmed": true, "created_at": "2026-10-20", "expires_at": null,
 "supersedes": "m-000"}

(字段为示意。)key 让同一主题能被精确覆盖;supersedes 指向更正前的那条(这里 m-000 里存的是 A);source 和 confirmed 告诉读取方这条信息能信到什么程度;expires_at 让临时信息到期自动退场。少了这几个字段,冲突处理、删除和审计都没法做。

怎么知道记忆做对了

记忆的问题往往要过几轮、甚至几天才冒出来,所以要专门测:

  • 召回正确:长对话回放里,后面的问题能不能用上前面确认过的事实。
  • 更新正确:更正以后用的是新值,旧值不再被召回。
  • 隔离正确:换另一个用户的身份提问,绝不能出现前一个用户的信息。
  • 遗忘正确:删除请求之后,存储、索引和缓存里都查不到。
  • 代价可控:每轮注入的记忆条数和 token 有上限,不会随着用的时间越来越长而无限增长。

面试里关于短期记忆、长期存储选型、压缩与 RAG 区别的逐题回答,见 Agent 核心 的“逐题作答 · 记忆”。

待验证

更正一条事实后,能不能既保留历史、又返回当前值,并且不拿旧记录当新答案的依据?

在报销案里可以这样测:先告诉助手“我的成本中心是 A”,再改成“是 B”,之后提单时检查工单里用的是 B,同时历史里还能查到曾经是 A、什么时候改的。

这是一篇可以继续生长的笔记。沿着关系继续阅读 ↗