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

news2024/11/24 10:50:47

一、前言

    尽管现在的大语言模型已经非常强大,可以解决许多问题,但在处理复杂情况时,仍然需要进行多个步骤或整合不同的流程才能达到最终的目标。然而,现在可以利用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, RunnablePassthrough

def 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 itemgetter

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough, RunnableParallel
from langchain_openai import ChatOpenAI

os.environ["OPENAI_API_KEY"] = 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'  # 你的Open AI Key

def get_rainfall(prompt):
    print('修改前的prompt:'+prompt['question'])
    prompt_new = prompt['question'].replace("天气如何?", "降雨量如何?")
    print('修改后的prompt:' + prompt_new)
    return

if __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 itemgetter

data = [('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 itemgetter

data = [('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 itemgetter

person = {'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 itemgetter

point = (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.coloradmin.cn/o/1830437.html

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

相关文章

树状数组练习

先看一下最后一题&#xff0c;这是一个树状数组的题目&#xff0c;那就水一下吧,但是由于没有注意问题&#xff0c;wa了很多次 const int N (int)1e5 5; int n; int flag[N]; int dp[N]; class Solution { public:vector<int> countOfPeaks(vector<int>& num…

【秋招突围】2024届秋招笔试-小红书笔试题-第二套-三语言题解(Java/Cpp/Python)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系计划跟新各公司春秋招的笔试题 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f4e7; 清隆这边…

意大利罗马3日自由行攻略

欢迎关注「苏南下」 在这里分享我的旅行和影像创作心得 今天来和大家聊聊我个人很喜欢的一座城市—意大利罗马。 作为意大利的首都&#xff0c;罗马自公元前753年建成至今&#xff0c;有超过2700年的历史&#xff0c;被誉为“永恒之城”。走在罗马街头&#xff0c;几乎看不到一…

使用 Python 进行测试(3)pytest setup

总结 我们前进到更真实的项目&#xff1a; less_basic_project ├── my_awesome_package │ ├── calculation_engine.py │ ├── __init__.py │ ├── permissions.py ├── pyproject.toml └── tests├── conftest.py├── test_calculation_engine.p…

283. 移动零 (Swift版本)

题目描述 最容易想到的解法 从后向前遍历, 发现0就通过交换相邻元素将0移动到最后 class Solution {func moveZeroes(_ nums: inout [Int]) {for index in (0..<nums.count).reversed() {if nums[index] 0 {moveZeroes(&nums, index)}}}func moveZeroes(_ nums: inout …

Mybatis plus join 一对多语法

一对多案例&#xff08;set集合&#xff09; 1. 实体类 题目 package co.yixiang.exam.entity;import co.yixiang.domain.BaseDomain; import co.yixiang.exam.config.CustomStringListDeserializer; import com.baomidou.mybatisplus.annotation.TableField; import com.fa…

youlai-boot项目的学习—本地数据库安装与配置

数据库脚本 在项目代码的路径下&#xff0c;有两个版本的mysql数据库脚本&#xff0c;使用对应的脚本就安装对应的数据库版本&#xff0c;本文件选择了5 数据库安装 这里在iterm2下使用homebrew安装mysql5 brew install mysql5.7注&#xff1a;记得配置端终下的科学上网&a…

PHP7 数组的实现

前提 PHP版本&#xff1a;php7.0.29使用到的文件 php-src/Zend/zend_types.hphp-src/Zend/zend_hash.hphp-src/Zend/zend_hash.cphp-src/Zend/zend_string.h 本文 是《PHP7底层设计和源码实现》第5章 数组的实现&#xff0c;学习笔记 功能分析 整体结构 bucket 里面增加h字段…

android studio CreateProcess error=2, 系统找不到指定的文件

【问题记录篇】 在AndroidStudio编译开发jni相关工程代码的时候&#xff0c;编译遇到的这个报错&#xff1a; CreateProcess error2, 系统找不到指定的文件。排查处理步骤: 先查看Build Output的具体日志输出 2.了解到问题出在了NDK配置上&#xff0c;此时需要根据自己的gra…

RTOS实时操作系统

常见的RTOS有&#xff1a; VxWorks&#xff1a;广泛应用于工业、医疗、通信和航空航天领域。FreeRTOS&#xff1a;一个开源的RTOS&#xff0c;广泛用于嵌入式设备。uc/OS&#xff1a;一个适用于教育和小型商业项目的RTOS。QNX&#xff1a;主要应用于汽车和工业自动化领域。Win…

第 2 章:Spring Framework 中的 IoC 容器

控制反转&#xff08;Inversion of Control&#xff0c;IoC&#xff09;与 面向切面编程&#xff08;Aspect Oriented Programming&#xff0c;AOP&#xff09;是 Spring Framework 中最重要的两个概念&#xff0c;本章会着重介绍前者&#xff0c;内容包括 IoC 容器以及容器中 …

Android-茫茫9个月求职路,终于拿满意offer

线程和进程的区别&#xff1f;为什么要有线程&#xff0c;而不是仅仅用进程&#xff1f;算法判断单链表成环与否&#xff1f;如何实现线程同步&#xff1f;hashmap数据结构&#xff1f;arraylist 与 linkedlist 异同&#xff1f;object类的equal 和hashcode 方法重写&#xff0…

免费分享:2017-2021全球10m土地利用数据(esri)(附下载方法)

美国环境系统研究所公司&#xff08;Environmental Systems Research Institute, Inc. 简称ESRI公司&#xff09;&#xff0c;以其先进的ArcGIS解决方案&#xff0c;为全球各行业提供多层次、可扩展、功能强大且开放性强的GIS技术。哨兵2号&#xff08;Sentinel-2&#xff09;是…

国产MCU芯片(2):东软MCU概览及触控MCU

前言: 国产芯片替代的一个主战场之一就是mcu,可以说很多国内芯片设计公司都打算或者已经在设计甚至有了一款或多款的量产产品了,这也是国际大背景决定的。过去的家电市场、过去的汽车电子市场,的确国产芯片的身影不是很常见,如今不同了,很多fabless投身这个行业,一种是…

【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)

&#x1f525;引言 本篇将深入解析单链表:探索底层逻辑&#xff0c;理解底层是如何实现并了解该接口实现的优缺点&#xff0c;以便于我们在编写程序灵活地使用该数据结构。 &#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &…

3. ceph-mimic版本部署

ceph-mimic版本部署 一、ceph-mimic版本部署1、环境规划2、系统基础环境准备2.1 关闭防火墙、SELinux2.2 确保所有主机时间同步2.3 所有主机ssh免密2.4 添加所有主机解析 3、配置ceph软件仓库4、安装ceph-deploy工具5、ceph集群初始化6、所有ceph集群节点安装相关软件7、客户端…

【C++】多态|原理|override|final|抽象类|多继承虚函数表|对象模型|虚表打印|(万字详解版)

目录 ​编辑 一.多态的概念 二.多态的构建 虚函数 重写 虚函数重写的例外 协变 隐藏 析构函数的重写 三.重载、重写(覆盖)、隐藏(重定义)的对比 四.C11新增的 override 和 final override final 五.抽象类 六.多态的原理 虚函数表 总结&#xff1a; 引用…

CMake多行注释以及通过Message打印不同级别日志

1 CMake注释 1.1 单行注释 CMake中单行注释时以 # 开头。 # 指定CMake最低版本cmake_minimum_required(VERSION 3.20)# 这是注释project(myproject)1.2 多行注释 多行注释时&#xff0c;以 #[[ 开头&#xff0c;以 ]] 结尾&#xff0c;中间都可以写注释内容。3.0之前的版本…

MySQL面试重点-1

1. 数据库基础知识&#xff1a; DDL、DML、DQL、DCL的概念与区别&#xff1f; DDL&#xff08;数据定义语言&#xff09;&#xff1a;创建&#xff08;CREATE&#xff09;数据库中的各种对象&#xff1a;表、视图、索引等DML&#xff08;数据操纵语言&#xff09;&#xff1a…

点积和叉积

文章目录 1、向量的点积2、向量的叉积3、矩阵的点积4、矩阵的叉积 1、向量的点积 数量积又称标量积&#xff08;Scalar product&#xff09;、点积&#xff08;Dot product&#xff09;&#xff0c;在欧几里得空间&#xff08;Euclidean space&#xff09;中称为内积&#xff…