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

概述

LangChain 的流式系统允许您将智能体运行的实时反馈展示到您的应用程序中。 使用 LangChain 流式传输可以实现: 请参阅下面的 常见模式 部分以获取更多端到端示例。

支持的流模式

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

智能体进度

要流式传输智能体进度,请使用 streamastream 方法并设置 stream_mode="updates"。这会在每个智能体步骤后发射一个事件。 例如,如果您有一个调用一次工具的代理,您应该看到以下更新:
  • LLM 节点:带有工具调用请求的 AIMessage
  • 工具节点:带有执行结果的 ToolMessage
  • LLM 节点:最终 AI 响应
Streaming agent progress
Output

LLM 令牌

要流式传输由 LLM 产生的令牌,请使用 stream_mode="messages"。下面您可以看到代理流式传输工具调用和最终响应的输出。
Streaming LLM tokens
Output

自定义更新

要流式传输工具执行时的更新,您可以使用 get_stream_writer
Streaming custom updates
Output
如果您在工具内部添加 get_stream_writer,您将无法在 LangGraph 执行上下文之外调用该工具。

流式传输多种模式

您可以通过传递流模式列表来指定多个流模式:stream_mode=["updates", "custom"] 每个流式传输的块都是一个 StreamPart 字典,包含 typensdata 键。使用 chunk["type"] 确定流模式,并使用 chunk["data"] 访问负载。
Streaming multiple modes
Output

常见模式

以下是展示流式传输常见用例的示例。

流式传输思考/推理令牌

某些模型在生成最终答案之前会进行内部推理。您可以通过过滤 标准内容块type"reasoning" 来流式传输这些正在生成的思考/推理令牌。
必须在模型上启用推理输出。请参阅 推理部分 和您的 提供商的集成页面 以获取配置详情。要快速检查模型的推理支持情况,请查看 models.dev
要从智能体流式传输思考令牌,请使用 stream_mode="messages" 并过滤推理内容块:
Output
无论模型提供商如何,其工作原理相同—LangChain 将特定于提供商的格式(Anthropic thinking 块、OpenAI reasoning 摘要等)通过 content_blocks 属性标准化为标准的 "reasoning" 内容块类型。 要从聊天模型直接流式传输推理令牌(不使用智能体),请参阅 与聊天模型流式传输

流式传输工具调用

您可能希望同时流式传输以下内容:
  1. 随着 工具调用 生成而生成部分 JSON
  2. 已完成的、解析后的执行工具调用
指定 stream_mode="messages" 将流式传输智能体中所有 LLM 调用生成的增量 消息块。要访问带有解析后工具调用的已完成消息:
  1. 如果这些消息在 状态 中被跟踪(如 create_agent 的模型节点中),请使用 stream_mode=["messages", "updates"] 通过 状态更新 访问已完成的消息(如下所示演示)。
  2. 如果这些消息未在状态中跟踪,请使用 自定义更新 或在流式循环中聚合块(下一节)。
如果您的智能体包含多个 LLM,请参阅下面关于 从子智能体流式传输 的部分。
Output

访问已完成的消息

如果已完成的消息在智能体的 状态 中被跟踪,您可以使用 stream_mode=["messages", "updates"],如 流式传输工具调用 部分所示,以便在流式传输期间访问已完成的消息。
在某些情况下,已完成的消息不会反映在 状态更新 中。如果您可以访问智能体内部,您可以使用 自定义更新 在流式传输期间访问这些消息。否则,您可以在流式循环中聚合消息块(见下文)。 考虑以下示例,我们将 流写入器 纳入简化的 护栏中间件。此中间件演示了工具调用以生成结构化的“安全/不安全”评估(也可以使用 结构化输出 来完成此操作):
然后我们可以将此中间件纳入我们的智能体并包含其自定义流事件:
Output
或者,如果您无法向流添加自定义事件,您可以在流式循环内聚合消息块:

人机回环流式传输

为了处理人类参与循环的 中断,我们在 上面的示例 基础上构建:
  1. 我们配置智能体使用 人类参与循环中间件和检查点器
  2. 我们收集在 "updates" 流模式下生成的中断
  3. 我们使用 命令 响应这些中断
Output
接下来,我们为每个中断收集一个 决策。重要的是,决策的顺序必须与我们收集的动作顺序相匹配。 为了说明,我们将编辑一个工具调用并接受另一个:
Output
然后,我们可以通过将 命令 传入相同的流式循环来恢复:
Output

从子智能体流式传输

当智能体中的任何位置有多个 LLM 时,通常有必要区分生成消息的来源。 为此,在创建每个智能体时传递一个 name。然后在 "messages" 模式下流式传输时,该名称可通过 lc_agent_name 键在元数据中获取。 下面,我们更新 流式传输工具调用 示例:
  1. 我们用 call_weather_agent 工具替换我们的工具,该工具在内部调用智能体
  2. 我们为每个智能体添加一个 name
  3. 创建流时指定 subgraphs=True
  4. 我们的流处理与之前相同,但我们添加了逻辑以使用 create_agentname 参数跟踪当前活动的智能体
当您为智能体设置 name 时,该名称也会附加到该智能体生成的任何 AIMessage 上。
首先我们构建智能体:
接下来,我们在流式循环中添加逻辑以报告哪个智能体正在发出令牌:
Output

禁用流式传输

在某些应用程序中,您可能需要禁用给定模型的单个令牌的流式传输。这在以下情况下很有用:
  • 多智能体 系统一起工作以控制哪些智能体流式传输其输出
  • 混合支持流式传输和不支持流式传输的模型
  • 部署到 LangSmith 并希望防止某些模型输出流式传输到客户端
初始化模型时设置 streaming=False
部署到 LangSmith 时,对任何您不希望流式传输到客户端的模型设置 streaming=False。这是在部署前在您的图代码中配置的。
并非所有聊天模型集成都支持 streaming 参数。如果您的模型不支持它,请使用 disable_streaming=True。此参数通过基类在所有聊天模型上可用。
有关更多详细信息,请参阅 LangGraph 流式指南

v2 流式格式

需要 LangGraph >= 1.1。
stream()astream() 传递 version="v2" 以获得统一的输出格式。每个块都是一个 StreamPart 字典,包含 typensdata 键—无论流模式或模式数量如何,形状都相同:
v2 格式还改进了 invoke()—它返回一个带有 .value.interrupts 属性的 GraphOutput 对象,清晰地将状态与中断元数据分离:
有关 v2 格式的更多详细信息,包括类型缩小、Pydantic/dataclass 强制转换和子图流式传输,请参阅 LangGraph 流式文档

相关资源