Skip to content

LCEL(LangChain Expression Language):不是新语言,而是函数式组合 DSL

LCEL(LangChain Expression Language)是 LangChain V3 中引入的一个重要概念。虽然名字中包含"语言",但它并不是一种全新的编程语言,而是一种专门用于组合 Runnable 组件的函数式领域特定语言(DSL)。LCEL 的核心是使用管道操作符(|)来连接不同的 Runnable 组件,从而声明式地定义执行流程。

LCEL 的核心理念

LCEL 的设计基于以下几个核心理念:

  1. 声明式编程 - 开发者描述想要什么,而不是如何实现
  2. 函数式组合 - 通过函数组合的方式来构建复杂的行为
  3. 类型安全 - 在编译时就能检查组件之间的兼容性
  4. 可读性强 - 代码读起来就像自然语言一样直观

管道操作符(|)的使用

LCEL 最显著的特点是使用管道操作符(|)来连接组件。这种设计灵感来源于 Unix 管道和函数式编程语言。通过 | 操作符,我们可以将多个 Runnable 组件串联起来,形成一个处理链:

typescript
const chain = promptTemplate | llm | outputParser;

在这个例子中,数据流从左到右:首先通过提示模板格式化输入,然后传递给语言模型生成响应,最后通过输出解析器处理结果。

与传统方法的对比

在传统的编程方法中,我们需要手动协调不同组件之间的数据传递:

typescript
// 传统方法
const formattedPrompt = await promptTemplate.invoke(input);
const llmOutput = await llm.invoke(formattedPrompt);
const finalOutput = await outputParser.invoke(llmOutput);

而使用 LCEL,同样的逻辑变得更加简洁和直观:

typescript
// LCEL 方法
const chain = promptTemplate | llm | outputParser;
const finalOutput = await chain.invoke(input);

LCEL 的优势

使用 LCEL 有以下几个重要优势:

  1. 代码简洁性 - 减少了大量的样板代码
  2. 易于理解 - 数据流向清晰可见
  3. 类型安全 - TypeScript 可以在编译时检查组件兼容性
  4. 自动优化 - 框架可以在后台进行性能优化
  5. 内置流支持 - 天然支持流式处理

实际应用场景

LCEL 在许多实际场景中都非常有用:

  1. RAG 系统 - 将检索器、文档处理、提示模板和语言模型组合在一起
  2. 数据处理管道 - 对原始数据进行一系列转换和处理
  3. 复杂决策流程 - 构建包含多个判断和分支的处理逻辑

通过 LCEL,开发者可以用很少的代码表达复杂的处理逻辑,同时还能享受到类型安全和性能优化带来的好处。

总结

LCEL 是 LangChain V3 中的一个革命性特性,它通过函数式组合的方式简化了复杂处理链的构建。虽然名为"语言",但它实际上是一种专门用于组合 Runnable 组件的 DSL。通过管道操作符(|),开发者可以声明式地定义执行流程,大大提高了代码的可读性和可维护性。在下一节中,我们将探讨为什么 LangChain 移除了旧的 call()run() 方法,以及这种变化带来的工程意义。