LangChain LCEL:用管道符串联你的 AI 工作流
💡摘要:LCEL 是 LangChain 的表达式语言,通过管道符
|将多个 AI 组件串联成数据流水线,让复杂的工作流定义变得像搭积木一样简单。
引言
在使用 LangChain 时,你可能会看到这样的代码:
chain=prompt|llm|output_parser result=chain.invoke({"topic":"AI"})第一次看到可能会困惑:Python 里的|不是"按位或"运算符吗?怎么还能串联 AI 组件了?
这正是 LCEL(LangChain Expression Language)的魔法所在。2 行代码就能构建一个完整的 AI 流水线,今天就带你读懂它。
核心概念
什么是 LCEL?
LCEL 可以理解为 LangChain 的"乐高语言"——用一种极简的方式把 AI 组件拼在一起。
核心思想:一切皆Runnable
类比理解:把 AI 工作流想象成工厂流水线
| 类比 | LCEL 组件 |
|---|---|
| 原料 | 用户的输入参数 |
| 加工站 1 | Prompt(格式化提示词) |
| 加工站 2 | Model(调用大模型) |
| 加工站 3 | Parser(提取结果) |
| 传送带 | 管道符 |
| 启动按钮 | .invoke() |
|管道的原理
虽然你不需要完全理解底层,但知道原理能帮你更好地使用:
Python 的"操作符重载":LangChain 重写了__or__方法,当两个 Runnable 用|连接时,内部会创建一个RunnableSequence对象,把两个组件串联起来。
延迟执行:管道搭好后,组件并不会立即运行。只有调用.invoke()时,数据才会在流水线中流动。
构建阶段:prompt | llm | parser → 只搭好了流水线,没执行 执行阶段:chain.invoke(...) → 数据开始流动,逐步执行数据如何流动?
当调用chain.invoke({"topic": "太空探索"})时:
- Prompt接收到
{"topic": "太空探索"},格式化为消息列表 - Model接收消息列表,调用大模型生成回答
- Parser提取回答中的文本内容,返回最终字符串
整个过程像一个接力赛——前一个的输出自动成为下一个的输入。
代码示例
基础示例:3 行构建链条
fromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParserfromlangchain_openaiimportChatOpenAI# 定义组件prompt=ChatPromptTemplate.from_template("写一个关于{topic}的短篇故事")llm=ChatOpenAI(temperature=0.7)parser=StrOutputParser()# 串联组件chain=prompt|llm|parser# 执行result=chain.invoke({"topic":"AI 觉醒"})print(result)|vs.pipe():两种写法
# 管道符写法(推荐)chain=prompt|llm|parser# .pipe() 写法(等价)chain=prompt.pipe(llm).pipe(parser)何时用.pipe():当需要在循环中动态构建链条时,.pipe()更方便:
chain=promptforprocessorin[step1,step2,step3]:chain=chain.pipe(processor)stream():实现打字机效果
# invoke():等全部生成完,一次性返回result=chain.invoke({"topic":"AI"})# stream():逐字逐句输出,像 ChatGPT 打字一样forchunkinchain.stream({"topic":"AI"}):print(chunk,end="",flush=True)选 invoke() 还是 stream()?
| 场景 | 推荐 |
|---|---|
| 短回答(分类、标签) | invoke() |
| 长文本(故事、报告) | stream() |
| 聊天机器人 | stream() |
| 批处理 | invoke()+batch() |
最佳实践
- 优先用
|:简洁直观,官方推荐 - 动态构建用
.pipe():循环或条件分支时更灵活 - 短任务用
invoke():简单直接 - 长输出用
stream():提升用户体验
总结
核心要点回顾:
- LCEL= 管道符
|+ Runnable 组件 = 声明式工作流 - 核心机制:一切皆 Runnable,前一个输出是后一个输入
- 延迟执行:构建时不运行,调用
.invoke()才触发 invoke()适合短任务,stream()适合长文本和实时交互
LCEL 让你告别繁琐的函数嵌套,用最简洁的语法构建强大的 AI 工作流。