Skip to main content
LangGraph 实现了一套流式传输系统,用于实时推送更新。流式传输对于提升基于大语言模型(LLM)构建的应用程序的响应速度至关重要。通过在完整响应尚未生成完毕时就逐步显示输出内容,流式传输显著改善了用户体验(UX),尤其在应对大语言模型固有的延迟时效果尤为明显。 LangGraph 流式传输支持的功能:

支持的流式传输模式

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

基本用法示例

LangGraph 图暴露了 .stream()(同步)和 .astream()(异步)方法,以迭代器形式生成流式输出。
  1. stream() 方法返回一个迭代器,用于生成流式输出。
  2. 设置 stream_mode="updates" 以仅流式传输每个节点执行后对图状态的更新。也可使用其他流式传输模式。详情请参阅支持的流式传输模式

流式传输多种模式

你可以将 stream_mode 参数设置为一个列表,以同时流式传输多种模式。 流式输出将是 (mode, chunk) 形式的元组,其中 mode 是流式传输模式的名称,chunk 是该模式流式传输的数据。

流式传输图状态

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

流式传输子图输出

为了在流式输出中包含子图的输出,你可以在父图的 .stream() 方法中设置 subgraphs=True。这将同时流式传输父图和任何子图的输出。 输出将以 (namespace, data) 元组的形式流式传输,其中 namespace 是一个元组,表示调用子图的节点路径,例如 ("parent_node:<task_id>", "child_node:<task_id>")
  1. 设置 subgraphs=True 以流式传输子图的输出。
  1. 设置 subgraphs=True 以流式传输子图的输出。
注意 我们不仅接收到了节点更新,还接收到了命名空间,它告诉我们当前流式传输来自哪个图(或子图)。

调试

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

LLM 令牌

使用 messages 流式传输模式,从图的任何部分(包括节点、工具、子图或任务)逐令牌流式传输大语言模型(LLM)的输出。 messages 模式 的流式输出是一个元组 (message_chunk, metadata),其中:
  • message_chunk:来自 LLM 的令牌或消息片段。
  • metadata:包含有关图节点和 LLM 调用详细信息的字典。
如果你的 LLM 没有 LangChain 集成,可以改用 custom 模式流式传输其输出。详情请参阅与任意 LLM 一起使用
Python < 3.11 的异步需要手动配置 在 Python < 3.11 中使用异步代码时,必须显式地将 RunnableConfig 传递给 ainvoke() 以启用正确的流式传输。详情请参阅异步与 Python < 3.11 或升级到 Python 3.11+。
  1. 注意,即使使用 .invoke 而不是 .stream 运行 LLM,也会发出消息事件。
  2. “messages” 流式传输模式返回一个 (message_chunk, metadata) 元组的迭代器,其中 message_chunk 是 LLM 流式传输的令牌,metadata 是包含调用 LLM 的图节点信息及其他信息的字典。

按 LLM 调用过滤

你可以为 LLM 调用关联 tags,以按 LLM 调用过滤流式传输的令牌。
  1. llm_1 被标记为 “joke”。
  2. llm_2 被标记为 “poem”。
  3. stream_mode 设置为 “messages” 以流式传输 LLM 令牌。metadata 包含有关 LLM 调用的信息,包括标签。
  4. 通过 metadata 中的 tags 字段过滤流式传输的令牌,仅包含标记为 “joke” 的 LLM 调用的令牌。
  1. joke_model 被标记为 “joke”。
  2. poem_model 被标记为 “poem”。
  3. 显式传递 config 以确保上下文变量正确传播。这在 Python < 3.11 中使用异步代码时是必需的。详情请参阅异步部分
  4. stream_mode 设置为 “messages” 以流式传输 LLM 令牌。metadata 包含有关 LLM 调用的信息,包括标签。

按节点过滤

要仅从特定节点流式传输令牌,请使用 stream_mode="messages" 并通过流式传输元数据中的 langgraph_node 字段过滤输出:
  1. “messages” 流式传输模式返回一个 (message_chunk, metadata) 元组,其中 message_chunk 是 LLM 流式传输的令牌,metadata 是包含调用 LLM 的图节点信息及其他信息的字典。
  2. 通过 metadata 中的 langgraph_node 字段过滤流式传输的令牌,仅包含来自 write_poem 节点的令牌。
  1. “messages” 流式传输模式返回一个 (message_chunk, metadata) 元组,其中 message_chunk 是 LLM 流式传输的令牌,metadata 是包含调用 LLM 的图节点信息及其他信息的字典。
  2. 通过 metadata 中的 langgraph_node 字段过滤流式传输的令牌,仅包含来自 write_poem 节点的令牌。

流式传输自定义数据

要从 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
  1. 获取流式写入器以发送自定义数据。
  2. 发出一个自定义键值对(例如,进度更新)。 3. 设置 stream_mode="custom" 以在流中接收自定义数据。

与任意 LLM 一起使用

你可以使用 stream_mode="custom"任意 LLM API 流式传输数据 —— 即使该 API 实现 LangChain 聊天模型接口。 这使你可以集成原始 LLM 客户端或提供自身流式接口的外部服务,使 LangGraph 对于自定义设置具有高度灵活性。
  1. 获取流式写入器以发送自定义数据。
  2. 使用你的自定义流式客户端生成 LLM 令牌。
  3. 使用写入器将自定义数据发送到流中。
  4. 设置 stream_mode="custom" 以在流中接收自定义数据。
让我们用一个包含工具调用的 AI 消息调用图:

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

如果你的应用程序混合了支持流式传输和不支持流式传输的模型,你可能需要显式地为不支持流式传输的模型禁用流式传输。 在初始化模型时设置 disable_streaming=True
  1. 设置 disable_streaming=True 以禁用聊天模型的流式传输。

Python < 3.11 的异步

在 Python 版本 < 3.11 中,asyncio 任务不支持 context 参数。 这限制了 LangGraph 自动传播上下文的能力,并以两种关键方式影响 LangGraph 的流式传输机制:
  1. 必须在异步 LLM 调用(例如,ainvoke())中显式传递 RunnableConfig,因为回调不会自动传播。
  2. 不能在异步节点或工具中使用 get_stream_writer() —— 你必须直接传递一个 writer 参数。
  1. 在异步节点函数中接受 config 作为参数。
  2. config 传递给 llm.ainvoke() 以确保上下文正确传播。
  3. 设置 stream_mode="messages" 以流式传输 LLM 令牌。
  1. 在异步节点或工具的函数签名中添加 writer 作为参数。LangGraph 将自动将流式写入器传递给函数。
  2. 设置 stream_mode="custom" 以在流中接收自定义数据。