【总结】LangChain中如何维持记忆

目录

1.短期记忆

2.长期记忆

3.记忆管理


1.短期记忆

AgentState通过Checkpointer对象来保存

首先需要一个配置id

由于两次调用使用了相同的thread_id,被认定为是同一次对话,所以LangChain会在请求模型时携带历史对话的Messages,模型就能根据历史消息来正确回答了。

python 复制代码
# 设定thread_id,作为会话标识
thread_id_config = {
    "configurable":{
        "thread_id": "thread_1"
    }

}
python 复制代码
agent = create_agent(
    model="deepseek-chat",
    checkpointer=InMemorySaver(),
)

response = agent.invoke({
    "messages": [
        HumanMessage(content="我的名字叫大卫,我喜欢打篮球,我喜欢小猫,小狗")
    ]
},config=thread_id_config)

print(response["messages"][-1].content)


response = agent.invoke({
    "messages": [
        HumanMessage(content="我喜欢什么动物")
    ]
},config=thread_id_config)

print(response["messages"][-1].content)

【输出结果】:


2.长期记忆

利用SqliteSaver

python 复制代码
checkpointer = SqliteSaver(sqlite3.connect("checkpoint.db", check_same_thread=False))

# 自动建表
checkpointer.setup()

# 设定thread_id,作为会话标识
thread_id_config = {
    "configurable":{
        "thread_id": "thread_1"
    }

}
python 复制代码
agent = create_agent(
    model="deepseek-chat",
    checkpointer=checkpointer,
)

# 1
response = agent.invoke({
    "messages":[
        HumanMessage(content="我是艾力,我喜欢旅游、写代码")
    ]
},config=thread_id_config)

print(response["messages"][-1].content)

print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")


# 2
response = agent.invoke({
    "messages":[
        HumanMessage(content="我有什么爱好?")
    ]
},config=thread_id_config)
print(response["messages"][-1].content)

【输出结果】:


3.记忆管理

复制代码
记忆管理策略:
    1.修剪消息
    2.删除消息
    不管是修剪还是删除,都会导致一部分消息丢失,从而丢失记忆。所以就有了第三种策略:
    3. 总结消息:它的思路很简单,就是把历史的消息利用大模型总结出摘要,
        然后把最新的消息拼接在一起作为新的消息列表发送给大模型,这样既不会超出模型的上下文窗口限制,还能尽量保留所有的记忆。
python 复制代码
"""
    记忆管理策略:
        1.修剪消息
        2.删除消息
        不管是修剪还是删除,都会导致一部分消息丢失,从而丢失记忆。所以就有了第三种策略:
        3. 总结消息:它的思路很简单,就是把历史的消息利用大模型总结出摘要,
            然后把最新的消息拼接在一起作为新的消息列表发送给大模型,这样既不会超出模型的上下文窗口限制,还能尽量保留所有的记忆。
"""

from langchain.agents import create_agent
from langgraph.checkpoint.memory import InMemorySaver
from langchain.agents.middleware import SummarizationMiddleware
from langchain_core.runnables import RunnableConfig
from dotenv import load_dotenv
load_dotenv()

# 初始化checkpointer
checkpointer = InMemorySaver()

# 初始化中间件
middleware = SummarizationMiddleware(
    model="deepseek-chat",
    trigger=("messages", 3), #  触发时机,当消息数超过3时,进行记忆压缩 总结
    keep=("messages", 1) #  保留最近的 1 条消息不被记忆压缩
)

# 创建agent
agent = create_agent(
    model="deepseek-chat",
    middleware=[middleware],
    checkpointer=checkpointer,
)

config: RunnableConfig = {"configurable": {"thread_id": "1"}}

agent.invoke({"messages": "你好,我是大卫."}, config)
agent.invoke({"messages": "我最喜欢的运动是乒乓"}, config)
agent.invoke({"messages": "我最喜欢的动物是猫猫"}, config)
agent.invoke({"messages": "我最喜欢的颜色是蓝色"}, config)
agent.invoke({"messages": "我最喜欢的食物是披萨"}, config)

final_response = agent.invoke({"messages": "你还记得我吗?"}, config)

for message in final_response["messages"]:
    message.pretty_print()
相关推荐
默_笙17 小时前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
qq_4260039617 小时前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫17 小时前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技18 小时前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读18 小时前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
只睡四小时19 小时前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
染指111019 小时前
122.Agent-LangChain核心组件-中间件-动态提示词(dynamic_promapt)
人工智能·langchain·agent·agents
奇思妙想聪明勤奋的小羊19 小时前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
lpfasd12319 小时前
2026年第38周GitHub趋势周报
python·科技·github
IZero0720 小时前
Jev 与 Laya
python·语言模型