LangChain和LLMs的异步

LangChain和LLMs异步

如何使用异步调用LLMs使LangChain链条工作,加快运行顺序长链所需的时间

Image byhp koch on Unsplash

在本文中,我将介绍如何使用LangChain进行长工作流的异步调用LLMs。我们将通过一个完整的代码示例,并比较顺序执行和异步调用的效果。

以下是内容的概述。如果你愿意,你可以跳到你感兴趣的部分:

  1. 基础知识:什么是LangChain
  2. 如何使用LangChain运行同步链
  3. 如何使用LangChain运行单个异步链
  4. 异步链的长工作流的实用技巧。

那么让我们开始吧!

基础知识:什么是LangChain

LangChain是一种基于语言模型开发应用程序的框架。这就是LangChain的官方定义。这个框架是最近创建的,并且已经成为构建由LLMs提供支持的工具的行业标准。

它是开源的,维护良好,并且以非常快的时间框架发布新功能。

官方文档可以在这里找到,GitHub存储库可以在这里找到。

我们在这个库中的一个缺点是,由于这些功能是新的,我们不能有效地使用Chat GPT来帮助构建新的代码。所以这意味着我们必须以“古老”的方式阅读文档、论坛和教程来工作。

LangChain的官方文档非常好,但是一些特定事例的示例不是很多。

我在处理长链的异步时遇到了这个问题。

以下是我用来了解这个框架的主要资源:

  1. 深度学习AI课程:LangChain与您的数据聊天;
  2. 官方文档;
  3. Youtube频道。

(ps. 这些资源都是免费的)

如何使用LangChain运行同步链

让我来设置我遇到的问题:我有一个包含大量行的数据框,对于每一行,我需要运行多个提示(链)到LLM,并将结果返回给我的数据框。

当你有多个行,比如10K,对于每个行运行3个提示,每个响应(如果服务器没有超载)大约需要3-5秒,你最终需要等待好几天才能完成工作流程。

下面我将展示构建同步链的主要步骤和代码,并在数据子集上计时。

对于这个示例,我将使用数据集Wine Reviews,许可证。这里的目标是从书面评论中提取一些信息。

我想提取评论的摘要、主要情感以及每个葡萄酒的前5个特征。

为此,我创建了两个链,一个用于摘要和情感,另一个将摘要作为输入来提取特征。

以下是运行它的代码:

运行时间(10个示例):

摘要链(顺序)执行时间为22.59秒。特征链(顺序)执行时间为22.85秒。

如果你想更多地了解我使用的组件,我真的推荐观看深度学习AI课程。

从这段代码中的主要要点是构建链的构建块,如何以顺序方式运行它,并完成这个循环所花费的时间。重要的是要记住,对于10个示例,大约需要45秒,而完整数据集包含130K行。因此,异步实现是以合理的时间运行此过程的新希望。

所以在设置问题和建立基准之后,让我们看看如何优化这段代码以更快地运行。

如何使用LangChain运行单个异步链

所以为了实现这个目标,我们将使用一个叫做异步调用的资源。为了解释这一点,首先我将简要解释代码正在做什么,以及时间花费在哪里。

在我们的例子中,我们遍历数据框的每一行,从行中提取一些信息,将它们添加到我们的提示中,并调用GPT API来获取响应。在获得响应后,我们只需解析它并将其添加回数据框中。

Image by Author

这里的主要瓶颈是当我们调用GPT API时,因为我们的计算机必须等待该API的响应(大约3秒)。其余的步骤很快,仍然可以进行优化,但这不是本文的重点。

所以,不是等待响应,如果我们同时发送所有的调用到API呢?这样我们只需要等待一个响应,然后处理它们。这就是所谓的异步调用API。

Image by Author

这样,我们按顺序进行预处理和后处理,但是API的调用不需要等待上一个响应返回才发送下一个。

下面是异步链的代码:

在这段代码中,我们使用了Python的async和await语法。LangChain还提供了一个arun()函数来异步运行该链。所以在开始时,我们首先按顺序处理每一行(可以进行优化),并创建多个“任务”,这些任务将并行等待API的响应,然后我们按顺序将响应处理成最终所需的格式(也可以进行优化)。

运行时间(10个示例):

异步摘要链执行时间为3.35秒。异步特征链执行时间为2.49秒。

与顺序执行相比:

顺序摘要链执行时间为22.59秒。顺序特征链执行时间为22.85秒。

我们可以看到运行时间几乎提升了10倍。所以对于大型工作负载,我强烈推荐使用这种方法。同时我的代码中有很多for循环,也可以进一步优化以提高性能。

本教程的完整代码可以在这个Github仓库中找到。

使用异步链处理长工作流的实用技巧。

当我运行这个代码时,遇到了一些限制和一些障碍,我想与你分享。

笔记本不友好的异步处理

在Jupyter笔记本上运行异步调用时,您可能会遇到一些问题。然而,只需询问Chat GPT,它可能会帮助您解决这个问题。我构建的代码是在.py文件中运行大型工作负载,因此可能需要一些更改才能在笔记本中运行。

输出键过多

第一个问题是我的链条有多个输出键,而当时的arun()只接受一个键作为输出的链条。因此,为了解决这个问题,我不得不将我的链条拆分为两个独立的链条。

不是所有的链条都可以是异步的

我在提示中使用了一个矢量数据库来进行示例和比较的逻辑,这要求示例是按顺序比较并添加到数据库中。这使得在完整链条中使用异步变得不可行。

内容不足

对于这个特定问题,我能找到的最好的内容就是官方的异步文档,并从中构建到我的用例。所以如果你运行它并发现新的东西,请与世界分享!

结论

LangChain是一个非常强大的工具,用于创建基于LLM的应用程序。我强烈推荐学习这个框架,并完成上述课程。

对于运行链的特定主题,对于高工作负载,我们看到了异步调用可能带来的潜在改进,所以我的建议是花时间理解代码在做什么,并拥有一个样板类(例如我提供的代码中的类),并异步运行它!

对于小工作负载或仅需要对API进行一次调用的应用程序,不需要进行异步操作,但是如果您有一个样板类,只需添加一个同步函数,这样您就可以轻松地使用其中之一。

感谢阅读。

完整的代码可以在此处找到。

如果您喜欢这篇内容并且想支持我,可以给我买杯咖啡:

Gabriel Cassimiro是一位向社区分享免费内容的数据科学家

嘿 👋,我刚在这里创建了一个页面。现在你可以给我买杯咖啡啦!

www.buymeacoffee.com

这里还有一些可能会对您感兴趣的其他文章:

使用深度强化学习解决Unity环境问题

使用PyTorch实现的深度强化学习代理的端到端项目及代码

towardsdatascience.com

使用Tensorflow模型和OpenCV进行目标检测

使用训练好的模型在静态图像和实时视频上识别对象

towardsdatascience.com