Skip to main content

通过传递数据

RunnablePassthrough允许传递输入数据,可以保持不变或添加额外的键。通常与RunnableParallel一起使用,将数据分配给映射中的新键。

RunnablePassthrough() 单独调用时,将简单地接收输入并传递。

使用assign参数调用RunnablePassthrough (RunnablePassthrough.assign(...)),将接收输入,并添加传递给assign函数的额外参数。

请参考下面的示例:

%pip install --upgrade --quiet  langchain langchain-openai
from langchain_core.runnables import RunnableParallel, RunnablePassthrough

runnable = RunnableParallel(
passed=RunnablePassthrough(),
extra=RunnablePassthrough.assign(mult=lambda x: x["num"] * 3),
modified=lambda x: x["num"] + 1,
)

runnable.invoke({"num": 1})

如上所示,passed 键使用 RunnablePassthrough() 调用,因此它只是传递了 {'num': 1}

在第二行中,我们使用了带有将数值乘以3的lambda的 RunnablePastshrough.assign。在这种情况下,extra 被设置为 {'num': 1, 'mult': 3},即原始值加上 mult 键。

最后,我们还使用lambda在映射中设置了第三个键 modified,将num加1,结果为 modified 键的值为 2

检索示例

在下面的示例中,我们看到了使用RunnablePassthrough和RunnableMap的用例。

from langchain_community.vectorstores import FAISS
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI, OpenAIEmbeddings

vectorstore = FAISS.from_texts(
["harrison worked at kensho"], embedding=OpenAIEmbeddings()
)
retriever = vectorstore.as_retriever()
template = """Answer the question based only on the following context:
{context}

Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
model = ChatOpenAI()

retrieval_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| model
| StrOutputParser()
)

retrieval_chain.invoke("where did harrison work?")

在这里,prompt的输入预期是一个带有 "context" 和 "question" 键的映射。用户输入只是问题。因此,我们需要使用我们的retriever获取上下文,并将用户输入传递到 "question" 键下。在这种情况下,RunnablePassthrough允许我们将用户的问题传递给prompt和model。

=======