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

news2025/4/18 16:17:28

在这里插入图片描述


【大语言模型】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.coloradmin.cn/o/2257425.html

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

相关文章

Prometheus加入BasicAuth认证,通过配置 Prometheus 的 Web 身份验证来限制访问/debug/pprof/

Prometheus 作为监控工具,暴露了大量的系统监控数据和配置信息,这些数据可能包含敏感信息。Prometheus 默认没有身份验证,任何能够访问 Prometheus Web 界面的人都可以查看和查询这些数据。 此外Prometheus Web 界面的/debug/pprof/接口存在…

再谈多重签名与 MPC

目录 什么是 MPC 钱包以及它们是如何出现的 多重签名和智能合约钱包已经成熟 超越 MPC 钱包 关于小队 多重签名已经成为加密货币领域的一部分,但近年来,随着 MPC(多方计算)钱包的出现,多重签名似乎被掩盖了。MPC 钱包之…

QT 中基于 TCP 的网络通信

基础 基于 TCP 的套接字通信需要用到两个类: 1)QTcpServer:服务器类,用于监听客户端连接以及和客户端建立连接。 2)QTcpSocket:通信的套接字类,客户端、服务器端都需要使用。 这两个套接字通信类…

数值分析—数值积分

研究背景 积分的数学解法为牛顿莱布尼兹公式,数学表示为 ∫ a b f ( x ) d x F ( b ) − F ( a ) \int_{a}^{b} f(x)dxF(b)-F(a) ∫ab​f(x)dxF(b)−F(a),但应用该方法有如下困难: 1, f ( x ) f(x) f(x)的原函数有时不能用初等函…

如何配置Github并在本地提交代码

前提: 可以流畅访问github, 需要一些上网技巧, 这就自行处理了 申请一个github账号 Github官网地址 首先就是邮箱注册啦, github没有对邮箱的限制, 只要是能收邮件的就ok, qq邮箱, 163等都可以使用. 然后和普通注册账号一样, 一路填写需要的信息, 验证邮箱即可. 如何新增代…

Unity控制物体材质球的改变

Unity控制物体材质球的改变 1.前言2.示例单个材质球的获取和更改多个材质球的获取和更改 1.前言 材质球其实就是一个数组&#xff0c;有的只有一个&#xff0c;有的却有多个 2.示例 单个材质球的获取和更改 private Material m_material;m_material GetComponent<Render…

一些硬件知识【2024/12/6】

MP6924A: 正点原子加热台拆解&#xff1a; PMOS 相比 NMOS 的缺点&#xff1a; 缺点描述迁移率低PMOS 中的空穴迁移率约为电子迁移率的 1/3 到 1/2&#xff0c;导致导通电流较低。开关速度慢由于迁移率较低&#xff0c;PMOS 的开关速度比 NMOS 慢&#xff0c;不适合高速数字电…

数据结构排序算法详解

数据结构排序算法详解 1、冒泡排序&#xff08;Bubble Sort&#xff09;2、选择排序&#xff08;Selection Sort&#xff09;2、插入排序&#xff08;Insertion Sort&#xff09;4、快速排序&#xff08;Quick Sort&#xff09; 1、冒泡排序&#xff08;Bubble Sort&#xff09…

【CKS最新模拟真题】获取多个集群的上下文名称并保存到指定文件中

文章目录 前言一、TASK二、解题过程1、问题一解题2、问题二解题 前言 月底考CKS,这是最新版的CKS模拟题 环境k8s版本ubuntu1.31 考试期间允许访问的资源地址&#xff0c;支持将英文翻译为中文文档 文档地址kubernetes文档https://kubernetes.io/docs https://kubernetes.io…

Linux上的C语言编程实践

说明&#xff1a; 这是个人对该在Linux平台上的C语言学习网站笨办法学C上的每一个练习章节附加题的解析和回答 ex1: 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后运行它看看发生了什么。 vim ex1.c打开 ex1.c 文件。假如我们删除 return 0…

Fastadmin地图插件在表单中的使用

表单中实现地图选择获取经纬度 1.Fastadmin后台安装地图选择插件地图位置(经纬度)选择插件 - 支持百度地图、高德地图、腾讯地图 – 基于ThinkPHP和Bootstrap的极速后台开发框架 2.腾讯地图开放平台后台创建应用创建KEY&#xff0c;配置逆地址解析额度。插件配置中配置腾讯地图…

Java项目实战II基于微信小程序的电子竞技信息交流平台的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着互联网技术的飞速发展…

计算机网络期末常见问答题总结

1、试说明为什么在运输建立时使用三报文握手&#xff0c;如果不采用三报文握手会出现什么情况&#xff1f; TCP三次握手的目的是确保客户端和服务器都能够接收对方的连接请求,并建立起可靠的连接。如果只进行两次握手,可能会导致以下情况的发生: - 如果客户端发送的SYN包在网…

kubesphere搭建 postgres15

创建configMap POSTGRES_PASSWORD数据库密码 PGDATA数据目录 创建【有状态副本集】工作负载 1.创建基本信息 2.容器组设置 配置环境变量 3.存储设置 完成之后点击下一步 配置服务 创建服务 配置基本信息 配置服务信息 外部访问选择nodePort&#xff0c;然后点击…

【55 Pandas+Pyecharts | 实习僧网Python岗位招聘数据分析可视化】

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 去除重复数据2.4 调整部分城市名称 &#x1f3f3;️‍&#x1f308; 3. Pyecharts数据可视化3.1 招聘数量前20岗位3.2 各城市招聘数量3…

/usr/local/go/bin/go: cannot execute binary file: Exec format error

现象&#xff1a;ubuntu中安装go软件环境&#xff0c;报上述错误 原因&#xff1a;系统与软件不适配 解决&#xff1a;查看本系统的版本 找到x86-64对应的go版本即可

记录模板学习(持续更新)

目的&#xff1a; 学习C模板的编写&#xff0c;使用模板类包装一个可调用对象 可调用对象包括&#xff1a;普通函数&#xff0c; lambda表达式&#xff0c; 类成员函数 可以参考到QtConcurrent::run的实现&#xff0c;可以看到这个函数有非常多重载&#xff0c;其中可以接受类…

从0开始边做边学,用vue和python做一个博客,非规范化项目,怎么简单怎么弄,跑的起来有啥毛病解决啥毛病(三)

基础的内容都差不多了&#xff0c;开始研究文章详情页的内容设计&#xff0c;程序员嘛肯定要用markdown编辑了&#xff0c;找了一些发现这个md-editor看着还不错&#xff0c;文档介绍页比较清晰&#xff0c;用着也比较简单。 md-editor安装配置使用Mock.js模拟请求接口mock.js …

Android 逆向/反编译/Hook修改应用行为 基础实现

前言&#xff1a;本文通过一个简单的情景案例实现安卓逆向的基本操作 一、情景描述 本文通过一个简单的情景案例来实现安卓逆向的基本操作。在这个案例中所使用的项目程序是我自己的Demo程序&#xff0c;不会造成任何的财产侵害&#xff0c;本文仅作为日常记录及案例分享。实…

从0开始深度学习(35)——YOLO V5原理详解

以YOLO V5s为例&#xff0c;介绍YOLO V5的网络结构&#xff0c;以及其中具体的功能模块 1 YOLO V5的整体网络结构 YOLO V5网络结构分为四个部分&#xff1a; 输入端&#xff1a; 输入端负责对输入图像进行预处理&#xff0c;包括数据增强、锚框计算等。骨干网络&#xff08;Ba…