聊天机器人现在可以使用工具来回答用户的问题,但它无法记住之前交互的上下文。这限制了它进行连贯、多轮对话的能力。
LangGraph 通过持久化检查点checkpointer
解决了这个问题。如果您在编译图时提供,并thread_id
在调用图时提供 ,LangGraph 会在每一步之后自动保存状态。当您再次使用相同的 调用图时thread_id
,图会加载其已保存的状态,从而允许聊天机器人从上次中断的地方继续执行。
我们稍后会看到,检查点比简单的聊天记忆功能强大得多——它允许您随时保存和恢复复杂的状态,以进行错误恢复、人机交互、时间旅行交互等等。但首先,让我们添加检查点来实现多轮对话。
本教程以添加工具为基础。
创建MemorySaver
检查点
创建MemorySaver
检查点:
API 参考:InMemorySaver
1 | from langgraph.checkpoint.memory import InMemorySaver |
这是内存检查点,这对于本教程来说很方便。但是,在生产应用程序中,您可能会将其更改为使用SqliteSaver
或PostgresSaver
连接数据库。
编译图表
使用提供的检查点编译图表,State
当图表通过每个节点时,它将检查点:
1 | graph = graph_builder.compile(checkpointer=memory) |
与你的聊天机器人互动
现在您可以与您的机器人互动!
- 选择一个线索作为本次对话的关键。
1 | config = {"configurable": {"thread_id": "1"}} |
- 呼叫您的聊天机器人:
1 | user_input = "Hi there! My name is Will." |
对话记录
1 | ================================ Human Message ================================= |
提出后续问题
提出后续问题:
1 | user_input = "Remember my name?" |
对话记录:
1 | ================================ Human Message ================================= |
变更下thread_id再次进行下测试:
1 | user_input = "Remember my name?" |
对话记录:
1 | ================================ Human Message ================================= |
请注意,我们所做的唯一更改是修改了
thread_id
的配置。
检查状态
到目前为止,我们已经在两个不同的线程上创建了一些检查点。但是检查点包含哪些内容呢?要state
随时检查给定配置的图表,请调用get_state(config)
。
1 | snapshot = graph.get_state(config) |
结果:
1 | snapshot1: StateSnapshot(values={'messages': [HumanMessage(content='Hi there! My name is Will.', additional_kwargs={}, response_metadata={}, id='ecd9b10a-c211-401a-9445-adbc597c1044'), AIMessage(content='Hello, Will! Nice to meet you. How can I assist you today?', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 17, 'prompt_tokens': 1563, 'total_tokens': 1580, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'qwen2.5:7b', 'system_fingerprint': 'fp_ollama', 'id': 'chatcmpl-52', 'service_tier': None, 'finish_reason': 'stop', 'logprobs': None}, id='run--1c9c145c-6fa4-415f-92b6-47f84997466b-0', usage_metadata={'input_tokens': 1563, 'output_tokens': 17, 'total_tokens': 1580, 'input_token_details': {}, 'output_token_details': {}}), HumanMessage(content='Remember my name?', additional_kwargs={}, response_metadata={}, id='5b1c1d1f-7178-4326-81a0-0beb501521fc'), AIMessage(content="Of course! You mentioned your name is Will. Is there anything specific you'd like to know or discuss?", additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 23, 'prompt_tokens': 1593, 'total_tokens': 1616, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'qwen2.5:7b', 'system_fingerprint': 'fp_ollama', 'id': 'chatcmpl-599', 'service_tier': None, 'finish_reason': 'stop', 'logprobs': None}, id='run--faa5caf2-81bb-4150-b5c9-c049c8ef30a4-0', usage_metadata={'input_tokens': 1593, 'output_tokens': 23, 'total_tokens': 1616, 'input_token_details': {}, 'output_token_details': {}})]}, next=(), config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1f07cbc5-e584-67b8-8004-70fd49b674a1'}}, metadata={'source': 'loop', 'step': 4, 'parents': {}}, created_at='2025-08-19T05:21:32.702483+00:00', parent_config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1f07cbc5-da23-6766-8003-fece86761aa4'}}, tasks=(), interrupts=()) |
上面的快照包含当前状态值、相应的配置以及next
要处理的节点。在我们的例子中,图已达到某个END
状态,因此next
为空。
恭喜!借助 LangGraph 的检查点系统,您的聊天机器人现在可以跨会话保持对话状态。这为更自然、更符合情境的交互开辟了激动人心的可能性。LangGraph 的检查点甚至可以处理任意复杂的图状态,这比简单的聊天记忆更具表现力和功能强大得多。
完整代码
1 | import os |