LangChain 组件详解:RunnablePassthrough
在 LangChain LCEL (LangChain Expression Language) 的世界里数据像水流一样在管道Pipe|中流动。通常一个组件会处理输入并产生新的输出传递给下一个组件。但是有时候我们需要保留原始输入或者将输入原样传递给后续步骤。这时RunnablePassthrough就登场了。1. 什么是 RunnablePassthroughRunnablePassthrough是一个极其简单的 Runnable它的作用就是透传。输入x输出x简单来说它就像一个占位符或连接器不做任何修改直接把拿到的数据递给后面。2. 为什么需要它你可能会问如果它什么都不做为什么需要它核心应用场景有两个数据多路复用Forking在并行处理RunnableParallel中我们需要把同一个输入同时传给多个分支。其中一个分支可能需要处理数据比如检索而另一个分支需要保留原始数据比如填入 Prompt。构建字典在构建 Prompt 输入时我们通常需要一个字典例如{context: ..., question: ...}。RunnablePassthrough允许我们在构建字典时引用“整个输入”。3. 核心应用场景RAG (检索增强生成)这是RunnablePassthrough最经典的使用场景。3.1 场景描述在 RAG 中我们需要做两件事拿用户的问题去检索文档 - 生成context。把用户的问题直接填入 Prompt - 生成question。3.2 代码实现详解让我们看一段模拟代码完整代码见src/examples/chains/demo_runnable_passthrough.py# 模拟一个检索器 (Retriever)# 在真实场景中这通常是 vector_store.as_retriever()deffake_retriever(query:str):logger.info(fRetrieving documents for:{query})returnf这里是关于 {query} 的一些背景知识...defmain():llmget_gemini_llm()# -----------------------------------------------------------# 场景 1: 基础用法 - 原样透传# -----------------------------------------------------------logger.info(--- Demo 1: Basic Passthrough ---)# 这里的 RunnablePassthrough() 就像一个占位符它把 invoke 传入的 Hello 原封不动地传给下一步# 虽然在这个简单的例子里看起来没用但在复杂的字典构造中非常关键chainRunnablePassthrough()resultchain.invoke(Hello World)logger.info(fResult:{result})# Output: Hello World# -----------------------------------------------------------# 场景 2: RAG (检索增强生成) - 最经典用法# -----------------------------------------------------------logger.info(\n--- Demo 2: RAG Scenario ---)promptChatPromptTemplate.from_template(基于以下上下文回答问题:\n\n上下文: {context}\n\n问题: {question})# 我们构建一个并行运行的 Map (RunnableParallel)# 1. context 键把用户输入传给 retriever获取上下文# 2. question 键我们需要把用户原始输入填到这里。# 如果不加 RunnablePassthrough()我们就没法在这里引用“原始输入”了。# 提示这里的 RunnableLambda(fake_retriever) 其实可以简化为直接写 fake_retriever# LangChain 会自动把函数转换为 RunnableLambda。rag_chain({context:fake_retriever,# --- 自动隐式转换为 RunnableLambda(fake_retriever)question:RunnablePassthrough()}|prompt|llm)# 调用链# 用户输入 什么是 LangChain?# 1. fake_retriever(什么是 LangChain?) - 填充 context# 2. RunnablePassthrough() 接收 什么是 LangChain? 并原样返回 - 填充 questionresponserag_chain.invoke(什么是 LangChain?)logger.info(fAI Response:{response.content})3.3 数据流深度解析 (参数是如何传递的)很多同学会问retriever比如fake_retriever的参数是从哪来的当您执行rag_chain.invoke(什么是 LangChain?)时数据流向如下广播 (Broadcasting)最外层的字典结构隐式RunnableParallel接收到输入什么是 LangChain?。它会将这一份输入同时复制并通过invoke()方法传递给字典中的每一个 Value。并行执行分支 A (“context”)调用retriever.invoke(什么是 LangChain?)。因此retriever函数或 Runnable接收到的参数就是这个输入字符串。分支 B (“question”)调用RunnablePassthrough().invoke(什么是 LangChain?)。它不做任何处理直接返回什么是 LangChain?。聚合 (Aggregation)RunnableParallel等待两个分支都执行完毕。它将结果打包成一个新的字典{context: ..., question: ...}。这个字典随后被传给下一个环节prompt。3.4 Mermaid 图解并行分发机制上下文文本LangChain 是什么用户输入: LangChain 是什么调用 retriever(LangChain 是什么)调用 Passthrough(LangChain 是什么)ChatPromptTemplateGemini/GPT如果没有RunnablePassthrough我们就无法在RunnableParallel那个字典结构中引用原始的输入字符串。4. 进阶用法RunnablePassthrough.assign()除了原样透传它还有一个非常有用的静态方法.assign()。它用于在不丢失原始字典数据的情况下添加新的字段。场景假设上一步的输出是{num: 10}你需要计算它的平方但同时保留num字段。代码对比不使用 assign:# 你需要手动构造整个字典很容易丢失旧数据chainRunnableLambda(lambdax:{num:x[num],squared:x[num]**2})使用 assign (优雅):# 自动合并新旧数据chainRunnablePassthrough.assign(squaredlambdax:x[num]**2)输出:{num: 10, squared: 100}这在长链条处理中非常有用可以像“滚雪球”一样不断给数据流增加新的上下文而不会丢弃之前的信息。5. 总结RunnablePassthrough(): 恒等函数f(x) x。用于在并行分支中保留原始输入。RunnablePassthrough.assign(…): 增量更新函数f(dict) dict new_keys。用于给字典添加新字段。它是 LCEL 胶水代码中不可或缺的一部分尤其是在构建 RAG 和复杂数据流时。

