开源模型应用落地-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)时开发的深度学习框架。该工具可用于图像分类、语音和…

胡说八道(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/…

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

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

期末复习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…

Apipost模拟HTTP客户端

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

JavaFX 节点

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

一文了解Redis

一.什么是Redis 与MySQL一样&#xff0c;Redis也是客户端服务器结构的程序&#xff0c;是基于内存的键值对存储系统&#xff0c;属于NoSQL的一种。与很多键值对数据库不同的是&#xff0c;Redis 中的值可以是由 string&#xff08;字符串&#xff09;、hash&#xff08;哈希&a…

【算法专题--链表】删除排序链表中的重复元素II -- 高频面试题(图文详解,小白一看就懂!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐ 双指针 -- 采用 哨兵位头节点 &#x1f95d; 什么是哨兵位头节点&#xff1f; &#x1f34d; 解题思路 &#x1f34d; 案例图解 四、总结与提炼 五、共勉 一、前言 删除排序链表中的重复元素II元素这道题&#xff0c…

【JKI SMO】框架讲解(二)

JKI State Machine 讲解 将JKI State Machine 模板拖曳到程序框图中&#xff0c; 如下图&#xff0c; 此模板会默认放置一个OK按钮在前面板中&#xff0c;用于提示用户如何增加一个简单的用户事件去使用此框架。 “Event Structure”&#xff0c;Idle&#xff1a;此分支可以设…

【JS重点17】原型链(面试重点)

一&#xff1a;原型链底层原理 以下面一段代码为例&#xff0c;基于原型对象&#xff08;Star构造函数的原型对象&#xff09;的继承使得不同构造函数的原型对象关联在一起&#xff08;此处是最大的构造函数Object原型对象&#xff09;&#xff0c;并且这种关联的关系是一种链…

C#联合Halcon机器视觉框架源码—升级版

相较于之前的NxtVision&#xff0c;本软件代码架构更加合理&#xff0c;且新增ui设计器、原来的vb脚本改为C#脚本&#xff0c;并尝试将视觉与运动控制相结合&#xff0c;是一体化的框架。 对源码有需求的&#xff0c;订阅本专栏后&#xff0c;私信我领取。

活动集锦 | 英码科技积极参与行业盛会,AI赋能城市数字化转型

在当今数字经济时代&#xff0c;城市全域数字化转型已经成为提升城市管理效能、优化资源配置、推动经济发展的重要手段。英码科技始终致力于为企业打造高效、低成本的行业应用方案&#xff0c;助力企业实现数字化转型。近日&#xff0c;英码科技受邀参加了多场行业展示活动&…

操作系统复习-线程同步

互斥量 两个线程的指令交叉执行互斥量可以保证先后执行称为原子性 原子性是指一系列操作不可被中断的特性这一系列操作要么全部执行完成&#xff0c;要么全部没有执行不存在部分执行部分未执行的情况 互斥锁 互斥量是最简单的线程同步的方法互斥锁&#xff0c;处于两态之一的…