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

相关文章

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark