RunnablePassthrough介绍和透传参数实战

news2025/7/24 10:20:39

导读:在构建复杂的LangChain应用时,你是否遇到过需要在处理链中既保留原始输入又动态扩展上下文的场景?RunnablePassthrough正是为解决这类数据流处理问题而设计的核心组件。

本文通过深入剖析RunnablePassthrough的工作机制和实际应用,为开发者提供了一套完整的数据透传解决方案。文章不仅详细介绍了该组件的核心概念和基础用法,更重要的是通过一个完整的RAG(检索增强生成)系统实战案例,展示了如何在实际项目中优雅地处理并行数据流。

特别值得关注的是文章中的.assign()方法应用技巧——它能够在不破坏原始数据结构的前提下,动态添加新的上下文字段。这种设计模式在处理复杂业务逻辑时显得尤为重要。案例中展示的向量检索与用户问题并行处理的实现方式,为构建高效AI应用提供了实用的架构参考。

简介

本文将深入介绍LangChain中的RunnablePassthrough组件,并通过实战案例演示如何使用透传参数功能。

RunnablePassthrough核心概念

功能定义

RunnablePassthrough是LangChain中的一个重要组件,其核心功能包括:

  • 在处理链中直接传递输入数据,不进行任何修改
  • 通过.assign()方法扩展上下文字段,动态添加新的数据字段

应用场景

RunnablePassthrough主要适用于以下场景:

  • 数据保留:保留原始输入数据供后续步骤使用
  • 上下文扩展:动态添加新字段到上下文中,例如结合检索结果与用户问题

基础用法示例

直接传递输入

from langchain_core.runnables import RunnablePassthrough

# 直接传递输入数据
chain = RunnablePassthrough() | model
output = chain.invoke("Hello")

扩展字段实战案例

案例一:使用assign()添加字段

from langchain_core.runnables import RunnablePassthrough

# 使用assign()方法添加新字段
# 该方法接收关键字参数,其值是一个处理函数
# 函数定义了如何处理输入数据以生成新字段
# lambda函数接收输入x,返回x["num"] * 2的结果
# 创建新字段'processed',值为输入字段'num'的两倍
chain = RunnablePassthrough.assign(processed=lambda x: x["num"] * 2)

# 调用chain对象的invoke方法,传入包含'num'字段的字典
# 执行lambda函数,在输入字典基础上添加'processed'字段
# 输出处理后的完整字典
output = chain.invoke({"num": 3})  # 输出:{'num': 3, 'processed': 6}
print(output)

案例二:构建上下文处理链

# 构建包含原始问题和处理上下文的链(伪代码示例)
chain = (
    RunnablePassthrough.assign(
        context=lambda x: retrieve_documents(x["question"])
    )
    | prompt
    | llm
)

input_data = {"question": "LangChain是什么?"}
response = chain.invoke(input_data)

透传参数LLM实战案例

工作流程说明

本案例展示了一个完整的RAG(检索增强生成)系统的实现流程:

  1. 并行处理:用户输入的问题同时传递给retriever和RunnablePassthrough()
  2. 检索执行:retriever完成检索后,自动将结果赋值给context字段
  3. 数据整合:检索结果context和用户输入question一并传递给提示模板
  4. 生成答案:模型根据检索到的上下文生成最终答案

完整代码实现

from langchain_community.embeddings import DashScopeEmbeddings
from langchain_milvus import Milvus
from langchain_core.documents import Document
from langchain_core.runnables import RunnablePassthrough
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

# 初始化嵌入模型
embeddings = DashScopeEmbeddings(
    model="text-embedding-v2",  # 第二代通用嵌入模型
    max_retries=3,
    dashscope_api_key="sk-xxxxxxxxxxxxxxxxxxx"
)

# 创建文档数据
document_1 = Document(
    page_content="MMR搜索和LangChain整合Milvus实战",
    metadata={"source": "humaonan.blog.csdn.net/article/details/148318637"},
)

document_2 = Document(
    page_content="Milvus向量Search查询综合案例实战(下)",
    metadata={"source": "humaonan.blog.csdn.net/article/details/148292710"},
)

