使用LangChain中的RunnableParallel进行并行化

概要

在构建基于自然语言处理的应用程序时,为了提高处理速度和效率,我们经常需要并行执行多个任务。LangChain 中的 RunnableParallel(又称为 RunnableMap)是一个强大的工具,它可以帮助我们轻松实现这一点。本文将详细介绍如何使用 RunnableParallel 来并行执行多个 Runnable,并展示具体的代码示例。

技术名词解释

RunnableParallel简介
RunnableParallel 允许我们并行执行多个 Runnable 对象,并将这些 Runnable 的输出作为映射返回。这对于并行运行独立进程尤其有用,因为映射中的每个 Runnable 都会并行执行。

技术细节

准备工作
首先,我们需要定义一个 ChatOpenAI 模型,以便我们可以使用它来生成文本。

from langchain_openai import ChatOpenAI, OpenAI
openai_api_key = "EMPTY"
openai_api_base = "http://127.0.0.1:1234/v1"
model = ChatOpenAI(
    openai_api_key=openai_api_key,
    openai_api_base=openai_api_base,
    temperature=0.3,
)

创建提示模板
接下来,我们需要创建几个提示模板,用于生成文章的大纲和写作技巧。

from langchain_core.prompts import ChatPromptTemplate

outlinePromptTemplate = '''主题:{theme}
如果要根据主题写一篇文章,请列出文章的大纲。'''
outlinePrompt = ChatPromptTemplate.from_template(outlinePromptTemplate)

tipsPromptTemplate = '''主题:{theme}
如果要根据主题写一篇文章,应该需要注意哪些方面,才能把这篇文章写好。'''
tipsPrompt = ChatPromptTemplate.from_template(tipsPromptTemplate)

定义查询
我们定义一个查询主题,用于生成文章的大纲和写作技巧。

query = "2024年中国经济走向与运行趋势"

创建输出解析器
为了从模型的响应中解析出字符串结果,我们需要定义一个输出解析器。

from langchain_core.output_parsers import StrOutputParser
strParser = StrOutputParser()

生成大纲和写作技巧
现在,我们可以创建链式请求来生成文章的大纲和写作技巧。

%%time
outlineChain = outlinePrompt | model | strParser
outline = outlineChain.invoke({"theme": query})
print(outline)

%%time
tipsChain = tipsPrompt | model | strParser
tips = tipsChain.invoke({"theme": query})
print(tips)

创建文章提示模板
有了大纲和写作技巧后,我们可以创建一个文章提示模板,用于生成完整的文章内容。

articlePromptTemplate = '''主题:{theme}
大纲:
{outline}

注意事项:
{tips}

请根据上面的主题、大纲和注意事项写出丰富的完整文章内容。'''
articlePrompt = ChatPromptTemplate.from_template(articlePromptTemplate)

生成完整文章
接下来,我们使用上述模板来生成一篇完整的文章。

%%time
articleChain = articlePrompt | model | strParser
article = articleChain.invoke({
    "theme": query,
    "outline": outline,
    "tips": tips
})
print(article)

使用RunnableParallel并行化
现在,我们使用 RunnableParallel 来并行执行生成大纲和写作技巧的任务。

%%time
from langchain_core.runnables import RunnableParallel

map_chain = RunnableParallel(outline=outlineChain, tips=tipsChain)
results = map_chain.invoke({"theme": query})
print(results)

组合所有任务
最后,我们将所有任务组合起来,并使用 RunnableParallel 来并行执行。

%%time
from langchain_core.runnables import RunnableParallel
from langchain_core.runnables import RunnablePassthrough
from operator import itemgetter

map_chain = RunnableParallel(outline=outlineChain, tips=tipsChain, theme=itemgetter("theme"))
results = map_chain.invoke({"theme": query})
print(results)

%%time
allChain = map_chain | articleChain | strParser
result = allChain.invoke({"theme": query})
print(result)

%%time
allChain = (
    {
        "outline": outlineChain,
        "tips": tipsChain,
        "theme": itemgetter("theme")
    }
    | articleChain
    | strParser
)
result = allChain.invoke({"theme": query})
print(result)

%%time
allChain = (
    {
        "outline": outlineChain,
        "tips": tipsChain,
        "theme": itemgetter("theme")
    }
    | articlePrompt 
    | model 
    | strParser
)
result = allChain.invoke({"theme": query})
print(result)

小结

通过本文,我们学习了如何使用LangChain中的 RunnableParallel 来并行执行多个 Runnable,并展示了具体的代码实现。使用 RunnableParallel 可以显著提高处理速度,尤其是在处理大量数据或需要并行化多个独立任务的情况下。希望这篇博客能帮助你更好地理解和应用LangChain的并行化功能。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值