LCEL(Lang Chain Expression Language) 介绍:LangChain 的开发提效技巧

本文主要是介绍LCEL(Lang Chain Expression Language) 介绍:LangChain 的开发提效技巧,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LCEL 介绍

LCEL(Lang Chain Expression Language)是将一些有趣的 Python 概念抽象成一种格式,使得可以构建 LangChain 组件链的 “极简主义” 代码层。

LCEL 具有以下强大的支持:

  • 超快速开发链。
  • 高级特性,如流式处理、异步、并行执行等。
  • 与 LangSmith 和 LangServe 等工具集成。

在本章节中,我们将介绍 LCEL 是什么,它是如何工作的,以及 LCEL 链、管道(pipe)和可运行项(Runnable)的基本要点。

LCEL 语法样例
  • 为了理解 LCEL 语法,让我们首先使用传统的 LangChain 语法构建一个简单的链。
# 导入所需的模块和类
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema.output_parser import StrOutputParser
from langchain.chains import LLMChain# 创建聊天提示模板,指定要获取关于的主题
prompt = ChatPromptTemplate.from_template("给我一个关于{topic}的一句话介绍"
)# 创建ChatOpenAI模型实例
model = ChatOpenAI(temperature=0)# 创建输出解析器实例
output_parser = StrOutputParser()# 创建LLMChain链,将聊天提示、模型和输出解析器组合在一起
chain = LLMChain(prompt=prompt,llm=model,output_parser=output_parser
)# 运行链,并指定主题为"大语言模型"
out = chain.run(topic="大语言模型")
print(out)
# -> 大语言模型是一种基于深度学习的人工智能技术,能够自动学习和生成自然语言文本,具有广泛的应用领域,如机器翻译、文本生成和对话系统等

这个链的目标是使用 ChatOpenAI 模型生成一个简短的关于指定主题的介绍。我们通过设置温度参数为 0,确保模型生成的输出更加确定性,使得结果更加精确和可控。

  • 而通过 LCEL 语法,我们使用管道操作符(|)而不是 LLMChain 来创建我们的链。
# 使用 LangChain Expression Language(LCEL)创建链
lcel_chain = prompt | model | output_parser# 运行链,并通过字典传递主题为"大语言模型"
out = lcel_chain.invoke({"topic": "大语言模型"})
print(out)
# -> 大语言模型是一种基于深度学习的人工智能技术,能够自动学习和生成自然语言文本,具有广泛的应用领域,如机器翻译、文本生成和对话系统等

这里的语法并不典型于Python,但只使用了原生Python。| 操作符简单地将左侧的输出传递给右侧的函数。

管道运算符的工作原理

为了理解 LCEL 和管道运算符的工作原理,我们创建自己的管道兼容函数。

当 Python 解释器在两个对象之间看到 | 运算符(如 a | b)时,它会尝试将对象 a 传递给对象 b__or__ 方法。这意味着这些模式是等价的:

# 对象方法
chain = a.__or__(b)
chain("一些输入")# 管道方法
chain = a | b
chain("一些输入")

考虑到这一点,我们可以构建一个 Runnable 类,它接受一个函数并将其转换为可以使用管道运算符 | 与其他函数链接的函数。

class Runnable:def __init__(self, func):self.func = funcdef __or__(self, other):def chained_func(*args, **kwargs):# 其他函数使用这个函数的结果return other(self.func(*args, **kwargs))return Runnable(chained_func)def __call__(self, *args, **kwargs):return self.func(*args, **kwargs)

让我们实现这个,取值 3,加上 5(得到 8),然后乘以 2,最后期望得到 16。

def add_five(x):return x + 5def multiply_by_two(x):return x * 2# 使用 Runnable 包装这些函数
add_five = Runnable(add_five)
multiply_by_two = Runnable(multiply_by_two)# 使用对象方法运行它们
chain = add_five.__or__(multiply_by_two)
print(chain(3))  # (3 + 5) * 2 = 16
# -> 16

直接使用 __or__ 我们会得到正确答案,让我们尝试使用管道操作符 | 将它们链接在一起:

# 将可运行的函数链接在一起
chain = add_five | multiply_by_two# 调用链
print(chain(3))  # (3 + 5) * 2 = 16
# -> 16

无论使用哪种方法,我们都会得到相同的响应,这就是 LCEL 在链接组件时使用的管道逻辑。

RunnableLambda 是一个 LangChain 抽象,它允许我们将 Python 函数转换为与管道兼容的函数,类似于我们在之前介绍的 Runnable 类。
让我们尝试一下我们之前的 add_fivemultiply_by_two 函数。

from langchain_core.runnables import RunnableLambda# 使用 RunnableLambda 包装这些函数
add_five = RunnableLambda(add_five)
multiply_by_two = RunnableLambda(multiply_by_two)

与之前的 Runnable 抽象类似,我们可以使用 | 运算符将 RunnableLambda 抽象连接在一起:

# 将可运行的函数链接在一起
chain = add_five | multiply_by_two

与我们的 Runnable 抽象不同,我们不能通过直接调用它来运行 RunnableLambda 链,而是必须调用 chain.invoke

# 调用链
print(chain.invoke(3))
# -> 16

可以看到使用 RunnableLambda 获得了和 Runnable 类似的结果。

LCEL 介绍小结

以上内容概述了 LangChain 表达语言(LCEL)的基础知识,通过 LCEL 我们可以轻松地构建链式结构。

LCEL 的优劣势多种多样。喜欢 LCEL 的人通常注重其极简的代码风格,以及对流式、并行操作和异步的支持,同时也看好 LCEL 与 LangChain 在组件链式连接方面的良好集成。

然而,有些人对 LCEL 持有不太喜欢的态度。这些人通常指出 LCEL 是对已经非常抽象的库再加一层抽象,语法令人困扰,违背了 Python 之禅,并且需要花费较多的时间来学习新的(或不太常见的)语法。

这两种观点都是有道理的,因为 LCEL 是一种极为不同的方法。然而,由于 LCEL 具有快速开发的特性,目前在 LangChain 开源社区中被广泛使用。对 LCEL 原理的简单了解将有助于读者在今后使用各种 LangChain 代码时更加得心应手。

这篇关于LCEL(Lang Chain Expression Language) 介绍:LangChain 的开发提效技巧的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/506812

相关文章

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

Python进阶之列表推导式的10个核心技巧

《Python进阶之列表推导式的10个核心技巧》在Python编程中,列表推导式(ListComprehension)是提升代码效率的瑞士军刀,本文将通过真实场景案例,揭示列表推导式的进阶用法,希望对... 目录一、基础语法重构:理解推导式的底层逻辑二、嵌套循环:破解多维数据处理难题三、条件表达式:实现分支