跳至主要内容

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

在用多个步骤组合链时,有时你可能希望将之前步骤中的数据保持不变,以便用作后续步骤的输入。 RunnablePassthrough 类可以让你做到这一点,通常与 RunnableParallel 一起使用,以将数据传递到你的构建链中的后续步骤。

让我们看一个例子

import {
RunnableParallel,
RunnablePassthrough,
} from "@langchain/core/runnables";

const runnable = RunnableParallel.from({
passed: new RunnablePassthrough(),
modified: (input) => input.num + 1,
});

await runnable.invoke({ num: 1 });
{ passed: { num: 1 }, modified: 2 }

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

我们还使用 modified 在映射中设置了第二个键。它使用 lambda 设置一个单独的值,为 num 添加 1,这使得 modified 键的值为 2

检索示例

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

yarn add @langchain/openai
import { StringOutputParser } from "@langchain/core/output_parsers";
import { ChatPromptTemplate } from "@langchain/core/prompts";
import {
RunnablePassthrough,
RunnableSequence,
} from "@langchain/core/runnables";
import { ChatOpenAI, OpenAIEmbeddings } from "@langchain/openai";
import { MemoryVectorStore } from "langchain/vectorstores/memory";

const vectorstore = await MemoryVectorStore.fromDocuments(
[{ pageContent: "harrison worked at kensho", metadata: {} }],
new OpenAIEmbeddings()
);

const retriever = vectorstore.asRetriever();

const template = `Answer the question based only on the following context:
{context}

Question: {question}
`;

const prompt = ChatPromptTemplate.fromTemplate(template);

const model = new ChatOpenAI({ model: "gpt-4o" });

const retrievalChain = RunnableSequence.from([
{
context: retriever.pipe((docs) => docs[0].pageContent),
question: new RunnablePassthrough(),
},
prompt,
model,
new StringOutputParser(),
]);

await retrievalChain.invoke("where did harrison work?");
"Harrison worked at Kensho."

这里,提示的输入预计将是一个具有 "context""question" 键的映射。 用户输入仅仅是问题。 因此,我们需要使用检索器获取上下文,并在 "question" 键下传递用户输入。 RunnablePassthrough 允许我们将用户的询问传递到提示和模型。

后续步骤

现在,你已经学习了如何将数据传递到你的链中,以帮助格式化流经你的链的数据。

要了解更多信息,请参阅本部分中有关 Runnable 的其他操作指南。


此页面对您有帮助吗?


你也可以留下详细的反馈 在 GitHub 上.