天学会AI应用开发(十七)LangGraph实现会话记忆功能
LangGraph是LangChain推荐的会话记忆架构,支持长短期双记忆与原生持久化。通过InMemorySaver实现短期记忆,利用SummarizationMiddleware压缩历史记录以节省令牌消耗。该架构特别适合生产环境中的复杂智能体场景,能高效管理对话上下文并确保持久化不丢失。
在上一篇文章中,我们借助 langchain_community 实现了基础的对话记忆功能,但该方法仅适用于早期链式架构的临时补丁,对于简单的线性对话尚可应对,一旦遇到复杂场景便显得力不从心。目前,LangChain 官方推荐使用 LangGraph 来高效管理会话记忆。LangGraph 是一种从底层统一管理全流程状态的架构,支持长短双记忆模式,原生持久化,并且能够轻松适配复杂 Agent,堪称生产环境的首选方案。接下来,我们将深入探讨 LangGraph 在会话记忆方面的基本用法与实战技巧。

一、使用LangGraph的环境准备
在命令行窗口中输入以下命令,即可一次性安装 LangChain、Ollama 插件以及 LangGraph 所需的核心依赖:
pip install langchain langchain-core langchain-ollama langgraph
请确保本地已通过 Ollama 完成了离线大模型的下载。例如,执行以下命令即可拉取 qwen2:1.5b 模型:
ollama pull qwen2:1.5b
等待模型下载完成后,再运行以下命令启动 Ollama 并加载模型:
ollama serve
二、使用LangGraph记住历史会话
在 Python 代码的开头,首先引入关键组件:LangChain 的智能体创建工具 create_agent、大模型工具 ChatOllama,以及 LangGraph 的内存保存器 InMemorySa ver:
from langchain.agents import create_agent
from langchain_ollama import ChatOllama
from langgraph.checkpoint.memory import InMemorySa ver # 内存存储
在 ChatOllama 的构造方法中,指定要使用的离线大模型名称:
llm = ChatOllama(model="qwen2:1.5b") # 改成你本地的模型
接下来,编写调用代码。首先调用 create_agent 创建启用短期记忆的智能体,然后通过其 invoke 方法与大模型进行交互:
agent = create_agent(
model=llm,
checkpointer=InMemorySa ver(), # 启用短期记忆
)
# 测试对话
print("=== 内存中的临时记忆 ===")
while True:
user_input = input("用户:")
if user_input in ["退出", "exit", "quit"]:
print("对话结束")
break
# 调用离线大模型
result = agent.invoke(
{"messages": [{"role": "user", "content": user_input}]},
{"configurable": {"thread_id": "session_001"}}
)
print(f"AI:{result['messages'][-1].content}\n")
运行此段代码,依次输入“我叫张三”和“我叫什么?”,输出结果如下:
=== 内存中的临时记忆 ===
你:我叫张三
AI:你好,张三。有什么问题或需要帮助的吗?
你:我叫什么?
AI:你的名字是“张三”。
从日志中可以清晰看到,AI 在第一次对话中成功记住了用户名为“张三”,第二次提问时依然能够准确回答。这说明通过 LangGraph 的 InMemorySa ver,我们已经初步实现了简单的对话记忆功能。
三、使用SummarizationMiddleware压缩历史记忆
虽然上述方法实现了记忆,但随着问答轮次不断增加,需要记忆的历史会话内容也会越来越长。为了节省 Token 消耗,我们必须对历史记录进行精简,只保留最近最关键的会话信息。LangGraph 提供了摘要中间件 SummarizationMiddleware,能够在历史会话超出限制时自动触发压缩。下面来看具体实现方法。
首先,在代码开头引入 SummarizationMiddleware:
from langchain.agents.middleware import SummarizationMiddleware
再声明一个新的大模型实例,专门用于压缩历史会话:
llm_summary = ChatOllama(model="qwen2:0.5b") # 改成你本地的模型
创建智能体时,增加 middleware 参数,并配置摘要中间件所需的摘要模型、Token 限制、保留消息数量等:
agent = create_agent(
model=llm,
checkpointer=InMemorySa ver(), # 启用短期记忆
# 压缩历史记忆并移除早期记忆
middleware=[
SummarizationMiddleware(
model=llm_summary,
trigger=("tokens", 100), # 超过100个token时触发
keep=("messages", 3), # 保留最近3条消息
)
]
)
重新运行代码,依次输入“我叫张三”、“我叫什么?”、“长江有多长?”、“黄河有多长?”、“珠江有多长?”、“黑龙江有多长?”、“我叫什么?”,输出结果如下:
=== 内存中的临时记忆 ===
你:我叫张三
AI:你好,张先生。有什么我可以帮助你的吗?
你:我叫什么?
AI:你好,张先生。你叫张三。
你:长江有多长?
AI:长江是中国最长的河流,全长约6300公里。
你:黄河有多长?
AI:黄河是中国第二长的河流,全长约5464公里。
你:珠江有多长?
AI:珠江是长江流域的一条重要河流,全长约2794公里。
你:黑龙江有多长?
AI:黑龙江是亚洲最长的河流之一,全长约1800公里。
你:我叫什么?
AI:根据您的描述,您似乎没有提供自己的名字。如果您有其他姓名,请告知我以便我能为您提供更准确的回答。
从日志中可以观察到,第一次询问“我叫什么?”时,AI 还能正确回答;但经过多轮对话后再次提问,AI 已经忘记了用户的名字。这说明 SummarizationMiddleware 确实发挥了作用——会话记录超出限制后,只保留了最近几条消息,早期的记忆被自动压缩掉了。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
CAD零基础入门教程:坐标输入、图层管理与基础绘图命令
本文面向CAD零基础学习者,系统讲解坐标输入、图层管理与基础绘图命令的核心用法。通过分步实操与常见问题排查,帮助新手建立精确绘图习惯,掌握规范出图的基础能力。
CAD从入门到项目交付:绘图、标注、图块与实战工作流
掌握CAD的核心在于建立“画得准、标得清、复用快、交付稳”的工作流。本文提供从环境设置、高频命令组合、标注规范、图块标准化到项目分阶段交付的完整路径,帮助初学者避免常见返工陷阱,独立完成可检查、可复用、可打印的工程图纸。
Claude Code 登录指南:个人、Teams 与企业账号区分与授权步骤
本文详细解析 Claude Code 登录前的账号类型区分方法,涵盖个人订阅、Teams 席位与企业 Enterprise 席位的授权路径差异。提供终端登录命令、环境变量排查及常见异常处理步骤,帮助用户快速完成正确授权并避免登录路径混淆。
Claude Code 文件修改前的权限模式配置与命令审批指南
本文详细介绍Claude Code在修改文件前的权限模式配置方法,包括defaultMode可选值、permissions allow与deny规则设置、多层级配置文件管理以及 status验证技巧,帮助开发者安全高效地使用AI编程助手。
Claude Code接入VS Code后先测扩展和终端命令
在VS Code中接入Claude Code后,建议优先验证扩展面板与集成终端两条入口。本文提供标准检查顺序、关键命令与常见故障排查路径,帮助你快速确认环境就绪,避免后续开发受阻。
- 热门数据榜
相关攻略
2026-09-01 16:53
2026-09-01 16:52
2026-09-01 14:27
2026-09-01 14:12
2026-09-01 14:10
2026-09-01 14:07
2026-09-01 13:55
2026-09-01 13:47
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

