Skip to main content
AI 应用程序需要记忆来在多次交互之间共享上下文。在 LangGraph 中,您可以添加两种类型的记忆:

添加短期记忆

短期记忆(线程级持久化)使代理能够跟踪多轮对话。要添加短期记忆:

在生产环境中使用

在生产环境中,请使用由数据库支持的检查点器:
首次使用 Postgres 检查点器时,您需要调用 checkpointer.setup()
设置 要使用 MongoDB 检查点器,您需要一个 MongoDB 集群。如果您还没有集群,请按照此指南创建一个。
首次使用 Redis 检查点器时,您需要调用 checkpointer.setup()

在子图中使用

如果您的图包含子图,您只需在编译父图时提供检查点器。LangGraph 会自动将检查点器传播到子图。
如果您希望子图拥有自己的记忆,可以在编译时提供相应的检查点器选项。这在多代理系统中非常有用,如果您希望代理跟踪其内部消息历史记录。

添加长期记忆

使用长期记忆跨对话存储特定于用户或应用程序的数据。

在生产环境中使用

在生产环境中,请使用由数据库支持的存储:
首次使用 Postgres 存储时,您需要调用 store.setup()
首次使用 Redis 存储时,您需要调用 store.setup()

使用语义搜索

在图的内存存储中启用语义搜索,使图代理能够通过语义相似性在存储中搜索项目。

管理短期记忆

启用短期记忆后,长时间的对话可能会超出LLM的上下文窗口。常见的解决方案包括: 这使得代理能够在不超出LLM上下文窗口的情况下跟踪对话。

修剪消息

大多数LLM都有一个最大支持的上下文窗口(以token为单位)。决定何时截断消息的一种方法是计算消息历史中的token数量,并在接近该限制时截断。如果你使用LangChain,可以使用修剪消息工具并指定要从列表中保留的token数量,以及用于处理边界的strategy(例如,保留最后maxTokens)。 要修剪消息历史,请使用trim_messages函数:

删除消息

你可以从图状态中删除消息以管理消息历史。当你想删除特定消息或清除整个消息历史时,这非常有用。 要从图状态中删除消息,可以使用RemoveMessage。要使RemoveMessage生效,你需要使用带有add_messages reducer的状态键,例如MessagesState 要删除特定消息:
要删除所有消息:
删除消息时,请确保最终的消息历史是有效的。检查你所使用的LLM提供商的限制。例如:
  • 一些提供商期望消息历史以user消息开头
  • 大多数提供商要求带有工具调用的assistant消息后必须跟随相应的tool结果消息。

总结消息

如上所示,修剪或删除消息的问题是,你可能会因消息队列的削减而丢失信息。因此,一些应用程序受益于使用聊天模型对消息历史进行更复杂的摘要方法。 可以使用提示和编排逻辑来总结消息历史。例如,在LangGraph中,你可以扩展MessagesState以包含一个summary键:
然后,你可以使用任何现有摘要作为上下文生成聊天历史的摘要。这个summarize_conversation节点可以在messages状态键中积累一定数量的消息后调用。
  1. 我们将在context字段中跟踪我们的运行摘要
(由SummarizationNode预期)。
  1. 定义仅用于过滤的私有状态
call_model节点的输入。
  1. 我们在这里传递一个私有输入状态,以隔离摘要节点返回的消息

管理检查点

你可以查看和删除检查点存储的信息。

查看线程状态

查看线程的历史记录

删除线程的所有检查点

预构建的内存工具

LangMem 是一个由LangChain维护的库,提供用于管理代理中长期记忆的工具。有关使用示例,请参阅LangMem文档