【大语言模型】LangChain LCEL 表达式语言

news2025/1/20 1:37:17

在这里插入图片描述


【大语言模型】LangChain LCEL 表达式语言

  • 一、简介
  • 二、LCEL的优势
  • 三、LCEL 的基本使用
    • 1、Runnable 对象
  • 四、实战实例

一、简介

LangChain LCEL 的全称为 LangChain Expression Language 即可直译为 LangChain 表达式。
为了构造更复杂的 LLM 应用并且更为简便快捷的构造 LLM 应用,Langchain 提供了类似“管道”的形式去声明提示词模板(prompt),即用 “|” 来连接各个组件之间的操作。也就是 LCEL 允许开发者将不同的模块进行简单的形式实现串联。语法如下所示:
chain = 提示词板 | 大模型调用 | 输出解析器

二、LCEL的优势

很多人疑惑的一点可能在于明明基于官方的 API 也可以实现请求响应的一系列过程,为何还要多此一举使用 LCEL 呢?

import os
# OpenAI提供的python公共库
from openai import OpenAI
import os

os.environ["OPENAI_API_KEY"] = "xxxxxxxxxxxxx"  # 将个人token替换到这个位置
os.environ["OPENAI_API_BASE"] = "xxxxxxxxxxxxx"

# 设置OpenAI Token
client = OpenAI(api_key=os.environ.get('OPENAI_API_KEY'), base_url=os.environ.get('OPENAI_API_BASE'))
chat_completion = client.chat.completions.create(
    # 声明调用的模型名称
    model='gpt-3.5-turbo',
    # temperature用来设置大模型返回数据的随机性和创造性,较低的数值返回的数据就更贴近现实。
    temperature=0.0,
    # 消息内容,可以包含上下文信息,列表数据中的顺序就是对话发生的顺序
    messages=[{'role': 'user', 'content': '1+1等于几?'}]
)
print(chat_completion)

# 从返回数据中拿到具体的答案信息
answer = chat_completion.choices[0].message.content
# 打印调试信息
print(answer)

tCompletion(id='chatcmpl-AbP4L1ArFNwLSzwRKVh5LrAwP9Pe2', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='1+1等于2。', refusal=None, role='assistant', audio=None, function_call=None, tool_calls=None))], created=1733477865, model='gpt-3.5-turbo-0125', object='chat.completion', service_tier=None, system_fingerprint=None, usage=CompletionUsage(completion_tokens=7, prompt_tokens=15, total_tokens=22, completion_tokens_details=CompletionTokensDetails(accepted_prediction_tokens=0, audio_tokens=0, reasoning_tokens=0, rejected_prediction_tokens=0), prompt_tokens_details=PromptTokensDetails(audio_tokens=0, cached_tokens=0)))
1+1等于2

从以上代码中可以看出以下几个问题:
1.官方提供的主要功能为请求的发送,具体发送的数据 messages 部分需要用户自己组织和维护。
2.返回的数据 response 部分也只是简单的组装了一个结构。有过开发经验的同学都深有感触,如果每次给到的返回信息从结构到内容都是不一样的,作为调用方,则需要编写无数行代码去处理这些异常。
而 LCEL 语法形式使得数据流程清晰,通过 pipeline 的形式,可以清晰地定义数据的流向以及处理的流程,使得代码更易于理解和维护。

三、LCEL 的基本使用

在使用 LCEL 表达式时,需要先了解其中所包含的元素:

  • |:连接符
  • Runnable对象:可执行操作

1、Runnable 对象

Runnable 对象意为可执行操作,每个LCEL表达式都需要runnable 对象以及"|"连接符,使得LCEL 对象可以自动支持这些调用。
其中 Runnable 对象需要包含以下三个接口:

  • stream:以流式返回输出结果。
  • invoke:基于-个input调用 Runnable。
  • batch:基于一个list的input 批量调用 Runnable。

所有的 Runnable 对象都具有共同的属性,即输入架构与输出架构。常见的输入和输出类型如下所示

Componentinput Typeoutput Type
Prdmptdictonaryprompt Value
LLMString, list of messages or Prompt ValueString
ChatModelString, list of messages or Prompt ValueChatMessage
RetrieverSingle StringList of Documents
ToolString/DictonaryTool dependent
Output ParserOutput of LLM or ChatModelParser dependent

