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

