RunnablePassthrough 是 LangChain 框架中一個(gè)非常實(shí)用的基礎(chǔ)組件,核心作用是透傳輸入數(shù)據(jù)或基于輸入數(shù)據(jù)生成新的輸出,常與其他 Runnable(如提示詞模板、LLM 模型)配合使用,是構(gòu)建復(fù)雜鏈(Chain)的關(guān)鍵工具。
一、核心概念(新手友好版)
可以把 RunnablePassthrough 理解成一個(gè)“數(shù)據(jù)中轉(zhuǎn)站”:
- 基礎(chǔ)用法:原封不動(dòng)地把輸入數(shù)據(jù)傳給下一個(gè)組件(比如模型);
- 進(jìn)階用法:在透傳的同時(shí),對(duì)輸入數(shù)據(jù)做簡單加工(比如新增字段、修改字段值)。
它的核心價(jià)值是解決“輸入數(shù)據(jù)格式不匹配”的問題——比如模型需要 {"question": "...", "context": "..."} 格式,但原始輸入只有 {"question": "..."},就可以用 RunnablePassthrough 補(bǔ)充 context 字段。
二、基礎(chǔ)用法(直接透傳)
1. 純透傳(無加工)
適用于輸入數(shù)據(jù)格式已經(jīng)滿足下一個(gè)組件要求的場景,代碼可直接運(yùn)行(需先安裝 LangChain):
# 第一步:安裝依賴(如果未安裝)
# pip install langchain
# 第二步:核心代碼
from langchain_core.runnables import RunnablePassthrough
# 初始化 RunnablePassthrough 實(shí)例
passthrough = RunnablePassthrough()
# 測試:輸入什么,輸出就是什么
input_data = {"question": "什么是 RunnablePassthrough?"}
output = passthrough.invoke(input_data)
print(output)
# 輸出結(jié)果:{'question': '什么是 RunnablePassthrough?'}
2. 配合 LLM 實(shí)現(xiàn)“輸入透傳+模型調(diào)用”
這是最常見的場景:透傳用戶輸入,拼接提示詞后調(diào)用模型。
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("請(qǐng)用簡單的語言解釋:{question}")
# 3. 構(gòu)建鏈:透傳輸入 → 拼接提示詞 → 調(diào)用模型
chain = RunnablePassthrough() | prompt | llm
# 4. 調(diào)用鏈
result = chain.invoke({"question": "什么是 RunnablePassthrough?"})
print(result.content)
# 輸出示例:RunnablePassthrough 是 LangChain 中的一個(gè)組件,主要作用是透傳輸入數(shù)據(jù)...
三、進(jìn)階用法(加工數(shù)據(jù)后透傳)
1. 用 assign() 新增字段
最常用的進(jìn)階功能:基于原始輸入,新增字段后透傳(比如補(bǔ)充上下文、系統(tǒng)指令)。
from langchain_core.runnables import RunnablePassthrough
# 原始輸入只有 question
input_data = {"question": "LangChain 是什么?"}
# 初始化 RunnablePassthrough,新增 context 字段
passthrough = RunnablePassthrough.assign(
# value 可以是固定值,也可以是函數(shù)(接收原始輸入作為參數(shù))
context=lambda x: f"用戶現(xiàn)在問的是:{x['question']},請(qǐng)用簡潔的語言回答"
)
# 調(diào)用后,輸出包含原始 question + 新增的 context
output = passthrough.invoke(input_data)
print(output)
# 輸出結(jié)果:
# {'question': 'LangChain 是什么?', 'context': '用戶現(xiàn)在問的是:LangChain 是什么?,請(qǐng)用簡潔的語言回答'}
2. 用 pick() 篩選字段
如果原始輸入字段太多,可通過 pick() 只透傳需要的字段:
from langchain_core.runnables import RunnablePassthrough
# 原始輸入有多個(gè)字段
input_data = {"question": "Python 怎么學(xué)?", "user_id": 123, "time": "2026-03-15"}
# 只透傳 question 字段
passthrough = RunnablePassthrough.pick(["question"])
output = passthrough.invoke(input_data)
print(output)
# 輸出結(jié)果:{'question': 'Python 怎么學(xué)?'}
四、實(shí)戰(zhàn)場景(完整示例)
結(jié)合 assign() + LLM 實(shí)現(xiàn)“動(dòng)態(tài)補(bǔ)充上下文 + 模型回答”:
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 兩個(gè)字段)
prompt = ChatPromptTemplate.from_template(
"根據(jù)上下文回答問題:\n上下文:{context}\n問題:{question}"
)
# 3. 構(gòu)建鏈:加工數(shù)據(jù) → 拼接提示詞 → 調(diào)用模型
chain = (
RunnablePassthrough.assign(
# 動(dòng)態(tài)生成上下文
context=lambda x: f"用戶提問關(guān)于{x['question']},要求回答不超過50個(gè)字"
)
| prompt
| llm
)
# 4. 調(diào)用鏈
result = chain.invoke({"question": "RunnablePassthrough 的核心作用?"})
print(result.content)
# 輸出示例:RunnablePassthrough 是 LangChain 組件,可透傳或加工輸入數(shù)據(jù),適配下游組件格式。
總結(jié)
-
核心作用:
RunnablePassthrough是 LangChain 的“數(shù)據(jù)中轉(zhuǎn)站”,核心是透傳/加工輸入數(shù)據(jù),適配下游組件的格式要求; -
基礎(chǔ)用法:
RunnablePassthrough()純透傳,pick()篩選字段; -
進(jìn)階用法:
assign()基于原始輸入新增/修改字段,是最常用的實(shí)戰(zhàn)功能。
這個(gè)組件本身不做復(fù)雜邏輯處理,但能讓鏈的數(shù)據(jù)流更靈活,是構(gòu)建 LangChain 復(fù)雜應(yīng)用的基礎(chǔ)工具。