概念起步笔记
记忆
本文总结把聊天记录存下来很容易,难的是让下一次真的取回对的那条、而且是最新的那条。
创建 2026-10-29更新 2026-11-02阅读约 5 分钟
本页是 Agent 核心 里“记忆”一支的展开。在 主线 的报销案里,记忆出现在两个地方:第 2 站拼上下文时,带入员工的长期偏好(常驻城市上海、默认成本中心);第 4 站推进任务时,维护短期状态(查到了哪些发票、走到哪一步、还在等谁确认)。
先区分保存对象
事实、目标、假设、用户偏好和模型建议,不能一股脑写进同一个“记忆”字段。它们各自要有来源、时间,更新规则也不一样。
| 类型 | 例子 | 来源 | 更新规则 |
|---|---|---|---|
| 事实 | 员工属于华东销售部 | 权威业务系统 | 以系统为准,定期同步,不由对话改写 |
| 偏好 | 报销单默认抄送助理 | 用户明确表达 | 用户可随时修改、删除 |
| 目标 | 这次要提一张打车报销单 | 当前请求 | 任务结束即归档 |
| 事件 | 上周提交过一张交通报销 | 工具结果 | 只追加,带时间 |
| 经验 | 发票号常被误读,需要二次核对 | 复盘总结 | 先作候选,验证后才生效 |
| 模型建议 | “可能是同一行程” | 模型推断 | 不作为事实写入 |
为什么要分这么细,看一个混在一起的后果:模型在某次对话里推测“INV-102 和上个月那张可能是同一行程”,这句话被当成事实存进了记忆。下次员工再报这张发票,系统读到这条“事实”,直接提示重复报销,把一张正常的单卡住了。模型建议要是单独标成一类、不当事实用,这种事就不会发生。
上下文再长也不等于持久化;存下来了,也不保证下次任务能正确取回。后面这件事跟 检索 和任务范围有关。
短期、长期与上下文
- 短期记忆:当前会话或任务的工作状态。精确的值(金额 118.5 元、发票号 INV-102)放结构化状态,最近几轮保留原文,更早的内容做滚动摘要。它要存在会话级存储里,别放在进程内存里,否则服务一重启,员工刚确认过的草稿就没了。
- 长期记忆:跨会话还会用到、而且用户允许保留的信息。精确查找放 KV 或关系库,语义查找放向量索引;每条都带上用户 / 租户、类型、来源、时间和过期时间。
- 上下文:这一轮模型能看到的内容,由运行时从状态、记忆和检索结果里重新拼出来。记忆存的是和这个用户有关的信息,RAG 知识库存的是领域材料,上下文则是这一轮实际摆在模型面前的内容。
一条记忆的生命周期
- 写入:只在用户明确要求、任务结束、关键决策点写。写之前问三个问题:下次还用得上吗,敏感吗,确认过吗。员工随口说的“这周好忙”三个问题都过不了,不用存;“以后报销单都抄送我助理”三个都过得了。
- 读取:先按用户和作用域过滤,再按相关度、时效、重要性排序。注入上下文时标上来源和时间,让模型知道这条信息有多新、从哪儿来。
- 冲突:同一主题有新旧两个值时,优先级通常是“用户明确更正 > 权威系统 > 近期观测 > 模型推断”。旧值留作历史版本,不跟新值一起被召回。
- 遗忘:靠 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、什么时候改的。
这是一篇可以继续生长的笔记。沿着关系继续阅读 ↗