如何将参数从一个步骤传递到下一个步骤
先决条件
本指南假定读者熟悉以下概念:
在组合多个步骤的链时,有时您希望将之前步骤的数据原样传递,以便在后续步骤中使用。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})
API 参考:RunnableParallel | RunnablePassthrough
{'passed': {'num': 1}, 'modified': 2}
如上所示,passed 键被调用时传入了 RunnablePassthrough(),因此它直接传递了 {'num': 1}。
我们还在映射中设置了第二个键,值为 modified。这使用了一个 lambda 表达式,将 num 的值加 1,结果得到一个键为 modified、值为 2 的条目。
检索示例
在下面的示例中,我们看到一个更贴近实际应用场景的例子,其中我们使用 RunnablePassthrough 与 RunnableParallel 在链中配合,以正确格式化提示词的输入:
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?")
API 参考:FAISS | StrOutputParser | ChatPromptTemplate | RunnablePassthrough | ChatOpenAI | OpenAIEmbeddings
'Harrison worked at Kensho.'
此处的提示输入预期为一个包含键“context”和“question”的映射。用户输入仅为问题。因此,我们需要使用我们的检索器获取上下文,并将用户输入通过“question”键传递。RunnablePassthrough 允许我们将用户的提问传递给提示和模型。
下一步
现在你已经学会了如何在链中传递数据,以帮助格式化通过链流动的数据。
要了解更多信息,请参阅本节中关于可运行对象的其他操操作指南。