流式传输
流式传输对于提高基于LLM构建的应用程序的响应能力至关重要。通过渐进式地显示输出,即使在完整响应准备好之前,流式传输也能显著改善用户体验 (UX),尤其是在处理 LLM 的延迟时。
概述
从LLM生成完整响应通常需要几秒钟的延迟,这在具有多个模型调用的复杂应用程序中会更加明显。幸运的是,LLM 会迭代地生成响应,允许在中间结果生成时显示它们。通过流式传输这些中间输出,LangChain 能够提供更流畅的 LLM 应用 UX,并在其设计的核心提供对流式传输的内置支持。
在本指南中,我们将讨论 LLM 应用程序中的流式传输,并 探讨 LangChain 的流式传输 API 如何支持您应用程序中各种组件的实时输出。
在 LLM 应用程序中流式传输什么
在涉及 LLM 的应用程序中,可以流式传输多种类型的数据,以通过减少感知延迟和提高透明度来改善用户体验。这些包括:
1. 流式传输 LLM 输出
最常见也是最重要的流式传输数据是 LLM 本身生成的输出。LLM 通常需要时间来生成完整响应,通过实时流式传输输出,用户可以即时看到部分结果。这提供了即时反馈,并有助于减少用户的等待时间。
2. 流式传输管道或工作流进度
除了流式传输 LLM 输出之外,流式传输更复杂的工作流或管道的进度也很有用,这能让用户对应用程序的整体进展有所了解。这可能包括:
-
在 LangGraph 工作流中: 使用 LangGraph,工作流由节点和边组成,代表不同的步骤。这里的流式传输涉及跟踪图状态的变化,因为各个节点请求更新。这允许更精细地 监视工作流中当前活动的节点,从而在工作流逐渐进行到不同阶段时提供关于工作流状态的实时更新。
-
在 LCEL 管道中: 流式传输 LCEL 管道的更新涉及捕获来自各个子可运行组件的进度。例如,当管道的不同步骤或组件执行时,您可以流式传输当前正在运行的子可运行组件,从而提供对整个管道进度的实时洞察。
流式传输管道或工作流进度对于为用户提供应用程序在执行过程中所处位置的清晰视图至关重要。
3. 流式传输自定义数据
在某些情况下,您可能需要流式传输自定义数据,这些数据超出了管道或工作流结构提供的信息。这些自定义信息被注入工作流中的特定步骤,无论是工具还是 LangGraph 节点。例如,您可以实时流式传输关于工具正在做什么的更新,或者 LangGraph 节点的进度。这些直接从步骤内部发出的细粒度数据提供了对工作流执行的更详细的洞察,尤其适用于需要更高可见性的复杂流程。
流式传输 API
LangChain 提供两个主要的 API,用于实时流式传输输出。这些 API 支持实现可运行接口的任何组件,包括LLM、编译后的 LangGraph 图以及使用LCEL生成的任何可运行组件。
- 同步 stream 和异步 astream:用于流式传输由可运行组件(例如聊天模型)生成的输出,或者流式传输由 LangGraph 创建的任何工作流。
- 仅异步的 astream_events:使用此 API 可访问由完全使用LCEL构建的 LLM 应用程序中的自定义事件和中间输出。请注意,此 API 可用,但在使用 LangGraph 时不需要。
此外,还有一个