LangGraph Memory 详解:短期记忆、持久化 Checkpointer 与上下文管理三策略

    |     2026年8月21日   |   AI大模型应用, LangChain框架   |     0 条评论   |    30

上篇你给 Agent 装好了手脚——@tool、多步循环、工具分包。可一关上进程,或换一轮提问,它就「不记得你叫小明」。这篇讲 Memory:短期 vs 长期、InMemorySaver + thread_id,以及上下文太长时的修剪 / 删除 / 总结。


小明的助手每轮都失忆

小明跑通了多工具 Agent,自信地连问两句:

用户: 我叫小明,喜欢杭州 助手: 好的,小明…… 用户: 我叫什么?喜欢哪个城市? 助手: 你还没有告诉我你的名字……

他一拍大腿:每次 invoke 只塞了当前这一句,历史根本没带上。于是自己维护一个 list,越聊越长,很快又撞上另一墙——上下文窗口(导图举例:有的模型上下文不能超过 128K)。

小明去找老张:”记忆到底分几种?框架能不能自动续聊?历史爆了怎么办?”

老张说:”先分清短期和长期;再用 checkpointer 续上同一条会话;最后才谈三种管理策略。”


什么是 Memory

老张在白板上写导图分类:

短期记忆(Working / Session) - 对话历史 - 查询结果 - 任务状态 → 当前任务或会话的上下文 长期记忆(Persistent) - 跨任务 / 跨会话的经验与知识 → 本篇点到为止;深挖在 Runtime·Store

“比喻:

  • 短期 = 今天这通电话的录音(同一次会话)
  • 长期 = 客户档案柜(换电话线还能查到偏好)

LangChain 短期侧常见两条实现路:

路 做法
外挂 list 自己 add_user / add_ai,每次 invoke(messages)
框架 State + checkpointer create_agent(..., checkpointer=...),同一 thread_id 自动续

持久化 checkpointer(导图认知级):SqliteSaver / PostgresSaver / CosmosDBSaver——进程挂了还能恢复;教学默认用内存版 InMemorySaver,生产深配另议。”

策略 对 State 里历史 发给 LLM 的内容 风险
修剪 仍完整保留 只选一部分发送 模型暂时看不见旧细节
删除 真正删掉 历史中不再存在 不可恢复,慎用
总结 旧轮变摘要 摘要 + 最近消息 细节可能被压扁;可用 SummarizationMiddleware

小明:”那我验收啥?”

“两样:① 同一 thread_id 多轮能续聊;② 至少搞清一种管理策略和另两种的差别。”


代码拆解:从 list 到 thread_id

1. 外挂 ShortTermMemory

memory.py:

class ShortTermMemory: def __init__(self, system: str) -> None: self._messages: list[BaseMessage] = [SystemMessage(content=system)] def add_user(self, text: str) -> None: self._messages.append(HumanMessage(content=text)) def add_ai(self, text: str) -> None: self._messages.append(AIMessage(content=text)) def as_messages(self) -> list[BaseMessage]: return list(self._messages) def clear(self) -> None: """清空对话,保留 system。""" del self._messages[1:]

main.py 里每次问答都带着历史:

def ask(user_text: str) -> str: memory.add_user(user_text) ai = model.invoke(memory.as_messages()) text = ai.content or "" memory.add_ai(text) return text

“这是最直观的短期记忆:消息链就是大脑的工作台。/clear 对应 memory.clear()——删的是 list 里的对话,system 留下。
缺点:和 Agent 工具循环各管各的,要自己把 list 喂进 create_agent 的 messages。”

2. InMemorySaver + thread_id

agent.py:

from langgraph.checkpoint.memory import InMemorySaver def build_default_agent(): """默认 AgentState(仅 messages)+ 进程内 checkpointer。""" return create_agent( get_chat_model(), tools=DEFAULT_TOOLS, system_prompt="你是简洁助教。记住用户说过的称呼;回答尽量短。", checkpointer=InMemorySaver(), )

main.py Demo A——同一 thread 续聊:

def demo_default_state() -> None: agent = build_default_agent() config = {"configurable": {"thread_id": "day9-default"}} r1 = agent.invoke( {"messages": [{"role": "user", "content": "我叫小明"}]}, config, ) r2 = agent.invoke( {"messages": [{"role": "user", "content": "我叫什么?"}]}, config, )

“关键两句:

  1. 创建时挂上 checkpointer=InMemorySaver()
  2. 每次 invoke 带同一 config.thread_id

换一个 thread_id,就是另一通电话,互不串话。这就是导图里的自动化短期记忆方案。”

3. 短期不止 messages:自定义 State 字段

state.py:

class CustomState(AgentState): session_start: NotRequired[str] visit_count: NotRequired[int] model_call_count: NotRequired[int]

工具里读 / 写(任务状态也是短期记忆的一种):

@tool def get_session_info(runtime: ToolRuntime) -> str: state = runtime.state ... return f"session_start={start}; visit_count={visits}; ..." @tool def bump_visit(runtime: ToolRuntime) -> Command: count = int(runtime.state.get("visit_count") or 0) + 1 return Command(update={"visit_count": count, "messages": [...]})

“短期包括对话历史、查询结果、任务状态——visit_count 就是任务状态字段。深讲 Runtime 三分法放到后面篇;这里只要知道:短期 ≠ 只能存聊天记录。”

4. 三种管理策略

导图原文要刻进脑子:

  • 修剪:State 里列表仍完整,只是发送前少带一些
  • 删除:State 里真没有了(类似 Day6 clear 的局部版,更危险)
  • 总结:旧消息变摘要,再拼上最近消息;框架侧有 SummarizationMiddleware

总结中间件(策略演示用):

SummarizationMiddleware( model=model, trigger=("messages", 6), # 触达条数后触发 keep=("messages", 2), # 保留最近若干条 )

挂上同一 checkpointer + thread_id,多轮之后旧对话会被摘要压缩——这就是「总结策略」的可运行对照。修剪 / 删除可先记概念表,生产再选型。

小明复述:”短期用 list 或 checkpointer+thread;爆了就修剪、慎删除、或总结;长期进 Store。”


总结

老张说:”第七篇只办一件事——让 Agent 记得住,并知道记不住时怎么办。”

“三个核心理解:

  1. 短期 vs 长期 —— 会话上下文 vs 跨会话经验;本篇主攻短期
  2. 续聊公式 —— checkpointer + 同一 thread_id(或 Day6 外挂 list)
  3. 爆窗三策略 —— 修剪 ≠ 删除 ≠ 总结;总结可用 SummarizationMiddleware”

LangChain 支线进度:

… → Tools 与 Tool Agent ↓ Memory(本篇:短期 / 持久化认知 / 管理策略) ↓ AI 私厨实战 → Runtime(State/Store/Context)→ …

小明说:”下一篇该把看图、工具、记忆捏成一个私厨 Demo 了。”

“对。下一篇:入门实战:AI 私厨“

没有记忆的 Agent 只是一次性计算器;checkpointer + thread_id 让会话有了连续剧,管理策略则防止剧集无限注水撑爆上下文。

转载请注明来源:LangGraph Memory 详解:短期记忆、持久化 Checkpointer 与上下文管理三策略
本文链接地址:https://ai.zhousir.top/?p=3855
回复 取消