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

