目录
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()