四、实战实例

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

import os

os.environ["OPENAI_API_KEY"] = "xxxxxxxxxx"  # 将个人token替换到这个位置
os.environ["OPENAI_API_BASE"] = "xxxxxxxxxx"

# 1、提示词模板 ->PromptValue
prompt = ChatPromptTemplate.from_template("出给一个关于{goods}的广告宜传语")
# 2、ChatGPT模型调用对象
model = ChatOpenAI()

# 将ChatGPT返回结果转换为字符串的处理器对象
output_parser = StrOutputParser()
# 将三个对象根据使用顺序组合成一个调用链,实现提示词组装、模型调用、结果解析的功能
# 业务流程  提示 调用  解析
chain = prompt | model | output_parser

# 输入提示词模版中的变量部分,调用链会自动完成后续的调用和解析
res = chain.invoke({"goods": "音乐节"})

print(res)

“跟随音乐的节拍,感受心灵的共鸣。音乐节邀您共同享受狂欢,释放激情,感受无限快乐!”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2255883.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java中的递归

大家好,今天我们来学习一下java中的递归,相信大家应该也对递归有一点了解吧,如果没有也没有关系,我们现在就来了解一下。 五、递归 自身中包含了自己,遇到的问题直接并不好解决,但是发现将原问题拆分成其子问题之后,子问题与原问…

【pyspark学习从入门到精通23】机器学习库_6

目录 分割连续变量 标准化连续变量 分类 分割连续变量 我们经常处理高度非线性的连续特征,而且只用一个系数很难拟合到我们的模型中。 在这种情况下,可能很难只通过一个系数来解释这样一个特征与目标之间的关系。有时,将值划分到离散的桶中…

STM32 自学笔记

摘抄于大学期间记录在QQ空间的一篇自学笔记,当前清理空间,本来想直接删除掉的,但是感觉有些舍不得,因此先搬移过来。 RAM vs ROM vs FLASH 2013-09-05记录,ROM和RAM指的都是半导体存储器,ROM是Read Only …

距离与AoA辅助的三维测距算法(适用于四个基站的情况的单点定位),MATLAB代码

本MATLAB 代码实现了一个基于LOS/NLOS混合环境的单点定位系统,主要用于估计目标物体的单点位 文章目录 代码运行结果源代码代码功能概述主要步骤分析初始化部分 绘图与输出 代码运行结果 定位结果如下: 命令行的坐标和误差输出: 部分代码…

2024年华中杯数学建模B题使用行车轨迹估计交通信号灯周期问题解题全过程文档及程序

2024年华中杯数学建模 B题 使用行车轨迹估计交通信号灯周期问题 原题再现 某电子地图服务商希望获取城市路网中所有交通信号灯的红绿周期,以便为司机提供更好的导航服务。由于许多信号灯未接入网络,无法直接从交通管理部门获取所有信号灯的数据&#x…

Cesium-地球材质-坡度

1. 创建viewer 创建viewer并添加地形 const viewer new Cesium.Viewer("cesiumContainer", {terrainProvider: await Cesium.CesiumTerrainProvider.fromIonAssetId(3956, {requestVertexNormals: true}) }); 2. 创建canvas色条 添加getColorRamp方法&#xff0…

OpenAI 12连更第一弹:o1完全体,200刀一个月的ChatGPT Pro

来源 | 机器之心 一天前,OpenAI 官方 X 账户的一条推文将 AI 社区的期待值拉满了。这家世界头部 AI 公司宣布将在未来的 12 天进行 12 场直播,发布一些「大大小小的新东西」。 这是 OpenAI 准备的圣诞礼物。 至于这些「大大小小的新东西」究竟是什么&am…

使用C#基于ADO.NET编写MySQL的程序

MySQL 是一个领先的开源数据库管理系统。它是一个多用户、多线程的数据库管理系统。MySQL 在网络上特别流行。MySQL 数据库可在大多数重要的操作系统平台上使用。它可在 BSD Unix、Linux、Windows 或 Mac OS 上运行。MySQL 有两个版本:MySQL 服务器系统和 MySQL 嵌入…

运动模糊效果

