首页 / 文章

构建能够在对话结束后仍保留数据而不造成数据积压的智能体内存。

一种针对智能体的三层内存设计:让会话状态自动失效,保持长期记录的规模较小且可编辑,并获取最新的实时数据。此外还包括多智能体交接失败的处理机制。

发布者:REACTAPP.TOP阅读约 9 分钟1983 词

来源: Building Agent Memory That Survives the Conversation (Without Storing Everything)

几乎每个投入实际使用的智能体都会经历这样的场景。

周一时,有用户表示自己负责西北地区的工作,只关心正在推进的项目,无法忍受冗长的回复。智能体回应“明白了”,在接下来的对话中便始终保持简短回复、仅讨论西北地区的相关内容且不提供草稿。用户对此很满意。

周二,同一位用户开启了新的聊天窗口,询问项目进展如何。智能体愉快地询问对方想了解哪个地区的状况。

那位用户脸上的表情,正是让我们不得不认真思考记忆问题的原因。

为何全量保存行不通

几乎所有开发者都会采用同样的解决办法:将整个对话记录下来,明天再重新加载。这看似理所当然,实则是个陷阱。它的失败恰恰比大多数教程更能体现智能体设计的要点。

假设完整的历史记录会被保存下来,每当用户返回时都会被重新加载。这样一来,事情的发展就会按照可预测的顺序进行。

第一周,一切正常。智能体确实记住了所有内容,你也觉得自己很聪明。但这是危险的阶段,因为这似乎在印证设计的正确性。

第三周,系统变得缓慢且成本高昂。现在每一轮对话都需要处理数千个旧聊天记录的标记。你在回答周五的问题时,实际上是在为周一的闲聊付出代价。上下文窗口就像智能体的办公桌,而在开始今天的工作之前,它已经被上周的文件堆得满满当当。

第六周,情况开始变糟。没人会提醒你这一阶段会出现的问题。旧对话中的一些说法早已不再属实。该用户此前一直负责西北地区的工作,直到一次晋升让他掌管整个国家的事务。项目也一直延期,直到最终交付。重新回放所有内容会让智能体同等重视过时与当前的事实。问题不再在于它记得太少,而在于它记得太多,却无法区分哪些信息已经过时。

实际上,重新回放完整历史记录就相当于在制造过时的上下文。因此,“我该如何保存所有内容?”从来都不是正确的问题。真正需要考虑的是:

哪些内容值得保留,哪些需要在需要时再获取,又哪些应该被丢弃并重新生成?

答对了这些问题,记忆架构自然就明确了。

三层设计

将其与你在工作中处理信息的方式作比较。有些内容会在会议期间记在脑中,之后便愉快地忘掉;有些则会被写在笔记本上,因为下个月还会用到;还有些内容根本不会被记住,因为它们会不断变化,每次都需要重新查看。处理人员也需要同样的三层结构。

第一层:会话内存,注定要被清除

这一层存储与当前对话相关的所有内容:消息历史、中间工具的运行结果、未完成的多步骤任务,以及在不同节点间传递的LangGraph状态。

当会话结束时,这一层的内容就会被清除。这并非保存失败,而是其设计初衷——主动消失,而这正是一项功能优势。

初学者会因此感到内疚,其实没必要。对话的详细记录类似于会议记录:重要的不是文字内容,而是得出的结论。因此有趣的问题是,当一次对话结束后,哪些内容会被提升为二级信息。

不是文字记录。通过一个简单的明确提取步骤,可以划分出三类内容:

  1. 关于用户的稳定事实,例如“负责西北地区”,该状态在未被撤销前有效。
  2. 偏好设置,例如“希望得到简短回答”和“排除草稿项目”。
  3. 决策结果,例如“同意采用每周总结的形式”。

那次周一的对话可能长达四千个标记。而值得保留下来的只有大约四十个结构化事实标记,压缩比例约为百倍。与摘要不同,重要信息不会被模糊处理,因为你提取的是具体的类别名称而非整体印象。摘要会悄悄忽略某些约束条件,而提取法则是解决方案:某个偏好要么完整地出现在列表中,要么不会出现,而且你可以为此编写测试。

第二层级:长期记忆,规模小、结构化且可编辑

这就是会在不同会话之间持续存在的紧凑存储空间,也就是用户的笔记本。不要试图耍小聪明。正是这种乏味的格式让它能够发挥作用:

{
  "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接收的是结论,而非通往结论的复杂过程。那些被归类为“已归档项目”的错误已无法被处理,因为被放弃的想法在被纳入需求列表后根本无法存续。

在任何多智能体设计中都应遵循这一原则:智能体之间应传递结论,而非完整的对话记录。

本周需执行的检查清单

针对现有智能体可做出的五项决策:

  1. 让会话记忆消失。在会话结束或经过N轮对话后添加一个提取步骤,仅保留事实、偏好和决策信息,其余内容则随对话一同消失。
  2. 将二级数据保持为枯燥的JSON格式。仅包含离散项、时间戳以及替换性更新内容,绝不能形成不断扩大的文本块,也绝不能仅支持追加操作。
  • 为用户提供了解信息的途径。哪怕只是一个简单的“您还记得我哪些信息?”的提问方式,也能建立信任,并免费帮用户发现过时的信息。
  • 对与世界相关的事实进行二级审核。任何工具能够获取的最新信息,如状态、数量、日期和数值等,都应被替换掉。用户的记忆用于存储个人相关内容,而工具则用于处理世界层面的信息。
  • 在交接时传递明确结论。使用包含任务、要求和限制条件的结构化数据。如果交接的内容只是原始记录,那就意味着你已经出现了上述问题,却尚未察觉。
  • 核心要点

    认为记忆意味着存储更多信息,这种想法完全错了。从那些试图解决“周二遗忘症”的方法,到过时的信息,再到归档的项目报告,所有这些问题都源于过于粗心大意地囤积过多信息。

    优秀的智能体记忆能力很大程度上体现在“遗忘”的技巧上。会话状态可能会消失,长期记录则保持简短以便一目了然,而外界提供的任何新信息都不会被记住。那些给人以真实个人感觉的智能体并非那些能记住一切的,它们只记住恰到好处的四十个标记。