前面我们讲的智能体都是没有记忆的也就是前面问的话后面第二次聊天调用就忘了不能连接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指定checkpointerimport sqlite3 from langgraph.checkpoint.sqlite import SqliteSaver #连接sqlite connection sqlite3.connect(./checkpoint.db,check_same_threadFalse) #初始化checkpointer checkpointer SqliteSaver(connection) #给checkpointer建表 checkpointer.setup() #创建Agent agent create_agent( modelllm, tools[get_weather], checkpointercheckpointer ) 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的上下文不能超过128kLangChain提供了一些记忆管理的策略来解决这个问题包括修剪、删除、总结摘要、自定义如根据用户的问题筛选历史消息修剪拿到消息历史后先移除前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( modeldeepseek-chat, model_provideropenai, api_keyos.getenv(DEEPSEEK_API_KEY), base_urlhttps://api.deepseek.com, temperature 0.7 ) tool def get_weather(location:str)-str: 获取天气 return f{location}的天气是晴朗 checkpointer InMemorySaver() agent create_agent( modelllm, tools[get_weather], middleware[ SummarizationMiddleware( modelllm, trigger(messages, 3), keep(messages, 1) ) ], checkpointercheckpointer, ) 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()回答你好张飞是的我记得你的信息——你喜欢小猫也喜欢游泳。