LLM无状态导致Agent缺乏连续性和个性化,需要四层内存系统(持久存储、相关性检索、生命周期管理)来解决。
语言模型是无状态的——对话一结束,它就会忘记一切。对于一个需要长期为同一批人工作的 Agent 来说,这是致命缺陷。
Agent Memory 正是解决这个问题的一层:它是一个独立于模型的持久化存储,负责记录发生过的事情,将其保留到 context window 之外,并在需要时把相关内容重新提供给模型。
它由四种记忆和一个不断重复的循环构成——一旦理解了这个结构,你就会发现,所有记忆系统都只是它的不同变体。
语言模型经过一次训练后便会被冻结。每个请求都由模型独立回答,除了当前 context window 中恰好包含的内容,它不会保留此前发生过的任何事情。关闭会话后再重新打开,模型甚至不知道自己曾经与你交谈过。
对于一次性问题,这没什么影响。但对于 Agent——一种需要长期为同一批人、在同一领域中处理相关任务的系统——这就是致命缺陷。
没有连续性——每个会话都从零开始;Agent 会反复询问你已经告诉过它的信息。
无法学习——纠正不会被保留下来;下次会话中,它还会犯同样的错误。
无法个性化——Agent 无法适应任何人,因为它什么都不会保留。
记忆是一个独立于模型的持久化存储。它记录发生过的事情,将其保留到单个 context window 的生命周期之外,并在再次需要时,把相关内容重新放回 context。模型本身仍然是无状态的;真正记住信息的是模型周围的系统。
有一种很诱人的捷径:把全部历史记录塞进每一个 prompt。但这种做法会同时遭遇三个问题:context window 存在上限,你迟早会用完;随着每轮对话都要重新发送所有内容,成本会持续增长;而且面对庞大的 context,模型很难有效关注深埋其中的信息。
记忆之所以要成为独立组件,正是为了让 Agent 的 context 中只保留少量相关事实,而不是它的全部过去。
模型是无状态的。记忆就是状态。
“记忆”并不是单一的东西。Agent 需要多种彼此不同的记忆,而混淆这些记忆,正是大多数记忆设计错误的根源。
这一领域借用了人类认知中的术语,因为相同的约束往往会催生相同的解决方案。
工作记忆(Working memory)——Agent 当前正在持有的内容:当前任务和最近几轮对话。它就是 context window。
情景记忆(Episodic memory)——与时间相关的具体过往事件,例如:“用户在上周二报告了这个问题。”
语义记忆(Semantic memory)——从经验中提炼出来的一般性事实,例如:“这位用户偏好简洁的回答。”
程序性记忆(Procedural memory)——做事的方法:技能和工作流,通常保存在 instructions 和 tools 中。
所有记忆系统,本质上都是围绕无状态模型运行的同一个循环:一次交互发生后,从中提取某些信息;将提取结果存储起来;之后再将其检索出来;Agent 使用这些信息;系统还会定期对存储内容进行整合和裁剪。
# writing (after an interaction)
memories = extract(conversation)
store.add(memories) # with subject, type, time, source
# reading (at the start of the next one)
relevant = store.retrieve(subject=user, query=now, top_k=5)
answer = agent(prompt(now, relevant))
免费的《Agent Memory 快速入门》——用短短几页介绍四种记忆以及完整循环,包括存储、检索、反思和遗忘。可免费下载。
从机制上看,为当前时刻检索正确的记忆,本质上是一个 retrieval 问题——使用的正是与 RAG 相同的 pipeline。
对当前情境进行 embedding,找出最相近的记忆,并视情况进行 rerank。记忆系统额外引入的是时间:新近程度和重要性都会影响结果,因此昨天的纠正应该排在一年前随口说过的一句话之前。
如果你已经理解 retrieval,那么也就掌握了记忆系统中负责读取的那一半。
记忆是现代 AI 工程中的一层。它是 context engineering 的关键信息来源之一,决定哪些内容进入 context window。
记忆的读取部分就是 RAG,只不过检索目标变成了 Agent 自己的过往经历。也正是记忆,让 Agent 从一个无状态的回答器,变成能够学习的系统。
掌握这个循环,你就掌握了让 Agent 给人一种“它了解你”之感的关键部分。
想进一步深入?《AI Agent Memory:完整指南》是一份完整参考资料——共 41 页、15 章、5 个附录,其中包含一个完整演示的客服 Agent 示例,以及一条为期 30 天的落地路径。获取这份指南。
它是一个独立于语言模型的持久化存储,负责记录过去交互中发生的事情,并在需要时将相关内容重新放入 context。
由于模型本身是无状态的,正是这套机制让 Agent 能够跨会话记住信息。
因为语言模型是无状态的——每个请求都被独立处理,除了当前 context window 中包含的内容,模型不会记得此前的请求。
关闭会话后,模型不会保留任何信息。记忆就是解决这一问题的外部层。
一共有四种:工作记忆,即 context window 中的当前任务;情景记忆,即过去发生的具体事件;语义记忆,即从经验中提炼出的一般性事实;程序性记忆,即完成事情的方法。
混淆这些记忆,是大多数记忆设计错误的根源。
记忆系统会使用 RAG。检索正确的记忆本身就是一个 retrieval 问题,使用的是同一套 pipeline。
但记忆还包括写入、整合和遗忘,而这些并不属于 RAG。RAG 只是记忆系统中负责读取的那一半。
长期来看不行。
context window 存在上限;随着每一轮都重新发送全部内容,成本会不断增加;而且模型无法很好地关注超大 context 中的信息。
记忆存在的意义,就是让 Agent 在 context 中只保留少量真正相关的事实。
如需采取进一步措施,你可以考虑屏蔽此人和/或举报滥用行为。