Agent为什么需要记忆?
LLM(大语言模型) 是 Agent 的大脑, 它是一个非常聪明的天才, 但是它没有记忆, 你问了它上一句, 回复之后都忘掉了, 鱼的记忆有 7 秒, 但是大语言模型的记忆只有 0.0001 秒…… 关键概念 :
- 无状态: 你给它一段输入, 它算下段输出, 算完就忘
- 上下文窗口: 如果你想让你的模型带有记忆, 你可以给它加上下文窗口(就是加载之前的记忆), 但是模型最多一次只能看固定的上下文长度, 它是按照 token 来计算的, 如果 token 过长之前的内容会被挤出去, 部分失忆, 所以我们需要记忆 !
Agent 记忆四层架构
存储结构
- 向量存储:用于相似性检索的记忆表示
- 分层结构:按时间或重要性组织的记忆层次
- 图存储:记忆间关联关系的图结构表示
- 记忆模式:不同类型记忆的存储范式
写入机制
- 触发时机:记忆写入的触发条件与时机
- 信息提取:从交互中提取关键信息
- 写入决策:决定哪些信息需要持久化存储
- 链接生成:建立记忆间的关联关系
记忆管理
- 遗忘机制:主动或被动遗忘不重要记忆
- 合并压缩:相似记忆的合并与信息压缩
- 记忆演化:记忆随时间的更新与演变
读取机制
- 检索测试:检索系统的评估与测试
- 检索增强:提升检索准确性的技术
- 排序与返回:检索结果的排序与返回策略
三种位置记忆
上下文记忆
存在当前输入窗口里面, 上下文记忆是临时的, 不可跨会话进行读取, 并且窗口大小是有限的, 每一次的对话都是一个更新
外部记忆
主要是体现在当前的这个数据库里(或向量数据库), 容量是无限的, 可以跨会话回答, 修改非常灵活, 可以直接操作并且执行 CRUD, 外部记忆通常是通过检索然后拼接到上下文当中的, 主要用来存储用户的画像和一些长期事实
外部记忆的四种主流形态:
- 检索式记忆: 将每条记忆做 embedding 存进向量库, 需要时按语义相似度检索 top-k 拼进上下文, 本质就是把 RAG 用在对话历史或者用户画像上
- 结构化记忆: 将记忆组织成键值对, 表, 图谱等结构, 适合精确, 可更新, 需要推理的关系场景中
- 摘要式记忆: 将有限的上下文记忆当内存, 将外部记忆存储当硬盘, 当会话变长的时候, 旧内容滚动摘要压缩成要点存档, 需要时再翻页召回, 这就是 MemGPT 的核心直觉
- 笔记式记忆: 让 agent 把重要的结论写入文件, 下次任务开始先读这份笔记, 这是编码式 agent 非常实用的方法
参数记忆
参数记忆一般是通过训练或微调实现来的, 成本比较贵, 但是参数记忆加载非常快, 容量由参数数量来决定, 相对固定
外部记忆的四个策略
write: 写什么, 何时写?
不是所有的对话都需要记忆, 只需要在对话当中抽取稳定的事实, 偏好 ,结论等, 给每条记忆重要性打分, 可以在会话结束的时候触发写入, 或者触发式(检测到某一段文字)来写入
read: 怎么找回?
检索记忆不能只看语义像不像, 而是靠三部分的因素去打分
- 相关性
- 新近度(他有多新, 多近被使用过)
- 重要性
update: 信息变了如何更新?
当新信息和旧的信息冲突时, 不能两个都存在, 需要进行修改, 然 llm 来判断应该如何处理(crud) 四种更新优化机制:
- 全量数据更新(当新信息与记忆库中的相似度小于 0.7 时,进行增量式更新)
- 更新现有记忆(相似度大于 0.8 时,更新记忆内容)
- 删除过时记忆(当记忆的重要性系数低于阈值时,自动删除)
- 不执行任何操作(信息已存在且完全相同时,可触发复习机制,提高该记忆的重要性权重)
forget: 为什么要主动忘记?
长期没有被命中的需要主动删除衰减, 不然数据库会越来越脏, 检索越来越差
做好离线整理
人不能把每件事情都塞进长期记忆, 如果内存中只添加不整理, 会越来越乱
反思 Reflection : 用 LLM 把一批零散观察提炼成高层洞见并存回记忆 睡眠时计算(「梦境」): 空闲时主动把上下文预先嚼碎(预摘要 / 预生成可能被问的 QA / 预整理) 后台自我评审 : 后台用 critic / verifier / 自动回归持续自查自纠