LCEL 链式编程:用管道符把 Prompt、模型和解析器串成一条链
脱敏说明:本文为 LangChain 基础教学项目的总结,示例全部采用通用模型与 OpenAI 兼容协议,不出现任何特定厂商名称。
一、什么是 LCEL
LCEL(LangChain Expression Language)是 LangChain 提供的声明式组合语法。最直观的形式就是管道符:
python
chain = prompt | llm | parser
数据从左向右流动:用户输入填进模板 → 模板生成消息 → 模型推理 → 解析器提取结果。它解决的是"胶水代码"问题------不用再手写"取变量、拼消息、调模型、解析字符串"这一整套重复流程。
最小示例:
python
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
prompt = ChatPromptTemplate.from_template("用一句话解释 {topic},面向零基础读者")
chain = prompt | llm | StrOutputParser()
print(chain.invoke({"topic": "向量数据库"}))
二、声明式带来的四个"免费"能力
同一条链不改代码就可以切换调用方式:
| 能力 | 用法 | 场景 |
|---|---|---|
| 同步调用 | chain.invoke(input) |
脚本、普通请求 |
| 流式输出 | chain.stream(input) |
打字机效果,降低首字等待 |
| 批量处理 | chain.batch([...]) |
批量分类、提取,内部带并发优化 |
| 异步调用 | await chain.ainvoke(input) |
异步 Web 服务 |
此外,LCEL 链自带回调挂载点(可观测性、计费、日志统一接入)和并行执行支持:
python
from langchain_core.runnables import RunnableParallel
parallel = RunnableParallel(
summary=summary_chain,
keywords=keyword_chain,
sentiment=sentiment_chain,
)
# 三个子链并行执行,总耗时约等于最慢的一支
三、消息历史:给链装上"记忆"
多轮对话不能每次把历史拼在字符串里。框架提供带历史的 Runnable 封装:
python
from langchain_core.runnables.history import RunnableWithMessageHistory
chain_with_history = RunnableWithMessageHistory(
chain,
get_session_history, # 根据会话 ID 返回历史消息
input_messages_key="input",
history_messages_key="history",
)
chain_with_history.invoke(
{"input": "接着上一个问题再展开讲讲"},
config={"configurable": {"session_id": "user-001"}},
)
会话隔离靠 session_id:不同用户、不同会话拿到不同的历史存储。教学项目特别强调这一点------并发场景下记忆串号是严重事故。
四、教学脚本的进阶路线
基础教学项目用 20 个脚本组织了一条平滑的学习曲线,核心节点如下:
- LCEL 基础链与流式
- Pydantic 结构化输出(从聊天文本提取销售线索)
- 消息历史与会话隔离
- Agent + 工具调用(仓库助理场景)
- RAG:文档加载 → 切分 → 轻量向量库 → 检索 → 链生成
- 简单 Web 应用
这条路线的编排思想值得借鉴:每一步只引入一个新概念,并立刻可运行。
五、LCEL 的适用边界
LCEL 擅长表达"可管道化的数据流",但不适合:
- 路径需要动态分支、回环(用图编排,而不是硬把分支塞进链)
- 强人工干预、长期挂起的流程(HITL 是图框架的地盘)
- 高度定制的 Agent 循环(直接用标准 Agent 工厂)
一个经验判断:流程能画成"一条直线(可有并行支流)"用链,需要"带条件的环"用图。
六、技术演进与最新差异(2025---2026)
这是本文最重要的部分------LCEL 教学内容大多写于 0.1/0.2 时代,而 2025 年 10 月后生态发生了代际变化:
- LangChain 1.0 正式 GA(2025-10-23)。 框架重心从"链"转向"Agent":
create_agent成为最高层标准入口,底层运行在 LangGraph 之上。LCEL 并没有消失(Runnable、管道组合仍是底层组装原语),但"用 LCEL 手工拼 RAG 链"不再是官方推荐的首要路径------很多场景被 Agent + 中间件 + 内置 RAG 工具取代。 - 旧功能迁移到 langchain-classic。 1.0 精简了命名空间,大量遗留链和旧集成移到独立的 classic 包。老教程里的部分导入路径需要调整;官方提供完整迁移指南。
- 版本支持窗口明确。 LangChain 0.3 处于维护模式,支持到 2026 年 12 月(安全补丁 + 关键修复);1.x 是 LTS,2.0 发布前无破坏性变更。如果还在 0.3 上,应在窗口期内规划升级。
- 标准内容块(content blocks)。 1.0 新增跨厂商统一的 content blocks 抽象,推理痕迹、引用、服务端工具调用等现代模型能力可以用一致方式访问------过去靠厂商私有字段(如某些模型的 reasoning_content)处理的逻辑,有了标准接口。
- 结构化输出集成进 Agent 主循环,不再需要"链式 + 输出解析器"的传统拼装(后续文章专讲)。
七、小结
LCEL 值得学的是它的声明式组合思想 :管道符让数据流一目了然,invoke/stream/batch/async 四态免费切换,RunnableParallel 表达并行,消息历史靠 session ID 隔离。但在 2026 年使用时要带着版本意识:它已从"主角"变为 Agent 体系的底层组装原语,新项目优先评估 LangChain 1.0 的 create_agent,把 LCEL 作为理解框架和定制局部逻辑的基础。