【大语言模型】LangChain ModelsIO与Models I/O Promopts详解

在这里插入图片描述


【大语言模型】LangChain ModelsIO与Prompts详解

  • 一、LangChain ModelsIO
    • 1、简介
    • 2、Models I/O 的应用场景
    • 3、Models I/O 主要模块
      • 3.1、Prompts
      • 3.2、Models
        • a、MESSAGES 类型
      • 3.3、Output Parsers
  • 二、LangChain ModelsIO Prompts
    • 1、简介
    • 2、Prompts 的优点
    • 3、实战示例
      • 3.1、PromptTemplate 提示模板的用法
        • 3.1.1、LCEL 表达式
      • 3.2、ChatPromptTemplate 聊天提示模板的用法
        • 3.2.1、二元组
        • 3.2.2、MessagePromptTemplate 或 BaseMessage 的实例
      • 3.3、LCEL 表达式

一、LangChain ModelsIO

1、简介

LangChain 实质上是对大语言模型(LLM)的一个扩展封装,其主要目的仍然是为了更好的使用大语言模型。

通过 LangChain,用户可以通过输入文本或补充模板信息来获取符合需求的文本输出。不难看出 LangChain 最终操作的结果都是字符串,因此在使用过程中不可避免地涉及到大量的文本处理工作,例如输入的格式化和输出结果的解析等。

2、Models I/O 的应用场景

文本处理工作既复杂又重复,对于开发者来说是一个必要但不重要的繁琐步骤。

LangChain 深知文本处理的痛点,因此提供了 Prompt Templates 和 Output Parser 抽象。用户可以根据自己的需求选择合适的实现类型,从而简化文本处理工作,提高开发效率。I/O 最主要的需要包含以下两个部分:

  • Prompt Templates: 负责请求数据的准备步骤。
  • Output Parser:则用于解析输出结果。

这样开发者就可以专注于业务逻辑的实现,而无需过多关注底层的文本处理细节。这种抽象的设计使得 LangChain 在大语言模型应用开发中具有更强的灵活性和可扩展性。

3、Models I/O 主要模块

在这里插入图片描述

3.1、Prompts

提示指的是将用户输入转换为语言模型的输入。这个提示由提示模板完成,它将用户的输入转换为一系列消息列表或最终的字符串对象。LangChain 提供了多种抽象,使得操作提示变得更加简单和灵活。

包含以下几种类型:

  • PromptValue:包含一个要转换为字符串的方法,以及一个要转换为消息列表的方法。
  • PromptTemplate:由模板字符串组成,格式化用户输入转为大语言模型的输入。
  • MessagePromptTemplate:由模板消息和一个 PromptTemplate 组成,将用户输入进行格式化,以生成最终字符串,即为消息的 content。
  • MessagesPlaceholder:消息的输入可以是消息列表。
  • ChatPromptTemplate:由 MessagePromptTemplate 和 MessagesPlaceholder 的列表组成,根据用户输入对这些内容进行格式化以生成最后的消息列表。

3.2、Models

LangChain 集成的模型主要有两个类型:LLMs 和聊天模型。

LLMs:指的是纯文本补全模型,包装的 API 将字符串提示作为输入并输出字符串完成。
Chat Models:聊天模型在 LLMs 的基础上针对对话进行了调整。将包含聊天消息的列表作为输入,
不同模型适合不同的提示策略,这意味着为一种模型设计的优化提示可能无法直接应用于其他模型。虽然 LangChain 提供了许多默认提示,但无法保证这些默认提示在所有模型中都能发挥良好的效果。

a、MESSAGES 类型

ChatModels 将详细列表作为输入并返回消息。所有消息都有一个 role 和 content 属性。role 代表消息的发出者是谁,content 描述了消息的具体内容,可能是几种不同的内容形式

除了上述两种类型外,消息还有一个 additional_kwargs 的属性,可以传递消息的附加信息,例如 OpenAI 的 function_call 。

类型作用
HumanMessage代表用户的消息。
AIMessage代表模型输出的消息。
SystemMessage代表系统消息。
FunctionMessage表示函数调用的结果,该参数为被调用的函数的名称。
ToolMessage表示工具调用的结果,对应匹配 OpenAI 的 function 和 tool 消息类型。

3.3、Output Parsers

输出解析器是用来处理模型生成的文本输出的组件,它接收模型的输出并将其转换为更易于使用的形式。

通常,输出解析器会将模型输出中的信息提取出来,特别是针对输出信息中的内容部分,有时也会处理额外的参数,如 additional_kwargs 字段中的值。

