跳至主要内容

如何链接可运行对象

关于 LangChain 表达式语言 的一个要点是,任何两个可运行对象都可以“链接”在一起形成序列。前一个可运行对象的 .invoke() 调用的输出将作为输入传递给下一个可运行对象。这可以使用 .pipe() 方法来完成。

生成的 RunnableSequence 本身就是一个可运行对象,这意味着它可以像任何其他可运行对象一样被调用、流式传输或进一步链接。以这种方式链接可运行对象的优点是高效的流式传输(序列将在输出可用时立即流式传输输出),以及使用 LangSmith 等工具进行调试和跟踪。

先决条件

管道方法

为了展示它的工作原理,让我们来看一个示例。我们将逐步介绍 LangChain 中的一种常见模式:使用 提示模板 将输入格式化为 聊天模型,最后使用[输出解析器](/docs/concepts#output-parsers 将聊天消息输出转换为字符串。

选择您的聊天模型

安装依赖项

yarn add @langchain/openai 

添加环境变量

OPENAI_API_KEY=your-api-key

实例化模型

import { ChatOpenAI } from "@langchain/openai";

const model = new ChatOpenAI({
model: "gpt-4o-mini",
temperature: 0
});
yarn add @langchain/core @langchain/core
import { StringOutputParser } from "@langchain/core/output_parsers";
import { ChatPromptTemplate } from "@langchain/core/prompts";

const prompt = ChatPromptTemplate.fromTemplate("tell me a joke about {topic}");

const chain = prompt.pipe(model).pipe(new StringOutputParser());

提示和模型都是可运行对象,提示调用中的输出类型与聊天模型的输入类型相同,因此我们可以将它们链接在一起。然后我们可以像任何其他可运行对象一样调用生成的序列

await chain.invoke({ topic: "bears" });
"Here's a bear joke for you:\n\nWhy did the bear dissolve in water?\nBecause it was a polar bear!"

强制转换

我们甚至可以将此链与更多可运行对象组合在一起以创建另一个链。这可能涉及使用其他类型的可运行对象进行一些输入/输出格式化,具体取决于链组件所需的输入和输出。

例如,假设我们想将笑话生成链与另一个评估生成的笑话是否好笑的链组合在一起。

我们需要小心如何将输入格式化为下一个链。在下面的示例中,链中的字典会自动解析并转换为 RunnableParallel,它会并行运行所有值并返回一个包含结果的字典。

这恰好与下一个提示模板所需的格式相同。以下是它的实际应用

import { RunnableLambda } from "@langchain/core/runnables";

const analysisPrompt = ChatPromptTemplate.fromTemplate(
"is this a funny joke? {joke}"
);

const composedChain = new RunnableLambda({
func: async (input: { topic: string }) => {
const result = await chain.invoke(input);
return { joke: result };
},
})
.pipe(analysisPrompt)
.pipe(model)
.pipe(new StringOutputParser());

await composedChain.invoke({ topic: "bears" });
'Haha, that\'s a clever play on words! Using "polar" to imply the bear dissolved or became polar/polarized when put in water. Not the most hilarious joke ever, but it has a cute, groan-worthy pun that makes it mildly amusing. I appreciate a good pun or wordplay joke.'

函数也会被强制转换为可运行对象,因此您也可以在链中添加自定义逻辑。下面的链会导致与之前相同的逻辑流程

import { RunnableSequence } from "@langchain/core/runnables";

const composedChainWithLambda = RunnableSequence.from([
chain,
(input) => ({ joke: input }),
analysisPrompt,
model,
new StringOutputParser(),
]);

await composedChainWithLambda.invoke({ topic: "beets" });
"Haha, that's a cute and punny joke! I like how it plays on the idea of beets blushing or turning red like someone blushing. Food puns can be quite amusing. While not a total knee-slapper, it's a light-hearted, groan-worthy dad joke that would make me chuckle and shake my head. Simple vegetable humor!"

查看上面运行的 LangSmith 跟踪 此处

但是,请记住,使用此类函数可能会干扰流式传输等操作。见 本节 获取更多信息。

下一步

你现在已经了解了一些将两个可运行对象链接在一起的方法。

要了解更多信息,请参阅有关可运行对象的 此部分中的其他操作指南。


此页面对您有帮助吗?


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