上一篇讲了 Runnable 协议:所有组件统一成「输入→输出」的形状。形状一致了,组合就成了顺理成章的事。LCEL(LangChain Expression Language)就是用来组合的语法。

这一篇讲 LCEL。但先说清楚一件事:LCEL 不是新概念,它就是** Runnable 之间的管道符 |**。理解了上一篇,这一篇几乎没有新东西,更多是「怎么用」。

LCEL 的核心:管道符

LCEL 的全部语法精华,就是一个管道符 |

chain = prompt | model | parser

这一行代码做的事:把 prompt 的输出喂给 model,把 model 的输出喂给 parser。就像 Unix 管道 cat | grep | sort 一样自然。

LCEL 管道:上一级输出喂给下一级

为什么这个语法能成立?因为上一篇讲的——所有组件都是 Runnable,形状一致。prompt 的输出能直接喂给 model,model 的输出能直接喂给 parser,不需要任何胶水。管道符只是把这种「天然可对接」显式表达出来。

LCEL 链自动继承的能力

管道串起来的链,最值钱的地方不是「写法简洁」,而是自动继承了 Runnable 的全部能力

LCEL 链自动继承 Runnable 能力

  • 流式:整条链 .stream() 能逐字流式输出,不用为链单独实现
  • 批处理.batch([...]) 批量喂输入,自动并发
  • 异步.ainvoke() 异步调用,不阻塞
  • 重试与 fallback.with_retry().with_fallbacks(),某步失败自动处理
  • LangSmith 追踪:整条链每一步自动被记录

这是 LCEL 相对「手写胶水链」的核心优势。手写的话,每加一个组件,你都要重新考虑它要不要支持流式、要不要异步;LCEL 链里,这些是管道符免费带来的。

一个完整例子

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

prompt = ChatPromptTemplate.from_template("用一句话解释{topic}")
chain = prompt | model | StrOutputParser()

# 链自动有这些能力
chain.invoke({"topic": "消息队列"})      # 单次
chain.batch([{"topic": "MQ"}, {"topic": "RAG"}])  # 批量
chain.stream({"topic": "Agent"})         # 流式

注意三个细节:

  1. 每个组件都是 Runnable(prompt 是、model 是、parser 是),所以能被 | 串联
  2. 串完的 chain 本身也是 Runnable——所以 chain 还能继续被串进更长的链
  3. chain 一诞生就有 invoke/batch/stream/重试/追踪,不用配置

第 2 点尤其重要:链是可组合的。小链能拼成大链,大链能拼进 Agent。这种「积木拼积木」的能力,是后面 LangGraph 能编排复杂流程的基础。

流式:LCEL 最常被用的场景

LCEL 在实际项目里最常被用的能力是流式

LLM 生成是逐 token 产出的,如果等整段生成完再返回,用户要干等几秒甚至十几秒。流式能让用户「边生成边看到」,体验提升巨大。而 LCEL 链的 .stream()端到端流式:从 prompt 填充、到模型生成、到解析,整条链都能以流的方式推进。

流式:端到端逐字输出

不用 LCEL,实现端到端流式要自己处理每个组件的缓冲、传递、拼接,相当麻烦。LCEL 把这件事标准化了——.stream() 一调,整条链流起来。

什么时候该用 LCEL,什么时候不该

LCEL 适合直线型流程:prompt → model → parser → 再接点别的。没有循环、没有条件分支、没有「调完工具回到模型再来一轮」的需求。

一旦你的流程变成:

  • 需要循环(思考→调工具→再思考)
  • 需要条件分支(根据结果走不同路)
  • 需要中断恢复(跑到一半暂停等人)

LCEL 就不够用了,这时候要上 LangGraph(Phase 2 的主角)。

LCEL 适合直线,复杂流程要 LangGraph

一个简单的判断标准:能用一条管道符从左写到右讲清楚的流程,用 LCEL;写不清楚、需要画图的,用 LangGraph

收束:组合的语法

这一篇讲清了 LCEL:

  • LCEL 就是 Runnable 之间的管道符 |,把组件串成链
  • 链自动继承流式、批处理、异步、重试、追踪,不用单独实现
  • 链本身也是 Runnable,可以继续拼进更大的链
  • 它适合直线型流程,循环分支要上 LangGraph

到目前为止,我们把底层 core 的「积木」和「组合语法」讲完了。但还有一类最基础的积木没细讲——Prompt 模板输出解析器。下一篇先讲 Prompt:怎么把固定文案和变量拼成给模型的输入。


关于十三Tech

我是十三,All in AI Agent 方向的架构师,专注 AI 工程实践。我相信 AI 是程序员的最佳搭档。

如果你想跟完这套「图解 LangChain」,欢迎关注公众号 「十三Tech」。全系列 42 篇,会按认识基础、LangGraph 状态机、Agent 与 middleware、RAG 检索、Tools/MCP/记忆、生产化收束这条线更新。

十三Tech公众号二维码