LangChain-v0.2文档翻译:3.9、如何在LangChain中并行调用可运行组件

RunnableParallel 原语本质上是一个字典,其值是可运行组件(或可以转换为可运行组件的内容,如函数)。它并行运行其所有值,每个值都使用 RunnableParallel 的整体输入进行调用。最终返回值是一个字典,其中包含每个值的结果,这些结果位于其适当的键下。

使用 RunnableParallels 格式化

RunnableParallels 可用于并行化操作,也可以用于将一个可运行组件的输出调整为匹配序列中下一个可运行组件的输入格式。您可以使用它们来拆分或分叉链,以便多个组件可以并行处理输入。稍后,其他组件可以加入或合并结果以综合最终响应。这种类型的链创建了一个如下所示的计算图:

     Input
      /   \
     /     \
 Branch1 Branch2
     \     /
      \   /
      Combine

以下示例中,提示的输入是一个包含 "context""question" 键的映射。用户输入只是问题。因此我们需要使用我们的检索器获取上下文,并将用户输入作为 "question" 键传递。

from langchain_community.vectorstores import FAISS
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI, OpenAIEmbeddings

# 创建 FAISS 实例
vectorstore = FAISS.from_texts(
    ["harrison worked at kensho"], embedding=OpenAIEmbeddings()
)
# 创建检索器
retriever = vectorstore.as_retriever()

# 定义提示模板
template = """
Answer the question based only on the following context:
{context}

Question: {question}
"""

# 创建 ChatPromptTemplate 实例
prompt = ChatPromptTemplate.from_template(template)

# 创建 ChatOpenAI 实例
model = ChatOpenAI()

# 创建检索链
retrieval_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | model
    | StrOutputParser()
)

# 调用检索链
retrieval_chain.invoke("where did harrison work?")

输出示例:

'Harrison worked at Kensho.'

::: {.callout-tip}
注意,当将 RunnableParallel 与另一个可运行组件组合时,我们甚至不需要将我们的字典包装在 RunnableParallel 类中 —— 类型转换由系统自动处理。在链的上下文中,这些是等价的:
:::

{"context": retriever, "question": RunnablePassthrough()}
RunnableParallel({"context": retriever, "question": RunnablePassthrough()})
RunnableParallel(context=retriever, question=RunnablePassthrough())

使用 itemgetter 作为简写

注意,您可以使用 Python 的 itemgetter 作为从映射中提取数据的简写,与 RunnableParallel 结合使用。您可以在 Python 文档中找到有关 itemgetter 的更多信息。

以下示例中,我们使用 itemgetter 从映射中提取特定键:

from operator import itemgetter

from langchain_community.vectorstores import FAISS
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI, OpenAIEmbeddings

vectorstore = FAISS.from_texts(
    ["harrison worked at kensho"], embedding=OpenAIEmbeddings()
)
retriever = vectorstore.as_retriever()

template = """Answer the question based only on the following context:
{context}

Question: {question}

Answer in the following language: {language}
"""
prompt = ChatPromptTemplate.from_template(template)

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

chain.invoke({"question": "where did harrison work", "language": "italian"})

输出示例:

'Harrison ha lavorato a Kensho.'

并行化步骤

RunnableParallels 使得执行多个可运行组件并行化变得容易,并可以将这些可运行组件的输出作为映射返回。

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

# 创建 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)

# 调用并行链
map_chain.invoke({"topic": "bear"})

输出示例:

{
  'joke': AIMessage(content="..."),
  'poem': AIMessage(content="In the quiet of the forest, the bear roams free\nMajestic and wild, a sight to see.")
}

并行性

RunnableParallel 也适用于并行运行独立进程,因为映射中的每个可运行组件都是并行执行的。例如,我们可以看到我们之前的 joke_chainpoem_chainmap_chain 运行时间大致相同,尽管 map_chain 执行了其他两个。

%%timeit

joke_chain.invoke({"topic": "bear"})

输出示例:

610 ms ± 64 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%%timeit

poem_chain.invoke({"topic": "bear"})

输出示例:

599 ms ± 73.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%%timeit

map_chain.invoke({"topic": "bear"})

输出示例:

643 ms ± 77.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

您现在已经了解了使用 RunnableParallel 格式化和并行化链步骤的一些方法。

