Skip to main content

概述

记忆是一个记录先前交互信息的系统。对于AI代理而言,记忆至关重要,因为它使代理能够记住先前的交互、从反馈中学习并适应用户偏好。随着代理处理更复杂的任务和大量的用户交互,这一能力对于效率和用户满意度都变得至关重要。 短期记忆使您的应用程序能够在单个线程或会话中记住先前的交互。
一个线程组织会话中的多次交互,类似于电子邮件将消息分组到单个对话中的方式。
对话历史是短期记忆最常见的形式。长对话对当今的LLM构成了挑战;完整的历史记录可能无法放入LLM的上下文窗口中,导致上下文丢失或错误。 即使您的模型支持完整的上下文长度,大多数LLM在长上下文上的表现仍然不佳。它们会因过时或离题的内容而“分心”,同时响应时间更慢,成本更高。 聊天模型使用消息来接受上下文,其中包括指令(系统消息)和输入(人类消息)。在聊天应用程序中,消息在人类输入和模型响应之间交替,形成一个随时间增长的消息列表。由于上下文窗口有限,许多应用程序可以从使用移除或“遗忘”过时信息的技术中受益。
需要对话记忆信息?使用长期记忆来存储和检索跨不同线程和会话的用户特定或应用程序级数据。

用法

要为代理添加短期记忆(线程级持久化),您需要在创建代理时指定一个checkpointer
LangChain的代理将短期记忆作为代理状态的一部分进行管理。通过将这些存储在图的状态中,代理可以访问给定对话的完整上下文,同时保持不同线程之间的分离。状态使用检查点持久化到数据库(或内存),以便线程可以随时恢复。短期记忆在代理被调用或步骤(如工具调用)完成时更新,并在每个步骤开始时读取状态。

在生产环境中

在生产环境中,使用由数据库支持的检查点:
有关更多检查点选项,包括SQLite、Postgres和Azure Cosmos DB,请参阅持久化文档中的检查点库列表

自定义代理记忆

默认情况下,代理使用AgentState来管理短期记忆,特别是通过messages键管理对话历史。 您可以扩展AgentState以添加额外字段。自定义状态模式通过state_schema参数传递给create_agent

常见模式

启用短期记忆后,长对话可能会超出LLM的上下文窗口。常见的解决方案有:

裁剪消息

移除前N条或后N条消息(在调用LLM之前)

删除消息

从LangGraph状态中永久删除消息

总结消息

总结历史中的早期消息,并用摘要替换它们

自定义策略

自定义策略(例如,消息过滤等)
这允许代理跟踪对话而不会超出LLM的上下文窗口。

裁剪消息

大多数LLM都有一个最大支持的上下文窗口(以令牌为单位)。 决定何时截断消息的一种方法是计算消息历史中的令牌数,并在接近该限制时进行截断。如果您使用LangChain,可以使用裁剪消息实用程序,并指定要从列表中保留的令牌数量,以及用于处理边界的strategy(例如,保留最后max_tokens条)。 要在代理中裁剪消息历史,请使用@before_model中间件装饰器:

删除消息

您可以从图状态中删除消息以管理消息历史。 当您想要移除特定消息或清除整个消息历史时,这很有用。 要从图状态中删除消息,您可以使用RemoveMessage 要使RemoveMessage工作,您需要使用带有add_messages 归约器的状态键。 默认的AgentState提供了此功能。 要移除特定消息:
要移除所有消息:
删除消息时,请确保生成的消息历史是有效的。检查您使用的LLM提供商的限制。例如:
  • 一些提供商期望消息历史以user消息开始
  • 大多数提供商要求带有工具调用的assistant消息后跟相应的tool结果消息。

总结消息

如上所示,裁剪或移除消息的问题在于,您可能会因消息队列的筛选而丢失信息。 因此,一些应用程序受益于使用聊天模型总结消息历史的更复杂方法。 摘要 要在代理中总结消息历史,请使用内置的SummarizationMiddleware
有关更多配置选项,请参阅SummarizationMiddleware

访问记忆

您可以通过多种方式访问和修改代理的短期记忆(状态):

工具

在工具中读取短期记忆

使用runtime参数(类型为ToolRuntime)在工具中访问短期记忆(状态)。 runtime参数在工具签名中是隐藏的(因此模型看不到它),但工具可以通过它访问状态。

从工具写入短期记忆

要在执行期间修改代理的短期记忆(状态),您可以直接从工具返回状态更新。 这对于持久化中间结果或使信息可供后续工具或提示访问很有用。

提示

在中间件中访问短期记忆(状态),以根据对话历史或自定义状态字段创建动态提示。
输出

模型之前

@before_model中间件中访问短期记忆(状态),以在模型调用之前处理消息。

模型之后

@after_model中间件中访问短期记忆(状态),以在模型调用之后处理消息。