构建能够在对话结束后仍保留数据而不造成数据积压的智能体内存。
一种针对智能体的三层内存设计:让会话状态自动失效,保持长期记录的规模较小且可编辑,并获取最新的实时数据。此外还包括多智能体交接失败的处理机制。
来源: Building Agent Memory That Survives the Conversation (Without Storing Everything)
几乎每个投入实际使用的智能体都会经历这样的场景。
周一时,有用户表示自己负责西北地区的工作,只关心正在推进的项目,无法忍受冗长的回复。智能体回应“明白了”,在接下来的对话中便始终保持简短回复、仅讨论西北地区的相关内容且不提供草稿。用户对此很满意。
周二,同一位用户开启了新的聊天窗口,询问项目进展如何。智能体愉快地询问对方想了解哪个地区的状况。
那位用户脸上的表情,正是让我们不得不认真思考记忆问题的原因。
为何全量保存行不通
几乎所有开发者都会采用同样的解决办法:将整个对话记录下来,明天再重新加载。这看似理所当然,实则是个陷阱。它的失败恰恰比大多数教程更能体现智能体设计的要点。
假设完整的历史记录会被保存下来,每当用户返回时都会被重新加载。这样一来,事情的发展就会按照可预测的顺序进行。
第一周,一切正常。智能体确实记住了所有内容,你也觉得自己很聪明。但这是危险的阶段,因为这似乎在印证设计的正确性。
第三周,系统变得缓慢且成本高昂。现在每一轮对话都需要处理数千个旧聊天记录的标记。你在回答周五的问题时,实际上是在为周一的闲聊付出代价。上下文窗口就像智能体的办公桌,而在开始今天的工作之前,它已经被上周的文件堆得满满当当。
第六周,情况开始变糟。没人会提醒你这一阶段会出现的问题。旧对话中的一些说法早已不再属实。该用户此前一直负责西北地区的工作,直到一次晋升让他掌管整个国家的事务。项目也一直延期,直到最终交付。重新回放所有内容会让智能体同等重视过时与当前的事实。问题不再在于它记得太少,而在于它记得太多,却无法区分哪些信息已经过时。
实际上,重新回放完整历史记录就相当于在制造过时的上下文。因此,“我该如何保存所有内容?”从来都不是正确的问题。真正需要考虑的是:
哪些内容值得保留,哪些需要在需要时再获取,又哪些应该被丢弃并重新生成?
答对了这些问题,记忆架构自然就明确了。
三层设计
将其与你在工作中处理信息的方式作比较。有些内容会在会议期间记在脑中,之后便愉快地忘掉;有些则会被写在笔记本上,因为下个月还会用到;还有些内容根本不会被记住,因为它们会不断变化,每次都需要重新查看。处理人员也需要同样的三层结构。
第一层:会话内存,注定要被清除
这一层存储与当前对话相关的所有内容:消息历史、中间工具的运行结果、未完成的多步骤任务,以及在不同节点间传递的LangGraph状态。
当会话结束时,这一层的内容就会被清除。这并非保存失败,而是其设计初衷——主动消失,而这正是一项功能优势。
初学者会因此感到内疚,其实没必要。对话的详细记录类似于会议记录:重要的不是文字内容,而是得出的结论。因此有趣的问题是,当一次对话结束后,哪些内容会被提升为二级信息。
不是文字记录。通过一个简单的明确提取步骤,可以划分出三类内容:
- 关于用户的稳定事实,例如“负责西北地区”,该状态在未被撤销前有效。
- 偏好设置,例如“希望得到简短回答”和“排除草稿项目”。
- 决策结果,例如“同意采用每周总结的形式”。
那次周一的对话可能长达四千个标记。而值得保留下来的只有大约四十个结构化事实标记,压缩比例约为百倍。与摘要不同,重要信息不会被模糊处理,因为你提取的是具体的类别名称而非整体印象。摘要会悄悄忽略某些约束条件,而提取法则是解决方案:某个偏好要么完整地出现在列表中,要么不会出现,而且你可以为此编写测试。
第二层级:长期记忆,规模小、结构化且可编辑
这就是会在不同会话之间持续存在的紧凑存储空间,也就是用户的笔记本。不要试图耍小聪明。正是这种乏味的格式让它能够发挥作用:
{
"user_id": "u-2481",
"facts": [
{"fact": "manages Northwest region", "updated": "2026-08-03"},
{"fact": "prefers concise answers", "updated": "2026-07-19"}
],
"preferences": [
{"pref": "exclude draft projects from reports", "updated": "2026-08-03"}
],
"decisions": [
{"decision": "weekly summary every Monday", "updated": "2026-07-28"}
]
}
每位用户仅有几十行JSON数据,在每次会话开始时加载到上下文中。这些数据量很小,随时添加都不会造成负担。
有三条规则确保其正常运行。
结构化数据优于散文式描述。像“此人可能负责西北地区且喜欢简洁表达”这类模糊的描述日后毫无用处。相反,可以将不同的事实分开呈现,便于逐个向用户展示、修正或删除。
为所有内容添加时间戳,并采用替换而非追加的方式。当用户从负责西北地区转为负责全国业务时,不要在原有信息旁再添加新信息,而应直接覆盖它。一旦数据库中同时存在“负责西北地区”和“负责全国业务”这两条记录,就会引发带有数据库关联的旧状态问题,情况会更糟,因为这样的旧状态会永久存在。
让用户能够查看并修正这些信息。哪怕只是一个简单的“这是我记得的关于你的信息”指令,也能带来改变。用户无法查看的记忆最终会变成他们不信任的记忆,通常是在智能体满腔自信地陈述出数月前就已过时的信息时。
所有可以查询到的信息都不属于第二层级,它们属于第三层级,而团队往往会在这一层级上把精力浪费在错误的事情上。
第三层级:按需重新生成,刻意不进行记忆
所有会自动变化的信息都属于这一层级:项目状态、数据数值、日期、组织结构图、实时数字,以及数据库和API的内容。
规则是绝不能记住这一层级的内容。不要对其进行总结,不要将其存储在记忆库中,也不要从之前的对话中延续它。在需要时,智能体只需调用工具即可获取当前数值。
写下来看似乎很显然。但这其实是智能体记忆机制中最容易出问题的规则,因为将实时数据缓存为记忆看似是一种优化手段,实际上却是一颗引信很长的定时炸弹:
- 如果存储了“猎鹰项目已延期”这样的信息,而后来项目实际上已经完成,那么智能体就会持续数周都在谈论一个早已交付的项目。
- 如果存储了“团队有8名成员”这样的信息,而后又有两人加入,那么所有关于人数的回答都会出现偏差。
对整个架构最精炼的总结可能是这样:
用记忆来存储关于人的信息,用工具来处理其他所有方面的信息。
用户偏好很少改变,一旦有变化他们自己会告诉你。世界却在不断变化,却从不告知你任何信息。所以要记住用户,去向世界寻求答案。
一个失败案例:“共享一切”遇上多智能体系统
这是简化后的版本。实际上,这一方案的实现经历了一次事故,发生在一家网格服务公司虚构的由两个智能体构成的处理流程中。
智能体A负责与用户沟通并收集报告需求,而智能体B则负责生成报告。当A将工作交给B时,整个团队在更大规模上重犯了初学者的错误:他们把A的所有上下文、全部对话内容、所有工具的输出结果以及所有状态都一并移交给了B。这种做法看似逻辑严密,但更多的上下文真的就能让B做出更明智的决策吗?
它出错的方式恰恰是关键所在。在一次会话中,有用户对A智能体大声思考:如果把归档的项目也包含进去会怎样?但经过再考虑后,认为那样会扭曲总数,于是决定不加。这只是很平常的出声思考,而A智能体处理得当。
随后信息被转交,B接收到了完整的对话记录,包括那些偏离主题的内容。但B没有A智能体所掌握的对话背景信息来加以判断。消息内容中并未说明归档项目的想法已被否决,脱离上下文看它就像是一条指令。B如实地加入了归档项目,因此正式报告中的总数出现错误,而通过查看B的代码却找不到原因,因为B的代码本身没有问题。
以上内容的多智能体版本是这样的:任务交接即代表会话边界。当智能体B开始执行任务时,就意味着进入了周二的新聊天会话。团队犯的同样错误是“保存所有内容”,只不过是在不同智能体之间进行横向传递,而非在多日间进行纵向保存。
解决方案也是一样的。原本的转录文本传递方式被结构化的任务交接数据包所取代,实际上就是智能体A为智能体B准备的可一次性使用的二级数据结构。
{
"task": "generate weekly regional report",
"requirements": [
"region: Northwest",
"active projects only",
"exclude drafts AND archived"
],
"format": "summary table first, details after",
"constraints_confirmed_by_user": true
}
这大约有五十个无歧义的标记。B接收的是结论,而非通往结论的复杂过程。那些被归类为“已归档项目”的错误已无法被处理,因为被放弃的想法在被纳入需求列表后根本无法存续。
在任何多智能体设计中都应遵循这一原则:智能体之间应传递结论,而非完整的对话记录。
本周需执行的检查清单
针对现有智能体可做出的五项决策:
- 让会话记忆消失。在会话结束或经过N轮对话后添加一个提取步骤,仅保留事实、偏好和决策信息,其余内容则随对话一同消失。
- 将二级数据保持为枯燥的JSON格式。仅包含离散项、时间戳以及替换性更新内容,绝不能形成不断扩大的文本块,也绝不能仅支持追加操作。
核心要点
认为记忆意味着存储更多信息,这种想法完全错了。从那些试图解决“周二遗忘症”的方法,到过时的信息,再到归档的项目报告,所有这些问题都源于过于粗心大意地囤积过多信息。
优秀的智能体记忆能力很大程度上体现在“遗忘”的技巧上。会话状态可能会消失,长期记录则保持简短以便一目了然,而外界提供的任何新信息都不会被记住。那些给人以真实个人感觉的智能体并非那些能记住一切的,它们只记住恰到好处的四十个标记。