1. LCEL链式调用
2. 链式调用
2.1 什么是链式调用
Written: 2026.06 顾名思义,LangChain其核心概念就是Chain。 Chain翻译成中文就是“链”。用于将多个组件(提示模板、model模型、记忆、工具等)连接起来,形成可复用的工作流,完成复杂的任务。比如我们刚刚实现的问答流程: 用户输入一个问题 —> 发送给大模型 —> 大模型进行推理 —> 将推理结果返回给用户。这个流程就是一个链
Chain 的核心思想是通过组合不同的模块化单元,实现比单一组件更强大的功能。比如:
- 将model 与Prompt Template (提示模板)结合
- 将model 与输出解析器结合
- 将model 与外部数据结合,例如用于问答
- 将model 与长期记忆结合,例如用于聊天历史记录
- 通过将第一个model 的输出作为第二个model 的输入,…,将多个model按顺序结合在一起
2.2 基本结构
在LangChain中,一个基本的Chain结构主要由三部分构成,分别是提示词模板、大模型和结果解析器(结构化解析器),其数据流向正如下图所示:

- Prompt:Prompt 是一个 BasePromptTemplate,这意味着它接受一个模板变量的字典并生成一个PromptValue 。PromptValue 可以传递给 model(它以字符串作为输入)或 ChatModel(它以消息序列作为输入)。
- Model:将 PromptValue 传递给 model。如果我们的 model 是一个 ChatModel,这意味着它将输出一个 BaseMessage 。
- OutputParser:将 model 的输出传递给 output_parser,它是一个 BaseOutpCutParser,意味着它可以接受字符串或 BaseMessage 作为输入。
- Chain:我们可以使用 | 运算符轻松创建这个Chain。 | 运算符在 LangChain 中用于将两个元素组合在一起。
3. LCEL介绍
3.1 什么是 LCEL
在现代大语言模型(model)应用的构建中,LangChain 提供了一种全新的表达范式,被称为LCEL(LangChain Expression Language)。它不仅简化了模型交互的编排过程,还增强了组合的灵活性和可维护性。 LCEL,全称为 LangChain Expression Language,是一种专为 LangChain 框架设计的表达语言。它通过一种链式组合的方式,允许开发者使用清晰、声明式的语法来构建语言模型驱动的应用流程。 简单来说,LCEL 是一种“函数式管道风格”的组件组合机制,用于连接各种可执行单元(Runnable)。这些单元包括提示模板、语言模型、输出解析器、工具函数等。3.2 设计目的
LCEL 的设计初衷在于:- 模块化构建:将模型调用流程拆解为独立、可重用的组件。
-
逻辑可视化:通过语法符号(如管道符
|)呈现出明确的数据流路径。 -
统一运行接口:所有 LCEL 组件都实现了
.invoke()、.stream()、.batch()等标准方法,便于在同步、异步或批处理环境下调用。 -
脱离框架限制:相比传统的
Chain类和Agent架构,LCEL 更轻量、更具表达力,减少依赖的“黑盒”逻辑。
3.3 典型优势
| 特性 | 描述 |
|---|---|
| 简洁语法 | 使用 |
| 灵活组合 | 可任意组合 Prompt、模型、工具、函数等组件 |
| 明确边界 | 每个步骤职责分明,方便调试与重用 |
| 可嵌套扩展 | 支持函数包装、自定义中间组件和流式拓展 |
| 与 Gradio/FastAPI 集成良好 | 可用于构建 API、UI 聊天等多种场景 |
4. LCEL核心分析
4.1 Runnable 接口
Runnable 是 LangChain 中所有链的通用接口,用于描述“可以执行的数据流节点”。用于构建所有链(Chain)组件。它代表“一个可以调用(运行)的流程单元”,无论是:
- 单个组件(如 prompt、model)
- 一个序列流程(如 prompt → model → parser)
- 并行、多路、多输入多输出的复合结构
Runnable 接口,它就可以像函数一样 .invoke(),或用管道符 | 组合。
在Runnable接口中定义了以下核心方法:
invoke(input):同步执行,处理单个输入,最常用的方法
batch(inputs):批量执行,处理多个输入,提升处理效率
stream(input):流式执行,逐步返回结果,经典的使用场景是大模型是一点点输出的,不是一下返回整个结果,可以通过 stream() 方法,进行流式输出
ainvoke(input):异步执行,用于高并发场景。
4.2 管道运算符
这是 LCEL 最具特色的语法符号。多个Runnable 对象可以通过 | 串联起来,形成清晰的数据处理链。例如:
管道运算符
4.3 PromptTemplate 与 OutputParser
LCEL 强调组件之间的职责明确,Prompt 只负责模板化输入,Parser 只负责格式化输出,Model 只负责推理。4.4 Runnable 类继承关系
分析LangChain源码可知,在 LangChain 的类结构中,顶层基类是Runnable,用于定义所有可执行对象的统一接口,实现了把“执行一个逻辑单元”抽象为一个统一的运行单元。包括:
-
invoke(input):同步执行 -
ainvoke(input):异步执行 -
batch(inputs):批量执行 -
stream(input):流式输出
RunnableSerializable 在 Runnable 基础上增加 序列化/反序列化 能力,作为 LangChain 内部链路的父类基类。
我们常用的Prompt、Parser、LLM 都继承自这个类,因而它们都可以被组合进 Chain / Graph 中。

