如何使用 LLM 的异步 API#

LangChain 利用 asyncio 库为 LLM 提供了异步支持。

异步支持特别适用于同时调用多个 LLM,因为这些调用都是网络绑定的。目前,支持 OpenAI, PromptLayerOpenAI, ChatOpenAIAnthropic,但将在未来实现其他 LLM 的异步支持。

您可以使用 agenerate 方法异步调用 OpenAI 的 LLM。

import time
import asyncio

from langchain.llms import OpenAI

def generate_serially():
    llm = OpenAI(temperature=0.9)
    for _ in range(10):
        resp = llm.generate(["Hello, how are you?"])
        print(resp.generations[0][0].text)


async def async_generate(llm):
    resp = await llm.agenerate(["Hello, how are you?"])
    print(resp.generations[0][0].text)


async def generate_concurrently():
    llm = OpenAI(temperature=0.9)
    tasks = [async_generate(llm) for _ in range(10)]
    await asyncio.gather(*tasks)


s = time.perf_counter()
# If running this outside of Jupyter, use asyncio.run(generate_concurrently())
await generate_concurrently() 
elapsed = time.perf_counter() - s
print('\033[1m' + f"Concurrent executed in {elapsed:0.2f} seconds." + '\033[0m')

s = time.perf_counter()
generate_serially()
elapsed = time.perf_counter() - s
print('\033[1m' + f"Serial executed in {elapsed:0.2f} seconds." + '\033[0m')
I'm doing well, thank you. How about you?


I'm doing well, thank you. How about you?


I'm doing well, how about you?


I'm doing well, thank you. How about you?


I'm doing well, thank you. How about you?


I'm doing well, thank you. How about yourself?


I'm doing well, thank you! How about you?


I'm doing well, thank you. How about you?


I'm doing well, thank you! How about you?


I'm doing well, thank you. How about you?
Concurrent executed in 1.39 seconds.


I'm doing well, thank you. How about you?


I'm doing well, thank you. How about you?

I'm doing well, thank you. How about you?


I'm doing well, thank you. How about you?


I'm doing well, thank you. How about yourself?


I'm doing well, thanks for asking. How about you?


I'm doing well, thanks! How about you?


I'm doing well, thank you. How about you?


I'm doing well, thank you. How about yourself?


I'm doing well, thanks for asking. How about you?
Serial executed in 5.77 seconds.

这段代码展示了如何使用异步 API 来调用 OpenAI 的 LLM。 首先,定义了一个生成文本的函数 generate_serially,并进行了循环调用,依次生成文本。 接着,定义了一个异步函数 async_generate,该函数使用了 await 关键字,表示函数调用将异步执行。 该函数调用了 OpenAI 的 agenerate 方法来生成文本,生成的文本通过 print() 输出。 最后,定义了一个并发生成的 generate_concurrently 函数,它与 async_generate 函数结合起来使用,用于并发地调用 LLM 来生成文本。

在主函数运行时, 首先调用了异步函数 await generate_concurrently(),并计算了执行该函数所需的时间,以便与后续序列执行函数的时间进行比较。 然后,调用了序列执行函数 generate_serially(),并计算了它的执行时间。 由于异步 API 可以同时调用多个 LLM,所以并发执行函数的执行时间应该比序列执行函数的执行时间更短。

tasks = [async_generate(llm) for _ in range(10)]
await asyncio.gather(*tasks)

这是 Python 中的列表解析语法,用于创建一个包含多个异步生成器对象的列表,其中 _ 表示一个无关紧要的变量,而 range(10) 表示循环 10 次。 在 asyncio.gather(*tasks) 中,星号运算符 * 用于解包 tasks 列表,将其作为单独的参数列表传递给 asyncio.gather() 函数。这样,每个 async_generate(llm) 函数就会以并发方式执行,从而加速整个过程。最终结果是,由 async_generate(llm) 函数生成的文本数据会返回一个包含在 gather() 函数返回值的列表中,该列表包含了所有并发执行的结果。