1. checkpointer
编译时指定checkpointer参数 可以实现储存在内存中的短记忆
2. memorysaver
指定checkpointer=memorysaver()
可以实现一般的记忆 适合本地调试使用 功能较差 原理是把对话内容记住 invoke时并入state
ps:图输入时需要指定线程id 分id实现记忆
config = {"configurable": {"thread_id": "2"}} for chunk in graph_with_memory.stream({"messages": ["请问我叫什么?"]}, config, stream_mode="debug"): if chunk["type"] == "checkpoint": # print(chunk) print(f"Thread id:{chunk['payload']['config']['configurable']['thread_id']}") print(f"CheckPoint id :{chunk['payload']['config']['configurable']['checkpoint_id']}") for message in chunk['payload']['values']['messages']: print(f"Message id:{message.id},Message content:{message.content}")3. sqlitesaver
SqliteSaver.from_conn_string(":memory:") 这个意思是创建一个上下文管理器 会自动把记忆写入数据库 位置是memory即内存 是用string传入的
这个东西需要一个关闭操作,实践上会用两种方式自动关闭 完成善后工作:with语句和exitstack
3.1. 用with的sqlitesaver
from langgraph.checkpoint.sqlite import SqliteSaver from langgraph.prebuilt import create_react_agent with SqliteSaver.from_conn_string(":memory:") as checkpointer: graph = create_react_agent(llm, tools=tools, checkpointer=checkpointer) display(Image(graph.get_graph().draw_mermaid_png())) config = {"configurable": {"thread_id": "11"}} for chunk in graph.stream({"messages": ["你好,我叫西瓜老师"]}, config, stream_mode="values"): chunk["messages"][-1].pretty_print() for chunk in graph.stream({"messages": ["请问我叫什么?"]}, config, stream_mode="values"): chunk["messages"][-1].pretty_print()使用with完成自动开启和关闭数据库
这样的缺点在于只在一个缩进块保持记忆 后续就自动关闭了
3.2. 用exitstack
创建一个exitstack=SqliteSaver.from_conn_string(":memory:") 相当于压栈了exit操作
当所有事情完成 完成exitstack.close() 就会执行exit操作
此时不需要局限在同个缩进块了
stack = ExitStack() checkpointer = stack.enter_context(SqliteSaver.from_conn_string(":memory:")) graph = create_agent(llm, tools=tools, checkpointer=checkpointer) config = {"configurable": {"thread_id": "11"}} for chunk in graph.stream({"messages": ["我叫1"]}, config, stream_mode="values"): chunk["messages"][-1].pretty_print() for chunk in graph.stream({"messages": ["请问我叫什么?"]}, config, stream_mode="values"): chunk["messages"][-1].pretty_print() stack.close()