Skip to content

记忆概览

记忆是系统对过往交互信息进行记录和回溯的能力。对于 AI Agent 而言,记忆至关重要——它使 Agent 能够记住之前的交互、从反馈中学习,并适应用户的偏好。当 Agent 处理日益复杂的任务和大量用户交互时,记忆能力对于效率和用户满意度都变得不可或缺。

本概念指南基于回溯范围将记忆分为两类:

  • 短期记忆:线程作用域的记忆,通过维护消息历史来追踪当前对话。LangGraph 将短期记忆作为 Agent 状态的一部分来管理。状态通过 checkpointer 持久化到数据库中,从而使线程可以在任何时候被恢复。短期记忆在每次调用图或完成一步时更新,状态在每一步开始时被读取。
  • 长期记忆:存储跨会话的用户特定数据或应用级数据,在多个对话线程之间共享。它可以在任何时间任何线程中被回溯。记忆作用于任意自定义命名空间,而不限于单个线程 ID。LangGraph 提供 store 来保存和回溯长期记忆。

短期记忆

短期记忆使你的应用能够在单个线程或对话中记住之前的交互。线程在一个会话中组织多次交互,类似于电子邮件将消息归入同一对话。

LangGraph 将短期记忆作为 Agent 状态的一部分进行管理,并通过线程作用域的 checkpoint 持久化。此状态通常包含对话历史,以及其他有状态的数据,如上传的文件、检索到的文档或生成的产物。通过将这些数据存储在图的状态中,Agent 可以在保持不同线程间隔离的同时,访问给定对话的完整上下文。

管理短期记忆

对话历史是最常见的短期记忆形式,而长对话对当今的 LLM 构成了挑战。完整的历史记录可能无法放入 LLM 的上下文窗口,导致不可恢复的错误。即使你的 LLM 支持完整的上下文长度,大多数 LLM 在长上下文上的表现仍然欠佳——它们会被陈旧或无关的内容"分散注意力",同时伴随更慢的响应速度和更高的成本。

聊天模型通过消息来传递上下文,包括开发者提供的指令(系统消息)和用户输入(人类消息)。在聊天应用中,消息在人类输入和模型响应之间交替,形成一个随时间增长的消息列表。由于上下文窗口有限且消息列表的 token 成本高昂,许多应用可以使用手动移除或遗忘陈旧信息的技术来受益。

有关管理消息的常用技术,请参阅添加和管理记忆指南。

长期记忆

LangGraph 中的长期记忆使系统能够跨不同对话或会话保留信息。与短期记忆的线程作用域不同,长期记忆保存在自定义的"命名空间"中。

长期记忆是一个复杂的挑战,没有通用的解决方案。但以下问题提供了一个框架,帮助你在不同技术之间做选择:

  • 记忆的类型是什么? 人类使用记忆来记住事实(语义记忆)、经历(情景记忆)和规则(程序性记忆)。AI Agent 也可以以同样的方式使用记忆。
  • 何时更新记忆? 记忆可以作为 Agent 应用逻辑的一部分(如"热路径")进行更新,也可以作为后台任务异步生成。

不同的应用需要不同类型的记忆。以下是三种记忆类型的对比:

记忆类型存储内容人类示例Agent 示例
语义记忆事实在学校学到的知识关于用户的事实
情景记忆经历做过的事情过去的 Agent 动作
程序性记忆指令本能或运动技能Agent 的系统提示

语义记忆

语义记忆涉及对特定事实和概念的保留。对于 AI Agent,语义记忆通常用于通过记住过往交互中的事实或概念来个性化应用。

语义记忆可以通过不同方式管理:

个人资料(Profile)

记忆可以是单个持续更新的"个人资料",包含关于用户、组织或其他实体的范围明确且特定的信息。个人资料通常是一个包含各种键值对的 JSON 文档。

更新个人资料时,需要确保每次都是更新操作。你需要传入之前的资料,让模型生成新的资料或生成 JSON patch 应用到旧资料上。当资料变得越来越大时,这可能会变得容易出错,可以考虑将资料拆分为多个文档,或在生成文档时使用严格解码以确保记忆模式保持有效。

集合(Collection)

另外,记忆也可以是持续更新和扩展的文档集合。每个单独的记忆可以范围更窄、更容易生成,从而降低随时间丢失信息的可能性。LLM 为新信息生成对象,比将新信息与现有资料协调更容易。因此,文档集合在后续回溯中往往能实现更高的召回率

然而,这也将一些复杂性转移到了记忆更新上。模型现在必须删除更新列表中的现有项,这可能比较棘手。此外,有些模型可能默认倾向于过度插入,而另一些则倾向于过度更新。

使用文档集合还会将复杂性转移到记忆搜索上。Store 目前支持语义搜索按内容过滤

情景记忆

情景记忆涉及回溯过去的事件或动作。CoALA 论文对此有很好的阐述:事实可以写入语义记忆,而经历则可以写入情景记忆。对于 AI Agent,情景记忆通常用于帮助 Agent 记住如何完成某项任务。

在实践中,情景记忆通常通过少样本示例提示来实现——Agent 从过往的序列中学习如何正确执行任务。有时"展示"比"告知"更容易,LLM 从示例中学习效果很好。少样本学习让你可以通过提供输入-输出示例来"编程"你的 LLM。

需要注意的是,记忆 store 只是存储少样本示例的一种方式。如果你希望有更多的开发者参与,或让少样本示例与评估工具更紧密关联,你也可以使用 LangSmith Dataset 来存储数据,并实现你自己的检索逻辑来选择最相关的示例。

程序性记忆

程序性记忆涉及记住执行任务所使用的规则。对于 AI Agent,程序性记忆是模型权重、Agent 代码和 Agent 提示的综合体,共同决定了 Agent 的功能。

在实践中,Agent 修改自己的模型权重或重写代码的情况并不常见。然而,Agent 修改自己的提示则是比较常见的。

一种有效的方法是"反思"(Reflection)或元提示。这涉及向 Agent 提供其当前指令(如系统提示),以及最近的对话或明确的用户反馈。Agent 根据这些输入来优化自己的指令。这种方法对于难以事先指定的指令特别有用,因为它允许 Agent 从交互中学习和适应。

以下伪代码展示了如何实现程序性记忆更新:

python
from langchain.agents import create_agent
from langchain.agents.middleware import dynamic_prompt, ModelRequest


@dynamic_prompt
def reflective_prompt(request: ModelRequest) -> str:
    """根据最近对话动态调整系统提示。"""
    # 从状态中获取当前指令和先前的用户反馈
    previous_feedback = request.state.get("user_feedback", "")
    current_prompt = request.state.get("system_prompt",
        "You are a helpful assistant."
    )

    if previous_feedback:
        # 根据反馈调整提示
        return f"""{current_prompt}

Previous user feedback: {previous_feedback}

Please incorporate this feedback into your responses."""
    return current_prompt

agent = create_agent(
    model="claude-sonnet-4-6",
    tools=[get_weather, search_knowledge],
    middleware=[reflective_prompt],
)

下一步

本站为非官方中文学习站点,不代表 LangChain 官方。部分内容参考官方文档并重新整理为中文学习笔记。