1、记忆类型
短期记忆---当前任务或会话的上下文
长期记忆---跨任务会话的经验与知识
2、添加记忆
2、1添加短期记---添加在内存
添加会话记忆(短期记忆)分为三步:
-
导入并初始化Checkpointer
-
创建Agent,指定Checkpointer
-
调用Agent,指定thread_id
from langchain.agents import create_agent
from langgraph.checkpoint.memory import InMemorySaveragent = create_agent(
"deepseek-chat",
checkpointer=InMemorySaver()
)
from langchain.messages import HumanMessage设定thread_id,作为会话标识
config = {"configurable": {"thread_id": "thread_1"}}
第一次调用,告知AI我的信息
response = agent.invoke(
{"messages": [HumanMessage(content="你好,我叫虎哥,我最喜欢猫猫。")]},
config # 调用时添加thread_id-------------------所有thread-id的都会快照成一组
)print(response)
====================================
====================================
第二次调用,询问我的信息,这次带上thread_id,唤起记忆
response = agent.invoke(
{"messages": [HumanMessage(content="我最喜欢的动物是什么?")]},
config # 调用时添加thread_id
)print(response)
2、2添加长期记---添加在数据库
# 3.Memory持久化存储
这里我们选择使用Sqlite作为存储方案,首先需要按照langgraph-checkpoint-sqlite依赖:
```
uv add langgraph-checkpoint-sqlite
```
接着,按照以下步骤使用:
- 导入依赖
- 初始化checkpointer
- 自动建表
- 创建Agent,指定checkpointer-
=========基于sqlite=================================================
connection = sqlite3.connect("resources/checkpoint.db", check_same_thread=False)
将数据库文件存入resources目录下名为checkpoint.db
import sqlite3
from langgraph.checkpoint.sqlite import SqliteSaver
# 连接sqlite
connection = sqlite3.connect("resources/checkpoint.db", check_same_thread=False)
# 初始化checkpointer
checkpointer = SqliteSaver(connection)
# 自动建表
checkpointer.setup()
# 创建agent
agent = create_agent(
"deepseek-chat",
checkpointer=checkpointer,
)
from langchain.messages import HumanMessage
# 设定thread_id,作为会话标识
config = {"configurable": {"thread_id": "thread_2"}}
# 第一次调用,告知AI我的信息
response = agent.invoke(
{"messages": [HumanMessage(content="你好,我叫虎哥,我最喜欢猫猫。")]},
config # 调用时添加thread_id
)
print(response)
# 第二次调用,询问我的信息,这次带上thread_id,唤起记忆
response = agent.invoke(
{"messages": [HumanMessage(content="我最喜欢的动物是什么?")]},
config # 调用时添加thread_id
)
print(response)
3、记忆管理策略
模型上下文溢出解决
当会话历史过长时,可能会超出模型的上下文窗口限制,常见的解决方案有:
**- 修剪消息----删除部分会话比如早期会话----不推荐
- 删除消息----直接删除超出的快照----不推荐**
- 总结消息摘要---用另一个模型进行总结---当上下文超出时总结
这里我们演示总结消息摘要的方案
常见写法
在这类 SummarizationMiddleware 里,trigger 通常是一个 tuple(二元组):
从语法上说
就你这里看,trigger 不是固定"几种语法",而是按照中间件实现支持哪些字段来决定。
最常见的可能有这几类:
-
按消息数触发
trigger=("messages", 6) -
按 token 数触发
trigger=("tokens", 3000) -
按字符/文本长度触发
trigger=("chars", 5000)from langchain.agents import create_agent
from langchain.agents.middleware import SummarizationMiddleware
from langgraph.checkpoint.memory import InMemorySaver
from langchain_core.runnables import RunnableConfig初始化checkpointer
checkpointer = InMemorySaver()
初始化中间件
middleware = SummarizationMiddleware(
model="deepseek-chat",
trigger=("messages", 6), # 触发时机,当消息数超过3时,进行总结
keep=("messages", 1) # 保留的会话数,超过2条
)创建agent
agent = create_agent(
model="deepseek-chat",
middleware=[middleware],
checkpointer=checkpointer,
)config: RunnableConfig = {"configurable": {"thread_id": "thread_3"}}
制造长会话历史
agent.invoke({"messages": [HumanMessage(content="你好,我是虎哥.")]}, config)
agent.invoke({"messages": [HumanMessage(content="我最喜欢的运动是乒乓")]}, config)
agent.invoke({"messages": [HumanMessage(content="我最喜欢的动物是猫猫")]}, config)测试效果
final_response = agent.invoke({"messages": HumanMessage(content="你还记得我吗?")}, config)
print(final_response)
for message in final_response["messages"]:
message.pretty_print()