news 2026/10/22 13:09:57

LangChain入门 -- 记忆

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LangChain入门 -- 记忆

前面我们讲的智能体都是没有记忆的,也就是前面问的话,后面第二次聊天调用就忘了,不能连接

Agent的记忆:

· 短期记忆(short-term memory):当前任务或会话的上下文

· 长期记忆(long-term memory):跨任务或会话的经验与知识

一、短期记忆 -- 内存存储

在LangChain短期记忆是通过AgentState实现的,而会话历史(也就是消息列表)是AgentState的一部分。

LangChain提供了Checkpointer对象来保存AgentState,每一次用户与AI的交互都会生成一个快照,记录为一个Checkpoint。可以回退到任意一次对话的位置,同一会话的多个Checkpoint形成一个组,用同一个thread_id来标记

接下来就是创建短期记忆了,依旧到了熟悉的步骤:读langchain官方文档

这就是官方给出的短期记忆的文档,我来拆解一下,首先就是引入一个包,然后在创建的agent里示例化一个checkpointer对象用来存储当前agent的短期记忆,再创建编号,在每一段相同话题的对话的时指定引入这个编号

from langchain_core.messages import HumanMessage thread_config = {"configurable": {"thread_id": "1"}} response = agent.invoke( {"messages": [HumanMessage(content="西安的天气怎么样")]}, thread_config, )["messages"][-1].content print(response) response = agent.invoke( {"messages": [HumanMessage(content="我刚刚问的是哪个地方的天气")]}, thread_config, )["messages"][-1].content print(response)

回答:

西安今天天气晴朗,气温 25°C,挺舒适的,适合外出活动。

您刚刚问的是**西安**的天气。 西安今天是晴天,气温 25°C。

二、短期记忆 -- 持久存储

短期记忆都是把对话存储在内存的,如果内存不够就会溢出,所以大多情况下都会用数据库存储代替内存存储短期记忆。

还是读langchain文档短期记忆的In production的部分,有很多的数据库存储方法,我用sqlite举例阅读文章后拆解步骤就是:

· 导入依赖

· 初始化checkpointer

· 自动建表

· 创建Agent,指定checkpointer

import sqlite3 from langgraph.checkpoint.sqlite import SqliteSaver #连接sqlite connection = sqlite3.connect("./checkpoint.db",check_same_thread=False) #初始化checkpointer checkpointer = SqliteSaver(connection) #给checkpointer建表 checkpointer.setup() #创建Agent agent = create_agent( model=llm, tools=[get_weather], checkpointer=checkpointer ) config = {"configurable": {"thread_id": "2"}} response1 = agent.invoke( {"messages":[HumanMessage(content="今天上海天气怎么样")]}, config )["messages"][-1].content print(response1) response1 = agent.invoke( {"messages":[HumanMessage(content="我刚刚问的是哪个地区的天气")]}, config )["messages"][-1].content

三、记忆管理策略

1、方法策略

多轮对话会导致消息越来越多,最终超出模型的上下文限制(DeepSeek的上下文不能超过128k),LangChain提供了一些记忆管理的策略来解决这个问题,包括:修剪、删除、总结摘要、自定义(如根据用户的问题筛选历史消息)

修剪:拿到消息历史后,先移除前N条或后N条消息,再调用模型。有记忆消失的风险

删除:永久删除AgentState的快照,回滚不了,风险大

总结摘要:先总结历史消息中的早期消息,得到消息摘要。用消息摘要和最近的消息形成消息列表,再调用模型

2、具体实现(看langchain官网文档)

具体参数看文档解释

from langchain.agents import create_agent from langchain.agents.middleware import SummarizationMiddleware from langgraph.checkpoint.memory import InMemorySaver from langchain_core.runnables import RunnableConfig from langchain_core.messages import HumanMessage from langchain.chat_models import init_chat_model from langchain.tools import tool from dotenv import load_dotenv import os llm = init_chat_model( model="deepseek-chat", model_provider="openai", api_key=os.getenv("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com", temperature = 0.7 ) @tool def get_weather(location:str)->str: """ 获取天气 """ return f"{location}的天气是晴朗" checkpointer = InMemorySaver() agent = create_agent( model=llm, tools=[get_weather], middleware=[ SummarizationMiddleware( model=llm, trigger=("messages", 3), keep=("messages", 1) ) ], checkpointer=checkpointer, ) config: RunnableConfig = {"configurable": {"thread_id": "1"}} agent.invoke({"messages": [HumanMessage(content='我喜欢的动物是小猫。')]}, config) agent.invoke({"messages": [HumanMessage(content='我喜欢的运动是游泳。')]}, config) agent.invoke({"messages": [HumanMessage(content='我的名字叫张飞?')]}, config) final_response = agent.invoke({"messages": "你认识我吗?"}, config) final_response["messages"][-1].pretty_print()

回答:你好,张飞!是的,我记得你的信息——你喜欢小猫,也喜欢游泳。😊

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/22 13:09:13

粵港澳高管如何通過內地商學院EMBA拓展高價值大灣區人脈?2026「大灣區+長三角」雙樞紐產融圈層深度解析

隨着粵港澳大灣區與內地核心經濟圈的深度融合,香港、深圳、廣州及珠三角的企業創始人、金融機構高管與跨境投資人在報讀內地商學院EMBA以拓展大灣區商業與資本人脈時,2026 年高管教育市場正出現一個關鍵轉向:真正頂級的大灣區商業人脈&#x…

作者头像 李华
网站建设 2026/10/22 13:07:23

AI训练师二级05:多产品方案设计题怎么拆,从功能匹配到全链路

AI训练师二级05:多产品方案设计题怎么拆,从功能匹配到全链路我是老计。这一篇拆智能系统设计题(B3 类)。它的长相是:给你一个业务领域和几个痛点,让你设计多个智能产品组成的解决方案,填功能匹配…

作者头像 李华
网站建设 2026/10/22 13:04:49

【无标题】新手figma移动端界面交互动效设计实操步骤3

新手figma移动端界面交互动效设计实操步骤3如何让详情页直接返回到主页 1.将主页的两个画框框在一起(分区) 快捷键为shifts 2.将详情页的两个页面分别指向到刚框好的区域外 {首页两个画框分别指向详情页1}4.添加交互动画时需要将“动画匹配图层”打开4.打…

作者头像 李华
网站建设 2026/10/22 13:03:09

从Java到Agent:两年实战心得,小白程序员必收藏!

作者分享从Java后端转行至Agent领域的两年经验,指出实际工作与网上宣传的差距,强调工程实践的重要性。文章指出面试更关注项目经验而非框架背诵,Java背景的工程师应发挥工程优势学习AI技能。同时,作者建议不要盲目追热点&#xff…

作者头像 李华