【总结】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()
相关推荐
做怪小疯子6 小时前
华为笔试0429
python·numpy
Warson_L7 小时前
Dictionary
python
寒山李白9 小时前
解决 python-docx 生成的 Word 文档打开时弹出“无法读取内容“警告
python·word·wps·文档·docx·qoder
2401_832365529 小时前
JavaScript中rest参数(...args)取代arguments的优势
jvm·数据库·python
Sirius.z9 小时前
第J3周:DenseNet121算法详解
python
2301_7796224110 小时前
Go语言怎么用信号量控制并发_Go语言semaphore信号量教程【入门】
jvm·数据库·python
2301_7662834410 小时前
c++如何将控制台输出保存到文件_cout重定向到txt【详解】
jvm·数据库·python
小康小小涵11 小时前
基于ESP32S3实现无人机RID模块底层源码编译
linux·开发语言·python
风落无尘11 小时前
LangChain 完全入门指南:从基础到实战(附面试题)
人工智能·langchain
lzjava202412 小时前
Python的函数
开发语言·python