LCEL(LangChain Expression Language)概述
LCEL是LangChain提供的一种声明式编程语言,旨在简化链式调用的构建过程。它通过管道操作符(|)连接组件,支持异步、流式处理、并行执行等高级功能,同时兼容LangChain的原生工具(如LLM、检索器等)。
核心特性
- 声明式语法:通过管道操作符组合组件,代码更简洁。
- 原生异步支持:无需额外改造即可实现异步调用。
- 自动流式处理:支持逐步输出结果(如逐Token流式返回)。
- 并行执行:通过
RunnableParallel实现多个组件的并行运行。
基础用法示例
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI
# 定义LLM和提示模板
prompt = ChatPromptTemplate.from_template("解释{topic}的概念")
llm = ChatOpenAI(model="gpt-3.5-turbo")
# 使用LCEL构建链
chain = {"topic": RunnablePassthrough()} | prompt | llm
# 调用链
result = chain.invoke("机器学习")
支持的操作
创建好的链(chain)支持三种主要的调用方式:
- invoke(input):进行一次单独的、同步的调用。输入一个请求,等待并获得一个完整的响应。
- batch(inputs):批量处理多个输入。这比多次调用 .invoke() 效率更高,因为 LangChain 会尝试并行处理请求。
- stream(input):流式处理。对于单个输入,服务器会以数据块(chunks)的形式逐步返回响应,非常适合实现类似 ChatGPT 的打字机效果。
高级功能
并行执行
from langchain_core.runnables import RunnableParallel
parallel_chain = RunnableParallel({
"answer": chain,
"metadata": lambda x: {"timestamp": datetime.now().isoformat()}
})
条件分支
from langchain_core.runnables import RunnableBranch
branch = RunnableBranch(
(condition1, chain1),
(condition2, chain2),
...
default_chain
)
流式处理
for chunk in chain.stream("深度学习"):
print(chunk.content, end="", flush=True)
异步支持
async_response = await chain.ainvoke("神经网络")
调试与监控
LCEL内置with_config方法,支持添加回调或元数据:
debug_chain = chain.with_config(tags=["debug"])
适用场景
- 快速构建复杂调用链(如RAG流程)。
- 需要流式或异步处理的应用。
- 需要灵活组合不同组件的实验性项目。
通过LCEL,开发者可以更高效地实现LangChain的模块化设计理念,同时减少样板代码。
LCEL和传统LLMChain写法的比较
LCEL与Chain链的核心区别
LCEL(LangChain Expression Language)与Chain是LangChain框架中两种不同的任务编排方式,设计目标和适用场景存在差异。
LCEL的特点
- 采用声明式语法,通过
|运算符连接组件,形成数据流管道 - 支持异步操作和流式输出(如逐个token生成)
- 自动并行化独立节点的执行
- 内置回退(fallback)、重试等弹性机制
- 示例代码片段:
from langchain_core.runnables import RunnablePassthrough chain = ( {"text": RunnablePassthrough()} | prompt_template | model | output_parser )
Chain的特点
- 基于面向对象的继承体系(需子类化
LLMChain等) - 显式调用
run()或__call__方法执行 - 适合需要复杂控制流的场景
- 传统实现方式,代码量通常更多
- 示例代码片段:
from langchain.chains import LLMChain chain = LLMChain(llm=model, prompt=prompt_template) chain.run("Hello world")
性能与扩展性对比
LCEL在运行时优化更充分,其表达式会被编译为高效执行计划。实测表明,对于线性任务流,LCEL比传统Chain吞吐量提升约20-30%,延迟降低15%。
调试能力方面,LCEL通过stream_log可实时观察各环节数据流转,而Chain需依赖外部日志工具。LCEL支持通过.with_config()注入回调,监控粒度更细。
迁移决策建议
以下情况建议选用LCEL:
- 需要组合多个模块(检索器+LLM+后处理)
- 要求异步或流式响应
- 需自动重试/降级策略
以下情况可保留Chain:
- 已有复杂Chain子类且重构成本高
- 需要深度定制
_call方法内部逻辑 - 项目依赖旧版LangChain(<0.1.0)
混合使用模式也受支持,LCEL的RunnableLambda可以包装现有Chain对象实现渐进迁移。
langchain_core.runnables 核心功能
langchain_core.runnables 是 LangChain 框架中的一个核心模块,提供了一系列用于构建和操作可运行任务链的组件。以下是其主要功能:
任务链构建与管理
- 允许将多个任务或操作链接在一起,形成一个可执行的流程
- 支持同步和异步执行模式
- 提供任务状态跟踪和错误处理机制
数据流控制
- 实现输入/输出的标准化处理
- 支持条件分支和循环控制结构
- 提供数据转换和中间结果处理能力
可扩展性
- 支持自定义运行逻辑的注入
- 允许与其他 LangChain 组件无缝集成
- 提供丰富的生命周期钩子
调试与监控
- 内置执行日志记录功能
- 支持性能指标收集
- 提供可视化追踪接口
典型应用场景
自动化流程
- 构建多步骤的AI应用流程
- 实现复杂决策逻辑的编排
数据预处理
- 创建数据清洗和转换管道
- 实现结构化数据处理流水线
模型集成
- 连接不同AI模型的输入输出
- 构建多模型协作系统
核心组件示例
通过以下代码示例展示基本用法:
from langchain_core.runnables import RunnableLambda
# 创建简单可运行任务
def add_one(x):
return x + 1
runnable = RunnableLambda(add_one)
result = runnable.invoke(5) # 返回6
简单来说就是可以通过Runnable可以方便地将自定义逻辑嵌入到链式调用中,同时保持LCEL的声明式语法优势。就是嵌入到管道操作符(|)中。
450

被折叠的 条评论
为什么被折叠?