总结
本文介绍了如何在LangChain中使用RunnableParallel原语来并行执行多个可运行组件,并通过字典形式返回它们的输出结果。通过实际的代码示例,展示了如何使用RunnableParallel进行操作的并行化,以及如何使用itemgetter来简化从映射中提取数据的过程。此外,还讨论了RunnableParallel在执行独立进程时的效率优势。

扩展知识

  • RunnableParallel:LangChain中的一个原语,允许并行执行多个可运行组件。
  • itemgetter:Python中的一个函数,用于从映射中提取特定键的值。
  • 并行化:一种编程技术,允许多个进程或任务同时执行,以提高效率。
<think>好的,用户遇到了安装langchain-chatchat时出现“Nomatching distributionfound”的错误。我需要根据之前的引用和常见解决方案来帮助他。首先,检查包是否存在。用户提到直接使用pip安装失败,可能这个包在PyPI上不存在或者名称有误。我需要建议用户确认包名是否正确,比如是否存在拼写错误,或者是否应该安装其他类似的包,比如langchain-community或chatchat。如果包名正确,接下来考虑使用其他安装源。引用3中提到可以通过指定镜像源来安装,比如清华源。用户可以尝试添加-i参数更换镜像源,看看是否能找到对应的版本。另外,引用1中提到使用poetry安装可能有效。用户需要先安装poetry,然后配置项目环境,可能通过pyproject.toml文件添加依赖,再运行poetryinstall。这种方法可能绕过pip的限制,特别是如果包在特定源中可用时。还有,Python版本的问题。用户的环境是Python3.11,而某些包可能不支持最新版本。引用2中的案例是Python3.10,但问题同样可能出现在版本兼容性上。建议用户尝试降低Python版本到3.8或3.9,使用虚拟环境管理工具如conda或venv。另外,可能需要安装依赖项,比如setuptools_scm,如引用2中的解决方案。用户需要先确保这些依赖项正确安装,可能通过指定镜像源安装它们,再尝试安装主包。 最后,如果所有方法都无效,可能需要从源码安装。用户需要克隆仓库,运行setup.py,或者查看项目的文档是否有其他安装说明。 需要将这些步骤分点列出,确保用户能逐步尝试。同时,生成相关问题,帮助用户深入解决类似问题,比如如何永久更换pip源,如何管理Python版本等。</think>### 解决方案 出现`No matching distribution found for langchain-chatchat`错误通常由以下原因导致,可逐步尝试以下方法: 1. **确认包名正确性** 检查包名拼写,例如`langchain-chatchat`可能是社区维护的非官方包,建议尝试其他名称变体(如`langchain-chat`或`chatchat`)。若包不存在于PyPI,需通过其他方式安装。 2. **使用镜像源加速安装** 指定国内镜像源(如清华源、阿里云源)尝试下载: ```bash pip install langchain-chatchat -i https://pypi.tuna.tsinghua.edu.cn/simple/ ``` 若仍失败,尝试添加`--trusted-host`参数[^3]: ```bash pip install langchain-chatchat -i http://mirrors.cloud.aliyuncs.com/pypi/simple/ --trusted-host mirrors.cloud.aliyuncs.com ``` 3. **使用Poetry安装(推荐)** 若包存在于特定仓库但未在PyPI发布,可通过`poetry`管理依赖: - 安装Poetry: ```bash pip install poetry ``` - 在项目目录中创建`pyproject.toml`并添加依赖: ```toml [tool.poetry.dependencies] langchain-chatchat = "*" ``` - 运行安装命令: ```bash poetry install ``` 4. **检查Python版本兼容性** Python 3.11可能导致部分包未适配。建议使用虚拟环境降级到Python 3.8/3.9: ```bash conda create -n py39 python=3.9 conda activate py39 pip install langchain-chatchat ``` 5. **手动安装依赖项** 若依赖缺失(如`setuptools_scm`),先单独安装依赖[^2]: ```bash pip install setuptools_scm -i http://mirrors.cloud.aliyuncs.com/pypi/simple/ ``` 6. **从源码安装** 若包未发布到PyPI,尝试从GitHub仓库克隆并安装: ```bash git clone https://github.com/[作者]/langchain-chatchat.git cd langchain-chatchat python setup.py install ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值