Skip to main content
LangGraph 实现了一个流式处理系统,用于呈现实时更新。流式处理对于提升基于大语言模型构建的应用程序的响应速度至关重要。通过渐进式地显示输出,甚至在完整响应准备好之前,流式处理显著改善了用户体验(UX),尤其是在处理大语言模型的延迟时。

入门

基本用法

LangGraph 图暴露了 stream 方法,用于将流式输出作为迭代器产生。

流模式

将一个或多个以下流模式作为列表传递给 stream 方法:

图状态

使用流模式 updatesvalues 来流式传输图执行过程中的状态。
  • updates 流式传输图每一步之后状态的更新
  • values 流式传输图每一步之后状态的完整值
使用此模式仅流式传输节点在每一步返回的状态更新。流式输出包括节点的名称以及更新内容。

大语言模型标记

使用 messages 流模式,从图的任何部分(包括节点、工具、子图或任务)逐标记流式传输大语言模型(LLM)输出。 来自 messages 模式的流式输出是一个元组 [message_chunk, metadata],其中:
  • message_chunk:来自大语言模型的标记或消息片段。
  • metadata:一个字典,包含有关图节点和大语言模型调用的详细信息。
如果您的大语言模型不是作为 LangChain 集成提供的,您可以改用 custom 模式来流式传输其输出。详情请参阅与任何大语言模型一起使用

按大语言模型调用筛选

您可以将 tags 与大语言模型调用关联,以按大语言模型调用筛选流式传输的标记。

从流中省略消息

使用 nostream 标签完全排除大语言模型输出。标记为 nostream 的调用仍然运行并产生输出;它们的标记只是不会在 messages 模式下发出。 这在以下情况下很有用:
  • 您需要大语言模型输出用于内部处理(例如结构化输出),但不想将其流式传输到客户端
  • 您通过不同的通道(例如自定义 UI 消息)流式传输相同的内容,并希望避免在 messages 流中出现重复输出

按节点筛选

要仅从特定节点流式传输标记,请使用 stream_mode="messages" 并通过流式元数据中的 langgraph_node 字段筛选输出:

自定义数据

要从 LangGraph 节点或工具内部发送自定义用户定义数据,请按照以下步骤操作:
  1. 使用 LangGraphRunnableConfig 中的 writer 参数发出自定义数据。
  2. 调用 .stream() 时设置 streamMode: "custom" 以在流中获取自定义数据。您可以组合多种模式(例如 ["updates", "custom"]),但至少必须有一个是 "custom"

工具进度

使用 tools 流模式接收工具执行的实时生命周期事件。这对于在工具运行时在 UI 中显示进度指示器、部分结果和错误状态非常有用。 tools 流模式发出四种事件类型:

定义流式传输进度的工具

要发出 on_tool_event 事件,请将您的工具函数定义为异步生成器async function*)。每个 yield 将中间数据发送到流,return 值用作工具的最终结果。
返回 Promise 的现有工具完全兼容。它们会发出 on_tool_starton_tool_end 事件,但不会发出 on_tool_event 事件。

在服务器端消费工具事件

streamMode: ["tools"](或与其他模式组合)传递给 graph.stream()

在 React 中使用 useStream 的工具进度

来自 @langchain/langgraph-sdk/reactuseStream 钩子在您包含 "tools" 流模式时会暴露一个 toolProgress 数组。每个条目都是一个 ToolProgress 对象,跟踪正在运行的工具的当前状态:
此示例展示了一个完整的代理,它使用异步生成器工具将搜索进度流式传输到 React UI。代理定义:
带有进度卡片的 React 组件:

toolscustom 流模式

两种流模式都可以呈现工具进度,但它们服务于不同的目的:
  • tools — 自动发出结构化的生命周期事件(on_tool_starton_tool_eventon_tool_endon_tool_error),除了使用 async function* 外,无需在工具中进行任何代码更改。useStream 钩子开箱即提供响应式的 toolProgress 数组。
  • custom — 使用 config.writer() 让您完全控制发出什么数据以及何时发出。当您需要不符合工具生命周期的自由格式数据,或者想要从节点(而不仅仅是工具)流式传输时,请使用此模式。

子图输出

要将子图的输出包含在流式输出中,您可以在父图的 .stream() 方法中设置 subgraphs: true。这将流式传输父图和任何子图的输出。 输出将以元组 [namespace, data] 的形式流式传输,其中 namespace 是一个元组,包含调用子图的节点路径,例如 ["parent_node:<task_id>", "child_node:<task_id>"]
注意,我们不仅接收节点更新,还接收命名空间,这些命名空间告诉我们正在从哪个图(或子图)流式传输。

调试

使用 debug 流模式,在图执行过程中流式传输尽可能多的信息。流式输出包括节点的名称以及完整状态。

同时使用多种模式

您可以将数组作为 streamMode 参数传递,以同时流式传输多种模式。 流式输出将是 [mode, chunk] 的元组,其中 mode 是流模式的名称,chunk 是该模式流式传输的数据。

高级

与任何大语言模型一起使用

您可以使用 streamMode: "custom"任何大语言模型 API 流式传输数据——即使该 API 没有实现 LangChain 聊天模型接口。 这使您可以集成原始大语言模型客户端或提供自己流式接口的外部服务,使 LangGraph 在自定义设置中具有高度灵活性。
让我们使用包含工具调用的 AIMessage 调用图:

为特定聊天模型禁用流式传输

如果您的应用程序混合了支持流式传输和不支持流式传输的模型,您可能需要为不支持流式传输的模型显式禁用流式传输。 在初始化模型时设置 streaming: false
并非所有聊天模型集成都支持 streaming 参数。如果您的模型不支持它,请改用 disableStreaming: true。此参数可通过基类在所有聊天模型上使用。