一、短期记忆是什么▎ 短期记忆让您的应用程序能够记住单个线程或对话中的先前交互。打个比方短期记忆就是这一通电话里的记性——你跟智能体在这一个对话中聊过的所有内容它都记得。但换一个对话挂断重拨就从头开始。关键概念线程thread▎ 线程将一次会话中的多次交互组织起来类似于电子邮件将消息归入单个对话中的方式。一句话一个线程 一次连续对话。短期记忆就是按线程保存的记忆。二、为什么需要专门管理短期记忆几个痛点上下文窗口有限完整对话历史可能塞不进 LLM 的上下文窗口导致上下文丢失或错误。长上下文表现变差即使模型支持长上下文也会因陈旧/无关内容分心且响应变慢、成本增加。消息会不断增长聊天中人类输入和模型回复交替消息列表越来越长。所以需要移除或遗忘陈旧信息的技术来管理记忆。▎ 区分要记住跨对话的信息请用长期记忆store本文讲的是短期记忆单线程内。三、怎么启用短期记忆—— checkpointer核心一句话▎ 要为智能体添加短期记忆需要在创建智能体时指定一个 checkpointer检查点器。checkpointer 就是负责把状态存下来、下次能恢复的组件。最简单的内存版fromlangchain.agentsimportcreate_agentfromlanggraph.checkpoint.memoryimportInMemorySaver agentcreate_agent(gpt-5.4,tools[get_user_info],checkpointerInMemorySaver(),# 关键加 checkpointer)# 调用时用 thread_id 标识这是哪个对话agent.invoke({messages:[{role:user,content:Hi! My name is Bob.}]},{configurable:{thread_id:1}},# 线程 ID)两个关键点checkpointer决定记忆存哪内存/数据库thread_id标识哪个对话线程相同 thread_id 同一个对话生产环境用数据库版 checkpointerInMemorySaver 重启就丢生产要用持久化的比如 Postgrespip install langgraph-checkpoint-postgresfromlanggraph.checkpoint.postgresimportPostgresSaver DB_URIpostgresql://postgres:postgreslocalhost:5442/postgres?sslmodedisablewithPostgresSaver.from_conn_string(DB_URI)ascheckpointer:checkpointer.setup()# 自动建表agentcreate_agent(gpt-5.4,tools[get_user_info],checkpointercheckpointer,)短期记忆的工作机制短期记忆作为智能体状态的一部分管理存在图状态里通过 checkpointer 持久化到数据库或内存线程可随时恢复更新时机调用智能体或完成一步如工具调用时更新读取时机每一步开始时读取状态四、自定义智能体记忆默认智能体用 AgentState 管理短期记忆通过 messages 键存对话历史。你可以扩展 AgentState 添加额外字段fromlangchain.agentsimportcreate_agent,AgentStatefromlanggraph.checkpoint.memoryimportInMemorySaverclassCustomAgentState(AgentState):user_id:strpreferences:dictagentcreate_agent(gpt-5.4,tools[get_user_info],state_schemaCustomAgentState,# 传入自定义状态checkpointerInMemorySaver(),)# 调用时可以传入自定义状态字段resultagent.invoke({messages:[{role:user,content:Hello}],user_id:user_123,preferences:{theme:dark}},{configurable:{thread_id:1}})这样除了对话历史还能在这个线程里记住 user_id、preferences 等额外信息。五、长对话的管理策略核心启用短期记忆后长对话可能超出上下文窗口。页面给出四种常见策略策略做法适用场景截断消息调用 LLM 前移除部分消息保留最近的防止超出 token 上限删除消息永久删除 LangGraph 状态中的消息移除特定消息或清空历史总结消息总结早期消息用摘要替换它们既省空间又尽量不丢信息自定义策略如消息过滤等特殊需求策略 1截断消息before_model 中间件用 before_model 中间件在调用模型之前修剪消息历史。思路是保留第一条消息 最近几条中间的丢掉fromlangchain.messagesimportRemoveMessagefromlanggraph.graph.messageimportREMOVE_ALL_MESSAGESfromlangchain.agentsimportcreate_agent,AgentStatefromlangchain.agents.middlewareimportbefore_modelfromlanggraph.runtimeimportRuntimefromtypingimportAnybefore_modeldeftrim_messages(state:AgentState,runtime:Runtime)-dict[str,Any]|None:Keep only the last few messages to fit context window.messagesstate[messages]iflen(messages)3:# 消息不多就不用动returnNonefirst_msgmessages[0]# 保留第一条recent_messagesmessages[-3:]# 保留最近几条new_messages[first_msg]recent_messagesreturn{messages:[RemoveMessage(idREMOVE_ALL_MESSAGES),# 先清空*new_messages# 再放回保留的]}agentcreate_agent(gpt-5-nano,tools[],middleware[trim_messages],# 挂上中间件checkpointerInMemorySaver(),)效果即使中间聊了很多轮模型也只看到开头 最近几条策略 2删除消息RemoveMessage用 RemoveMessage 删除特定消息或全部消息。需要状态键带 add_messages reducer默认 AgentState 已提供。删除特定消息最早的 2 条fromlangchain.messagesimportRemoveMessagedefdelete_messages(state):messagesstate[messages]iflen(messages)2:return{messages:[RemoveMessage(idm.id)forminmessages[:2]]}删除所有消息fromlanggraph.graph.messageimportREMOVE_ALL_MESSAGESdefdelete_messages(state):return{messages:[RemoveMessage(idREMOVE_ALL_MESSAGES)]}⚠️ 重要提醒删除消息后要确保消息历史仍然有效否则模型会报错某些厂商要求消息历史以 user 消息开头大多数厂商要求带工具调用的 assistant 消息后必须跟对应的 tool 结果消息不能拆散实战中常用 after_model 中间件在模型回复后删除旧消息fromlangchain.agents.middlewareimportafter_modelafter_modeldefdelete_old_messages(state:AgentState,runtime:Runtime)-dict|None:Remove old messages to keep conversation manageable.messagesstate[messages]iflen(messages)2:return{messages:[RemoveMessage(idm.id)forminmessages[:2]]}returnNoneagentcreate_agent(gpt-5-nano,tools[],system_promptPlease be concise and to the point.,middleware[delete_old_messages],checkpointerInMemorySaver(),)策略 3总结消息SummarizationMiddleware截断/删除的问题会丢失信息。更聪明的方法是用模型把早期消息总结成摘要再用摘要替换它们。LangChain 提供内置的 SummarizationMiddlewarefromlangchain.agentsimportcreate_agentfromlangchain.agents.middlewareimportSummarizationMiddleware agentcreate_agent(modelgpt-5.4,tools[],middleware[SummarizationMiddleware(modelgpt-5.4-mini,# 用小模型做总结省钱trigger(tokens,4000),# 触发条件token 达到 4000keep(messages,20)# 保留最近 20 条消息不总结)],checkpointerInMemorySaver(),)三个参数model用哪个模型做总结推荐用便宜的小模型trigger什么时候触发总结这里设为 token 数到 4000keep保留多少条最近消息不被总结效果长对话中早期内容被压缩成摘要模型既能看到历史梗概又不会超出窗口六、访问短期记忆的三种途径短期记忆状态可以通过三个地方访问和修改途径 1工具里访问runtime.state用 ToolRuntime 参数在工具中读写状态对模型隐藏fromlangchain.toolsimporttool,ToolRuntimefromlangchain.agentsimportcreate_agent,AgentStateclassCustomState(AgentState):user_id:strtooldefget_user_info(runtime:ToolRuntime)-str:Look up user info.user_idruntime.state[user_id]# 读短期记忆returnUser is John Smithifuser_iduser_123elseUnknown user工具还能写入短期记忆——直接返回 Command(update{…})fromlanggraph.typesimportCommandfromlangchain.messagesimportToolMessagetooldefupdate_user_info(runtime:ToolRuntime[CustomContext,CustomState])-Command:Look up and update user info.user_idruntime.context.user_id nameJohn Smithifuser_iduser_123elseUnknown userreturnCommand(update{user_name:name,# 写入自定义状态字段messages:[ToolMessage(Successfully looked up user information,tool_call_idruntime.tool_call_id)]})途径 2提示里访问dynamic_prompt 中间件根据状态/上下文生成动态系统提示fromlangchain.agents.middlewareimportdynamic_prompt,ModelRequestclassCustomContext(TypedDict):user_name:strdynamic_promptdefdynamic_system_prompt(request:ModelRequest)-str:user_namerequest.runtime.context[user_name]returnfYou are a helpful assistant. Address the user as{user_name}.agentcreate_agent(modelgpt-5-nano,tools[get_weather],middleware[dynamic_system_prompt],context_schemaCustomContext,)效果系统提示会变成 “Address the user as John Smith”模型回复时就会称呼用户名字。途径 3模型执行前/后访问before_model / after_modelbefore_model调用模型前处理消息如截断历史after_model调用模型后处理消息如删除含敏感词的回复fromlangchain.agents.middlewareimportafter_modelafter_modeldefvalidate_response(state:AgentState,runtime:Runtime)-dict|None:Remove messages containing sensitive words.STOP_WORDS[password,secret]last_messagestate[messages][-1]ifany(wordinlast_message.contentforwordinSTOP_WORDS):return{messages:[RemoveMessage(idlast_message.id)]}returnNone七、访问记忆途径总览途径装饰器/方式时机典型用途工具runtime: ToolRuntime工具执行时在工具中读写状态提示dynamic_prompt生成系统提示时根据状态/上下文定制提示模型执行前before_model调用模型前截断/修剪消息历史模型执行后after_model调用模型后删除敏感词、清理消息八、一句话总结▎ 短期记忆 单个线程对话内的记忆靠 checkpointer thread_id 实现同一对话记得住、能恢复。▎ 长对话靠四种策略管理截断 / 删除 / 总结 /自定义。▎ 访问记忆有四个切入点工具runtime.state、动态提示dynamic_prompt、模型执行前before_model、模型执行后after_model。九、和前几讲的关系把这几讲串起来短期记忆线程内对话历史存 state[“messages”]靠 checkpointer 持久化长期记忆store跨线程永久保存靠 runtime.store工具访问上下文工具用 runtime.state / runtime.context / runtime.store 读写这些记忆消息messages短期记忆的载体四种类型组成对话历史一句话短期记忆是这次通话的草稿纸checkpointer 是草稿纸的存档thread_id 是通话编号。