Streaming Support in LangChain

LangChain 中的流式处理支持

2 分钟阅读

我们很高兴地宣布 LangChain 中的流式处理支持。关于 LLM 应用程序的最佳用户体验已经有很多讨论,我们认为流式处理是其核心。我们还更新了 chat-langchain 代码库,以包含流式处理和异步执行。我们希望这个代码库可以作为开发人员构建一流的聊天和问答应用程序的模板。

动机

开发人员在尝试构建有用的 LLM 应用程序时讨论的最大痛点之一是延迟;这些应用程序通常会多次调用 LLM API,每次调用都需要几秒钟。盯着加载指示器超过几秒钟可能会是非常令人沮丧的用户体验。

流式处理 通过逐个 token 返回 LLM 的输出,而不是一次性返回所有输出,从而帮助减少这种感知到的延迟。在聊天应用程序的上下文中,当 LLM 生成 token 时,它可以立即提供给用户。虽然这不会改变从问题提交到完整响应的端到端执行时间,但它通过向用户展示 LLM 正在取得进展,大大减少了感知到的延迟。ChatGPT 是一个利用 LLM 流式处理的应用程序的绝佳示例。我们构建了一个示例聊天机器人应用程序,它像 ChatGPT 一样使用流式处理(更多详情见下文)

用法

作为起点,我们已经为 LLMOpenAI 实现实现了流式处理支持。请阅读完整的文档 此处

我们支持一个名为 on_llm_new_token 的回调,当 OpenAIstreaming 参数设置为 True 时,用户可以在他们的回调处理程序中实现该回调。同步和异步执行都支持流式处理。

Web 应用程序模板

既然您已经使用 LangChain 为 Chat-Your-Data Challenge 挑战赛(或其他应用程序)构建了一个聊天机器人,并且可以在终端中运行,那么下一步是什么? 将该程序变成一个多用户可以利用的 Web 应用程序怎么样?

我们在 chat-langchain 中实现了一些更改,以突出显示如何将相关的 LangChain 功能集成到可以支持多用户的即时部署应用程序中的最佳实践。该应用程序利用 FastAPI 作为后端,并使用 Jinja 模板制作了一个非常基本的用户界面。该代码库仍然是开源的——欢迎更改和建议!

流式处理

该应用程序利用 LangChain 流式处理并实现了 StreamingLLMCallbackHandler,以通过 websocket 将每个 token 发送回客户端。另一个回调处理程序 QuestionGenCallbackHandler 用于在 ChatVectorDBChain 的问题生成步骤中向客户端发送消息。

异步执行

该应用程序利用最近添加的对选定链和 LLM 的 asyncio 支持,以支持并发执行(无需生成多个线程和考虑竞争)。当应用程序有多个客户端连接时,这很重要

下一步

我们才刚刚开始使用流式处理、回调和异步支持!我们欢迎任何和所有反馈。在不久的将来,我们希望实现

  • 对其他 LLM 的流式处理支持。
  • 更多关于回调处理程序的示例和用例。