概述
记忆是一个记住以前交互信息的系统。对于 AI 智能体来说,记忆至关重要,因为它让智能体能够记住以前的交互、从反馈中学习并适应用户偏好。随着智能体处理越来越复杂的任务和大量用户交互,这种能力对于效率和用户满意度来说变得必不可少。 短期记忆让你的应用能够在单个线程或对话中记住以前的交互。线程将会话中的多个交互组织在一起,类似于电子邮件将消息归组到单个对话中的方式。
用法
要为智能体添加短期记忆(线程级持久化),你需要在创建智能体时指定checkpointer。
LangChain 的智能体将短期记忆作为智能体状态的一部分来管理。通过将这些信息存储在图的状态中,智能体可以访问给定对话的完整上下文,同时维护不同线程之间的隔离。状态使用检查点器持久化到数据库(或内存),以便线程可以在任何时候恢复。短期记忆在智能体被调用或步骤(如工具调用)完成时更新,状态在每步开始时被读取。
在生产环境中
在生产环境中,使用由数据库支持的检查点器:有关更多检查点器选项,包括 SQLite、Postgres 和 Azure Cosmos DB,请参阅持久化文档中的检查点器库列表。
自定义智能体记忆
你可以通过创建带有状态 schema 的自定义中间件来扩展智能体状态。自定义状态 schema 可以使用中间件中的stateSchema 参数传递。优先使用 StateSchema 类进行状态定义(也支持普通 Zod 对象)。
常见模式
启用短期记忆后,长对话可能会超出 LLM 的上下文窗口。常见的解决方案有:裁剪消息
移除最前或最后的 N 条消息(在调用 LLM 之前)
删除消息
从 LangGraph 状态中永久删除消息
摘要消息
对历史中较早的消息进行总结并用摘要替换它们
自定义策略
自定义策略(例如消息过滤等)
裁剪消息
大多数 LLM 都有最大支持的上下文窗口(以 Token 计)。 一种决定何时截断消息的方法是计算消息历史中的 Token 并在接近限制时截断。如果你使用 LangChain,可以使用裁剪消息工具并指定要从列表中保留的 Token 数量,以及用于处理边界的strategy(例如保留最后 maxTokens)。
要在智能体中裁剪消息历史,使用带有 beforeModel 钩子的 createMiddleware:
删除消息
你可以从图状态中删除消息来管理消息历史。 当你想要删除特定消息或清除整个消息历史时,这很有用。 要从图状态中删除消息,可以使用RemoveMessage。要使 RemoveMessage 工作,你需要使用带有 messagesStateReducer reducer 的状态键,如 MessagesValue。
要删除特定消息:
摘要消息
如上所示,裁剪或删除消息的问题在于你可能会因为消息队列的裁减而丢失信息。 因此,某些应用可以从使用聊天模型对消息历史进行摘要这种更复杂的方法中受益。
summarizationMiddleware:
summarizationMiddleware。
访问记忆
你可以通过以下几种方式访问和修改智能体的短期记忆(状态):工具
在工具中读取短期记忆
使用runtime 参数(类型为 ToolRuntime)在工具中访问短期记忆(状态)。
runtime 参数对工具签名是隐藏的(所以模型看不到它),但工具可以通过它访问状态。
从工具写入短期记忆
要在执行过程中修改智能体的短期记忆(状态),你可以直接从工具返回状态更新。 这对于持久化中间结果或使信息对后续工具或提示可访问非常有用。提示
在中间件中访问短期记忆(状态),基于对话历史或自定义状态字段创建动态提示。模型前
模型后
将这些文档连接到 Claude、VSCode 等,通过 MCP 获取实时答案。

