Agent的长期记忆

什么是长期记忆

长期记忆是指 Agent 能够跨会话、持久化存储并按需检索的信息,用于跨会话的知识积累、个性化、用户画像等,具有长期价值,通常经过提炼、结构化,并可能用于检索增强(RAG)等机制。他的主要作用是:

  1. 个性化服务:记住用户偏好、历史行为、身份信息等。
  2. 知识积累:存储学到的经验、事实、操作流程等。
  3. 上下文扩展:通过检索补充短期记忆的不足。
  4. 持续学习:支持 Agent 在多次交互中不断优化策略。

OpenClow长期记忆的实现

1:长期记忆

  • 长期记忆通过MEMORY.md来实现的,这里主要是存储高价值、持久化的事实与偏好。
  • MEMORY.md会被自动注入到每次对话的系统提示词中!也就是说,OpenClaw每次开始新对话时,都会先“翻看”这个文件。但有个限制:它被截断到200行之后就不再显示了(为了控制系统提示词大小)。所以 MEMORY.md应该保持精简,把最重要的信息放在前面。

每日记忆:memory/日期.md里面存储每日的笔记,适用于比较低频、细节化的日常交互。例如某天具体写了哪段代码、聊了什么琐事。这些细节不会都记录到核心的长期记忆(防止过载),但在需要时可被追溯。

2:每日记忆

  • 每日记忆:memory/日期.md里面存储每日的笔记,适用于比较低频、细节化的日常交互。例如某天具体写了哪段代码、聊了什么琐事。这些细节不会都记录到核心的长期记忆(防止过载),但在需要时可被追溯。

3:记忆写入时机
3.1:Agent 主动写入(LLM 决策)

  • 用户显式要求:用户说“记住我偏好 TypeScript”
  • Agent 主动写入Agent 自主判断:Agent 在对话中认为某些信息值得保存,自行决定写入

agnets.md中的提示词:

plain
复制代码
写下来 —— 别指望“心里记着”! 人的记忆力是有限的——如果你想记住某件事,就把它写进文件里。 光靠脑子记(心理笔记)是扛不住会话重启的,但文件可以。 所以,当有人对你说“记住这个”的时候 → 请把它更新到 memory/YYYY-MM-DD.md 或者相关的文件中。 MEMORY.md - 你的长期记忆库 你可以随时在主要的会话中自由地读取、编辑和更新 MEMORY.md。 把那些重要的事件、想法、决定、观点以及吸取的教训都写进去。 这就是你精心整理的记忆——是提炼出来的精华,而不是原始的流水账。 随着时间的推移,记得回顾你的每日文件,并把那些值得保留的内容更新到 MEMORY.md 里。

3.2:Memory Flush 自动写入(LLM 决策)

  • Memory Flush 是 Compaction(上下文压缩)前的安全网——确保在激进的上下文裁剪之前,重要信息已被保存。触发条件

相关提示词:

plain
复制代码
当前会话即将触发自动压缩;请将那些持久化的记忆内容保存到磁盘上。 只将持久化记忆存储在 memory/YYYY-MM-DD.md 文件中。 在此次刷新期间,请把 MEMORY.md、DREAMS.md、SOUL.md、TOOLS.md、AGENTS.md 这些文件视为只读状态(即不要修改它们)。 如果没有需要存储的内容,请直接回复 NO_REPLY。

4:日记忆到长期记忆的晋升完全依赖 Agent 自主判断

  1. 对话中直接写入:Agent 在主会话中可以自由读写 MEMORY.mdAGENTS.md 模板明确指导:"You can read, edit, and update MEMORY.md freely in main sessions"。当 Agent 认为某条信息足够重要时,可以跳过日记忆,直接写入长期记忆。
  2. 心跳维护:AGENTS.md 模板建议 Agent 在心跳(Heartbeat)期间定期回顾日记忆并更新 MEMORY.md
plain
复制代码
🔄 记忆维护(在心跳期间) 每隔一段时间(比如几天一次),利用心跳周期来执行以下操作: 浏览最近生成的 memory/YYYY-MM-DD.md 文件。 找出那些值得长期保留的重要事件、经验教训或灵感洞察。 将这些提炼后的学习成果更新到 MEMORY.md 中。 删掉 MEMORY.md 里那些已经过时或不再相关的信息。

这套默认机制的特点:灵活但不确定。Agent 可以根据语境自由判断哪些信息值得长期保留,但是否执行、何时执行、整理质量如何,完全取决于 LLM 的自主决策。

此套长期记忆的局限性

  1. 无论是 Agent 主动写入还是 Memory Flush 自动写入,写什么、怎么写、写多少,都完全由 LLM 在单次推理中自主决定。没有结构化的提取规则,没有强制的输出格式。不同的模型、不同的上下文长度、甚至同一模型的不同推理轮次,写入的内容可能完全不同。你告诉 Agent 自己的名字、城市和饮食偏好,Agent 可能只记住了名字,漏掉了其余两个——即使用户没有明确说“记住这个”。
  2. Memory Flush 本身是 Compaction 前的救济机制,但它只在上下文接近压缩阈值时触发。如果一次对话很短(未触发 Compaction),而 Agent 又没有主动写入,那么对话中的信息就不会被持久化。换句话说,Flush 只能保证“长对话压缩前不丢”,不能保证“短对话也能记住”。
  3. 无论选择哪条晋升路径,日记忆向 MEMORY.md 的晋升都存在不确定性:晋升完全依赖 Agent 在对话中或心跳期间自主决定是否整理日记忆。Agent 可能长期不回顾,也可能整理时遗漏重要信息——没有任何机制保证晋升一定发生。

长期记忆框架mem0

添加记忆(add)

  1. 信息提取:利用 LLM(如 DeepSeek、GPT)从对话中自动识别关键事实(如“我喜欢Coding”)。
    主要提取---> 1、用户偏好和习惯 2、任务执行中产生的关键结论和决策
  2. 冲突检测与合并:新记忆与已有记忆比对,自动处理矛盾(如先说“喜欢Coding”,后说“讨厌写代码”)。
  3. 结构化存储:
    ● 内容被向量化并存入向量库;
    ● 实体和关系被提取并存入图数据库;
    ● 支持附加元数据(如 category: movies, importance: high)。

检索记忆(search)
检索时机 :
1、【主动检索】任务开始前,用当前任务的描述去检索相关记忆,把结果注入system prompt 作为背景知识。
2、【被动触发】 Agent 在推理过程中,判断当前步骤需要某类特定知识时,主动发起检索(把「查记忆」封装成一个 Tool,让 Agent 自己决定什么时候调)

  1. 查询理解:LLM 对用户问题进行语义优化。
  2. 多路检索:
    ● 向量搜索:基于语义相似度召回相关记忆;
    ● 图查询:根据实体关系扩展上下文(如“谁是蜘蛛侠?” → “彼得是蜘蛛侠”)。
  3. 结果排序:综合相关性、时效性、重要性等维度返回最匹配的记忆。

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
K弟
下载 APP