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

添加短期能力

短期能力(线程级持久化)使智能体能跟踪多轮对话。添加短期能力的步骤如下: :::python
::: :::js
:::

生产环境使用

在生产环境中,使用基于数据库的检查点器: :::python
::: :::js
:::
:::python
您首次使用PostgreSQL检查点器时需要调用 checkpointer.setup()
::::::js
您首次使用PostgreSQL检查点器时需要调用 checkpointer.setup()
:::
:::python
配置 要使用 MongoDB检查点器,您需要MongoDB集群。若尚未创建,请参考 此指南。针对智能体的详细配置,请查看 使用MongoDB Atlas配置短期能力。
::::::js
设置 要使用 MongoDBSaver,您需要一个 MongoDB 集群。如果您还没有集群,请按照 此指南 创建一个。有关以智能体为中心的逐步说明,请参阅 使用 MongoDB Atlas 的短期记忆。
:::
:::python
你在使用 Redis 检查点器时,第一次需要调用 checkpointer.setup()。
设置 要使用 Oracle 检查点器,您需要一个 Oracle AI 数据库实例。本地容器(例如 gvenzl/oracle-free:23-slim)或 OCI 中的 Oracle 自主数据库均可。
你在使用 Oracle 检查点器时,第一次需要调用 checkpointer.setup()。
:::

在子图中使用

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

添加长期记忆

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

在节点内访问存储

一旦你编译一个包含存储的图,LangGraph 会自动将存储注入到你的节点函数中。推荐通过 Runtime 对象访问存储。 :::python
::: :::js
:::

用于生产环境

在生产环境中,使用基于数据库的存储: :::python
::: :::js
:::
:::python
你在使用 Postgres store 时,第一次需要调用 store.setup()
::::::js
你在使用 Postgres store 时,第一次需要调用 store.setup()
:::
:::python
基于query的语义搜索需要 MongoDB 向量搜索($vectorSearch),该搜索在 MongoDB Atlas或具有搜索和向量搜索(mongot)的私有管理的 MongoDB 上运行。没有mongot的纯mongod是不够的。在打开存储时从create_vector_index_config传递index_config。索引创建可能超过默认的 15 秒等待时间,因此首次运行时将auto_index_timeout设置得更高。有关 Atlas 集群设置,请参阅此指南。有关向量索引设置和以智能体为中心的逐步介绍,请参阅使用 MongoDB Atlas 的长期记忆。
::::::js
想要了解以智能体为中心的介绍,请参阅 使用 MongoDB Atlas 的长期记忆。
:::
:::python
你在使用 Redis store 时,第一次需要调用 store.setup()。
设置 要使用 Oracle store,您需要一个 Oracle AI Database 实例——用于语义 search 的向量索引需要 Oracle AI Vector Search。
你在使用 Oracle 存储和检查点器时,第一次需要调用 store.setup() 和 checkpointer.setup()。
:::

使用语义搜索

在您的图内存存储中启用语义搜索,以使图智能体能够通过语义相似性在存储中搜索项目。 :::python
::: :::js
::: :::js
InMemoryStore 适合开发环境。生产环境请使用 PostgresStore、MongoDBStore 或 RedisStore 等持久化存储。
:::
:::python
::::::js
:::

管理短期记忆

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

裁剪消息

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

删除消息

您可以从图状态中删除消息以管理消息历史。当您想要删除特定消息或清空整个消息历史时,这很有用。 :::python 要从图状态中删除消息,可以使用 RemoveMessage。为了让 RemoveMessage 正常工作,你需要使用带有 @[add_messages] 的状态键,例如 reducer,如 MessagesState。 要删除特定消息:
要删除所有消息:
::: :::js 要从图状态中删除消息,可以使用 RemoveMessage。为了让 RemoveMessage 正常工作,你需要使用一个带有 @[messagesStateReducer][messagesStateReducer] reducer,例如 MessagesValue。 要删除特定消息:
:::
当删除消息时,务必确保生成的消息历史记录是有效的。检查您正在使用的 LLM 提供商的限制。例如:
  • 一些提供者期望消息历史以 user 消息开始
  • 大多数提供者要求 assistant 消息中包含工具调用,其后必须跟随相应的 tool 结果消息。
:::python
::::::js
:::

摘要消息

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

管理检查点

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

查看会话状态

:::python
::: :::js
:::

查看会话历史记录

:::python
::: :::js
:::

删除线程的所有检查点

:::python
::: :::js
:::

数据库管理

如果您使用任何数据库支持的持久化实现(如 Postgres、Redis 或 Oracle)来存储短期和/或长期记忆,则在使用前需要运行迁移来设置所需的数据库架构。 按照惯例,大多数数据库特定库会在检查点器或存储实例上定义一个 setup() 方法,用于运行所需的迁移。但您仍需查阅具体的 @[BaseCheckpointSaver] 或 @[BaseStore] 实现文档,以确认确切的方法名称和用法。 我们建议将迁移操作作为独立的部署步骤,或确保在服务器启动时自动运行迁移。
官方原文:src/oss/langgraph/add-memory.mdx · 非官方翻译,译文由 AI 生成,以英文原文为准。
Last modified on November 3, 2026