常见的输出解析器类型有如下几种:

  • StrOutputParser:把语言模型的输出转换为字符串。
  • OpenAI Functions Parsers:用于处理 OpenAI 函数调用,获取并使用 function_call 和 arguments 参数。
  • Agent Output Parsers:根据用户输入和应用场景,选择合适的方案来执行操作。

二、LangChain ModelsIO Prompts

1、简介

在 LangChain Models 中输入和输出同样重要,Promots 即为对输入信息的处理。这些提示是用户提供给模型的一组指令或输入,旨在触发模型生成响应并协助理解上,以生成相关且连贯的语言的输出。

但是涉及到提示的内容过于冗长,并且很多是重复且不需要每次关注的内容,为了简化这一过程并提高效率,Prompts 提供了许多模板类型,使得输入步骤变得更加简洁高效。

2、Prompts 的优点

LangChain 提供的常见模板能够帮助用户快速构建适当的输入,以获得相对准确的输出结果。Langchain 的目标是创建出与模型无关的模板,以便能够轻松地跨不同语言模板重用现有模板。

模板可以包括说明、少量示例以及适合给定任务的特定上下文和问题。

并且所有模板都实现了 Runnable 接口,在内部完成对于 Runnable 的实现,这样用户可以轻松的使用 LCEL 将 prompt 与其他的 Runnable 对象连接起来。

3、实战示例

3.1、PromptTemplate 提示模板的用法

使用 PromptTemplate 创建字符串提示模板,默认情况下 PromptTemplate 使用 Python 的 str.format 语法进行模板化。

用户只需要自定义的消息提示语,将不同部分用插值的方式表示来自定义提示模板。

PromptTemplate 支持多个变量,如下代码所示:

from langchain_core.prompts import PromptTemplate
# 定义一个包含两个变量的提示模板
prompt = PromptTemplate.from_template("给出一个{topic} 的广告, 它的价格是 {price} ¥,广告需要能够引起用户的兴趣")
# 格式化并传入参数
print(prompt.format(topic='冰淇淋', price=3))
# 给出一个冰淇淋的广告, 它的价格是 3 ¥,广告需要是能够引起用户兴趣的

除了支持多个变量之外,还支持无变量的形式,如下代码所示:

from langchain_core.prompts import PromptTemplate
# 定义一个包含两个变量的提示模板
prompt = PromptTemplate.from_template("告诉我一个广告")
# 格式化并传入参数
print(prompt.format())
# 告诉我一个广告
3.1.1、LCEL 表达式

PromptTemplate 接受字典并返回 StringPromptValue。

# 定义一个包含两个变量的提示模板
prompt = PromptTemplate.from_template("给出一个{topic} 的广告, 它的价格是 {price} ¥,广告需要能够引起用户的兴趣")
# invoke 调用
prompt_val = prompt.invoke({"topic": "冰淇淋", "price": "3"})
print(prompt_val)
# text='给出一个冰淇淋的广告, 它的价格是 3 ¥,广告需要是能够引起用户兴趣的'

通过 to_string() 方法能够将结果转换为字符串

# 定义一个包含两个变量的提示模板
prompt = PromptTemplate.from_template("给出一个{topic} 的广告, 它的价格是 {price} ¥,广告需要能够引起用户的兴趣")
# invoke 调用
prompt_val = prompt.invoke({"topic": "冰淇淋", "price": "3"})
print(prompt_val)
# text='给出一个冰淇淋的广告, 它的价格是 3 ¥,广告需要是能够引起用户兴趣的'
print(prompt_val.to_string())
#给出一个冰淇淋 的广告, 它的价格是 3 ¥,广告需要能够引起用户的兴趣

3.2、ChatPromptTemplate 聊天提示模板的用法

聊天模型的提示是聊天消息列表,传入时需要传入一个消息的列表,其中传入的消息都需要与 OpenAI 消息列表的 role 相关,每个 role 对应的有不同的文本描述用来串联上下文,Langchain 同样提供这样的形式来完成对 role 和 content 的定义,以实现更为方便的构建聊天提示。

聊天提示模板有两种书写方式:

  • 二元组。
  • MessagePromptTemplate 或 BaseMessage 的实例。
3.2.1、二元组

代码示例如下所示:

