大数跨境

LangChain 表达式语言(LCEL)入门与实战:从 Prompt 到复杂多链的声明式编程

LangChain 表达式语言(LCEL)入门与实战:从 Prompt 到复杂多链的声明式编程 知识代码AI
2026-10-16
0

⛓️ LangChain 表达式语言(LCEL)入门与实战:从 Prompt 到复杂多链的声明式编程


一、本章概览

第20章《LangChain 表达式语言(LCEL)入门与实战》是课程中聚焦 LangChain 核心编程范式的关键章节——全面介绍 LCEL(LangChain Expression Language)这一声明式的链式组合语言,从设计理念、Runnable 协议、基础用法,到与传统调用方式的对比、批量处理、流式输出、异步调用、回退机制,再到复杂多链(AI 辩论链)的实战构建。

核心内容速览:

板块
核心知识点
🏗️ LCEL 是什么
声明式链式组合语言,从原型到生产无需改代码
⚡ 核心优势
流式处理、并行处理、日志记录、回退机制等开箱即用
🔗 Runnable 协议
统一接口规范,标准化输入/输出 Schema
📊 LCEL vs 古典语法
7大场景对比,代码量减少 60%+
🎯 invoke 方法
通用同步调用,单次/复杂协作
🔄 流式/批量/异步
chain.stream / chain.batch / chain.ainvoke
🛡️ Fallbacks 回退
模型异常自动切换,一行代码实现
🧠 AI 辩论链
输入→论点→正反论述→最终总结的完整多链

二、LangChain 技术生态全景

在深入 LCEL 之前,先了解 LangChain 的完整生态体系:

LangChain 技术生态
├── LangChain ───────── LLMs 应用开发框架(Python / JavaScript)
├── LangChain-Core ──── LCEL 等核心协议(基础抽象层)
├── LangChain-Community ── 第三方集成(模型、向量库、工具等)
├── LangChain Templates ── 开箱即用的 APP 示例模板
├── LangServe ────────── Chains 生产部署(REST API)
└── LangSmith ────────── 一站式开发者平台
    ├── 可观测性(Observability)
    ├── 监控(Monitoring)
    ├── 反馈(Feedback)
    ├── 评估(Evaluation)
    ├── 标注(Annotation)
    └── 测试(Testing)
★

LCEL 位于 LangChain-Core 层,是整个生态的协议基石,为所有组件提供了统一的组合与调用接口。


三、LCEL 是什么?

3.1 基本定义

LCEL(LangChain Expression Language) 是一种声明式的链式组合语言,能够从简单的 Prompt + LLM 链到复杂的生产级链(可运行 100 多个步骤)统一表达。

★

LCEL 的设计初衷是支持将原型快速投入生产,而无需更改代码。

3.2 核心设计理念

竖线管道操作符 |:

LCEL 的核心是 | 操作符,类似于 Unix 管道,它将不同组件链接在一起,将一个组件的输出作为下一个组件的输入。

Prompt Template → Model → Output Parser
       |              |           |
   生成输入        LLM调用      解析输出

标准化的大模型抽象 Model I/O:

输入: X = "foo", y = "bar"
  ↓
Prompt Template: "Does {x} like {y}, and why?"
  ↓
Chat Model / LLM
  ↓
Output Parser: {"likes": True, "reason": "Because ..."}

3.3 核心组件模块

模块
说明
Model I/O
聊天模型和 LLM 的通用接口,以及处理模型输出的实用工具
Retrieval
检索增强生成,从各种来源加载数据、准备数据,在生成步骤中检索数据
Agents
允许 LLM 自主完成任务,决定采取哪些行动、执行行动、观察结果并重复

四、LCEL Runnable 协议

4.1 Runnable 接口

LangChain 实现了 Runnable 协议来简化创建自定义链的过程。许多 LangChain 组件都实现了 Runnable 协议,包括:

  • Chat Models
  • LLMs
  • Output Parsers
  • Retrievers
  • Prompt Templates

4.2 组件的输入/输出类型

组件
输入类型
输出类型
Prompt
Dictionary
PromptValue
ChatModel
String / Chat Messages / PromptValue
ChatMessage
LLM
String / Chat Messages / PromptValue
String
OutputParser
LLM 或 ChatModel 的输出
取决于解析器
Retriever
String
List of Documents
Tool
String 或 Dictionary
取决于工具

4.3 Schema 方法

所有 Runnable 对象都显式描述输入和输出 Schema:

# 查看 chain 的输入类型
chain.input_schema.schema()
# 输出:{'title': 'PromptInput', 'type': 'object', 
#        'properties': {'topic': {'title': 'Topic', 'type': 'string'}}}