documents = [document_1, document_2]

# 构建向量存储
vector_store = Milvus.from_documents(
    documents=documents,
    embedding=embeddings,
    collection_name="runnable_test",
    connection_args={"uri": "http://192.168.19.152:19530"}
)

# 创建检索器(默认使用similarity_search)
retriever = vector_store.as_retriever(search_kwargs={"k": 2})

# 定义提示模板
prompt = ChatPromptTemplate.from_template("基于上下文回答:{context}\n问题:{question}")

# 初始化语言模型
model = ChatOpenAI(
    model_name="qwen-plus",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    api_key="sk-xxxxxxxxxxxxxxxxxxx",
    temperature=0.7
)

# 构建处理链
chain = {
    "context": retriever,  # 检索相关文档
    "question": RunnablePassthrough()  # 直接传递用户问题
} | prompt | model

# 执行查询
result = chain.invoke("如何实现向量搜索?")
print(result)

总结

RunnablePassthrough作为LangChain生态系统中的基础组件,为数据流处理提供了灵活的解决方案。通过本文的实战案例,我们可以看到:

  • 简洁性:RunnablePassthrough提供了简洁的API来处理数据传递和扩展
  • 灵活性:支持多种数据处理模式,适应不同的业务场景
  • 实用性:在RAG系统中发挥重要作用,实现了高效的上下文管理

掌握RunnablePassthrough的使用方法,将有助于构建更加高效和灵活的AI应用系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2401506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaSec-XSS

反射型XSS 简介 XSS(跨站脚本攻击)利用浏览器对服务器内容的信任,攻击者通过在网页中注入恶意脚本,使这些脚本在用户的浏览器上执行,从而实现攻击。常见的XSS攻击危害包括窃取用户会话信息、篡改网页内容、将用户重定向到恶意网站&#xff0c…

echarts在uniapp中使用安卓真机运行时无法显示的问题

文章目录 一、实现效果二、话不多说,上源码 前言:我们在uniapp中开发的时候,开发的时候很正常,echarts的图形在h5页面上也是很正常的,但是当我们打包成安卓app或者使用安卓真机运行的时候,图形根本就没有渲…

STM32----IAP远程升级

