跳至主要内容

如何链接可运行对象

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

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

先决条件

pipe 方法

为了展示它是如何工作的,让我们举一个例子。我们将介绍 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
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 上留下详细的反馈 GitHub.