返回

LangChain 入门 3:LCEL 核心源码速通

人工智能

LangChain,一种简洁易用、强大高效的基于 Kotlin 协程的新一代 DSL 链式编程框架,在语言级别对数据的流动进行建模,以实现异步编程的优雅与可读性。

在 LangChain 的生态系统中,LCEL(LangChain Expression Language)作为 LangChain 的表达式语言,承担着至关重要的角色。LCEL 的管道操作符,作为 LCEL 的核心语法糖,是 LCEL 编程的灵魂所在。

管道操作符,顾名思义,它就像一条管道,将上游产生的数据流经管道,再传输到下游。在 LCEL 中,管道操作符 |> 将上游产生的数据作为下游的输入,实现数据在各个函数式操作间的高效流转,从而构建出优雅且可读性极佳的代码。

为了更深入地理解 LCEL 管道操作符的实现,我们不妨一探 LCEL 的核心源码,揭开其神秘面纱。

LCEL 管道操作符的实现离不开其背后的最核心抽象类 RunnableRunnable 抽象类定义了一个 run 函数,该函数负责执行具体的操作逻辑。Runnable 抽象类的两个最重要的子类分别是 RunnableSequenceRunnableParallel

RunnableSequence 用于表示顺序执行的一系列操作,即上游操作完成之后,下游操作才开始执行。RunnableSequence 通过维护一个 runnables 链表,按顺序执行链表中的每个 Runnable

RunnableParallel 用于表示并行执行的一系列操作,即上游操作与下游操作可以同时执行。RunnableParallel 通过维护一个 runnables 列表,并发执行列表中的每个 Runnable

有了 RunnableRunnableSequenceRunnableParallel 这三个核心类,管道操作符 |> 的实现就水到渠成了。

管道操作符 |> 实际上是对 run 函数的调用,run 函数接收两个参数,第一个参数是上游操作产生的数据,第二个参数是下游操作的 Runnablerun 函数会将上游产生的数据作为下游操作的输入,并顺序或并行执行下游操作。

通过对 RunnableRunnableSequenceRunnableParallel 的巧妙组合,LCEL 管道操作符 |> 得以实现,为 LCEL 编程提供了简洁、高效、可读性极佳的语法糖。

通过对 LCEL 核心源码的深入探索,我们不仅揭开了管道操作符 |> 的实现之谜,更对 LCEL 的设计思想和实现原理有了更深刻的理解。

参考
讲述了 LCEL 的管道操作符是如何实现的,以及背后最核心的 Runnable 抽象类,和它最重要的两个子类 RunnableSequenceRunnableParallel