5. 链式调用基础用法
5.1 顺序链
LangChain 的一个典型链条由Prompt、Model、OutputParser (可没有)组成,然后可以通过 链(Chain) 把它们顺序组合起来,让一个任务的输出成为下一个任务的输入。顺序链
执行处理链并记录最终结果及数据类型:
5.2 分支链
在LangChain中提供了类RunnableBranch来完成LCEL中的条件分支判断,它可以根据输入的不同采用不同的处理逻辑,具体示例如下,在下方示例中程序会根据用户输入中是否包含英语、韩语等关键词,来选择对应的提示词进行处理。根据判断结果,再执行不同的逻辑分支

实现分支链
测试查询,执行结果如下
5.3 串行链

实现串行链
执行结果如下
5.4 并行链
在 Langchain 中,创建并行链(Parallel Chains),是指同时运行多个子链(Chain),并在它们都完成后汇总结果。这在以下场景中非常有用:- 同时问多个问题并聚合结果
- 多个 model 同时工作取最优答案
- 多路径推理、多模态处理(如图片+文字)

并行链
执行结果如下
6. 链式调用进阶用法
6.1 函数转可执行链
RunnableLambda 是 LangChain 的一个包装器,它可以把一个普通的 Python 函数(lambda 或 def) 转换为一个 可执行的链(Runnable)。然后我们就可以像对待模型、Prompt、Parser 一样,把它与其他组件用 | 运算符连接。
使用场景:由于每次 AI 生成结果的不确定性,在开发过程中可能需要添加一些自定义节点实现功能,比如 格式化、过滤、映射等操作。例如执行打印函数查看第一阶段生成结果,代码如下:
实现函数转可执行链
执行结果如下
6.2 参数传递
RunnableParallel 是 LangChain 构建“多路并发数据流”的核心模块,它能让检索、预处理、翻译等操作并行执行,并将结果无缝衔接到后续的 LLM 推理中
下面示例展示了模拟在和大语言模型交互之前,先检索文档的操作,通过RunnableParallel将执行结果作为提示词模板的输入参数,将输出结果继续向下传递
相当于传递给提示词模板的参数从最开始的一个question,又增加了一个检索文档结果的参数retrieval_info,并且,这里使用了简写方式,在LCEL表达式中,使用字典结构包裹并在管道符两侧的,都会自动包装成RunnableParallel
实现参数传递
执行结果如下
6.3 数据透传
RunnablePassthrough是一个相对特殊的组件,它的作用是将输入数据原样传递到下一个可执行组件,同时还能对传递的数据进行数据重组。虽然功能简单,但在复杂的 Chain 构建中非常常用,尤其用于 保持输入数据流不中断 或 与并行分支结合。
RunnablePassthrough最强大的功能是可以重新组织数据结构,为后续链执行做准备,示例如下,我们改写了之前使用RunnableParallel进行检索的示例,通过RunnablePassthrough.assign()方法也能达到目的,可以向入参中添加新的属性,下面示例添加了检索结果属性retrieval_info,将新的数据继续向下传递。
实现数据透传
执行结果如下
6.4 图形化打印链图
Langchain 支持在终端图形化地打印链结构图,尤其是在使用 Langchain Expression Language (LCEL) 创建链(比如RunnableSequence, RunnableParallel 等)后,可以通过内置的 .get_graph().print_ascii() 来生成类似“流程图”的输出,非常适合调试和理解链的结构。
实现图形化打印链图
执行结果如下

