跳到内容

如何添加线程级别持久性(函数式 API)

先决条件

本指南假定您熟悉以下内容

LangGraph API 用户无需此操作

如果您使用的是 LangGraph API,则无需手动实现检查点保存器。API 会自动为您处理检查点。本指南适用于在您自己的自定义服务器中实现 LangGraph 的情况。

许多 AI 应用程序需要记忆来在同一线程上的多次交互(例如,多次对话回合)中共享上下文。在 LangGraph 函数式 API 中,可以使用线程级别持久性将此类记忆添加到任何entrypoint() 工作流中。

创建 LangGraph 工作流时,您可以通过使用检查点保存器来设置其结果的持久性

  1. 创建检查点保存器实例

    from langgraph.checkpoint.memory import MemorySaver
    
    checkpointer = MemorySaver()       
    
  2. checkpointer 实例传递给 entrypoint() 装饰器

    from langgraph.func import entrypoint
    
    @entrypoint(checkpointer=checkpointer)
    def workflow(inputs)
        ...
    
  3. (可选)在工作流函数签名中暴露 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)
        ...
    
  4. (可选)选择将从工作流返回哪些值以及检查点保存器将哪些值保存为 previous

    @entrypoint(checkpointer=checkpointer)
    def workflow(inputs, *, previous):
        ...
        result = do_something(...)
        return entrypoint.final(value=result, save=combine(inputs, result))
    

本指南介绍如何向工作流添加线程级别持久性。

注意

如果您需要跨多个对话或用户共享的记忆(跨线程持久性),请查阅此操作指南

注意

如果您需要为 StateGraph 添加线程级别持久性,请查阅此操作指南

设置

首先,我们需要安装所需的软件包

pip install --quiet -U langgraph langchain_anthropic

接下来,我们需要设置 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()
================================== Ai Message ==================================

Your name is Bob.
如果我们想开始新的对话,可以传入不同的 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"。查阅此操作指南了解更多信息。

评论