【总结】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()
相关推荐
TechWayfarer5 小时前
查询IP所在地的3种方案:从API到离线库,风控场景怎么选?
开发语言·网络·python·网络协议·tcp/ip
程序员榴莲5 小时前
Python 单例模式
开发语言·python·单例模式
hh.h.6 小时前
昇腾CANN ops-transformer 仓的 MC2 算子:MoE 模型的全到全通信
python·深度学习·transformer·cann
NiceCloud喜云7 小时前
Claude Files API 深入:从上传、复用到配额管理的工程化指南
android·java·数据库·人工智能·python·json·飞书
专注VB编程开发20年7 小时前
windows下python自带标准库 ≈ 70% 纯.py 源码,30% .pyd(DLL)
python
萌新小码农‍7 小时前
人工智能数学基础+python实例(人工智能学习day3)
开发语言·人工智能·python
毋语天9 小时前
FastAPI 进阶实战:请求体、文件上传、响应模型与数据校验
python·fastapi·api开发·数据校验·pydantic
ZhengEnCi10 小时前
09a-斯坦福 CS336 作业一:BPE 分词器
python·神经网络
测试员周周10 小时前
【Appium 系列】第18节-重试与容错 — 移动端测试的稳定性保障
人工智能·python·功能测试·ui·单元测试·appium·测试用例