05. Agent Memory 应该如何设计?短期记忆和长期记忆怎么区分?
整理 Agent Memory 的设计思路、短期记忆与长期记忆的边界。
简单回答
Agent Memory 分为短期记忆和长期记忆。短期记忆就是当前对话的上下文(context window 内的信息),随着对话进行不断增长,通常需要做裁剪或摘要。长期记忆是跨会话持久化的信息(用户偏好、历史决策、任务经验等),存在外部存储中,需要时检索调用。设计的核心挑战是:短期记忆的上下文管理(有限窗口下保留关键信息)和长期记忆的检索准确性(存了很多但要能找到有用的)。
详细解释
为什么 Agent 需要 Memory
没有 Memory 的 Agent 每次对话都像失忆——用户上一轮告诉它"我的项目用 Python 3.11",下一轮它就忘了,又要问一遍。更重要的是,Agent 在执行多步任务时,前面步骤的结果和中间状态需要被记住,否则后面的步骤无法继续。
Memory 对 Agent 的作用类似于人的记忆系统:工作记忆(短期记忆)用于当前正在处理的信息,长期记忆用于存储过去的经验和知识。
短期记忆(Working Memory / Short-term Memory)
短期记忆在技术实现上就是当前对话的上下文——所有的用户消息、Agent 的回复、工具调用的结果、Thought 过程等,这些都在 LLM 的 context window 里。
短期记忆的核心问题是 context window 有限。一个复杂的 Agent 任务可能涉及几十轮 Tool Calling,每一轮的 Thought、Action、Observation 都要放进上下文。很快就会超出模型的最大 context 长度。
管理策略有几种。最简单的是 sliding window(滑动窗口)——只保留最近 N 轮的对话,更早的丢弃。缺点是可能丢失关键信息。
更好的做法是 summarization(摘要)——用 LLM 对历史对话做摘要,只保留摘要而不是原始对话。比如前 20 轮的对话被压缩成一段 200 token 的摘要,然后和最近 5 轮的原始对话一起放进上下文。这样既保留了历史信息的要点,又控制了上下文长度。
还有一种是 selective retention(选择性保留)——识别并保留"关键信息"(如用户的明确指令、重要决策、工具调用的关键结果),丢弃"不重要的信息"(如中间的试错过程、闲聊内容)。这可以用规则来做,也可以用 LLM 判断什么重要什么不重要。
在 Agent 的多步任务中,还有一种常见的做法是维护一个 scratchpad(工作区)——把任务的关键状态信息(如"已完成的步骤"、"待处理的步骤"、"收集到的中间结果")结构化地存储在一个专门的区域,每轮都带上。这比让 LLM 从冗长的对话历史中去"找"关键信息更高效。
长期记忆(Long-term Memory)
长期记忆是跨会话、持久化的信息。用户昨天告诉 Agent "我喜欢简洁的回答风格",今天再来对话时 Agent 应该还记得。用户上周用 Agent 完成了一个数据分析任务,这次来做类似的任务时 Agent 应该能参考上次的经验。
长期记忆的存储通常在外部——向量数据库、关系数据库或者键值存储。存储的内容可以是用户画像(偏好、习惯)、历史对话的摘要、任务执行的经验(什么策略在什么场景下效果好)等。
长期记忆的核心挑战不在存储而在检索——存了很多信息,但当前任务需要什么信息?检索不准确的话,注入了无关的历史信息反而会干扰 Agent 的当前决策。本质上这又是一个 RAG 问题——只不过检索的知识库是用户和 Agent 的历史交互,而不是业务文档。
记忆的写入和更新
什么信息值得写入长期记忆?不能把所有对话都写入,否则检索时噪声太大。通常的做法是用 LLM 做一轮"提炼"——在会话结束时,让 LLM 从对话中提取值得记住的信息(用户偏好、关键决策、重要事实),以结构化的形式存入记忆库。
记忆还需要更新和遗忘机制。用户的偏好可能变了,过时的信息应该被更新或淘汰。可以用时间衰减(越旧的记忆权重越低)、显式更新(新信息覆盖旧信息)等方式管理。
实际项目中的权衡
在很多实际项目中,长期记忆的投入产出比不如想象中高。实现一套靠谱的长期记忆系统——包括提炼、存储、检索、更新、遗忘——工程成本不低。对于大部分对话场景,做好短期记忆管理(对话历史摘要 + sliding window)已经能覆盖绝大多数需求。长期记忆更适合需要高度个性化、有长期用户关系的场景(如个人助理、心理咨询类应用)。
MemGPT 是一个比较有代表性的研究项目,它用操作系统中虚拟内存的思路来管理 Agent 记忆——把上下文窗口类比为"内存",把外部存储类比为"硬盘",通过 LLM 自主决定把什么信息"换入"和"换出"。思路很巧妙,但实际工程稳定性还有待提升。
面试时可以这样答
Agent Memory 分短期和长期两类。短期记忆就是当前对话的上下文,核心挑战是 context window 有限。管理策略包括滑动窗口、对话摘要、选择性保留关键信息,以及维护一个结构化的 scratchpad 来记录任务状态。
长期记忆是跨会话持久化的信息——用户偏好、历史决策等。存在外部存储里,需要时检索注入上下文。核心难点在检索——存了很多但要能准确找到当前任务需要的信息,本质上还是一个 RAG 问题。
写入长期记忆也有讲究,不能什么都存。通常是在会话结束时用 LLM 提炼出值得记住的信息,结构化存储。还需要更新和遗忘机制,避免过时信息干扰决策。
实际项目中我的经验是,做好短期记忆管理(对话摘要加滑动窗口)能覆盖大部分场景。长期记忆投入产出比取决于业务场景,个人助理类产品值得做,一般的工具类应用优先级不高。
常见追问
- 对话历史做摘要时,怎么保证关键信息不丢失?
- 长期记忆的检索和 RAG 的检索有什么区别?
- MemGPT 的思路你怎么看?工程上有什么挑战?