【总结】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()
相关推荐
曾阿伦12 小时前
Trae CN Python环境调试debug指南
开发语言·python
渣男教父13 小时前
Python游戏自动化实战案例
python·编程语言
天天爱吃肉821813 小时前
【工程师笔记|新能源整车电控一次过CISPR25/BCI,汽车EMC/EMI落地十大核心设计技巧】
大数据·人工智能·笔记·python·汽车
m0_6174939413 小时前
Python 使用 cryptography 实现数据加密与解密
开发语言·python
万山寒13 小时前
python依赖包导出离线安装到没有外网的服务器
服务器·开发语言·python
程序员雷欧14 小时前
LongAdder
开发语言·python
月光船幽幽14 小时前
分层阈值规避归藏协议过度重置
人工智能·python
SMF191914 小时前
【Linux】完美解决缩略图工具gm调用java.io.FileNotFoundException: gm问题
java·开发语言·python
㳺三才人子14 小时前
初探 Data Analysis - Matplotlib
python·plotly·pandas·matplotlib
Python私教14 小时前
0、null、未采集:AI Agent 反馈系统最容易踩的语义坑
人工智能·python