# 制定模板
chat_prompt = ChatPromptTemplate.from_messages([("system", "你是一个游戏的 npc,有三个任务让玩家完成,需要给出玩家三个任务,并且规定出完成的标准。"),("human", "你好,我是这个游戏的玩家"),("ai", "{user} 玩家你好,欢迎来到这个游戏"),("human", "{user_input}"),])
# 格式化消息列表,并且传入参数
messages = chat_prompt.format_messages(user="ling", user_input="你好,我需要做什么")
print(messages)
# [SystemMessage(content='你是一个游戏的 npc,有三个任务让玩家完成,需要给出玩家三个任务,并且规定出完成的标准。'), HumanMessage(content='你好,我是这个游戏的玩家'), AIMessage(content='ling 玩家你好,欢迎来到这个游戏'), HumanMessage(content='你好,我需要做什么')]
3.2.2、MessagePromptTemplate 或 BaseMessage 的实例
chat_template = ChatPromptTemplate.from_messages([SystemMessage(content=("你是一个擅长制定计划的助手""计划需要贴合用户需求,给出详细的时间节点和任务指标")),HumanMessagePromptTemplate.from_template("{user_req}")]
)
messages_o = chat_template.format_messages(user_req="我想要一个旅行计划")
print(messages_o)
# [SystemMessage(content='你是一个擅长制定计划的助手计划需要贴合用户需求,给出详细的时间节点和任务指标'), HumanMessage(content='我想要一个旅行计划')]

3.3、LCEL 表达式

ChatPromptValue 接受字典并返回转换后消息的值。可以转换为消息列表或者是转换为字符串。

# 使用 invoke 方式调用
chat_prompt = ChatPromptTemplate.from_messages([("system", "你是一个游戏的 npc,有三个任务让玩家完成,需要给出玩家三个任务,并且规定出完成的标准。"),("human", "你好,我是这个游戏的玩家"),("ai", "{user} 玩家你好,欢迎来到这个游戏"),("human", "{user_input}"),])
chat_val = chat_prompt.invoke({"user": "ling", "user_input": "你好,我需要做什么"})
print(chat_val)
# messages=[SystemMessage(content='你是一个游戏的 npc,有三个任务让玩家完成,需要给出玩家三个任务,并且规定出完成的标准。'), HumanMessage(content='你好,我是这个游戏的玩家'), AIMessage(content='ling 玩家你好,欢迎来到这个游戏'), HumanMessage(content='你好,我需要做什么')]
print(chat_val.to_string())
"""
System: 你是一个游戏的 npc,有三个任务让玩家完成,需要给出玩家三个任务,并且规定出完成的标准。
Human: 你好,我是这个游戏的玩家
AI: ling 玩家你好,欢迎来到这个游戏
Human: 你好,我需要做什么
"""

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

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

相关文章

MicroBlaze软核开发(三):DDR + FLASH

实现功能:使用 MicroBlaze软核,配置 DDR、Flash 接口,并将程序烧写固化到Flash,每次启动 FPGA 时自动运行 Flash 中的程序 。 Vivado版本:2018.3 FPGA:Xilinx Artix-7 系 目录 引言 Vivado部分&#xff1…

11.23[大数据]

PRO1:LSTM模型预测输出都是同一个值? 画出来的图像就是一条横线 这个搜了搜,原因可能有很多,但感觉最主要的原因极可能是激活函数选择不当,以及层的搭建不合适 原模型是 REF https://zhuanlan.zhihu.com/p/654325094 https:/…

基于SpringBoot+Vue的新闻管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着互联网技术的飞速发展,信息传播速度不断加快,新闻媒体行业面临着巨大的机遇与挑战。传统的新闻媒体正在逐渐向数字化转型,而新闻管理系统作为数字化新闻媒体的核心组成部分,其…

【C语言】完成程序设计填空

文章目录 1、请阅读下面的程序,在空白处填写正确的代码,要求各在一行从头开始输出m和n的值。2、求100~599之间的所有水仙花数,即各位数字的立方和恰好等于该数本身的数。3、以下程序的功能是:将值为三位正整数的变量x中的数值按照个位、十位、百位的顺序 拆分并输出。请填空…

MySQL-DDL之数据表操作

文章目录 一. 表的创建1. 表的创建2. 栗子 二. 查看表1. 查看数据库中的所有表2. 查看表结构 三. 删除表1. 删除表 四. 修改表结构1. 添加字段2. 修改字段3. 删除字段4. 修改表名 数据定义语言:简称DDL(Data Definition Language) 一. 表的创建 1. 表的创建 格式&…

【开源安全保护】如何安装JumpServer堡垒机

【开源安全保护】如何安装JumpServer堡垒机 什么是堡垒机 大家好,我是星哥,今天我以前来认识堡垒机 堡垒机(Bastion Host),也称为跳板机(Jump Server),是指在计算机网络中&#x…

