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

在本文中,我将介绍如何使用LangChain进行长工作流的异步调用LLMs。我们将通过一个完整的代码示例,并比较顺序执行和异步调用的效果。
以下是内容的概述。如果你愿意,你可以跳到你感兴趣的部分:
- 基础知识:什么是LangChain
- 如何使用LangChain运行同步链
- 如何使用LangChain运行单个异步链
- 异步链的长工作流的实用技巧。
那么让我们开始吧!
基础知识:什么是LangChain
LangChain是一种基于语言模型开发应用程序的框架。这就是LangChain的官方定义。这个框架是最近创建的,并且已经成为构建由LLMs提供支持的工具的行业标准。
它是开源的,维护良好,并且以非常快的时间框架发布新功能。
官方文档可以在这里找到,GitHub存储库可以在这里找到。
我们在这个库中的一个缺点是,由于这些功能是新的,我们不能有效地使用Chat GPT来帮助构建新的代码。所以这意味着我们必须以“古老”的方式阅读文档、论坛和教程来工作。
LangChain的官方文档非常好,但是一些特定事例的示例不是很多。
我在处理长链的异步时遇到了这个问题。
以下是我用来了解这个框架的主要资源:
- 深度学习AI课程:LangChain与您的数据聊天;
- 官方文档;
- Youtube频道。
(ps. 这些资源都是免费的)
如何使用LangChain运行同步链
让我来设置我遇到的问题:我有一个包含大量行的数据框,对于每一行,我需要运行多个提示(链)到LLM,并将结果返回给我的数据框。
当你有多个行,比如10K,对于每个行运行3个提示,每个响应(如果服务器没有超载)大约需要3-5秒,你最终需要等待好几天才能完成工作流程。
下面我将展示构建同步链的主要步骤和代码,并在数据子集上计时。
对于这个示例,我将使用数据集Wine Reviews,许可证。这里的目标是从书面评论中提取一些信息。
我想提取评论的摘要、主要情感以及每个葡萄酒的前5个特征。
为此,我创建了两个链,一个用于摘要和情感,另一个将摘要作为输入来提取特征。
以下是运行它的代码:
运行时间(10个示例):
摘要链(顺序)执行时间为22.59秒。特征链(顺序)执行时间为22.85秒。
如果你想更多地了解我使用的组件,我真的推荐观看深度学习AI课程。
从这段代码中的主要要点是构建链的构建块,如何以顺序方式运行它,并完成这个循环所花费的时间。重要的是要记住,对于10个示例,大约需要45秒,而完整数据集包含130K行。因此,异步实现是以合理的时间运行此过程的新希望。
所以在设置问题和建立基准之后,让我们看看如何优化这段代码以更快地运行。
如何使用LangChain运行单个异步链
所以为了实现这个目标,我们将使用一个叫做异步调用的资源。为了解释这一点,首先我将简要解释代码正在做什么,以及时间花费在哪里。
在我们的例子中,我们遍历数据框的每一行,从行中提取一些信息,将它们添加到我们的提示中,并调用GPT API来获取响应。在获得响应后,我们只需解析它并将其添加回数据框中。

这里的主要瓶颈是当我们调用GPT API时,因为我们的计算机必须等待该API的响应(大约3秒)。其余的步骤很快,仍然可以进行优化,但这不是本文的重点。
所以,不是等待响应,如果我们同时发送所有的调用到API呢?这样我们只需要等待一个响应,然后处理它们。这就是所谓的异步调用API。

这样,我们按顺序进行预处理和后处理,但是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