Skip to main content

概述

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

用法

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

生产环境

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

自定义代理记忆

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

常见模式

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

修剪消息

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

删除消息

永久从 LangGraph 状态中删除消息

总结消息

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

自定义策略

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

修剪消息

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

删除消息

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

总结消息

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

访问记忆

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

工具

在工具中读取短期记忆

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

从工具写入短期记忆

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

提示词

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

模型之前

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

模型之后

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