news 2026/6/10 23:39:16

16.5LangChain 与 LangGraph 记忆管理策略完整代码演示

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
16.5LangChain 与 LangGraph 记忆管理策略完整代码演示

LangChain 与 LangGraph 记忆管理策略完整代码演示

本文将用多个独立、可运行的代码示例,逐一演示 LangChain 中短期记忆长期记忆以及LangGraph 的 Checkpointer 会话记忆,并覆盖修剪、删除、总结等高级记忆管理策略。所有示例均基于阿里云百炼 Qwen 模型(兼容 OpenAI API)。


环境准备

在运行任何代码前,请安装依赖并设置.env文件。

pipinstalllangchain langchain-openai langchain-community chromadb faiss-cpu tiktoken# 如果需要 SQLite checkpointerpipinstalllanggraph-checkpoint-sqlite

创建.env文件:

DASHSCOPE_API_KEY=你的API Key DASHSCOPE_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1

通用模型初始化(后续所有示例共用):

importosfromdotenvimportload_dotenvfromlangchain_openaiimportChatOpenAI load_dotenv()llm=ChatOpenAI(model="qwen-plus",temperature=0.7,api_key=os.getenv("DASHSCOPE_API_KEY"),base_url=os.getenv("DASHSCOPE_BASE_URL"),model_kwargs={"extra_body":{"enable_thinking":False}})

一、短期记忆(Short-Term Memory)

1. 会话缓冲记忆(ConversationBufferMemory)

保存全部历史,最直接。

fromlangchain.memoryimportConversationBufferMemoryfromlangchain.chainsimportConversationChain memory=ConversationBufferMemory()conversation=ConversationChain(llm=llm,memory=memory,verbose=False)conversation.predict(input="我叫小明,我喜欢编程。")response=conversation.predict(input="你还记得我叫什么名字吗?")print(response)# 输出会正确回答“小明”

2. 会话窗口记忆(ConversationBufferWindowMemory)

只保留最近 k 轮对话。

fromlangchain.memoryimportConversationBufferWindowMemory memory=ConversationBufferWindowMemory(k=2)conversation=ConversationChain(llm=llm,memory=memory,verbose=False)conversation.predict(input="我叫小明。")conversation.predict(input="我喜欢编程。")conversation.predict(input="你还记得我的名字吗?")# 窗口只保留后两轮,可能忘记名字print(conversation.predict(input="我叫什么?"))

3. 会话摘要记忆(ConversationSummaryMemory)

利用 LLM 将历史压缩为摘要。

fromlangchain.memoryimportConversationSummaryMemory memory=ConversationSummaryMemory(llm=llm)conversation=ConversationChain(llm=llm,memory=memory,verbose=False)conversation.predict(input="我叫小明,我是程序员。")conversation.predict(input="我喜欢 Python 和 Go。")response=conversation.predict(input="请回顾一下我的信息。")print(response)# 模型会基于摘要回答,能看到姓名和爱好

4. 会话摘要缓冲记忆(ConversationSummaryBufferMemory)

窗口 + 摘要的组合。

fromlangchain.memoryimportConversationSummaryBufferMemory memory=ConversationSummaryBufferMemory(llm=llm,max_token_limit=100)conversation=ConversationChain(llm=llm,memory=memory,verbose=False)foriinrange(5):conversation.predict(input=f"第{i}条消息:这是测试内容。")print(memory.load_memory_variables({})["history"])# 超出 token 限制的历史会被压缩为摘要

5. 实体记忆(ConversationEntityMemory)

抽取并存储实体信息。

fromlangchain.memoryimportConversationEntityMemory memory=ConversationEntityMemory(llm=llm)memory.save_context({"input":"小明是程序员,喜欢 Go 语言。"},{"output":"已记录。"})memory.save_context({"input":"小红是设计师,喜欢画画。"},{"output":"好的。"})print("实体存储:",memory.entity_store.store)# 输出: {'小明': '小明是程序员,喜欢 Go 语言。', '小红': '小红是设计师,喜欢画画。'}

二、长期记忆(Long-Term Memory)

向量存储记忆(VectorStoreRetrieverMemory)

使用 FAISS 和嵌入模型实现语义检索。

fromlangchain.memoryimportVectorStoreRetrieverMemoryfromlangchain.embeddingsimportHuggingFaceEmbeddingsfromlangchain.vectorstoresimportFAISS# 初始化嵌入模型(首次使用会下载)embedding_model=HuggingFaceEmbeddings(model_name="paraphrase-multilingual-MiniLM-L12-v2")# 创建空向量库(需先有一条文本初始化)vectorstore=FAISS.from_texts(["初始化占位"],embedding_model)retriever=vectorstore.as_retriever(search_kwargs={"k":2})memory=VectorStoreRetrieverMemory(retriever=retriever)# 保存记忆memory.save_context({"input":"我喜欢科幻电影"},{"output":"记住了"})memory.save_context({"input":"最近在学 LangChain"},{"output":"好的"})# 检索相关记忆related=memory.load_memory_variables({"input":"推荐一部电影"})["history"]print(related)# 输出会包含“我喜欢科幻电影”

三、LangGraph Checkpointer 会话记忆

1. 使用 InMemorySaver(内存版)

fromlanggraph.checkpoint.memoryimportInMemorySaverfromlanggraph.prebuiltimportcreate_react_agentfromlangchain_core.messagesimportHumanMessage# 创建 checkpointercheckpointer=InMemorySaver()# 创建 Agent(需定义工具,这里用空工具列表)agent=create_react_agent(llm,tools=[],checkpointer=checkpointer)config={"configurable":{"thread_id":"user_123"}}# 第一轮agent.invoke({"messages":[HumanMessage(content="我叫小明,我喜欢编程。")]},config)# 第二轮,依赖记忆response=agent.invoke({"messages":[HumanMessage(content="我叫什么名字?")]},config)print(response["messages"][-1].content)# 会回答“小明”

