开源模型应用落地-LangChain高阶-LCEL-表达式语言(七)

一、前言

    尽管现在的大语言模型已经非常强大,可以解决许多问题,但在处理复杂情况时,仍然需要进行多个步骤或整合不同的流程才能达到最终的目标。然而,现在可以利用langchain来使得模型的应用变得更加直接和简单。

    LCEL是什么?

    LCEL是一种非常灵活和强大的语言,可以帮助您更方便地构建复杂的应用程序。它提供了很多有用的功能,使得您可以更快速地完成开发任务。

    上一篇开源模型应用落地-LangChain高阶-LCEL-表达式语言(六)我们通过两个案例学习了运行自定义函数接收可运行配置,本篇开始继续学习LCEL的高级用法:传递传入即实现在不改变或添加额外键的情况下改变键值。


二、术语

2.1.LCEL

    是一种用于构建复杂链式组件的语言。它提供了一些非常实用的功能,比如流式处理、并行化和日志记录。它的使用方式很简单:只需要使用 "|" 符号将不同的组件连接起来,就可以形成一个链式结构。这个 "|" 符号就像是Unix中的管道操作符,可以将一个组件的输出转换成下一个组件的输入,从而实现数据的传递和处理。

2.2. Passthrough: Pass through inputs传递输入

    在不改变或添加额外键的情况下传递输入。它通常与RunnableParallel结合使用,用于分配数值到字典的新键。


三、前提条件

3.1.安装虚拟环境

conda create -n langchain python=3.10
conda activate langchain
pip install --quiet  langchain-core langchain-community langchain-openai -i https://pypi.tuna.tsinghua.edu.cn/simple

PS:--quiet: 这个选项会让输出信息更简洁,只显示必要的信息,不会输出太多冗余信息。


四、技术实现

4.1.基础示例

不更改传递输入,将数据传递到映射中的新键。

# -*- coding: utf-8 -*-
from langchain_core.runnables import RunnableParallel, RunnablePassthroughdef get_5A_Scenic_Spots(prompt):print(prompt['prompt'])return prompt['prompt']+"特色美食有哪些?"if __name__ == '__main__':runnable = RunnableParallel(passed=RunnablePassthrough(),modified=get_5A_Scenic_Spots,)result = runnable.invoke({"prompt": "广州特色景点有哪些?"})print(result)

调用结果:

  

说明:

原输入的prompt为:广州特色景点有哪些?修改后的prompt为:广州的特色景点有哪些?特色美食有哪些?

4.2.综合示例

# -*- coding: utf-8 -*-
import os
from operator import itemgetterfrom langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough, RunnableParallel
from langchain_openai import ChatOpenAIos.environ["OPENAI_API_KEY"] = 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'  # 你的Open AI Keydef get_rainfall(prompt):print('修改前的prompt:'+prompt['question'])prompt_new = prompt['question'].replace("天气如何?", "降雨量如何?")print('修改后的prompt:' + prompt_new)returnif __name__ == '__main__':model = ChatOpenAI(model="gpt-3.5-turbo", temperature=0, max_tokens=512)context = "6月9日,广州市出现中雨局部大雨,全市平均雨量11.2毫米,增城区仙村镇录得最大累计雨量35.6毫米和最大小时雨强27.1毫米。各区最低气温23~24℃,最高气温25~28℃。10日-12日副高加强,我市降雨有所减弱,以午后雷阵雨为主,间中雨势较大。高考期间赴考时段可能与雷雨天气叠加,交通拥堵气象风险高,建议家长和考生提前规划好赶考路线,预留充足时间。午后体感略闷热,建议考场做好通风降温工作,医疗等相关部门做好保障工作。"question = "6月9日广州市的天气如何?"template = """Answer the question based only on the following context:{context}Question: {question}"""prompt = ChatPromptTemplate.from_template(template)chain = ({"context": itemgetter("context"), "question": RunnablePassthrough()}| prompt| model| StrOutputParser())runnable = RunnableParallel(chain=chain,modified=get_rainfall,)# resp = chain.invoke({"context": context, "question": question})# print(resp)resp = runnable.invoke({"context": context, "question": question})print(resp['chain'])

调用结果:

  

说明:

在RunnableParallel中将询问天气的Prompt更改为询问降雨量,使得推理结果为:6月9日广州市出现中雨局部大雨,全市平均雨量11.2毫米,增城区仙村镇录得最大累计雨量35.6毫米和最大小时雨强27.1毫米。各区最低气温23~24℃,最高气温25~28℃。


五、附带说明

5.1.RunnableParallel组件

 是一个特殊的组件,它允许并行运行多个处理步骤。当想要同时执行多个任务,而这些任务之间不需要相互等待或依赖对方的结果时,使用RunnableParallel就非常有用,这可以显著提高处理速度,特别是在处理需要大量计算资源的任务时。

  RunnableParallel可以轻松地并行执行多个Runnables,并将这些Runnables的输出作为映射返回。