一、概述: IAP,全称是“In-Application Programming”,中文解释为“在程序中编程”。IAP是一种对通过微控制器的对外接口(如USART,IIC,CAN,USB,以太网接口甚至是无线射频通道&#…

C++优选算法 904. 水果成篮

文章目录 1.题目描述2.算法思路 3.完整代码容器做法数组做法 1.题目描述 看到这种题目,总觉得自己在做阅读理解,晕了,题目要求我们在一个数组里分别找出两种数字,并统计这两种数字分别出现一共是多少。 2.算法思路 采用哈希表滑…

Python6.5打卡(day37)

DAY 37 早停策略和模型权重的保存 知识点回顾: 过拟合的判断:测试集和训练集同步打印指标模型的保存和加载 仅保存权重保存权重和模型保存全部信息checkpoint,还包含训练状态 早停策略 作业:对信贷数据集训练后保存权重&#xf…

大中型水闸安全监测管理系统建设方案

一、背景介绍 我国现已建成流量5m/s及以上的水闸共计100321座。其中,大型水闸923座,中型水闸6,697座。按功能类型划分,分洪闸8193座,排(退)水闸17808座,挡潮闸4955座,引水闸13796座&…

风控研发大数据学习路线

在如今信息爆炸时代,风控系统离不开大数据技术的支撑,大数据技术可以帮助风控系统跑的更快,算的更准。因此,风控技术研发需要掌握大数据相关技术。然而大数据技术栈内容庞大丰富,风控研发同学很可能会面临以下这些痛点…

【设计模式】门面/外观模式

MySQL ,MyTomcat 的启动 现在有 MySQL ,MyTomcat 类,需要依次启动。 public class Application {public static void main(String[] args) {MySQL mySQL new MySQL();mySQL.initDate();mySQL.checkLog();mySQL.unlock();mySQL.listenPort(…

spring的webclient与vertx的webclient的比较

Spring WebClient 和 Vert.x WebClient 都是基于响应式编程模型的非阻塞 HTTP 客户端,但在设计理念、生态整合和适用场景上存在显著差异。以下是两者的核心比较: 🔄 1. 技术背景与架构 • Spring WebClient ◦ 生态定位:属于 Sp…

贪心算法应用:埃及分数问题详解

贪心算法与埃及分数问题详解 埃及分数(Egyptian Fractions)问题是数论中的经典问题,要求将一个真分数表示为互不相同的单位分数之和。本文将用2万字全面解析贪心算法在埃及分数问题中的应用,涵盖数学原理、算法设计、Java实现、优…

高效集成AI能力:使用开放API打造问答系统,不用训练模型,也能做出懂知识的AI

本文为分享体验感受,非广告。 一、蓝耘平台核心功能与优势 丰富的模型资源库 蓝耘平台提供涵盖自然语言处理、计算机视觉、多模态交互等领域的预训练模型,支持用户直接调用或微调,无需从零开始训练,显著缩短开发周期。 高性能…

Qt 仪表盘源码分享

Qt 仪表盘源码分享 一、效果展示二、优点三、源码分享四、使用方法 一、效果展示 二、优点 直观性 数据以图表或数字形式展示,一目了然。用户可以快速获取关键信息,无需深入阅读大量文字。 实时性 仪表盘通常支持实时更新,确保数据的时效性。…

Python数据可视化科技图表绘制系列教程(四)

目录 带基线的棒棒糖图1 带基线的棒棒糖图2 带标记的棒棒糖图 哑铃图1 哑铃图2 包点图1 包点图2 雷达图1 雷达图2 交互式雷达图 【声明】:未经版权人书面许可,任何单位或个人不得以任何形式复制、发行、出租、改编、汇编、传播、展示或利用本博…

深入理解系统:UML类图

UML类图 类图(class diagram) 描述系统中的对象类型,以及存在于它们之间的各种静态关系。 正向工程(forward engineering)在编写代码之前画UML图。 逆向工程(reverse engineering)从已有代码建…

软件工程的定义与发展历程

文章目录 一、软件工程的定义二、软件工程的发展历程1. 前软件工程时期(1940s-1960s)2. 软件工程诞生(1968)3. 结构化方法时期(1970s)4. 面向对象时期(1980s)5. 现代软件工程(1990s-至今) 三、软件工程的发展趋势 一、软件工程的定义 软件工程是应用系统化、规范化、可量化的方…

第十三节:第五部分:集合框架:集合嵌套

集合嵌套案例分析 代码: package com.itheima.day27_Collection_nesting;import java.util.*;/*目标:理解集合的嵌套。 江苏省 "南京市","扬州市","苏州市","无锡市","常州市" 湖北省 "武汉市","…

Java设计模式之观察者模式详解

一、观察者模式简介 观察者模式(Observer Pattern)是一种行为型设计模式,它定义了对象之间的一对多依赖关系。当一个对象(主题)的状态发生改变时,所有依赖于它的对象(观察者)都会自…

freeRTOS 消息队列之一个事件添加到消息队列超时怎么处理

一 消息队列的结构框图 xTasksWaitingToSend‌:这个列表存储了所有因为队列已满而等待发送消息的任务。当任务尝试向一个已满的队列发送消息时,该任务会被挂起并加入到xTasksWaitingToSend列表中,直到队列中有空间可用‌, xTasksW…

Authpf(OpenBSD)认证防火墙到ssh连接到SSH端口转发技术栈 与渗透网络安全的关联 (RED Team Technique )

目录 🔍 1. Authpf概述与Shell设置的作用 什么是Authpf? Shell设置为/usr/sbin/authpf的作用与含义 🛠️ 2. Authpf工作原理与防火墙绕过机制 技术栈 工作原理 防火墙绕过机制 Shell关联 🌐 3. Authpf与SSH认证及服务探测…

组合与排列

组合与排列主要有两个区别,区别在于是否按次序排列和符号表示不同。 全排列: 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当mn时所有的排列情况…