相关新闻

ClickHouse如何应对大数据领域的数据倾斜问题

ClickHouse如何应对大数据领域的数据倾斜问题

ClickHouse如何应对大数据领域的数据倾斜问题 关键词:ClickHouse、数据倾斜、分布式计算、OLAP、分片优化、查询调优、长尾问题 摘要:在大数据领域,“数据倾斜"就像一场不均匀的"暴雨”——大部分区域只是毛毛细雨,少数…

2026/7/4 7:31:18 阅读更多 →
用过才敢说! 降AIGC网站 千笔·降AIGC助手 VS 学术猹,自考党必备!

用过才敢说! 降AIGC网站 千笔·降AIGC助手 VS 学术猹,自考党必备!

在AI技术迅速发展的今天,越来越多的学生和研究者开始借助AI工具辅助论文写作,以提高效率和内容质量。然而,随着各大查重系统对AI生成内容的识别能力不断提升,论文中的“AI痕迹”和“重复率超标”问题逐渐成为学术道路上的隐形障碍…

2026/5/17 7:02:17 阅读更多 →
风骨初鸣:奠基之后的三五事

风骨初鸣:奠基之后的三五事

风骨初鸣:奠基之后的三五事岐金兰奠基之日,无人敲锣打鼓。那篇文字发出去,像往深井里扔了颗石子,等了很久,没听见回响——这是常事。思想的出生,从来不是新闻。后来回响来了。不是以“认可”的形式&#xf…

2026/5/17 7:02:17 阅读更多 →

最新新闻

工业级条码扫描系统架构与核心技术解析

工业级条码扫描系统架构与核心技术解析

1. 工业级条码扫描系统架构解析LV30条码扫描器与MKV42F64VLH16微控制器的组合,构成了一个完整的工业级条码识别解决方案。这套系统在硬件设计上采用了模块化架构,主要包含三个核心部分:光学采集模块:LV30扫描器采用1/3英寸全局快门…

2026/7/6 7:13:06 阅读更多 →
STM32F439ZG驱动RGB灯带实现智能灯光控制系统

STM32F439ZG驱动RGB灯带实现智能灯光控制系统

1. 项目概述:用智能灯光打造沉浸式空间体验这个项目的核心目标是通过IN-PC55TBTRGB全彩LED灯带和STM32F439ZG高性能微控制器的组合,将普通空间转化为动态光影艺术装置。作为一名嵌入式开发工程师,我最近完成了这个智能灯光控制系统的完整实现…

2026/7/6 7:11:06 阅读更多 →
基于CEC1302与IN-PC55TBTRGB的环境光效系统设计

基于CEC1302与IN-PC55TBTRGB的环境光效系统设计

1. IN-PC55TBTRGB与CEC1302的硬件组合解析这个项目核心在于利用IN-PC55TBTRGB可编程RGB LED和CEC1302控制器,打造沉浸式环境照明系统。IN-PC55TBTRGB是Inolux推出的5x5mm可寻址RGB LED模块,采用串行移位寄存器设计,支持逐颗编程控制。实测单个…

2026/7/6 7:11:06 阅读更多 →
基于MC6470 IMU与dsPIC30F4011的运动控制系统设计

基于MC6470 IMU与dsPIC30F4011的运动控制系统设计

1. 项目背景与核心器件选型在工业自动化和机器人控制领域,精确的运动控制和位置感知一直是核心技术挑战。MC6470作为一款6自由度(6DOF)惯性测量单元(IMU),集成了三轴加速度计和三轴陀螺仪,能够提供高精度的运动追踪数据。而dsPIC30F4011是Mic…

2026/7/6 7:09:05 阅读更多 →
N_m3u8DL-RE流媒体下载:3个实用技巧轻松搞定在线视频保存

N_m3u8DL-RE流媒体下载:3个实用技巧轻松搞定在线视频保存

N_m3u8DL-RE流媒体下载:3个实用技巧轻松搞定在线视频保存 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE…

2026/7/6 7:07:05 阅读更多 →
基于74HC32与MKV44F64VLH16的智能键盘设计方案

基于74HC32与MKV44F64VLH16的智能键盘设计方案

1. 项目背景与核心需求在嵌入式系统开发中,按键输入是最基础也最频繁使用的人机交互方式之一。传统方案通常直接将机械按键连接到微控制器的GPIO引脚,但这种做法存在两个显著问题:一是按键抖动会导致误触发,二是占用宝贵的IO资源。…

2026/7/6 7:07:05 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