学习 LCEL 表达式:降低 LLM 应用开发难度

目录

一、前言

[二、什么是 LCEL](#二、什么是 LCEL)

[三、为什么需要 LCEL](#三、为什么需要 LCEL)

[四、LCEL 的核心语法](#四、LCEL 的核心语法)

[五、第一个 LCEL 示例](#五、第一个 LCEL 示例)

六、加入输出解析器

[七、LCEL 的本质](#七、LCEL 的本质)

[八、Runnable:LCEL 的核心接口](#八、Runnable:LCEL 的核心接口)

九、RunnableLambda

[十、并行执行 RunnableParallel](#十、并行执行 RunnableParallel)

十一、RunnablePassthrough

[十二、LCEL 在 RAG 中的应用](#十二、LCEL 在 RAG 中的应用)

十三、构建聊天机器人

[十四、LCEL 与传统 LangChain 对比](#十四、LCEL 与传统 LangChain 对比)

传统写法

[LCEL 写法](#LCEL 写法)

[十五、LCEL 与 LangGraph 的关系](#十五、LCEL 与 LangGraph 的关系)

[十六、LCEL 的优势](#十六、LCEL 的优势)

可读性高

扩展简单

易于组合

[与 LangChain 深度融合](#与 LangChain 深度融合)

十七、面试高频问题

[什么是 LCEL?](#什么是 LCEL?)

[LCEL 核心操作符是什么?](#LCEL 核心操作符是什么?)

[LCEL 底层依赖什么?](#LCEL 底层依赖什么?)

[LCEL 和 LangGraph 有什么区别?](#LCEL 和 LangGraph 有什么区别?)

十八、总结


一、前言

随着大语言模型(LLM)的快速发展,越来越多开发者开始构建自己的 AI 应用。

例如:

复制代码
智能客服

RAG知识库

AI助手

代码生成工具

数据分析助手

在早期的 LangChain 开发中,我们经常会写出这样的代码:

python 复制代码
prompt = PromptTemplate(...)

llm = ChatOpenAI(...)

parser = StrOutputParser()

result = parser.invoke(
    llm.invoke(
        prompt.invoke(
            {"topic":"人工智能"}
        )
    )
)

虽然功能可以实现,但存在明显问题:

复制代码
代码嵌套严重

可读性差

维护困难

扩展复杂

于是 LangChain 团队推出了:

复制代码
LCEL

全称:

复制代码
LangChain Expression Language

即:

复制代码
LangChain 表达式语言

它的目标只有一个:

用更简洁、更优雅的方式构建 LLM 应用。


二、什么是 LCEL

LCEL 是 LangChain 官方推出的一套声明式编排语言。

核心思想:

复制代码
把多个组件像管道一样连接起来

例如:

复制代码
Prompt

↓

LLM

↓

OutputParser

传统代码:

python 复制代码
result = parser.invoke(
    llm.invoke(
        prompt.invoke(
            {"topic":"AI"}
        )
    )
)

LCEL:

复制代码
chain = prompt | llm | parser

直接变成:

复制代码
流水线

形式。


三、为什么需要 LCEL

在 AI 应用开发中,一个请求往往需要经过多个步骤。

例如:

复制代码
用户问题

↓

Prompt模板

↓

大模型

↓

结果解析

↓

输出

架构:

如果使用传统方式:

复制代码
每增加一步

就会多一层嵌套

代码会越来越难维护。

LCEL 则通过:

复制代码
管道表达式

解决这一问题。


四、LCEL 的核心语法

LCEL 最重要的操作符:

复制代码
|

即:

复制代码
Pipe(管道)

类似 Linux:

复制代码
cat log.txt | grep ERROR

含义:

复制代码
前一个组件的输出

作为下一个组件的输入

五、第一个 LCEL 示例

安装依赖:

bash 复制代码
pip install langchain
pip install langchain-openai

示例:

python 复制代码
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate

llm = ChatOpenAI()

prompt = ChatPromptTemplate.from_template(
    "请介绍一下{topic}"
)

chain = prompt | llm

result = chain.invoke(
    {"topic":"机器学习"}
)

print(result.content)

执行流程:


六、加入输出解析器

默认返回:

复制代码
AIMessage(...)

很多时候我们只需要:

复制代码
字符串

此时可以加入:

复制代码
StrOutputParser

代码:

python 复制代码
from langchain_core.output_parsers import (
    StrOutputParser
)

chain = (
    prompt
    | llm
    | StrOutputParser()
)

执行:

python 复制代码
result = chain.invoke(
    {"topic":"深度学习"}
)

print(result)

架构:


七、LCEL 的本质

实际上:

复制代码
prompt | llm | parser

背后等价于:

python 复制代码
parser.invoke(
    llm.invoke(
        prompt.invoke(input)
    )
)

只是:

复制代码
隐藏了复杂调用

提高了可读性。


八、Runnable:LCEL 的核心接口

LCEL 底层依赖:

复制代码
Runnable

几乎所有组件都实现了:

复制代码
Runnable

包括:

复制代码
PromptTemplate

ChatOpenAI

OutputParser

Retriever

因此它们都可以:

复制代码
|

连接。


九、RunnableLambda

开发中经常需要:

复制代码
自定义逻辑

例如:

python 复制代码
def upper(text):
    return text.upper()

包装:

python 复制代码
from langchain_core.runnables import (
    RunnableLambda
)

chain = (
    prompt
    | llm
    | StrOutputParser()
    | RunnableLambda(upper)
)

执行后:

复制代码
全部转大写

十、并行执行 RunnableParallel

很多场景需要:

复制代码
同时执行多个任务

例如:

复制代码
总结文章

翻译文章

提取关键词

架构:

代码:

python 复制代码
from langchain_core.runnables import (
    RunnableParallel
)

parallel = RunnableParallel({

    "summary": summary_chain,

    "translate": translate_chain,

    "keywords": keyword_chain
})

执行:

python 复制代码
result = parallel.invoke(text)

返回:

复制代码
{
    "summary":"...",
    "translate":"...",
    "keywords":"..."
}

十一、RunnablePassthrough

某些场景:

复制代码
需要保留原始输入

例如:

python 复制代码
from langchain_core.runnables import (
    RunnablePassthrough
)

chain = {
    "question":
        RunnablePassthrough(),
    "answer":
        prompt | llm
}

输出:

复制代码
{
    "question":"什么是AI",
    "answer":"..."
}

十二、LCEL 在 RAG 中的应用

经典 RAG:

LCEL:

python 复制代码
chain = (

    retriever

    | prompt

    | llm

    | StrOutputParser()

)

非常简洁。


十三、构建聊天机器人

示例:

python 复制代码
chain = (

    ChatPromptTemplate.from_template(
        """
        你是一名Java专家

        用户问题:

        {question}
        """
    )

    | llm

    | StrOutputParser()
)

调用:

python 复制代码
result = chain.invoke({
    "question":"什么是Spring IOC"
})

即可得到回答。


十四、LCEL 与传统 LangChain 对比

传统写法

python 复制代码
prompt_result =
    prompt.invoke(data)

llm_result =
    llm.invoke(prompt_result)

result =
    parser.invoke(llm_result)

LCEL 写法

复制代码
chain = prompt | llm | parser

代码量减少:

复制代码
50%以上

十五、LCEL 与 LangGraph 的关系

很多人容易混淆:

复制代码
LCEL

LangGraph

实际上:

复制代码
LCEL

负责:

复制代码
单条执行链

而:

复制代码
LangGraph

负责:

复制代码
复杂状态流转

关系:

可以理解为:

复制代码
LCEL是积木

LangGraph是建筑图纸

十六、LCEL 的优势

可读性高

复制代码
prompt | llm | parser

一眼就能看懂流程。


扩展简单

增加一步:

复制代码
prompt

| llm

| parser

| custom_step

即可。


易于组合

支持:

复制代码
串行

并行

分支

动态路由

等模式。


与 LangChain 深度融合

几乎所有官方组件都支持:

复制代码
Runnable

协议。


十七、面试高频问题

什么是 LCEL?

复制代码
LangChain Expression Language

用于声明式构建 LLM 工作流

LCEL 核心操作符是什么?

复制代码
|

管道操作符。


LCEL 底层依赖什么?

复制代码
Runnable

接口体系。


LCEL 和 LangGraph 有什么区别?

复制代码
LCEL:

链式编排

LangGraph:

图编排

十八、总结

LCEL 的出现,让 LangChain 开发从:

复制代码
invoke(
    invoke(
        invoke()
    )
)

变成:

复制代码
prompt | llm | parser

极大降低了开发复杂度。

可以这样理解:

复制代码
Prompt
是流水线起点

LLM
是核心加工厂

Parser
是结果处理器

LCEL
则是连接这一切的传送带

对于现代 AI 应用开发来说:

复制代码
LangChain 负责组件

LCEL 负责连接组件

LangGraph 负责管理复杂流程

掌握 LCEL 后,你将能够更加高效地构建:

复制代码
RAG系统

Agent系统

知识库问答

企业级AI应用

真正进入现代 LLM 应用开发的大门。

相关推荐
147API1 小时前
Project Glasswing 扩展后,AI 安全扫描不能只看发现漏洞
人工智能·安全·api·claude
香蕉鼠片1 小时前
数字化图像的过程
人工智能·深度学习·计算机视觉
百胜软件@百胜软件1 小时前
巡讲实录丨AI让业务自己跑:胜券AI多智能体协同,加速业务运营新效能
人工智能·零售数字化·数智中台·珠宝行业
lhxcc_fly1 小时前
6.3.1RAG--存储(嵌入向量)
langchain·llm·embedding
继续商行1 小时前
Go 切片与数组内存分配底层差异:大数据量场景下的性能对比
人工智能
李燚1 小时前
Eino 的 ReAct 循环是怎么跑起来的:图、节点、分支
golang·agent·react·ai-agent
论迹2 小时前
【LangChain】-- 定义聊天模型
langchain
向量引擎2 小时前
多模型 API 网关接入实践:统一 Base URL、API Key 管理与故障排查
人工智能·gpt·ai编程·ai写作·key
KKKlucifer2 小时前
AI赋能安全运营,构建闭环数据风险防御体系
人工智能·安全