1、运动模糊效果 运动模糊效果,是一种用于 模拟真实世界中快速移动物体产生的模糊现象 的图像处理技术,当一个物体以较高速度移动时,由于人眼或摄像机的曝光时间过长,该物体会在图像中留下模糊的运动轨迹。这种效果游戏、动画、电…

三款电容麦的对比

纸面参数 第一款麦克风 灵敏度: -36 dB 2 dB(0 dB1V/Pa at 1 kHz) 灵敏度较低,需要更高的增益来拾取同样的音量。频率响应: 40 Hz - 18 kHz 响应范围较窄,尤其在高频区域。等效噪音级: ≤18 dB(A计权) 噪…

nacos bootstrap.yml 和 spring.config.import 加载配置的流程区别

相关依赖 springboot:2.7.15 nacos:2.2.3 bootstrap.yml加载方式 加载流程如下图所示 从图中可以看出,: 1.bootstrap.yml 的加载是在 BootstrapApplicationListener.onApplicationEvent 接收到 ApplicationEnvironmentPreparedEventEvent 事件后另起一个 Sprin…

数据结构题库12

第六章 图 一、单项选择题 1.下面关于图的存储结构的叙述中正确的是 (1) 。 (1):A.用邻接矩阵存储图占用空间大小只与图中顶点有关,与边数无关 B.用邻接矩阵存储图占用空间大小只与图中边数有关,而与顶点数…

【adb】iqoo系统精简垃圾内置应用

免责声明 这个得谨慎点,虽然我验证过两部手机和不同版本的系统,但是总会有特殊的存在、 本教程来自于互联网搜集整理, 按照本教程造成的用户设备硬件或数据损失,本人概不承担任何责任,如您不同意此协议,请不…

sharedPreference包的使用总结

文章目录 1 概念介绍2 实现方法3 示例代码我们在上一章回中介绍了"如何自定义评分条"相关的内容,本章回中将介绍如何实现本地存储.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 Flutter是一套跨平台的UI框架,它不像原生SDK一样提供本地存储功能,因此,我们在…

嵌入式蓝桥杯学习4 lcd移植

cubemx配置 复制前面配置过的文件 打开cubemx,将PB8,PB9配置为GPIO-Output。 点击GENERATE CODE. 文件移植 1.打开比赛提供的文件包,点击Inc文件夹 2.点击Inc文件夹。复制fonts.h和lcd.h,粘贴到我们自己的工程文件夹的bsp中&#xff08…

基于Matlab扩展卡尔曼滤波的GPS与DME组合无人机导航系统设计与实现

随着无人机(UAV)在农业监测、环境保护、物流运输、灾害救援等各个领域的广泛应用,精准且可靠的导航系统已成为提升无人机性能和任务执行能力的关键因素。传统的导航方法依赖于单一传感器,往往难以在复杂和动态的环境中提供足够的定…

仿真键盘输入遇到Edge环境不识别 回车符如何处理

这个问题我也是最近才遇到,可能现在大家都喜欢用新架构,基于网页来写应用管理软件。 当遇到Edge环境下,文本框不识别回车符如何处理,根据笔者经验可通过配置Edge 基于键盘管理设置来解决这个事情。如图 即在Edge浏览器环境下&…

黑马redis

Redis的多IO线程只是用来处理网络请求的,对于读写操作命令Redis仍然使用单线程来处理 Redisson分布式锁实现15问 文章目录 主线程和IO线程是如何协作的Unix网络编程中的五种IO模型Linux世界一切皆文件生产上限制keys *、flushdb、flushall等危险命令keys * 遍历查询100W数据花…

JDK 并发编程工具类详解:CountDownLatch、Semaphore、Exchanger、CyclicBarrier 和 Phaser

在 Java 并发编程中,JDK 提供了一些强大的工具类来帮助开发者处理线程间的同步和通信问题。这些工具类主要包括 CountDownLatch、Semaphore、Exchanger、CyclicBarrier 和 Phaser,它们都位于 java.util.concurrent 包下,统称为 JUC&#xff0…

实现RAGFlow-0.14.1的输入框多行输入和消息框的多行显示

一、Chat页面输入框的修改 1. macOS配置 我使用MacBook Pro,chip 是 Apple M3 Pro,Memory是18GB,macOS是 Sonoma 14.6.1。 2. 修改chat输入框代码 目前RAGFlow前端的chat功能,输入的内容是单行的,不能主动使用Shift…