概述

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

用法

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

生产环境

在生产环境中,使用由数据库支持的检查点器:
___CODE_BLOCK_2___

自定义智能体记忆

您可以通过创建带有状态模式的自定义中间件来扩展智能体状态。可以使用中间件中的 stateSchema 参数传递自定义状态模式。
___CODE_BLOCK_4___

常见模式

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

裁剪消息

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

删除消息

您可以从图状态中删除消息来管理消息历史。 当您想要移除特定消息或清除整个消息历史时,这非常有用。 要从图状态中删除消息,您可以使用 RemoveMessage 。要使 RemoveMessage 正常工作,您需要使用带有 messagesStateReducer reducer 的状态键,如 MessagesZodState 要移除特定消息:
___CODE_BLOCK_14___
删除消息时, 请确保 结果消息历史是有效的。检查您使用的 LLM 提供商的限制。例如:
  • 某些提供商期望消息历史以 user 消息开头
  • 大多数提供商要求带有工具调用的 assistant 消息后面跟随相应的 tool 结果消息。
___CODE_BLOCK_18___
___CODE_BLOCK_19___

总结消息

如上所示,裁剪或移除消息的问题是您可能会因为消息队列的删减而丢失信息。因此,某些应用程序可以从使用聊天模型总结消息历史的更复杂方法中受益。 Summary 要在智能体中总结消息历史,请使用内置的 summarizationMiddleware
___CODE_BLOCK_21___
请参阅 summarizationMiddleware 了解更多配置选项。

访问记忆

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

工具

在工具中读取短期记忆

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

从工具写入短期记忆

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

提示词

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

模型调用前

___CODE_BLOCK_28___

模型调用后

___CODE_BLOCK_29___

Connect these docs to Claude, VSCode, and more via MCP for real-time answers.