如何将参数从一个步骤传递到下一个步骤
先决条件
当组合包含多个步骤的链时,有时您会希望传递来自先前步骤的数据,并保持不变以用作后续步骤的输入。RunnablePassthrough
类允许您执行此操作,并且通常与 RunnableParallel 结合使用,以将数据传递到您构建的链中的后续步骤。
让我们看一个例子
import {
RunnableParallel,
RunnablePassthrough,
} from "@langchain/core/runnables";
const runnable = RunnableParallel.from({
passed: new RunnablePassthrough<{ num: number }>(),
modified: (input: { num: number }) => input.num + 1,
});
await runnable.invoke({ num: 1 });
{ passed: { num: 1 }, modified: 2 }
如上所示,使用 RunnablePassthrough()
调用了 passed
键,因此它只是传递了 {'num': 1}
。
我们还在映射中使用 modified
设置了第二个键。这使用 lambda 设置一个值,将 num 加 1,这导致 modified
键的值为 2
。
检索示例
在下面的示例中,我们看到了一个更真实的用例,我们在链中使用 RunnablePassthrough
以及 RunnableParallel
来正确格式化提示的输入
提示
有关安装集成包的常规说明,请参阅此部分。
- npm
- yarn
- pnpm
npm i @langchain/openai @langchain/core
yarn add @langchain/openai @langchain/core
pnpm add @langchain/openai @langchain/core
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
允许我们将用户的问题传递给提示和模型。
下一步
现在您已经学习了如何通过链传递数据,以帮助格式化流经链的数据。
要了解更多信息,请参阅本节中关于 runnables 的其他操作指南。