【AI大模型应用开发】【LangChain系列】8. 重要组件介绍:如何运用LangChain表达式语言LCEL中的RunnableParallel和RunnablePassthrough?

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
简介: 【AI大模型应用开发】【LangChain系列】8. 重要组件介绍:如何运用LangChain表达式语言LCEL中的RunnableParallel和RunnablePassthrough?
  • 大家好,我是同学小张,日常分享AI知识和实战案例
  • 欢迎 点赞 + 关注 👏,持续学习持续干货输出
  • +v: jasper_8017 一起交流💬,一起进步💪。
  • 微信公众号也可搜【同学小张】 🙏

本站文章一览:


经过几次的LangChain实战,发现其中最常用的两个封装类RunnableParallelRunnablePassthrough。这是LangChain独有的表达式语言(LCEL)中最主要的组件。本文我们来深入学习下这两个组件的原理与使用。

0. 前置推荐阅读

LangChain实战系列:

LangChain表达式语言(LCEL)介绍:

1. RunnableParallel

1.1 基础使用

官方概念如下:

RunnableParallel can be useful for manipulating the output of one Runnable to match the input format of the next Runnable in a sequence.

RunnableParallel 可用于操作一个Runnable的输出,以匹配序列中下一个Runnble的输入格式。

从下面这段示例代码来理解下官方的解释:

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}
"""
prompt = ChatPromptTemplate.from_template(template)
model = ChatOpenAI()
retrieval_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | model
    | StrOutputParser()
)
retrieval_chain.invoke("where did harrison work?")

代码中每个 "|" 前后的元素都可看作是一个Runnable

其中的 {"context": retriever, "question": RunnablePassthrough()} 就是RunnableParallel,它的作用就是将输入组成 contextquestion 为key的字典格式,传递给 prompt

RunnableParallel 的使用可以有以下三种形式,三种形式等价:

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

1.2 并行执行多个Chain

RunnableParallel 可以让我们能够同时执行多个Chain,然后以字典形式返回各个Chain的结果。

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)
map_chain.invoke({"topic": "bear"})

以上示例代码中,定义了两个Chain:joke_chainpoem_chain,通过 RunnableParallel 同时执行。

注意 RunnableParallel(joke=joke_chain, poem=poem_chain) 中的key值为 jokepoem,返回的结果中会以这两个值作为每个Chain的key值组织结果。返回结果如下:

{'joke': AIMessage(content="Why don't bears wear shoes?\n\nBecause they have bear feet!"),
 'poem': AIMessage(content="In the wild's embrace, bear roams free,\nStrength and grace, a majestic decree.")}

2. RunnablePassthrough

官方解释:

RunnablePassthrough allows to pass inputs unchanged or with the addition of extra keys. This typically is used in conjuction with RunnableParallel to assign data to a new key in the map.

RunnablePassthrough 允许在不改变或添加额外键的情况下传递输入。这通常与RunnableParallel结合使用,将数据分配给映射中的新键。

还是以一个实例代码和输出来看下它怎么用。

from langchain_core.runnables import RunnableParallel, RunnablePassthrough
runnable = RunnableParallel(
    passed=RunnablePassthrough(),
    extra=RunnablePassthrough.assign(mult=lambda x: x["num"] * 3),
    modified=lambda x: x["num"] + 1,
)
runnable.invoke({"num": 1})

以上代码并行执行了三行代码,其输出结果为:

{'passed': {'num': 1}, 'extra': {'num': 1, 'mult': 3}, 'modified': 2}

(1)第一行代码:passed=RunnablePassthrough(),直接透传输入:'passed': {'num': 1}

(2)第二行代码:extra=RunnablePassthrough.assign(mult=lambda x: x["num"] * 3),除了透传原数据,还加了 mult 的值,通过 assign 函数将两个结果组装输出:'extra': {'num': 1, 'mult': 3}

(3)第三行代码:modified=lambda x: x["num"] + 1,在原值基础上执行+1操作,没使用 assign 函数,因此原数据不组合输出:'modified': 2

3. 参考链接

https://python.langchain.com/docs/expression_language/how_to/map

https://python.langchain.com/docs/expression_language/how_to/passthrough

如果觉得本文对你有帮助,麻烦点个赞和关注呗 ~~~


  • 大家好,我是 同学小张,日常分享AI知识和实战案例
  • 欢迎 点赞 + 关注 👏,持续学习持续干货输出
  • +v: jasper_8017 一起交流💬,一起进步💪。
  • 微信公众号也可搜【同学小张】 🙏

本站文章一览:

相关实践学习
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
9天前
|
人工智能 缓存 监控
使用LangChain4j构建Java AI智能体:让大模型学会使用工具
AI智能体是大模型技术的重要演进方向,它使模型能够主动使用工具、与环境交互,以完成复杂任务。本文详细介绍如何在Java应用中,借助LangChain4j框架构建一个具备工具使用能力的AI智能体。我们将创建一个能够进行数学计算和实时信息查询的智能体,涵盖工具定义、智能体组装、记忆管理以及Spring Boot集成等关键步骤,并展示如何通过简单的对话界面与智能体交互。
194 1
|
9天前
|
人工智能 Java API
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
本文介绍AI大模型的核心概念、分类及开发者学习路径,重点讲解如何选择与接入大模型。项目基于Spring Boot,使用阿里云灵积模型(Qwen-Plus),对比SDK、HTTP、Spring AI和LangChain4j四种接入方式,助力开发者高效构建AI应用。
376 122
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
|
28天前
|
机器学习/深度学习 人工智能 计算机视觉
让AI真正"看懂"世界:多模态表征空间构建秘籍
本文深入解析多模态学习的两大核心难题:多模态对齐与多模态融合,探讨如何让AI理解并关联图像、文字、声音等异构数据,实现类似人类的综合认知能力。
203 6
|
12天前
|
机器学习/深度学习 人工智能 自然语言处理
AI Compass前沿速览:Qwen3-Max、Mixboard、Qwen3-VL、Audio2Face、Vidu Q2 AI视频生成模型、Qwen3-LiveTranslate-全模态同传大模型
AI Compass前沿速览:Qwen3-Max、Mixboard、Qwen3-VL、Audio2Face、Vidu Q2 AI视频生成模型、Qwen3-LiveTranslate-全模态同传大模型
139 13
AI Compass前沿速览:Qwen3-Max、Mixboard、Qwen3-VL、Audio2Face、Vidu Q2 AI视频生成模型、Qwen3-LiveTranslate-全模态同传大模型
|
20天前
|
机器学习/深度学习 人工智能 机器人
AI Compass前沿速览:Nano Bananary、MCP Registry、通义DeepResearch 、VoxCPM、InternVLA·M1具身机器人
AI Compass前沿速览:Nano Bananary、MCP Registry、通义DeepResearch 、VoxCPM、InternVLA·M1具身机器人
|
18天前
|
人工智能 IDE 开发工具
CodeGPT AI代码狂潮来袭!个人完全免费使用谷歌Gemini大模型 超越DeepSeek几乎是地表最强
CodeGPT是一款基于AI的编程辅助插件,支持代码生成、优化、错误分析和单元测试,兼容多种大模型如Gemini 2.0和Qwen2.5 Coder。免费开放,适配PyCharm等IDE,助力开发者提升效率,新手友好,老手提效利器。(238字)
140 1
CodeGPT AI代码狂潮来袭!个人完全免费使用谷歌Gemini大模型 超越DeepSeek几乎是地表最强
|
12天前
|
人工智能 Java API
构建基于Java的AI智能体:使用LangChain4j与Spring AI实现RAG应用
当大模型需要处理私有、实时的数据时,检索增强生成(RAG)技术成为了核心解决方案。本文深入探讨如何在Java生态中构建具备RAG能力的AI智能体。我们将介绍新兴的Spring AI项目与成熟的LangChain4j框架,详细演示如何从零开始构建一个能够查询私有知识库的智能问答系统。内容涵盖文档加载与分块、向量数据库集成、语义检索以及与大模型的最终合成,并提供完整的代码实现,为Java开发者开启构建复杂AI智能体的大门。
383 58
|
17天前
|
存储 人工智能 监控
如何用RAG增强的动态能力与大模型结合打造企业AI产品?
客户的问题往往涉及最新的政策变化、复杂的业务规则,数据量越来越多,而大模型对这些私有知识和上下文信息的理解总是差强人意。
52 2
|
18天前
|
人工智能 自然语言处理 算法
现代AI工具深度解析:从GPT到多模态的技术革命与实战应用
蒋星熠Jaxonic,AI技术探索者,深耕代码生成、多模态AI与提示词工程。分享AI工具架构、实战应用与优化策略,助力开发者提升效率,共赴智能编程新纪元。

热门文章

最新文章