记住事实、记住经历、记住规则:Agent记忆的完整设计思路与代码实现!
5.5 长期记忆管理与持久化
在前面几节内容中我们介绍了短期记忆的底层机制以及消息列表的管理策略。从本节开始,我们将把目光转向长期记忆——它解决的是一个短期记忆根本无法触及的问题——如何让 Agent 在不同的对话会话之间也能记住用户。为了能更加深刻地理解长期记忆,下面我们先来看人类是如何描述长期记忆的。
5.5.1 人类的长期记忆模式
人类的记忆像是一个包罗万象的信息库,自然而然描述记忆的方式就多种多样。尽管研究者们对不同记忆类型的描述并非总是相同,但一些关键概念已经逐渐形成共识。在日常生活中各种形式的记忆有时会相互重叠,因此也被归纳为几大类。持续时间很短的记忆可以称为短期记忆,这个我们在前面的内容中已经介绍过,而任何被保存下来以便日后回忆的信息都可以称为长期记忆。对于人类的长期记忆来说,主要可以分为如下3个类别:
(1)情景记忆
当一个人回忆起过去经历的某个特定事件(或“片段”)时,这就是情景记忆(Episodic Memory)。这种长期记忆能够唤起人们对各种细节的关注,从小时候的特殊经历到二十分钟前与人交谈时的感受等等,它可以是近期发生的也可以是几十年前的。
(2)语义记忆
语义记忆(Semantic Memory)是人们长期储存知识的一种方,它由各种信息组成,例如在学校学到的事实、概念的含义及其相互关系或者某个特定词语的定义等,例如现在是哪一年、中国的首都是哪里、“机器学习”的含义是什么。
(3)程序性记忆
程序性记忆(Procedural Memory)指的是对如何做事(包括生理和心理方面)的长期记忆,它参与了技能学习的过程,包括从习以为常的基本技能到需要大量练习才能掌握的技能。例如多年未骑自行车后,再次坐上车却能立刻想起该怎么做,这就是程序性记忆的典型例子。
5.5.2 智能体认知架构
与短期记忆按 thread_id 隔离不同,长期记忆存储在自定义命名空间下,它可以跨任意会话被读取和写入。不过,长期记忆的设计没有放之四海而皆准的标准答案,所以,在动手实现之前通常需要先回答两个问题,即“要存什么类型的记忆?” 和“什么时候写入记忆? ”。这两个问题的答案决定了整个长期记忆系统的架构设计。
LangGraph 在设计 Agent 的记忆系统时,借鉴了心理学对人类记忆的分类方式。根据存储内容的不同,长期记忆可以分为3种类型,如表5-1所示。
从表5-1可以看出,语义记忆、情景记忆和程序记忆这样的类型划分方式,恰好也能够满足对于智能体长期记忆的归纳和管理,而采用这样的架构设计也被称之为语言智能体认知架构(Cognitive architectures for language agents, CoALA)[2],如图5-7所示。
如图5-7所示,它展示了一个典型的智能体记忆系统架构,于2024年由普林斯顿大学所提出。CoALA 借鉴了人类认知科学中的记忆分类方式,将智能体的记忆划分为程序记忆、语义记忆和情景记忆以及工作记忆(短期记忆)4个部分。
在智能体运行过程中,外部环境会持续向智能体提供观察,短期记忆则负责对当前任务的状态进行临时存储与推理,智能体通过检索不同类型的记忆,结合决策过程生成对应动作,并与数字世界、物理世界以及对话场景进行交互。同时,系统还能将新的经验反向写入长期记忆中,从而实现动态学习与持续进化。整个架构体现了现代 AI 智能体从“单次生成”向“具备长期记忆与自主学习能力”的重要演进方向。
5.5.3 语义记忆
语义记忆用于存储关于用户、组织或其他实体的具体事实、规则和结构化信息,最典型的应用场景就是个性化信息,让 Agent 记住用户的姓名、年龄、偏好、工作等个人信息,从而使智能体具备知识检索与持续学习的能力。
在具体实现上,语义记忆有两种存储方式,用户画像和记忆集合 [4]。
(1)用户画像
用户画像(Profile)把所有需要记住的信息维护成一份可持续更新的 JSON 文档,原理如图5-8所示。
如图5-8所示,当用户和大模型在交互过程中有新的息产生时,旧的用户画像和新的信息将会一同被传给大模型,让模型生成更新后的用户画像。可以看出,这种方法的优点是信息集中、上下文完整;但缺点也很明显,随着画像内容大增加更新过程会很容易出错,也容易丢失细节,可能需要拆分文档或使用严格解码来确保 JSON 格式有效。关于用户画像的详细记忆示例可以参见 Code/Chapter05/profile_memory.json 文件。
(2)记忆集合
记忆集合(Collection)把每条记忆单独存储为一个文档,随着交互不断追加新的文档,原理如图5-9所示。
如图5-9所示,记忆集合由多个相互独立的记忆片段组成列表,其优点是每条记忆粒度小、不容易丢信息,如果是新产生的信息则更简单,只需要在列表中新加入一条内容即可;缺点是模型在删除或更新旧条目时会变得复杂(容易发生过度插入或过度更新),此外分散的片段可能导致模型缺乏对记忆之间关系的全局理解。
这里过度插入指模型有可能错判当前信息为新的信息而直接插入导致记忆间出现有冲突;过度更新则是指模型表现过于“积极”,在处理新信息时,会错误地覆盖或修改原本不该变动的现有记忆。对于这类问题,可以借助像 Trustcall [5] 这样的工具包来更精确地管理记忆的增删改查逻辑。关于记忆集合的详细记忆示例可以参见 Code/Chapter05/collection_memory.json 文件。
总结起来就是,如果用户信息相对固定、字段清晰可预设(如偏好语言、常用工具),用户画像是更简洁的选择;如果信息随时间持续积累、难以预设所有字段,记忆集合的扩展性则更好。
5.5.4 情景记忆
情景记忆中存储的不是事实,而是侧重于 Agent 过去执行任务的经历(操作序列)和结果。情景记忆最常见的实现方式是少样本示例(Few-shot Examples),把历史上成功的输入输出案例存储起来,在新任务到来时检索出最相关的案例放入提示词中来引导大模型模仿预期的行为,使系统能够基于过去经验进行决策优化。
总结起来就是,情境记忆让智能体能够通过看到过去具体成功的案例或交互序列来学习复杂的任务处理模式,从而在面对相似场景时提供更准确、更符合预期的表现。
5.5.5 程序记忆
程序记忆主要负责保存模型的能力与执行规则,包括大语言模型本身以及智能体的代码逻辑,它决定了智能体执行任务、调用工具以及进行决策的行为方式。在现代 AI 智能体系统中,程序记忆通常由系统提示词、智能体代码以及大模型权重共同构成,其中模型权重中蕴含着通过大规模预训练或微调获得的隐式知识,例如语言理解、推理能力和任务执行模式;而智能体代码、提示词等则包含显式知识,用于定义工作流程、工具调用、检索逻辑以及决策规则等内容。
与语义记忆或情景记忆不同,程序记忆通常需要在系统初始化阶段由开发者预先设定。例如,智能体启动时所加载的提示词、智能体工作流代码以及模型本身,这些都是其程序性记忆的重要组成部分。同时,修改程序记忆往往具有更高的风险,错误的提示词、代码逻辑或模型更新,可能导致智能体行为偏离预期,甚至引发系统漏洞。因此,在工业级 AI 系统中,通常会尽量保持代码层的确定性与稳定性,而将灵活性更多交给大语言模型的推理过程,以平衡系统的可控性与适应能力。
5.5.6 记忆写入方式
在清楚存什么记忆以后另一个重要的设计决策就是什么时候写入记忆。根据提供的来源或之前的对话,写入记忆在智能体架构中被视为一种学习行为,即将信息从短期记忆或外部观察持久化到长期记忆中。在 LangGraph 等框架中,长期记忆的写入主要有两种方式,其原理示意如图5-10所示。
在图5-10中,左右两边分别是热路径写入和后台写入的原理示意图,他们各自具有不同的优缺点和应用场景。
(1)热路径写入
热路径写入 (In the Hot Path)的原理是在智能体运行的过程中实时创建记忆。智能体在响应用户之前,会先通过推理决定哪些信息值得记住,并立即将其写入存储库。热路径写入的优势在于即时性和透明性,新生成的记忆在接下来的下一次交互中立即可用,同时用户也可以清楚地看到智能体正在“记住”某些信息 [3]。例如,如果留心观察的话在使用 ChatGPT 的过程中,网页右侧偶尔就会有一个“记忆已更新”的提示。后续,我们主要用到的也将是热路径写入……
更多推荐


所有评论(0)