# 查看 Prompt 的输入类型
prompt.input_schema.schema()
# 输出:同上(Chain 的输入从 Prompt 开始)

4.4 Runnable 核心方法

方法
说明
适用场景
invoke
通用同步调用,对输入调用该链
单一操作
stream
流式返回生成内容(chunk)
实时输出
batch
对输入列表调用该链
批量处理
ainvoke
异步版本的 invoke
异步调用
astream
异步版本的 stream
异步流式
abatch
异步版本的 batch
异步批量

五、基础代码示例:最简 LCEL 链

5.1 最简单的 LCEL 链

from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

# 初始化 ChatOpenAI 模型
model = ChatOpenAI(model="gpt-3.5-turbo-0125")

# 创建聊天提示模板
prompt = ChatPromptTemplate.from_template("讲个关于{topic}的笑话吧")

# 初始化输出解析器
output_parser = StrOutputParser()

# 构建处理链(使用 | 管道操作符)
chain = prompt | model | output_parser

# 调用链
result = chain.invoke({"topic": "程序员"})
print(result)
# 输出:'为什么程序员总是喜欢用"Ctrl+C"和"Ctrl+V"呢?\n\n因为他们喜欢复制粘贴!!'
★

🔑 核心语法:chain = prompt | model | output_parser,一行代码完成链式构建!


六、LCEL vs 古典语法:7大场景对比

6.1 简单调用

对比项
古典语法(Without LCEL)
LCEL 语法
代码量
~15行
~5行
示例
手动格式化 Prompt → 手动调用 API → 手动解析
prompt | model | output_parser

Without LCEL:

prompt_template = "Tell me a short joke about {topic}"
client = openai.OpenAI()

def call_chat_model(messages: List[dict]) -> str:
    response = client.chat.completions.create(
        model="gpt-3.5-turbo", messages=messages,
    )
    return response.choices[0].message.content

def invoke_chain(topic: str) -> str:
    prompt_value = prompt_template.format(topic=topic)
    messages = [{"role": "user", "content": prompt_value}]
    return call_chat_model(messages)

invoke_chain("ice cream")

With LCEL:

chain = ({"topic": RunnablePassthrough()} | prompt | model | output_parser)
chain.invoke("ice cream")

6.2 流式输出

对比项
古典语法
LCEL 语法
代码量
~15行
1行
示例
手动实现 Generator + Stream 回调
chain.stream()

With LCEL 只需一行:

for chunk in chain.stream("ice cream"):
    print(chunk, end="", flush=True)

6.3 批量并行处理

对比项
古典语法
LCEL 语法
代码量
~5行 + ThreadPoolExecutor
1行
示例
手动管理线程池
chain.batch()

With LCEL 只需一行:

chain.batch(["ice cream", "spaghetti", "dumplings"])

6.4 异步调用

对比项
古典语法
LCEL 语法
代码量
~10行 + AsyncOpenAI
1行
示例
手动实现 async 函数
chain.ainvoke()

With LCEL 只需一行:

await chain.ainvoke("ice cream")

6.5 更换模型提供商(OpenAI → Anthropic)

对比项
古典语法
LCEL 语法
代码量
~15行
~3行
示例
重写整个调用逻辑
只需替换 Model 组件

With LCEL:

from langchain_anthropic import ChatAnthropic

anthropic = ChatAnthropic(model="claude-2")
anthropic_chain = (
    {"topic": RunnablePassthrough()} | prompt | anthropic | output_parser
)
anthropic_chain.invoke("ice cream")

6.6 回退机制(Fallbacks)

对比项
古典语法
LCEL 语法
代码量
~10行 + try/except
1行
示例
手动捕获异常切换
chain.with_fallbacks()

With LCEL 只需几行:

fallback_chain = chain.with_fallbacks([anthropic_chain])
fallback_chain.invoke("ice cream")           # 同步
await fallback_chain.ainvoke("ice cream")    # 异步
fallback_chain.batch([...])                  # 批量

6.7 使用 LLM 替代 Chat Model

from langchain_openai import OpenAI

# 使用 Completion 端点
llm = OpenAI(model="gpt-3.5-turbo-instruct")
llm_chain = ({"topic": RunnablePassthrough()} | prompt | llm | output_parser)
llm_chain.invoke("ice cream")

七、LCEL 进阶:AI 辩论链(多链组合)

7.1 辩论链结构

输入话题 → 原始观点 → 正面论述 → 反面论述 → 最终总结

7.2 完整代码实现

from operator import itemgetter
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.runnables import RunnablePassthrough

