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

入门

基本用法

LangGraph 图暴露了 stream (同步) 和 astream (异步) 方法来生成流式输出作为迭代器。传递一个或多个 流模式 来控制您接收的数据。
输出
输出

流输出格式 (v2)

需要 LangGraph >= 1.1。本页面上的所有示例均使用 version="v2"
stream()astream() 传递 version="v2" 以获得统一的输出格式。每个块都是一个 StreamPart 字典,具有一致的形状 — 无论流模式、模式数量还是子图设置如何:
每种流模式都有一个对应的 TypedDict,包含 ValuesStreamPartUpdatesStreamPartMessagesStreamPartCustomStreamPartCheckpointStreamPartTasksStreamPartDebugStreamPart。您可以从 langgraph.types 导入这些类型。联合类型 StreamPartpart["type"] 上的不相交联合,支持在编辑器和类型检查器中进行完整的类型收窄。 使用 v1(默认值),输出格式会根据您的流选项而变化(单模式返回原始数据,多模式返回 (mode, data) 元组,子图返回 (namespace, data) 元组)。使用 v2,格式始终相同:
v2 格式还支持类型收窄,这意味着您可以根据 chunk["type"] 过滤块并获得正确的负载类型。每个分支将 part["data"] 收窄为该模式的特定类型:

流模式

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

图状态

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

LLM 令牌

使用 messages 流式模式从图的任何部分(包括节点、工具、子图或任务)逐个令牌地流式传输大型语言模型 (LLM) 输出。 messages 模式 的流式输出是一个元组 (message_chunk, metadata),其中:
  • message_chunk: LLM 的令牌或消息段。
  • metadata: 包含有关图节点和 LLM 调用详细信息的字典。
如果您的 LLM 不可用作 LangChain 集成,则可以使用 custom 模式流式传输其输出。详见 与任何 LLM 配合使用
Python < 3.11 的异步需要手动配置 当在 Python < 3.11 中使用异步代码时,您必须显式传递 RunnableConfigainvoke() 以启用正确的流式传输。详见 Python < 3.11 的异步 或升级到 Python 3.11+。

按 LLM 调用筛选

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

从流中省略消息

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

按节点筛选

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

自定义数据

要从 LangGraph 节点或工具内部发送自定义用户定义的数据,请按照以下步骤操作:
  1. 使用 get_stream_writer 访问流写入器并发出自定义数据。
  2. 调用 .stream().astream() 时设置 stream_mode="custom" 以在流中获取自定义数据。您可以组合多种模式(例如 ["updates", "custom"]),但必须至少有一个是 "custom"
Python < 3.11 的异步中没有 get_stream_writer 在 Python < 3.11 上运行的异步代码中,get_stream_writer 将无法工作。 相反,请在您的节点或工具中添加 writer 参数并手动传递它。 详见 Python < 3.11 的异步 以获取用法示例。

子图输出

要将 子图 的输出包含在流式输出中,您可以在父图的 .stream() 方法中设置 subgraphs=True。这将流式传输来自父图和任何子图的输出。 输出将作为元组 (namespace, data) 流式传输,其中 namespace 是一个元组,包含调用子图的节点路径,例如 ("parent_node:<task_id>", "child_node:<task_id>")
使用 version="v2",子图事件使用相同的 StreamPart 格式。ns 字段标识来源:
注意 我们不仅接收节点更新,还接收命名空间,这告诉我们正在从哪个图(或子图)流式传输。

检查点

使用 checkpoints 流模式在图执行期间接收检查点事件。每个检查点事件的格式与 get_state() 的输出相同。需要 检查点器

任务

使用 tasks 流模式在图执行期间接收任务开始和结束事件。任务事件包含有关正在运行的节点、其结果和任何错误的信息。需要 检查点器

调试

使用 debug 流模式在图执行过程中尽可能多地流式传输信息。流式输出包括节点名称以及完整状态。
debug 模式结合 checkpointstasks 事件以及额外的元数据。如果您只需要调试信息的一个子集,请直接使用 checkpointstasks

同时使用多种模式

您可以将列表作为 stream_mode 参数传递以同时流式传输多种模式。 使用 version="v2",每个块都是一个 StreamPart 字典。使用 chunk["type"] 区分模式:

高级

与任何 LLM 配合使用

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

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

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

迁移到 v2

v2 流式格式(本页使用的格式)提供统一的输出格式。以下是关键差异和迁移方法的摘要:

v2 invoke 格式

当向 invoke()ainvoke() 传递 version="v2" 时,它返回一个 GraphOutput 对象,包含 .value.interrupts 属性:
对于除默认 "values" 之外的任何流模式,invoke(..., stream_mode="updates", version="v2") 返回 list[StreamPart] 而不是 list[tuple]
GraphOutput 上的字典风格访问 (result["key"], "key" in result, result["__interrupt__"]) 仍可用于向后兼容,但已弃用,将在未来版本中移除。请迁移到 result.valueresult.interrupts
这将状态与中断元数据分离。使用 v1,中断嵌入在返回的字典下的 __interrupt__ 中:

Pydantic 和数据类状态强制转换

当您的图状态是 Pydantic 模型或数据类时,v2 values 模式会自动将输出强制转换为正确的类型:

Python < 3.11 的异步处理

在 Python < 3.11 版本中,asyncio tasks 不支持 context 参数。 这限制了 LangGraph 自动传播上下文的能力,并以两种方式影响 LangGraph 的流式机制:
  1. 必须显式传递 RunnableConfig 到异步 LLM 调用(例如 ainvoke()),因为回调不会自动传播。
  2. 无法在异步节点或工具中使用 get_stream_writer — 您必须直接传递 writer 参数。