创建时间: 2026-03-29最后更新: 2026-09-10

1. 统一接口

前面已经分别使用过 Prompt Template、ChatModel 和 Output Parser。把它们放进一次完整调用时,可以依次执行三个步骤:

manual.ts
1
const promptValue = await prompt.invoke({
2
input: '什么是 Runnable?',
3
})
4
const message = await model.invoke(promptValue)
5
const text = await parser.invoke(message)

这段代码有一个值得注意的细节:promptmodelparser 的职责完全不同,却都提供了 invoke()

它们接收的数据也不同。Prompt 接收模板变量,模型接收 Prompt 或消息,Parser 接收模型消息。LangChain 让这些对象遵守同一套执行约定,因此调用方可以用一致的方式启动每个步骤。

当步骤继续增加时,手动调用会产生更多中间变量,还要反复把前一步的结果传给后一步:

code.ts
1
input
2
-> prompt.invoke(input)
3
-> model.invoke(promptValue)
4
-> parser.invoke(message)
5
-> text

LCEL 可以把这段固定顺序直接描述成一条链:

lcel.ts
1
const chain = prompt.pipe(model).pipe(parser)
2
3
const text = await chain.invoke({
4
input: '什么是 Runnable?',
5
})

LCELLangChain Expression Language 的缩写。它提供了一套组合可执行步骤的表达方式。在 JavaScript 中,最常用的组合方法是 .pipe()

要理解 .pipe() 为什么能够连接 Prompt、模型和 Parser,我们需要先把 Runnable 接口讲清楚。

正在加载图示...
正在验证登录状态
请稍候,验证完成后将继续显示文章内容