5.2.operator.itemgetter 作用

    是 Python 标准库中的一个函数,它可以用于从序列类型(如列表、元组等)中提取特定项目。它的主要用途如下:   

    从列表中提取特定项目:

from operator import itemgetterdata = [('Alice', 25, 'Engineer'), ('Bob', 30, 'Manager'), ('Charlie', 35, 'Director')]
names = itemgetter(0)
ages = itemgetter(1)
jobs = itemgetter(2)print(list(map(names, data)))  # Output: ['Alice', 'Bob', 'Charlie']
print(list(map(ages, data)))   # Output: [25, 30, 35]
print(list(map(jobs, data)))   # Output: ['Engineer', 'Manager', 'Director']

    根据特定项目对列表进行排序:

from operator import itemgetterdata = [('Alice', 25, 'Engineer'), ('Bob', 30, 'Manager'), ('Charlie', 35, 'Director')]
sorted_by_age = sorted(data, key=itemgetter(1))
print(sorted_by_age)
# Output: [('Alice', 25, 'Engineer'), ('Bob', 30, 'Manager'), ('Charlie', 35, 'Director')]sorted_by_name = sorted(data, key=itemgetter(0))
print(sorted_by_name)
# Output: [('Alice', 25, 'Engineer'), ('Bob', 30, 'Manager'), ('Charlie', 35, 'Director')]

    在字典中提取特定项目:

from operator import itemgetterperson = {'name': 'Alice', 'age': 25, 'job': 'Engineer'}
name_getter = itemgetter('name')
age_getter = itemgetter('age')
job_getter = itemgetter('job')print(name_getter(person))  # Output: 'Alice'
print(age_getter(person))   # Output: 25
print(job_getter(person))   # Output: 'Engineer'

    在元组中提取特定项目:

from operator import itemgetterpoint = (10, 20, 30)
x_getter = itemgetter(0)
y_getter = itemgetter(1)
z_getter = itemgetter(2)print(x_getter(point))  # Output: 10
print(y_getter(point))  # Output: 20
print(z_getter(point))  # Output: 30

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

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

相关文章

每天五分钟深度学习框架pytorch:多维tensor向量在某一维度的拼接和分割

本文重点 在深度学习中,我们常常需要完成多个向量拼接,同时也要完成向量的分割,在pytorch中已经有封装好的库,我们可以直接调用完成这部分任务。 Cat拼接 c=torch.cat([a,b],dim=0)表示将a和b按0维度进行拼接,需要注意再非dim维度,两个矩阵的维度必须是一致的,不然会拼…

单调栈(续)、由斐波那契数列讲述矩阵快速降幂技巧

在这里先接上一篇文章单调栈,这里还有单调栈的一道题 题目一(单调栈续) 给定一个数组arr, 返回所有子数组最小值的累加和 就是一个数组,有很多的子数组,每个数组肯定有一个最小值,要把所有子…

Caffe、PyTorch、Scikit-learn、Spark MLlib 和 TensorFlowOnSpark 概述

在 AI 框架方面,有几种工具可用于图像分类、视觉和语音等任务。有些很受欢迎,如 PyTorch 和 Caffe,而另一些则更受限制。以下是四种流行的 AI 工具的亮点。 Caffee Caffee是贾扬青在加州大学伯克利分校(UC Berkeley)时开发的深度学习框架。该工具可用于图像分类、语音和…

MySQL中的复合查询与表的内外连接解析

在MySQL中,复合查询通常指的是涉及多个表或多个查询条件的查询。而表的内外连接(INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL OUTER JOIN,但MySQL不直接支持FULL OUTER JOIN)则是复合查询中常用的连接技术,用于从多个表…

【websocket】怎么终止websocket断开重连

介绍 代码是用go语言实现的。go语言实现websocket,常用第三方库github.com/gorilla/websocket。 不过只要明白了思路,不管哪个语言实现起来都是一样的。 问题 在生产环境,websocket客户端一般都会实现断开重连的逻辑,如果直接…

胡说八道(24.6.12)——数字电子技术以及Modelsim

上回书说到数电中的最常用的表达式——逻辑表达式(由布尔代数组成)以及常用的两种图表——真值表(真值表表示的是所有的输入可能的线性组合以及输出)和卡诺图(卡诺图则是一种化简工具,排除冗余项,合并可合并项)。 今天,先来看看昨天说的基本逻…

DP:01背包问题

一、背包问题的概述 背包问题是⼀种组合优化的NP完全问题。 本质上是为了找出“带有限制条件的组合最优解” 1、根据物品的个数,分为如下几类: • 01背包问题:每个物品只有⼀个(重点掌握)• 完全背包问题&#xff1…

ffmpeg封装和解封装介绍-(10)综合完成视频重编码为h265,解封装解码编码再封装

