Skip to main content
LangGraph 实现了一个流式系统,用于展示实时更新。流式传输对于增强基于 LLM 构建的应用程序的响应性至关重要。通过逐步显示输出,即使在完整响应准备好之前,流式传输也能显著改善用户体验 (UX),特别是在处理 LLM 延迟时。

入门

基本用法

LangGraph 图暴露了 stream 方法来生成流式输出作为迭代器。

流模式

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

图状态

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

LLM 令牌

使用 messages 流式模式从图的任何部分(包括节点、工具、子图或任务)逐个令牌地流式传输大型语言模型 (LLM) 输出。 messages 模式 的流式输出是一个元组 [message_chunk, metadata],其中:
  • message_chunk: LLM 的令牌或消息段。
  • metadata: 包含有关图节点和 LLM 调用详细信息的字典。
如果您的 LLM 不可用作 LangChain 集成,则可以使用 custom 模式流式传输其输出。详见 与任何 LLM 配合使用

按 LLM 调用筛选

您可以将 tags 关联到 LLM 调用,以便按 LLM 调用筛选流式传输的令牌。

从流中省略消息

使用 nostream 标签完全排除 LLM 输出。标记为 nostream 的调用仍然运行并产生输出;它们的令牌只是在 messages 模式下不发出。 这在以下情况下很有用:
  • 您需要 LLM 输出进行内部处理(例如结构化输出),但不想将其流式传输到客户端
  • 您通过不同的渠道流式传输相同的内容(例如自定义 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 事件。

在服务端消费工具事件

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

在 React 中使用 useStream 进行工具进度

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

toolscustom 流模式

两种流模式都可以显示工具进度,但它们服务于不同的目的:
  • tools — 自动发出结构化的生命周期事件 (on_tool_start, on_tool_event, on_tool_end, on_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 是该模式流式传输的数据。

高级

与任何 LLM 配合使用

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

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

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