LCEL 链式编程:用管道符把 Prompt、模型和解析器串成一条链

文章来源声明: 原文作者:flash俊杰; 来源站点:掘金; 原文链接:https://juejin.cn/post/7688926238557257743; 本文基于上述来源整理/加工,觅优补充点评,仅供技术学习交流。版权归原作者所有。
觅优短评

适合已上手 LangChain、需要理清 LCEL 定位与版本迁移路径的开发者。价值在于既讲透声明式组合的四个免费能力,又点明 1.0 时代链与 Agent 的分工边界,避免守着旧教程走弯路。

LCEL 链式编程:用管道符把 Prompt、模型和解析器串成一条链 ----------------------------------

脱敏说明:本文为 LangChain 基础教学项目的总结,示例全部采用通用模型与 OpenAI 兼容协议,不出现任何特定厂商名称。

一、什么是 LCEL

LCEL(LangChain Expression Language)是 LangChain 提供的声明式组合语法。最直观的形式就是管道符:

chain = prompt | llm | parser

数据从左向右流动:用户输入填进模板 → 模板生成消息 → 模型推理 → 解析器提取结果。它解决的是"胶水代码"问题——不用再手写"取变量、拼消息、调模型、解析字符串"这一整套重复流程。

最小示例:

<span>from</span> langchain_core.prompts <span>import</span> ChatPromptTemplate
<span>from</span> langchain_core.output_parsers <span>import</span> StrOutputParser

prompt = ChatPromptTemplate.from_template(<span>"用一句话解释 {topic},面向零基础读者"</span>)
chain = prompt | llm | StrOutputParser()

<span>print</span>(chain.invoke({<span>"topic"</span>: <span>"向量数据库"</span>}))

二、声明式带来的四个"免费"能力

同一条链不改代码就可以切换调用方式:

能力用法场景
同步调用`chain.invoke(input)`脚本、普通请求
流式输出`chain.stream(input)`打字机效果,降低首字等待
批量处理`chain.batch([...])`批量分类、提取,内部带并发优化
异步调用`await chain.ainvoke(input)`异步 Web 服务

此外,LCEL 链自带回调挂载点(可观测性、计费、日志统一接入)和并行执行支持:

<span>from</span> langchain_core.runnables <span>import</span> RunnableParallel

parallel = RunnableParallel(
    summary=summary_chain,
    keywords=keyword_chain,
    sentiment=sentiment_chain,
)
<span># 三个子链并行执行,总耗时约等于最慢的一支</span>

三、消息历史:给链装上"记忆"

多轮对话不能每次把历史拼在字符串里。框架提供带历史的 Runnable 封装:

<span>from</span> langchain_core.runnables.history <span>import</span> RunnableWithMessageHistory

chain_with_history = RunnableWithMessageHistory(
    chain,
    get_session_history,          <span># 根据会话 ID 返回历史消息</span>
    input_messages_key=<span>"input"</span>,
    history_messages_key=<span>"history"</span>,
)

chain_with_history.invoke(
    {<span>"input"</span>: <span>"接着上一个问题再展开讲讲"</span>},
    config={<span>"configurable"</span>: {<span>"session_id"</span>: <span>"user-001"</span>}},
)

会话隔离靠 session_id:不同用户、不同会话拿到不同的历史存储。教学项目特别强调这一点——并发场景下记忆串号是严重事故。

四、教学脚本的进阶路线

基础教学项目用 20 个脚本组织了一条平滑的学习曲线,核心节点如下:

  1. LCEL 基础链与流式
  2. Pydantic 结构化输出(从聊天文本提取销售线索)
  3. 消息历史与会话隔离
  4. Agent + 工具调用(仓库助理场景)
  5. RAG:文档加载 → 切分 → 轻量向量库 → 检索 → 链生成
  6. 简单 Web 应用

这条路线的编排思想值得借鉴:每一步只引入一个新概念,并立刻可运行。

五、LCEL 的适用边界

LCEL 擅长表达"可管道化的数据流",但不适合:

  • 路径需要动态分支、回环(用图编排,而不是硬把分支塞进链)
  • 强人工干预、长期挂起的流程(HITL 是图框架的地盘)
  • 高度定制的 Agent 循环(直接用标准 Agent 工厂)

一个经验判断:流程能画成"一条直线(可有并行支流)"用链,需要"带条件的环"用图。

六、技术演进与最新差异(2025—2026)

这是本文最重要的部分——LCEL 教学内容大多写于 0.1/0.2 时代,而 2025 年 10 月后生态发生了代际变化:

  1. LangChain 1.0 正式 GA(2025-10-23)。 框架重心从"链"转向"Agent":create_agent 成为最高层标准入口,底层运行在 LangGraph 之上。LCEL 并没有消失(Runnable、管道组合仍是底层组装原语),但"用 LCEL 手工拼 RAG 链"不再是官方推荐的首要路径——很多场景被 Agent + 中间件 + 内置 RAG 工具取代。
  2. 旧功能迁移到 langchain-classic。 1.0 精简了命名空间,大量遗留链和旧集成移到独立的 classic 包。老教程里的部分导入路径需要调整;官方提供完整迁移指南。
  3. 版本支持窗口明确。 LangChain 0.3 处于维护模式,支持到 2026 年 12 月(安全补丁 + 关键修复);1.x 是 LTS,2.0 发布前无破坏性变更。如果还在 0.3 上,应在窗口期内规划升级。
  4. 标准内容块(content blocks)。 1.0 新增跨厂商统一的 content blocks 抽象,推理痕迹、引用、服务端工具调用等现代模型能力可以用一致方式访问——过去靠厂商私有字段(如某些模型的 reasoning_content)处理的逻辑,有了标准接口。
  5. 结构化输出集成进 Agent 主循环,不再需要"链式 + 输出解析器"的传统拼装(后续文章专讲)。

七、小结

LCEL 值得学的是它的声明式组合思想:管道符让数据流一目了然,invoke/stream/batch/async 四态免费切换,RunnableParallel 表达并行,消息历史靠 session ID 隔离。但在 2026 年使用时要带着版本意识:它已从"主角"变为 Agent 体系的底层组装原语,新项目优先评估 LangChain 1.0 的 create_agent,把 LCEL 作为理解框架和定制局部逻辑的基础。