主函数逐句解析: 由于代码太多我们只解析主函数,(其他封装函数见前面文章,同时用到了解码编码封装代码)。 初始化和参数处理 int main(int argc, char* argv[]) {/// 输入参数处理string useage "124_test_x…

【计算机网络】已解决:“‘ping‘ 不是内部或外部命令,也不是可运行的程序或批处理文件”报错

文章目录 一、问题分析背景二、可能出错的原因三、错误代码示例四、正确解决方法与示例五、注意事项 已解决“‘ping’ 不是内部或外部命令,也不是可运行的程序或批处理文件”报错 一、问题分析背景 在Windows操作系统中,ping 命令是一个常用的网络诊断…

线程池ThreadPoolExecutor使用指南

线程池ThreadPoolExecutor使用指南 🧐使用线程池的好处是什么? 统一管理,减少资源获取创建的开销,提高利用率。 🔧线程池的参数 ​ThreadPoolExecutor​ 3 个最重要的参数: ​corePoolSize​ : 任务队列…

docker login 报错: http: server gave HTTP response to HTTPS client

环境: 自建 Harbor、Docker 1. 问题分析 # 命令,这里用的是 IP,可以为域名 docker login -u test 172.16.51.182:31120 # 输入密码 Password:# 报错如下: Error response from daemon: Get "https://172.16.51.182:31120/…

HIVE及SparkSQL优化经验

简介 针对高耗跑批时间长的作业,在公司近3个月做过一个优化专项;优化成效:综合cpu、内存、跑批耗时减少均在65%以上; cpu和内存消耗指的是:vcoreseconds和memoryseconds 这里简单说下优化的一些思路,至于…

[Algorithm][贪心][增减字符串匹配][分发饼干][最优除法][跳跃游戏Ⅱ][跳跃游戏]详细讲解

目录 1.增减字符串匹配1.题目链接2.算法原理详解3.代码实现 2.分发饼干1.题目链接2.算法原理详解3.代码实现 3.最优除法1.题目链接2.算法原理详解3.代码实现 4.跳跃游戏 II1.题目链接2.算法原理详解3.代码实现 5.跳跃游戏1.题目链接2.算法原理详解3.代码实现 1.增减字符串匹配 …

图神经网络pytorch_geometric库之MessagePassing类

MessagePassing是图神经网络Python库pytorch_geometric(PyG)库里非常重要的一个基类,它可以用来创建消息传递图神经网络,pytorch_geometric里很多类比如图卷积层GCNConv和图注意力层GATConv都基于此类实现,我们也可以基于它来自定义图神经网络…

期末复习6--链表头插法(逆序)尾插法(顺序)---输出链表

头插法 #include <stdio.h> #include <stdlib.h>struct Node //定义结构体 {char data; //数据域struct Node * next; //指针域 };/* 请在这里填写答案 */void PrintList (struct Node * head) {struct Node * s;if(head NULL){printf("None&qu…

mybatisplus 笔记

int isDelete userRoleMapper.delete(new LambdaQueryWrapper<UserRole>().in(UserRole::getUserId, roleUserDTO.getUserId()).in(UserRole::getRoleId, roleUserDTO.getRoleId()));LambdaQueryWrapper<UserRole>: LambdaQueryWrapper 是 MyBatis Plus 提供的一个…

Apipost模拟HTTP客户端

模拟HTTP客户端的软件有很多&#xff0c;其中比较著名的就有API-FOX、POSTMAN。 相信很多小伙伴都使用POSTMAN。这篇博客主要介绍Apipost的原因是&#xff0c;Apipost无需下载&#xff0c;具有网页版。 APIFOX的站内下载&#xff1a; Api-Fox&#xff0c;类似于PostMan的软件…

时间复杂度和空间复杂度的深入解析

在算法和数据结构的学习中&#xff0c;时间复杂度和空间复杂度是两个至关重要的概念。它们分别用于衡量算法在执行过程中所需的计算资源&#xff08;时间&#xff09;和存储资源&#xff08;空间&#xff09;。以下&#xff0c;我们将从技术难点、面试官关注点、回答吸引力以及…

JavaFX 节点

JavaFX Node类javafx.scene.Node是添加到JavaFX 场景图的所有组件 的基类&#xff08;超类&#xff09; 。JavaFX Node 类是抽象的&#xff0c;因此你只需将 Node 类的子类添加到场景图中。场景图中的所有 JavaFX Node 实例共享一组由 JavaFX Node 类定义的公共属性。本 JavaFX…

毕节前端工程师前景怎么样:深入剖析与全面展望

毕节前端工程师前景怎么样&#xff1a;深入剖析与全面展望 在数字化浪潮的推动下&#xff0c;前端工程师作为连接技术与用户的桥梁&#xff0c;其职业前景备受关注。毕节地区的前端工程师同样面临着机遇与挑战并存的局面。那么&#xff0c;毕节前端工程师的前景究竟如何呢&…