上一篇讲了 Runnable 协议:所有组件统一成「输入→输出」的形状。形状一致了,组合就成了顺理成章的事。LCEL(LangChain Expression Language)就是用来组合的语法。
这一篇讲 LCEL。但先说清楚一件事:LCEL 不是新概念,它就是** Runnable 之间的管道符 |**。理解了上一篇,这一篇几乎没有新东西,更多是「怎么用」。
LCEL 的核心:管道符
LCEL 的全部语法精华,就是一个管道符 |:
chain = prompt | model | parser
这一行代码做的事:把 prompt 的输出喂给 model,把 model 的输出喂给 parser。就像 Unix 管道 cat | grep | sort 一样自然。
为什么这个语法能成立?因为上一篇讲的——所有组件都是 Runnable,形状一致。prompt 的输出能直接喂给 model,model 的输出能直接喂给 parser,不需要任何胶水。管道符只是把这种「天然可对接」显式表达出来。
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"}) # 流式
注意三个细节:
- 每个组件都是 Runnable(prompt 是、model 是、parser 是),所以能被
|串联 - 串完的
chain本身也是 Runnable——所以 chain 还能继续被串进更长的链 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:
- LCEL 就是 Runnable 之间的管道符
|,把组件串成链 - 链自动继承流式、批处理、异步、重试、追踪,不用单独实现
- 链本身也是 Runnable,可以继续拼进更大的链
- 它适合直线型流程,循环分支要上 LangGraph
到目前为止,我们把底层 core 的「积木」和「组合语法」讲完了。但还有一类最基础的积木没细讲——Prompt 模板和输出解析器。下一篇先讲 Prompt:怎么把固定文案和变量拼成给模型的输入。
关于十三Tech
我是十三,All in AI Agent 方向的架构师,专注 AI 工程实践。我相信 AI 是程序员的最佳搭档。
如果你想跟完这套「图解 LangChain」,欢迎关注公众号 「十三Tech」。全系列 42 篇,会按认识基础、LangGraph 状态机、Agent 与 middleware、RAG 检索、Tools/MCP/记忆、生产化收束这条线更新。