【经典论文阅读】DDPM(Diffusion)

DDPM(Diffusion) denoising diffusion probabilistic models 【生成模型】DDPM概率扩散模型(原理代码)-CSDN博客 【DDPM】一文看懂去噪扩散概率模型,公式讲解、代码实现与最全详解(一)-CSDN博客 【DDPM】…

重拾Java:穿越最具多功能性的编程语言之旅

你知道Java是世界上最广泛使用的编程语言之一吗?无论是用于Web应用、企业系统,还是Android开发,Java始终是各级开发者的可靠选择。 在完成SESI SENAI的系统开发技术培训后,我决定重新学习这门语言。现在,我将其与我正…

MySQL--用户权限

1.使用root用户登录MySQL客户端,创建一个名为userl的用户,初始密码为123456;创建一个名为user2的用户,无初始密码。然后,分别使用uesr1、user2登录MySQL 客户端。 创建两个用户 使用user1登录 使用user2登录 2.使用root用户登录&a…

LabVIEW断路器检测系统

随着电网技术的快速发展,对电力系统的可靠性和安全性要求不断提高,塑壳断路器作为关键的保护设备,其出厂前的检测非常重要。开发了一种基于LabVIEW软件平台开发的塑壳断路器智能脱扣器检测系统,该系统能够有效提高检测的自动化水平…

Python实现Excel中数据条显示

Python中要实现百分比数据条的显示,可以使用pandas库,pandas图表样式的设置与Excel中的条件格式设置比较类似,比如Excel里常用的数据条的用法,在pandas中使用代码进行高亮显示,用来突出重点数据,下面一起来…

使用Vue3+Echarts实现加载中国地图,点击省份地图下钻(完整教程)

一. 前言 在众多 ECharts 图表类型中,开发者始终绕不开的有各种各样的地图开发,关于地图开发,可能比其他图表相对繁琐一些,其实说简单也简单,说复杂也复杂,其中不乏有层级地图、3D 地图等,感觉…

【机器学习】——windows下安装anaconda并在vscode上进行配置

一、安装anaconda 1.进入清华的镜像网站,下载自己电脑对应的anaconda版本。网站:https://repo.anaconda.com/archive/ 这里我下载的版本是anaconda3-2024.10-1-Windows-x86-64 2.下载完毕后开始安装anaconda 3.配置anaconda环境变量 在设置中找到编…

总结FastDFS的面试题

目录 一:FastDFS的基础知识 1:定义 2:FastDFS的优点 3:tracker server 4:storage server 二:FastDFS的存储原理 1:小文件存储的问题 2:小文件合并存储 3:文件上…

Leetcode打卡:骑士在棋盘上的概率

执行结果:通过 题目:骑士在棋盘上的概率 在一个 n x n 的国际象棋棋盘上,一个骑士从单元格 (row, column) 开始,并尝试进行 k 次移动。行和列是 从 0 开始 的,所以左上单元格是 (0,0) ,右下单元格是 (n - …

Oceanbase离线集群部署

准备工作 两台服务器 服务器的配置参照官网要求来 服务器名配置服务器IPoceanbase116g8h192.168.10.239oceanbase216g8h192.168.10.239 这里选oceanbase1作为 obd机器 oceanbase安装包 选择社区版本的时候自己系统的安装包 ntp时间同步rpm包 联网机器下载所需的软件包 …

漫画之家Spring Boot:漫画资源的跨设备访问

摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&a…

重生之我在21世纪学C++—循环语句

一、while 循环 1、while 语法形式 while ( 表达式 ) { 语句 } while默认只能跟一条语句,如果有多条语句,需要用{ }将语句括起来。 2、执行流程 首先上来先执行判断表达式,如果表达式的值为 0 ,就不进入循环;如…

微信小程序购物车全选反选功能以及合计

微信小程序基于Vant Weapp的购物车功能实现 1、单选 使用微信小程序原生表单组件checkbox和checkbox-group 注意&#xff1a;checkbox原生不支持bind:change事件&#xff0c;checkbox-group支持 <checkbox-group bindchange"handleCheck"><checkbox val…

DAY35|动态规划Part03|LeetCode:01背包问题 二维、01背包问题 一维、416. 分割等和子集

目录 01背包理论基础&#xff08;一&#xff09; 基本思路 C代码 01背包理论基础&#xff08;二&#xff09; 基本思路 C代码 LeetCode:416. 分割等和子集 基本思路 C代码 01背包理论基础&#xff08;一&#xff09; 题目链接&#xff1a;卡码网46. 携带研究材料 文字…