RunnablePassthrough
2026-03-14 本文已影响0人
阿凡提说AI
RunnablePassthrough 是 LangChain 框架中一个非常实用的基础组件,核心作用是透传输入数据或基于输入数据生成新的输出,常与其他 Runnable(如提示词模板、LLM 模型)配合使用,是构建复杂链(Chain)的关键工具。
一、核心概念(新手友好版)
可以把 RunnablePassthrough 理解成一个“数据中转站”:
- 基础用法:原封不动地把输入数据传给下一个组件(比如模型);
- 进阶用法:在透传的同时,对输入数据做简单加工(比如新增字段、修改字段值)。
它的核心价值是解决“输入数据格式不匹配”的问题——比如模型需要 {"question": "...", "context": "..."} 格式,但原始输入只有 {"question": "..."},就可以用 RunnablePassthrough 补充 context 字段。
二、基础用法(直接透传)
1. 纯透传(无加工)
适用于输入数据格式已经满足下一个组件要求的场景,代码可直接运行(需先安装 LangChain):
# 第一步:安装依赖(如果未安装)
# pip install langchain
# 第二步:核心代码
from langchain_core.runnables import RunnablePassthrough
# 初始化 RunnablePassthrough 实例
passthrough = RunnablePassthrough()
# 测试:输入什么,输出就是什么
input_data = {"question": "什么是 RunnablePassthrough?"}
output = passthrough.invoke(input_data)
print(output)
# 输出结果:{'question': '什么是 RunnablePassthrough?'}
2. 配合 LLM 实现“输入透传+模型调用”
这是最常见的场景:透传用户输入,拼接提示词后调用模型。
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI # 需安装:pip install langchain-openai
from langchain_core.runnables import RunnablePassthrough
# 1. 初始化模型(需配置 OpenAI API Key,或替换为其他模型如 ChatAnthropic)
import os
os.environ["OPENAI_API_KEY"] = "你的 OpenAI API Key"
llm = ChatOpenAI(model="gpt-3.5-turbo")
# 2. 定义提示词模板(需要接收 "question" 字段)
prompt = ChatPromptTemplate.from_template("请用简单的语言解释:{question}")
# 3. 构建链:透传输入 → 拼接提示词 → 调用模型
chain = RunnablePassthrough() | prompt | llm
# 4. 调用链
result = chain.invoke({"question": "什么是 RunnablePassthrough?"})
print(result.content)
# 输出示例:RunnablePassthrough 是 LangChain 中的一个组件,主要作用是透传输入数据...
三、进阶用法(加工数据后透传)
1. 用 assign() 新增字段
最常用的进阶功能:基于原始输入,新增字段后透传(比如补充上下文、系统指令)。
from langchain_core.runnables import RunnablePassthrough
# 原始输入只有 question
input_data = {"question": "LangChain 是什么?"}
# 初始化 RunnablePassthrough,新增 context 字段
passthrough = RunnablePassthrough.assign(
# value 可以是固定值,也可以是函数(接收原始输入作为参数)
context=lambda x: f"用户现在问的是:{x['question']},请用简洁的语言回答"
)
# 调用后,输出包含原始 question + 新增的 context
output = passthrough.invoke(input_data)
print(output)
# 输出结果:
# {'question': 'LangChain 是什么?', 'context': '用户现在问的是:LangChain 是什么?,请用简洁的语言回答'}
2. 用 pick() 筛选字段
如果原始输入字段太多,可通过 pick() 只透传需要的字段:
from langchain_core.runnables import RunnablePassthrough
# 原始输入有多个字段
input_data = {"question": "Python 怎么学?", "user_id": 123, "time": "2026-03-15"}
# 只透传 question 字段
passthrough = RunnablePassthrough.pick(["question"])
output = passthrough.invoke(input_data)
print(output)
# 输出结果:{'question': 'Python 怎么学?'}
四、实战场景(完整示例)
结合 assign() + LLM 实现“动态补充上下文 + 模型回答”:
from langchain_core.runnables import RunnablePassthrough
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
# 1. 初始化模型
os.environ["OPENAI_API_KEY"] = "你的 API Key"
llm = ChatOpenAI(model="gpt-3.5-turbo")
# 2. 提示词模板(使用 question 和 context 两个字段)
prompt = ChatPromptTemplate.from_template(
"根据上下文回答问题:\n上下文:{context}\n问题:{question}"
)
# 3. 构建链:加工数据 → 拼接提示词 → 调用模型
chain = (
RunnablePassthrough.assign(
# 动态生成上下文
context=lambda x: f"用户提问关于{x['question']},要求回答不超过50个字"
)
| prompt
| llm
)
# 4. 调用链
result = chain.invoke({"question": "RunnablePassthrough 的核心作用?"})
print(result.content)
# 输出示例:RunnablePassthrough 是 LangChain 组件,可透传或加工输入数据,适配下游组件格式。
总结
-
核心作用:
RunnablePassthrough是 LangChain 的“数据中转站”,核心是透传/加工输入数据,适配下游组件的格式要求; -
基础用法:
RunnablePassthrough()纯透传,pick()筛选字段; -
进阶用法:
assign()基于原始输入新增/修改字段,是最常用的实战功能。
这个组件本身不做复杂逻辑处理,但能让链的数据流更灵活,是构建 LangChain 复杂应用的基础工具。