跳到主要内容
Open In ColabOpen on GitHub

如何将参数从一步传递到下一步

在组合多步骤链时,有时您会希望将前一步骤的数据原封不动地传递下去,作为后续步骤的输入。而 RunnablePassthrough 类允许您这样做,并且通常与 RunnableParallel 结合使用,将数据传递到您构建的链的后续步骤中。

请看下面的示例

%pip install -qU langchain langchain-openai

import os
from getpass import getpass

if "OPENAI_API_KEY" not in os.environ:
os.environ["OPENAI_API_KEY"] = getpass()
from langchain_core.runnables import RunnableParallel, RunnablePassthrough

runnable = RunnableParallel(
passed=RunnablePassthrough(),
modified=lambda x: x["num"] + 1,
)

runnable.invoke({"num": 1})
{'passed': {'num': 1}, 'modified': 2}

如上所示,passed 键通过 RunnablePassthrough() 被调用,因此它只是简单地传递了 {'num': 1}

我们还在映射中设置了第二个键,名为 modified。这使用了一个 lambda 函数来设置一个单一值,即将 num 增加 1,从而使 modified 键的值为 2

检索示例

在下面的示例中,我们看到了一个更实际的用例,其中我们在链中使用 RunnablePassthroughRunnableParallel,以正确格式化提示的输入

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 允许我们将用户的问题传递给提示和模型。

下一步

现在您已经学会了如何在链中传递数据,以帮助格式化在链中流动的数据。

要了解更多信息,请参阅本节中关于可运行对象的其他操作指南。