【总结】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()
相关推荐
蓝色的杯子2 小时前
OpenClaw一文详细了解-手搓OpenClaw-4 Tool Runtime
人工智能·python
克里普crirp2 小时前
电离层TEC地图中添加晨昏线/昼夜转换线
python
Dxy12393102162 小时前
Python使用PyEnchant详解:打造高效拼写检查工具
开发语言·python
Rick19932 小时前
LangChain和spring ai是什么关系?
人工智能·spring·langchain
架构师老Y2 小时前
011、消息队列应用:RabbitMQ、Kafka与Celery
python·架构·kafka·rabbitmq·ruby
枫叶林FYL2 小时前
【Python高级工程与架构实战】项目四:生产级LLM Agent框架:基于PydanticAI的类型安全企业级实现
人工智能·python·自然语言处理
龙腾AI白云2 小时前
多模大模型应用实战:智能问答系统开发
python·机器学习·数据分析·django·tornado
AI应用实战 | RE3 小时前
011、向量数据库入门:Embeddings原理与ChromaDB实战
开发语言·数据库·langchain·php
Hommy883 小时前
【开源剪映小助手】配置与部署
python·开源·aigc·剪映小助手