RunnablePassthrough

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é)

  1. 核心作用RunnablePassthrough 是 LangChain 的“數(shù)據(jù)中轉(zhuǎn)站”,核心是透傳/加工輸入數(shù)據(jù),適配下游組件的格式要求;
  2. 基礎(chǔ)用法RunnablePassthrough() 純透傳,pick() 篩選字段;
  3. 進(jìn)階用法assign() 基于原始輸入新增/修改字段,是最常用的實(shí)戰(zhàn)功能。

這個(gè)組件本身不做復(fù)雜邏輯處理,但能讓鏈的數(shù)據(jù)流更靈活,是構(gòu)建 LangChain 復(fù)雜應(yīng)用的基礎(chǔ)工具。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容