如何添加线程级别持久性(函数式 API)¶
LangGraph API 用户无需此操作
如果您使用的是 LangGraph API,则无需手动实现检查点保存器。API 会自动为您处理检查点。本指南适用于在您自己的自定义服务器中实现 LangGraph 的情况。
许多 AI 应用程序需要记忆来在同一线程上的多次交互(例如,多次对话回合)中共享上下文。在 LangGraph 函数式 API 中,可以使用线程级别持久性将此类记忆添加到任何entrypoint() 工作流中。
创建 LangGraph 工作流时,您可以通过使用检查点保存器来设置其结果的持久性
-
创建检查点保存器实例
-
将
checkpointer
实例传递给entrypoint()
装饰器 -
(可选)在工作流函数签名中暴露
previous
参数@entrypoint(checkpointer=checkpointer) def workflow( inputs, *, # you can optionally specify `previous` in the workflow function signature # to access the return value from the workflow as of the last execution previous ): previous = previous or [] combined_inputs = previous + inputs result = do_something(combined_inputs) ...
-
(可选)选择将从工作流返回哪些值以及检查点保存器将哪些值保存为
previous
本指南介绍如何向工作流添加线程级别持久性。
注意
如果您需要跨多个对话或用户共享的记忆(跨线程持久性),请查阅此操作指南。
注意
如果您需要为 StateGraph
添加线程级别持久性,请查阅此操作指南。
设置¶
首先,我们需要安装所需的软件包
接下来,我们需要设置 Anthropic(我们将使用的 LLM)的 API 密钥。
import getpass
import os
def _set_env(var: str):
if not os.environ.get(var):
os.environ[var] = getpass.getpass(f"{var}: ")
_set_env("ANTHROPIC_API_KEY")
为 LangGraph 开发设置 LangSmith
注册 LangSmith,快速发现问题并提高 LangGraph 项目的性能。LangSmith 允许您使用跟踪数据来调试、测试和监控使用 LangGraph 构建的 LLM 应用程序 — 在此处阅读更多关于如何入门的信息。
示例:具有短期记忆的简单聊天机器人¶
我们将使用一个包含单个任务的工作流,该任务调用一个聊天模型。
我们先定义将要使用的模型
API 参考:ChatAnthropic
from langchain_anthropic import ChatAnthropic
model = ChatAnthropic(model="claude-3-5-sonnet-latest")
现在我们可以定义任务和工作流了。要添加持久性,我们需要将Checkpointer 传递给entrypoint() 装饰器。
API 参考:BaseMessage | add_messages | entrypoint | task | MemorySaver
from langchain_core.messages import BaseMessage
from langgraph.graph import add_messages
from langgraph.func import entrypoint, task
from langgraph.checkpoint.memory import MemorySaver
@task
def call_model(messages: list[BaseMessage]):
response = model.invoke(messages)
return response
checkpointer = MemorySaver()
@entrypoint(checkpointer=checkpointer)
def workflow(inputs: list[BaseMessage], *, previous: list[BaseMessage]):
if previous:
inputs = add_messages(previous, inputs)
response = call_model(inputs).result()
return entrypoint.final(value=response, save=add_messages(inputs, response))
如果我们尝试使用此工作流,对话的上下文将在交互之间持久化
注意
如果您正在使用 LangGraph Cloud 或 LangGraph Studio,则无需将 checkpointer 传递给 entrypoint 装饰器,因为这是自动完成的。
现在我们可以与智能体交互,并看到它记住了之前的消息!
config = {"configurable": {"thread_id": "1"}}
input_message = {"role": "user", "content": "hi! I'm bob"}
for chunk in workflow.stream([input_message], config, stream_mode="values"):
chunk.pretty_print()
================================== Ai Message ==================================
Hi Bob! I'm Claude. Nice to meet you! How are you today?
input_message = {"role": "user", "content": "what's my name?"}
for chunk in workflow.stream([input_message], config, stream_mode="values"):
chunk.pretty_print()
thread_id
。唰!所有记忆都消失了!
input_message = {"role": "user", "content": "what's my name?"}
for chunk in workflow.stream(
[input_message],
{"configurable": {"thread_id": "2"}},
stream_mode="values",
):
chunk.pretty_print()
================================== Ai Message ==================================
I don't know your name unless you tell me. Each conversation I have starts fresh, so I don't have access to any previous interactions or personal information unless you share it with me.
流式传输令牌
如果您想从聊天机器人流式传输 LLM 令牌,可以使用 stream_mode="messages"
。查阅此操作指南了解更多信息。