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

添加短期记忆

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

在生产环境中使用

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

在子图中使用

如果你的图包含子图,你只需在编译父图时提供检查点器。LangGraph 会自动将检查点器传播到子图中。
你可以配置子图特定的检查点行为。有关持久化级别(包括中断支持和有状态延续)的详细信息,请参阅子图持久化

添加长期记忆

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

在节点中访问存储

一旦你使用存储编译了图,LangGraph 会自动将存储注入到你的节点函数中。推荐通过 Runtime 对象访问存储。

在生产环境中使用

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

使用语义搜索

在图的记忆存储中启用语义搜索,让图智能体可以通过语义相似性搜索存储中的项目。
InMemoryStore 适合开发环境。在生产环境中,请使用持久化存储,如 PostgresStoreMongoDBStoreRedisStore

管理短期记忆

启用短期记忆后,长对话可能会超出大语言模型(LLM)的上下文窗口。常见的解决方案有:
  • 裁剪消息:在调用大语言模型(LLM)之前移除前 N 条或后 N 条消息
  • 删除消息:从 LangGraph 状态中永久删除消息
  • 总结消息:总结历史中较早的消息并用摘要替换它们
  • 管理检查点:存储和检索消息历史
  • 自定义策略(例如消息过滤等)
这使得智能体可以在不超出大语言模型(LLM)上下文窗口的情况下跟踪对话。

裁剪消息

大多数大语言模型(LLM)有最大支持的上下文窗口(以 Token 计量)。决定何时截断消息的一种方法是计算消息历史中的 Token 数,并在接近该限制时进行截断。如果你使用的是 LangChain,可以使用 trim messages 工具并指定要从列表中保留的 Token 数,以及用于处理边界的 strategy(例如保留最后 maxTokens 条)。 要裁剪消息历史,使用 trimMessages 函数:

删除消息

你可以从图状态中删除消息来管理消息历史。这在你需要移除特定消息或清除整个消息历史时很有用。 要从图状态中删除消息,可以使用 RemoveMessage。为了使 RemoveMessage 生效,你需要使用带有 messagesStateReducer 归约器的状态键,比如 MessagesValue 要移除特定消息:
删除消息时,确保生成的消息历史是有效的。请检查你使用的大语言模型(LLM)提供商的限制。例如:
  • 某些提供商要求消息历史以 user 消息开头
  • 大多数提供商要求带有工具调用的 assistant 消息后面跟有相应的 tool 结果消息。

总结消息

如上所示,裁剪或移除消息的问题在于你可能会因为消息队列的裁剪而丢失信息。因此,某些应用会受益于使用聊天模型来总结消息历史这一更复杂的方法。 摘要 可以使用提示和编排逻辑来总结消息历史。例如,在 LangGraph 中,你可以在状态中包含一个 summary 键以及 messages 键:
然后,你可以生成聊天历史的摘要,使用任何现有摘要作为下一次摘要的上下文。这个 summarizeConversation 节点可以在 messages 状态键中累积了一定数量的消息后被调用。

管理检查点

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

查看线程状态

查看线程历史

删除线程的所有检查点

数据库管理

如果你使用任何数据库支持的持久化实现(如 Postgres 或 Redis)来存储短期和/或长期记忆,你需要在将其与数据库一起使用之前运行迁移来设置所需的模式。 按照惯例,大多数数据库特定的库在检查点器或存储实例上定义了一个 setup() 方法来运行所需的迁移。但是,你应该检查你的特定 BaseCheckpointSaverBaseStore 实现以确认确切的方法名称和用法。 我们建议将迁移作为专门的部署步骤运行,或者确保它们作为服务器启动的一部分运行。