【每天一个小笔记】04 LangChain的LCEL

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的声明式语法优势。就是嵌入到管道操作符(|)中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值