RunnablePassthrough:传递数据
RunnablePassthrough 允许不改变或添加额外的键来传递输入。这通常与 RunnableParallel 结合使用,将数据分配给映射中的新键。
RunnablePassthrough() 自行调用,将简单地获取输入并将其传递。
使用分配调用 RunnablePassthrough (RunnablePassthrough.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': {'num': 1}, 'extra': {'num': 1, 'mult': 3}, 'modified': 2}
如上所示,传递的密钥是使用 RunnablePassthrough() 调用的,因此它只是传递 {'num': 1}
。
在第二行中,我们使用 RunnablePastshrough.assign 和一个将数值乘以 3 的 lambda。在这种情况下,使用 {'num': 1, 'mult': 3}
设置 extra,这是带有 mult 的原始值已添加密钥。
最后,我们还在映射中设置了第三个键,它使用 lambda 来设置单个值,将 num 加 1,这导致修改后的键值为 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?")
'Harrison worked at Kensho.'
这里提示的输入应该是一个带有“context”和“question”键的地图。用户输入只是问题。因此,我们需要使用检索器获取上下文,并通过“question”键下的用户输入。在这种情况下,RunnablePassthrough 允许我们将用户的问题传递给提示和模型。