代码语言
知识点思维导图
34 个知识节点
记忆系统(03) - Agent Memory:截断、总结、检索与生命周期
读完后,你应能完成以下任务:
- 绘制“记忆系统(03) - Agent Memory:截断、总结、检索与生命周期 / 模型本身没有会话记忆”的关键对象与数据流,解释“所谓“记忆”是应用完成的四件事:保存、选择、压缩、注入。”,并用源码位置、日志或 Trace 标注证据。
- 为“记忆系统(03) - Agent Memory:截断、总结、检索与生命周期 / 三种策略的真实边界”设计正常与异常输入,验证“截断时要保留完整消息对和工具调用对,不能留下孤立的 tool result。”,输出首个偏差位置与回归测试结果。
- 实现“记忆系统(03) - Agent Memory:截断、总结、检索与生命周期 / 检索”的最小代码或配置,检验“它能跨会话工作,但必须处理权限、过期、冲突、删除和写入质量。”,输出命令、结果与 Diff,并说明不适用边界。
更新日期:2026/08/11
一、模型本身没有会话记忆
LLM 每次调用只看到应用传入的上下文。所谓“记忆”是应用完成的四件事:保存、选择、压缩、注入。把全部聊天记录原样追加不是记忆系统,只是一个最终会超长、变贵并引入噪声的数组。
先按生命周期分层:
| 层级 | 典型内容 | 主键 | 保留策略 |
|---|---|---|---|
| 工作状态 | 当前计划、工具结果、待审批动作 | thread_id |
分钟到小时,TTL |
| 短期会话 | 最近消息、滚动摘要 | thread_id |
会话级,允许重建 |
| 长期语义 | 用户明确偏好、稳定事实 | user_id + namespace |
跨会话,可修改删除 |
| 情节记忆 | 某次任务发生了什么 | user_id + event_time |
衰减、合并或归档 |
| 审计日志 | 工具调用、审批和外部写操作 | trace_id |
按合规要求,不注入 Prompt |
审计日志不等于模型记忆。它可以永久留存以追责,但通常不应整段进入上下文。
二、三种策略的真实边界
2.1 截断
保留最近 N 条或最近一段 Token。它便宜、确定,但可能删掉第一轮的关键约束。截断时要保留完整消息对和工具调用对,不能留下孤立的 tool result。
2.2 检索
把长期事实拆成可检索条目,只在相关问题出现时召回。它能跨会话工作,但必须处理权限、过期、冲突、删除和写入质量。向量相似不等于事实仍有效。
三、按预算组装上下文
综合分数不能只看余弦相似度,可按业务定义为:
相关性 × 可信度 × 新鲜度 × 权限可见性
权限不可见应直接过滤为零;明确事实的可信度高于模型推测;被新事实覆盖的旧记忆应标记失效,而不是同时注入让模型自行裁决。
四、写入长期记忆的闸门
候选事实进入长期库前逐项判断:
- 用户是否明确表达,而非模型推断。
- 未来会不会复用,临时任务状态不应长期保存。
- 是否包含密码、Token、证件号等禁止持久化信息。
- 是否与现有事实重复或冲突。
- 是否能提供来源时间和删除入口。
“我以后都要中文回答”可以保存为偏好;“帮我把这段临时翻成英文”不能反推出用户永久偏好英文。
五、摘要的数据契约
不要只存一段自然语言,至少保存:
{
"thread_id": "thread-42",
"summary_version": 3,
"covered_until_message_id": "msg-180",
"goal": "排查支付回调重复入账",
"confirmed_constraints": ["不能修改历史订单"],
"completed_steps": ["确认回调存在重试"],
"open_questions": ["幂等键是否跨租户唯一"],
"source_message_ids": ["msg-001", "msg-180"]
}
这样才能增量更新、回溯来源和检测摘要遗漏。原始消息的留存期限可以与摘要不同,但删除策略要在产品和合规层明确。
六、验收指标
- 记忆命中率:需要的记忆是否进入上下文。
- 错误注入率:无关、过期或冲突记忆被注入的比例。
- 压缩保真率:摘要是否保留标注的关键事实。
- Token 节省率:相对全历史输入节省多少上下文。
- 删除传播时延:用户删除后,缓存、向量索引和副本多久不可检索。
- 跨用户泄漏率:必须为零,使用自动化权限用例持续验证。
七、常见错误
- 无限追加 messages,直到请求超出上下文窗口。
- 把所有对话摘要都永久保存,既污染召回又增加隐私风险。
- 只更新结构化记录,不删除旧向量,导致旧偏好仍能被召回。
- 把工具返回原文写入长期记忆,敏感字段和 Prompt Injection 一并持久化。
- 用“回答看起来正常”代替记忆命中、冲突、删除和权限测试。
八、总结
- 模型本身没有会话记忆:所谓“记忆”是应用完成的四件事:保存、选择、压缩、注入。
- 三种策略的真实边界:截断时要保留完整消息对和工具调用对,不能留下孤立的 tool result。
- 按预算组装上下文:被新事实覆盖的旧记忆应标记失效,而不是同时注入让模型自行裁决。
- 写入长期记忆的闸门:用户是否明确表达,而非模型推断。 -> 未来会不会复用,临时任务状态不应长期保存。 -> 是否包含密码、Token、证件号等禁止持久化信息。 -> 是否与现有事实重复或冲突。
- 验收指标:记忆命中率:需要的记忆是否进入上下文。
- 常见错误:把所有对话摘要都永久保存,既污染召回又增加隐私风险。
九、动手实践:Memory 三策略与 Token 预算
这段实验不调用模型,直接把同一段历史依次经过截断、摘要、长期记忆检索、预算选择,便于观察四个动作各自解决什么问题。
9.1 在线运行
零依赖,Python 3.10+ 可运行。页面中的“运行”使用同一份 main.py,结果不是预先写死的截图。
9.2 重点观察
- 截断只保留最近消息,因此会丢掉早期约束。
- 滚动摘要保留目标和约束,但不冒充原始证据。
- 长期记忆只召回与当前问题相关、未失效且属于当前用户的条目。
- 最终上下文受预算约束,低分或超预算条目不会注入。
9.3 可运行源码:Agent Memory:截断、总结、检索与生命周期
main.py
学完自测
选择所有正确答案;提交后逐项核对判断依据。