# 1️⃣ 计划器:生成关于给定输入的论点
planner = (
    ChatPromptTemplate.from_template("生成关于以下内容的论点:{input}")
    | ChatOpenAI()
    | StrOutputParser()
    | {"base_response": RunnablePassthrough()}
)

# 2️⃣ 正面论证:列出关于基础回应的正面方面
arguments_for = (
    ChatPromptTemplate.from_template(
        "列出关于{base_response}的正面或有利的方面"
    )
    | ChatOpenAI()
    | StrOutputParser()
)

# 3️⃣ 反面论证:列出关于基础回应的反面方面
arguments_against = (
    ChatPromptTemplate.from_template(
        "列出关于{base_response}的反面或不利的方面"
    )
    | ChatOpenAI()
    | StrOutputParser()
)

# 4️⃣ 最终响应者:综合原始回应和正反论点生成最终回应
final_responder = (
    ChatPromptTemplate.from_messages([
        ("ai", "{original_response}"),
        ("human", "正面观点:\n{results_1}\n\n反面观点:\n{results_2}"),
        ("system", "给出批评后生成最终回应"),
    ])
    | ChatOpenAI()
    | StrOutputParser()
)

# 5️⃣ 构建完整处理链
chain = (
    planner
    | {
        "results_1": arguments_for,
        "results_2": arguments_against,
        "original_response": itemgetter("base_response"),
    }
    | final_responder
)

# 调用辩论链
chain.invoke({"input": "房地产低迷"})

7.3 输出示例

★

在面对房地产低迷的情况下,需要综合考虑正面和反面观点,以找到平衡和解决问题的方法。同时,房地产市场的低迷也可能为购房者提供更好的机会,并寻求合适的解决方案,以实现经济的平稳发展和社会的和谐进步。


八、LCEL 核心优势总结

优势
说明
🚀 快速原型到生产
无需更改代码,直接投入生产环境
🔧 声明式编程
使用 | 管道符,代码简洁优雅
⚡ 并行处理
chain.batch()
 一行代码实现批量并行
📡 流式输出
chain.stream()
 一行代码实现流式响应
⏱️ 异步支持
chain.ainvoke()
 一行代码实现异步调用
🛡️ 回退机制
chain.with_fallbacks()
 一行代码实现异常自动切换
🔄 模型无关
更换模型提供商只需替换 Model 组件
📐 Schema 校验
自动生成 input_schema / output_schema
🔗 多链组合
RunnablePassthrough 实现复杂多链逻辑
📊 可观测性
集成 LangSmith 实现日志、追踪、调试

📌 本章核心要点总结

序号
核心要点
一句话总结
1
LCEL 是什么
声明式链式组合语言,用 | 管道符连接组件,原型到生产零改代码
2
LangChain 生态全景
LangChain(框架)+ LangChain-Core(LCEL)+ LangServe(部署)+ LangSmith(平台)
3
Runnable 协议
统一接口规范,所有组件(Prompt/Model/Parser/Retriever/Tool)实现同一协议
4
invoke / stream / batch
三大核心方法:单次调用、流式输出、批量并行
5
LCEL vs 古典语法
7大场景对比,代码量减少 60%~90%,一行代码实现流式/批量/异步/回退
6
回退机制(Fallbacks) chain.with_fallbacks()
 模型异常自动切换,同步/异步/批量全支持
7
模型无关性
同一 prompt | model | parser 结构,更换模型只需替换 Model 组件
8
Schema 校验 input_schema
 / output_schema 自动生成,Pydantic 模型校验输入输出
9
AI 辩论链
5步构建:输入→论点→正面→反面→总结,展示多链组合威力
10
生产级特性
流式、并行、异步、回退、日志、追踪、调试全开箱即用

★

📚 下一章预告:第21章——生产级大模型应用开发平台 LangSmith,敬请期待!🚀

本课程系列文章持续更新中,欢迎关注!


本文整理自《AI 大模型应用开发实战营》第20章,讲师:彭靖田


【声明】内容源于网络
0
0
知识代码AI
技术基底 机器视觉全栈 × 光学成像 × 图像处理算法 编程栈 C++/C#工业开发 | Python智能建模 工具链 Halcon/VisionPro工业部署 | PyTorch/TensorFlow模型炼金术 | 模型压缩&嵌入式移植
内容 421
粉丝 0
知识代码AI 技术基底 机器视觉全栈 × 光学成像 × 图像处理算法 编程栈 C++/C#工业开发 | Python智能建模 工具链 Halcon/VisionPro工业部署 | PyTorch/TensorFlow模型炼金术 | 模型压缩&嵌入式移植
总阅读8.6k
粉丝0
内容421