概要
在构建基于自然语言处理的应用程序时,为了提高处理速度和效率,我们经常需要并行执行多个任务。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的并行化功能。