开源模型应用落地-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, 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32CubeMX配置-RTC周期唤醒

一、简介 MCU为STM32G070,采用内部时钟32KHZ,配置为周期6s唤醒,调用回调函数,进行喂狗操作。 二、配置 初始时间、日期、周期唤醒时间配置。 开启周期唤醒中断 三、生成代码 调用回调函数,进行喂狗操作。 //RTC唤醒回…

vue-i18n使用步骤详解(含完整操作步骤)

开篇 下面是从创建vue项目开始,完整使用i18n实现国际化功能的步骤,希望对您有所帮助。 完整步骤 创建项目 创建项目,并在创建项目的时候选择vuex,router 选择3.x版本 后面随意选即可,下面是完整的代码结构 安装vue-i18n,并封装…

数据库事务隔离级别

前几天项目上合作公司的系统出现了一次死锁,突然想到由于近几年开发设计的系统并发用户比较少,很久没有碰到过死锁了,因此对死锁的概念也比较生疏了,需要温习一下。 事务 先从最基本的概念开始,事务、及其ACID特性。…

牛客热题:最长上升子序列(一)

📟作者主页:慢热的陕西人 🌴专栏链接:力扣刷题日记 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 文章目录 牛客热题:最长上升子序列(一)题目链接方法…

浅谈赚钱的四个级别,你在哪一层呢

一谈到赚钱,很多人都会扯到:智商、情商、人脉、资源、背景等等,类似“小钱靠勤,中钱靠智,大钱靠德”这样的经典语录都会脱口而出,其实从本质上来讲,都没有错,但这样的说法太缥缈&…

基于CPS-SPWM链式STATCOM系统在电压不平衡环境下控制策略的simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于CPS-SPWM链式STATCOM系统在电压不平衡环境下控制策略的simulink建模与仿真。利用电压外环PI调节器得到有功 电流指令值结合由负载侧电流检测 到 的无功 电流指令值 &#…

element-plus表单组件之自动补全组件el-autocomplete和级联选择器组件el-cascader

el-autocomplete 自动补全组件 自补全组件的功能和可以根据输入过滤的el-select组件有些类似。 fetch-suggestions 根据输入框的输入获取建议的内容,其接受值是一个函数,有2个参数,querystring:输入的内容,callback内置函数&…

C 语言连接MySQL 数据库

前提条件 本机安装MySQL 8 数据库 整体步骤 第一步:开启Windows 子系统安装Ubuntu 22.04.4,安装MySQL 数据库第三方库执行 如下命令: sudo aptitude install libmysqlclient-dev wz2012LAPTOP-8R0KHL88:/mnt/e/vsCode/cpro$ sudo aptit…

【论文阅读】AttnDreamBooth | 面向文本对齐的个性化图片生成

文章目录 1 动机2 方法3 实验 1 动机 使用灵活的文本控制可以实现一些特定的概念的注入从而实现个性化的图片生成。 最经典的比如一些好玩的动漫人物的概念,SD大模型本身是不知道这些概念的,但是通过概念注入是可以实现的从而生成对应的动漫人物 两个…

使用Java Spring Boot生成二维码与条形码

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

【分布式计算】java消息队列机制

消息队列是一种在不同组件或应用之间进行数据传递的技术,通常用于处理异步通信。它允许消息的发送者(生产者)和接收者(消费者)之间进行解耦。 概念 消息队列是一种先进先出(FIFO)的数据结构&…

(三十九)Vue之集中式的状态管理机制Vuex

目录 概念vuex的核心概念State(状态)Getters(获取器)Mutations(突变)Actions(动作) 搭建vuex环境基本使用getters的使用 上一篇:(三十八)Vue之插槽…

02 设计过程概述

02 设计过程概述 2-1 设计需求2-2 飞机设计的各个阶段2-2-1 概念设计2-2-2 初步设计2-2-3 详细设计 2-3 飞机概念设计的流程2-4 集成产品开发和飞机设计2-5 补充2-5-1 布局设计(Configuration Design)关键任务:作用和重要性:使用领…

SinoDB导入导出工具汇总

在进行数据迁移、数据库表备份、表重建以及批量数据加载时,我们经常希望数据处理过程能够更快点。本文是SinoDB导入导出工具的汇总,大家可以根据不同场景选择合适的SinoDB导入导出工具。 1. 各工具特点 通常利用dbschema工具导出数据库结构,…

父亲节 | 10位名家笔下的父亲,读懂那份孤独而深沉的父爱

Fathers Day 母爱如水,父爱如山。 相对于母爱的温柔,父亲的爱多了几分静默和深沉。 读完10位名家笔下的父亲,我们就会明白,到底亏欠了父亲多少。 不要让自己有“子欲养而亲不待”的后悔和遗憾, 多给父亲一些爱的表示&a…

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 01 为什么需要一个新的网络架构

关于专栏 本专栏是工作之后阅读 Cloud Native Data Center Networking ( O’Reilly, 2019)的读书笔记。这本书是我在数据中心从事云网络工作的启蒙、扫盲读物。可惜,其中文版翻译并非尽善尽美,必须结合英文原版才能理解原作者要表…

期末算法复习

0-1背包问题(动态规划) 例题 算法思想: 动态规划的核心思想是将原问题拆分成若干个子问题,并利用已解决的子问题的解来求解更大规模的问题。 主要是状态转移方程和状态 算法描述: 初始化一个二维数组dp&#xff0…

通过命令行启动MySQL

通过命令行启动MySQL 右击,选择管理员运行 停止MySQL net stop你的服务名称 net stop MySQL启动MySQL net start你的服务名称 net start MySQL

绿色版DirectoryOpus功能强大且高度可定制的Windows文件管理器

Directory Opus(通常简称为DOpus)是一款功能强大且高度可定制的Windows文件管理器。它提供了许多超越Windows默认文件资源管理器(Explorer)的功能,使得文件和文件夹的管理变得更加高效和直观。以下是对Directory Opus的…

破解动态网页:如何用JavaScript获取自动消失的联想词

前几天在做数据分析时,我尝试获取某网站上输入搜索词后的联想词,输入搜索词后会弹出一个显示联想词的框。有趣的是,当我尝试通过按F12定位这个弹框在HTML中的位置时,输入框失去焦点后,联想词弹框就自动消失了。我观察到…