2. 使用 SqliteSaver(持久化)

importsqlite3fromlanggraph.checkpoint.sqliteimportSqliteSaver conn=sqlite3.connect("checkpoints.db",check_same_thread=False)checkpointer=SqliteSaver(conn)checkpointer.setup()agent=create_react_agent(llm,tools=[],checkpointer=checkpointer)config={"configurable":{"thread_id":"persistent_user"}}agent.invoke({"messages":[HumanMessage(content="我的邮箱是 test@example.com")]},config)# 重启程序后,仍可恢复记忆response=agent.invoke({"messages":[HumanMessage(content="我的邮箱是什么?")]},config)print(response["messages"][-1].content)

四、高级记忆管理策略(修剪 / 删除 / 总结)

1. 修剪消息(trim_messages)

发送给模型前截断,不改变原始状态。

fromlangchain_core.messagesimporttrim_messagesfromlangchain_core.promptsimportChatPromptTemplate# 构造长消息列表messages=[HumanMessage(content="1"),AIMessage(content="a"),HumanMessage(content="2"),AIMessage(content="b"),HumanMessage(content="3"),AIMessage(content="c"),]trimmer=trim_messages(strategy="last",max_tokens=50,token_counter=llm.get_num_tokens)trimmed=trimmer.invoke(messages)print(f"原始{len(messages)}条,修剪后{len(trimmed)}条")

2. 删除消息(删除 State 中的消息)

直接操作 State(如在 LangGraph 节点中)。

# 伪代码示例(在 LangGraph 节点函数中)defdelete_old_messages(state):# 只保留最后 3 条消息state["messages"]=state["messages"][-3:]returnstate

3. 总结消息中间件(SummarizationMiddleware)

官方推荐方式,自动将旧消息压缩为摘要。

fromlangchain.agentsimportcreate_agentfromlangchain.agents.middlewareimportSummarizationMiddlewarefromlanggraph.checkpoint.memoryimportInMemorySaver checkpointer=InMemorySaver()middleware=SummarizationMiddleware(model=llm,trigger=("messages",4),# 消息超过4条时触发总结keep=("messages",2)# 保留最近2条原始消息)agent=create_agent(model=llm,middleware=[middleware],checkpointer=checkpointer)config={"configurable":{"thread_id":"summary_demo"}}agent.invoke({"messages":[HumanMessage(content="我叫小明。")]},config)agent.invoke({"messages":[HumanMessage(content="我是程序员。")]},config)agent.invoke({"messages":[HumanMessage(content="我喜欢 Go。")]},config)agent.invoke({"messages":[HumanMessage(content="你还记得我的职业吗?")]},config)# 此时旧消息已被总结,但模型仍能回答“程序员”

总结

记忆类型策略适用场景
短期记忆Buffer / Window / Summary / Entity单次会话、有限上下文
长期记忆VectorStoreRetrieverMemory跨会话知识库、个性化推荐
会话持久化Checkpointer (InMemory/SQLite/Postgres)多轮对话、断点续聊
记忆压缩Trim / Delete / SummarizationMiddleware防止上下文溢出、优化成本
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 23:38:18

Teamcenter许可回收,两种触发方式到底哪个更及时?

做个简单的调研,同样用Teamcenter,同样面对许可“等米下锅”的窘境,我发现大家回收集群的方式真是天差地别。前几年听说一家机械厂,IT老大为了抢到工程师独占的许可证,竟每晚11点守在系统前手动踢人——谁不开电脑就回…

作者头像 李华
网站建设 2026/6/10 23:37:10

Linux Schedutil 的 sugov_policy:调频策略的 per-CPU 管理

一、简介在现代 Linux 系统中,CPU 频率调频(CPUFreq)是衔接进程调度子系统与硬件电源管理的核心模块,直接决定系统的性能、功耗、发热三者的平衡。传统ondemand、performance等调频策略依赖独立定时器轮询 CPU 负载,调…

作者头像 李华
网站建设 2026/6/10 23:33:02

3分钟快速激活Beyond Compare 5:开源密钥生成工具完整指南

3分钟快速激活Beyond Compare 5:开源密钥生成工具完整指南 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 你是否厌倦了Beyond Compare 5的30天评估期限制?想要永久解锁这…

作者头像 李华
网站建设 2026/6/10 23:32:59

PLC客控方案如何赢得亚朵集团招标?选型要点全解析

酒店智能客控市场进入精细化竞争阶段,技术方案从早期的RCU集中控制、RS-485总线,逐步向利用现有电力线传输信号的方向演进。PLC(电力线通信)技术因其无需额外布通信线、网随电通、施工成本低等特性,在中高端连锁酒店的…

作者头像 李华
网站建设 2026/6/10 23:32:02

卫生间漏水维修全攻略:上海尤卉教你快速排查与解决漏水问题

前言:专业维修,安心生活 卫生间漏水问题困扰着许多家庭,不仅影响日常生活,还可能造成财产损失。作为专业的家居维修服务品牌,上海尤卉一直致力于为上海地区居民提供高效、可靠的卫生间漏水检测与维修服务。我们拥有多年…

作者头像 李华
网站建设 2026/6/10 23:29:59

基于图神经网络的微服务故障传播分析:从告警风暴到根因定位

基于图神经网络的微服务故障传播分析:从告警风暴到根因定位一、微服务的"蝴蝶效应":一个节点故障,百条告警齐鸣 微服务架构中,服务间的调用依赖形成复杂的拓扑网络。一个数据库节点的延迟升高,会导致上游的订…

作者头像 李华