模型I/O功能之模型包装器

文章目录

    • 模型包装器分类
    • LLM模型包装器、
    • 聊天模型包装器

    截至2023年7月,LangChain支持的大语言模型已经超过了50种,这其中包括了来自OpenAI、Meta、Google等顶尖科技公司的大语言模型,以及各类优秀的开源大语言模型。对于这些大语言模型,LangChain都提供了模型包装器以实现交互。

    随着大语言模型的发展,LangChain的模型包装器组件也在不断升级,以适应各个大模型平台的API变化。2023年,OpenAI发布了GPT-3.5-Turbo模型,并且在他们的平台上增加了一个全新类型的API,即Chat类型API。这种API更适合用于聊天场景和复杂的应用场景,例如多轮对话。截至2023年8月,最新的GPT-4模型和Anthropic的Claude2模型都采用了Chat类型API。这种API也正在成为模型平台API的发展趋势。如果不使用这种API,将无法利用最强大的GPT-4模型,也无法生成接近“人类标准”的自然语言对话文本。因此,选择适合自己应用需求的API,以及配套的LangChain模型包装器组件,是在使用大语言模型进行开发时必须考虑的重要因素。

模型包装器分类

    LangChain的模型包装器组件是基于各个模型平台的API协议进行开发的,主要提供了两种类型的包装器。一种是通用的LLM模型包装器,另一种是专门针对Chat类型API的Chat Model(聊天模型包装器)。

    如下图所示,以OpenAI平台的两种类型API为例,如果使用text-davinci-003模型,则导人的是OpenAI的LLM模型包装器(图第①步),而使用GPT-4模型则需要导人ChatOpenAI的聊天模型包装器(图第②步)。选择的模型包装器不同,获得的模型响应也不同。选择LLM模型包装器获得的响应是字符串(图第③步),选择聊天模型包装器,它接收一系列的消息作为输人,并返回一个消息类型作为输出,获得的响应是AIMessage消息数据(图第④步)。

    LangChain的模型包装器组件提供了一种方便的方式来使用各种类型的大语言模型,无论是通用的LLM模型包装器,还是专门针对聊天场景的聊天模型包装器,都能让开发者更高效地利用大语言模型的能力。

图片名称

    LLM模型包装器是一种专门用于与大语言模型文本补全类型API交互的组件。这种类型的大语言模型主要用于接收一个字符串作为输人,然后返回一个补全的字符串作为输出。比如,你可以输人一个英文句子的一部分,然后让模型生成句子的剩余部分。这种类型的模型非常适合用于自动写作、编写代码、生成创意内容等任务。

    例如你想使用OpenAI的text-davinci-O03模型,你可以选择使用OpenAI模型包装器,示例如下:

from langchain.llms import OpenAI
openai =OpenAI (model name="text-davinci-003")

    代码中的openai是OpenAI类的一个实例,它继承了OpenAI类的所有属性和方法,你可以使用这个openai对象来调用OpenAI的text-davinci–O03模型,导人的OpenAI类即LangChain的模型包装器,专门用于处理OpenAI公司的Completion类型API。2023年,LangChain已经实现了50种不同大语言模型的Completion类型API的包装器,包括OpenAI、Llama.cpp、Cohere、Anthropic等。也就是说,开发者无须关注这50个模型平台的底层API是如何调用的,LangChain已经包装好了调用方式,开发者可以“即插即用”。

    通过LangChain.llms获取的所有对象都是大语言模型的包装器,这些对象称为LLM模型包装器。所有的LLM模型包装器都是BaseLLM的子类,它们继承了BaseLLM的所有属性和方法,并根据需要添加或覆盖一些自己的方法。这些包装器封装了各平台上的大语言模型的功能,使得开发者可以以面向对象的方式使用这些大语言模型的功能,而无须与各个模型平台的底层API进行交互。

    需要注意的是,OpenAI的Text Completion类型API在2023年7月进行了最后一次更新,该API现在只能用于访问较旧的历史遗留模型,如2020一2022年的模型text-davinci-O03、text-davinci-O02、Davinci、Curie、Babbage、Ada等。OpenAI的Text Completion类型API与新的Chat Completion类型API(以下简称Chat类型API”)不同。Text Completion类型API使得开发者可以直接提供一段具有特定上下文的文本,然后让模型在这个上下文的基础上生成相应的输出。尽管这种方式在某些场景下可能会更方便,比如翻译和写文案的场景,但在需要模拟对话或者复杂交互的情况下,OpenAI平台建议使用Chat类型API。

    相比之下,如果要使用OpenAI的最新模型,如2023年以后的模型GPT-4和GPT-3.5-Tubo,那么你需要通过Chat类型API进行访问。这意味着,如果你想充分利用OpenAI最新的技术,就需要将应用程序或服务从使用Text Completion类型API迁移到使用Chat类型API上。LangChain创建了聊天模型包装器组件,适配了模型平台的Chat类型API。

    通过LangChain.chat models获取的所有对象都是聊天模型包装器。聊天模型包装器是一种专门用于与大语言模型的Chat类型API交互的包装器组件。设计这类包装器主要是为了适配GPT-4等先进的聊天模型,这类模型非常适合用于构建能与人进行自然语言交流的多轮对话应用,比如客服机器人、语音助手等。它接收一系列的消息作为输人,并返回一个消息作为输出。

    2023年7月,LangChain已经实现了6个针对不同模型平台的聊天模型包装器:

  1. ChatOpenAI:用于包装OpenAI Chat大语言模型(如GPT-4和GPT-3.5-Turbo);
  2. AzureChatOpenAI:用于包装Azure平台上的OpenAI模型;
  3. PromptLayerChatOpenAI:用于包装PromptLayer平台上的OpenAI模型;
  4. ChatAnthropic:用于包装Anthropic平台上的大语言模型;
  5. ChatGooglePalm:用于包装Google Palm平台上的大语言模型;
  6. Chat VertexAI:用于包装Vertex AI平台上的大语言模型,Vertex AI的PaLM API中包含了Google的Pathways Language Model2(PaLM2)的发布端点。

    聊天模型包装器都是BaseChatModel的子类,继承了BaseChatModel的所有属性和方法,并根据需要添加或覆盖一些自己的方法。例如,如果你想使用最先进的GPT-4模型,那么可以选择使用ChatOpenAI模型包装器,示例如下:from langchain.chat models import ChatOpenAI11m ChatopenAI(temperature=0,model name=“gpt-4”)在上述代码中,llm是ChatOpenAI类的一个实例,你可以使用这个llm对象来调用GPT-4模型的功能。LLM模型包装器和聊天模型包装器,都是LangChain对各个大语言模型底层API的封装,开发者无须关注各个模型平台底层API的实现方式,只需要关注模型输人什么,以及输出什么。

    在LangChain的官网文档中,凡是涉及模型输人、输出的链Chain)和代理(Agent)的示例代码,都会提供两份。一份是使用LLM模型包装器的,一份是使用聊天模型包装器的,这是因为两者之间存在着细微但是很重要的区别。

  1. 输入的区别对于LLM模型包装器,其输入通常是单一的字符串提示词(prompt)。例如,你可以输人"Translate the following English text to French:‘{text}",然后模型会生成对应的法文翻译。另外,LLM模型包装器主要用于文本任务,例如给定一个提示“今天的天气如何?”模型会生成一个相应的答案“今天的天气很好。”聊天模型包装器,其输人则是一系列的聊天消息。通常这些消息都带有发言人的标签(比如系统、AI和人类)。每条消息都有一个role(角色)和content(内容)。例如,你可以输人[{“role”:“user”,"content’“:Translate the following English text toFrench::”{text"}】,模型会返回对应的法文翻译,但是返回内容包含在AIMessage(…)内。
  2. 输出的区别对于LLM模型包装器,其输出是一个字符串,这个字符串是模型对提示词的补全。而聊天模型包装器的输出是一则聊天消息,是模型对输入消息的响应。虽然LLM模型包装器和聊天模型包装器在处理输人和输出的方式上有所不同,但是为了使它们可以混合使用,它们都实现了基础模型接口。这个接口公开了两个常见的方法:predict(接收一个字符串并返回一个字符串)和predict messages(接收一则消息并返回一则消息)。这样,无论你是使用特定的模型,还是创建一个应该匹配其他类型模型的应用,都可以通过这个共享接口来进行操作。

    之所以要区分这两种类型,主要是因为它们处理输人和输出的方式不同,且各自适用的场景不同。通过这种方式,开发者可以更好地利用不同类型的大语言模型,提高模型的适用性和灵活性。在LangChain的发展迭代过程中,每个模块调用模型I/O功能都提供了LLM模型包装器和聊天模型包装器两种代码编写方式。因为OpenAI平台的底层API发生了迭代,LangChain为了不增加开发者的代码修改量,更好地适配新的大语言模型发展要求,做了类型划分。这种划分已经形成了技术趋势,同时也为学习LangChain提供了线索。

    如果你使用的是LangChain的Ilms模块导出的对象,则这些对象是LLM模型包装器,主要用于处理自由形式的文本。输人的是一段或多段自由形式文本,输出的则是模型生成的新文本。这些输出文本可能是对输人文本的回答、延续或其他形式的响应。相比之下,如果你使用的是LangChain的chat models模块导出的对象,则这些对象是专门用来处理对话消息的。输人的是一个对话消息列表,每条消息都由角色和内容组成。这样的输入给了大语言模型一定的上下文环境,可以提高输出的质量。输出的也是一个消息类型,这些消息是对连续对话内容的响应。

    当看到一个类的名字内包含“Chat”时,比如ChatAgent,那么就表示要给模型输入的是消,息类型的信息,也可以预测ChatAgent输出的是消息类型。

LLM模型包装器、

    LLM模型包装器是LangChain的核心组件之一。LangChain不提供自己的大语言模型,而是提供与许多不同的模型平台进行交互的标准接口。下面通过示例演示如何使用LLM模型包装器。示例代码使用的LLM模型包装器是OpenAI提供的模型包装器,封装了OpenAI平台的接口,导人方式和实例化方法对于所有LLM模型包装器都是通用的。

    首先,安装OpenAI Python包:pip install openai LangChain然后导人OpenAI模型包装器并设置好密钥:

from langchain.11ms import OpenAI
OpenAI.openai_api_key="填人你的密钥"

    使用LLM模型包装器最简单的方法是,输人一个字符串,输出一个字符串:
    #运行一个最基本的LLM模型包装器,由模型平台OpenAI提供文本生成能力

llm =OpenAI()
llm("Tell me a joke")

    运行结果如下:'Why did the chicken cross the road?\n\nTo get to the other side.'说明:这里的运行结果是随机的,不是固定的。

聊天模型包装器

    当前最大的应用场景便是“Chat”(聊天),比如模型平台OpenAI最热门的应用是ChatGPT。为了紧跟用户需求,LangChain推出了专门用于聊天场景的聊天模型包装器(Chat Model),以便能与各种模型平台的Chat类型API进行交互。聊天模型包装器以聊天消息作为输人和输出的接口,输入不是单个字符串,而是聊天消息列表。下面通过示例演示输人聊天消息列表的聊天模型包装器如何运行,以及与3.2.2节介绍的LLM模型包装器在使用上有什么区别。

    首先安装OpenAI Python包:pip install openai LangChain然后设置密钥:

import os
os.environ['OPENAI API KEY'='填人你的密钥'

    为了使用聊天模型包装器,这里将导人3个数据模式(schema):一个由AI生成的消息数据模式(AIMessage)、一个人类用户输人的消息数据模式(HumanMessage)、一个系统消息数据模式(SystemMessage)。这些数据模式通常用于设置聊天环境或提供上下文信息。然后导入聊天模型包装器ChatOpenAI,这个模型包装器封装了OpenAI平台Chat类型的API,无须关注OpenAI平台的接口如何调用,只需要关注向这个ChatOpenAI中输人的内容:

from langchain.schema import(AIMessage,HumanMessage,SystemMessage)
from langchain.chat models import ChatopenAI

    向ChatOpenAI聊天模型包装器输入的内容必须是一个消息列表。消息列表的数据模式需要符合AIMessage、HumanMessage和SystemMessage这3种数据模式的要求。这样设计的目的是提供一种标准和一致的方式来表示和序列化输入消息。序列化是将数据结构转换为可以存储或传输的数据模式的过程。在ChatOpenAI中,序列化是指将消息对象转换为可以通过API发送的数据。这样,接收消息的一方(OpenAI平台的服务器)就能知道如何正确地解析和处理每则消息了。

    在本示例中,SystemMessage是指在使用大语言模型时用于配置系统的系统消息,HumanMessage是指用户消息。下面将SystemMessage和HumanMessage组合成一个聊天消息列表,输入模型。这里使用的模型是GPT-3.5-Tubo。如果你有GPT-4,也可以使用GPT-4。

chat ChatopenAI (model name="gpt-3.5-turbo",temperature=0.3)
messages =[SystemMessage(content="你是个取名大师,你擅长为创业公司取名字")HumanMessage(content="帮我给新公司取个名字,要包含AI")]
response=chat(messages)
print (response.content,end='\n')

    创建一个消息列表messages,这个列表中包含了一系列SystemMessage和HumanMessage对象。每个消息对象都有一个content属性,用于存储实际的消息内容。例如,在上面的示例代码中,系统消息的内容是“你是个取名大师,你擅长为创业公司取名字”,用户消息的内容是“帮我给新公司取个名字,要包含A”。

    当你调用chat(messages)时,ChatOpenAI对象会接收这个消息列表,然后按照AIMessage、HumanMessage和SystemMessage这3种数据模式将其序列化并发送到OpenAI平台的服务器上。服务器会处理这些消息,生成AI的回应,然后将这个回应发送回ChatOpenAI聊天模型包装器。聊天模型包装器接收回应,回应是一个AIMessage对象,你可以通过response.content方法获取它的内容。
    包含“AI”的创业公司名称的建议:

  1. AIgenius
  2. AItech
  3. AIvision
  4. AIpros
  5. AIlink
  6. AIsense
  7. AIsolutions
  8. AIwave
  9. AInova
  10. AIboost

    希望这些名称能够给你一些启发!

    相比于LLM模型包装器,聊天模型包装器在使用过程中确实更显复杂一些。主要是因为,聊天模型包装器需要先导人3种数据模式,并且需要组合一个消息列表messages,最后从响应对象中解析出需要的结果。而LLM模型包装器则简单许多,只需要输人一个字符串就能直接得到一个字符串结果。

    为什么聊天模型包装器会设计得如此复杂呢?这其实是因为各个模型平台的Chat类型API接收的数据模式不统一。为了能够正确地与这些API进行交互,必须定义各种消息的数据模式,满足各个模型平台Chat类型API的所需,以获取期望的聊天消息结果。如果不使用统一的数据模式,每次向不同的模型平台提交输入时,都需要对输入进行单独的处理,这无疑会增加开发工作量。而且,如果不进行类型检查,那么一旦出现类型错误,可能会在代码运行时才发现,进而导致程序崩溃,或者产生不符合预期的结果。

    尽管聊天模型包装器在使用过程中的复杂性较高,但这种复杂性是有价值的。通过前置对数据模式的处理,可以简化和统一数据处理流程,减小出错的可能性。这样,开发者在使用大语言模型时,可以将更多的注意力放在业务逻辑的开发上,而不必被各种复杂的数据处理和错误处理所困扰。这种设计理念也可以让开发者不必为各模型平台的API调用方式不同而烦恼,可以更快速地集成和使用这些强大的大语言模型。

    聊天模型包装器的设计目标是处理复杂的对话场景,它需要处理的输人是一个聊天消息列表,支持多轮对话。这个列表中的每一则消息都包含了消息角色(AI或用户)和消息内容,它们合在一起构成了一个完整的对话上下文。这种输人方式非常适合处理那些需要引入历史对话内容以便生成带有对话上下文的响应的任务。LLM模型包装器的设计目标是处理那些只需要单一输入就可以完成的任务,如文本翻泽、文本分类等。因此,它只需要一个字符串作为输入,不需要复杂的消息列表和对话上下文。这种简洁的输入方式使得LLM模型包装器在处理一些简单的任务时更加便捷。

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

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

相关文章

【漫话机器学习系列】067.希腊字母(greek letters)-写法、名称、读法和常见用途

希腊字母(Greek Letters) 希腊字母在数学、科学、工程学和编程中广泛使用,常用于表示变量、常量、参数、角度等。以下是希腊字母的完整列表及其常见用途。 大写与小写希腊字母表 大写小写名称(英文)名称(…

JxBrowser 7.41.7 版本发布啦!

JxBrowser 7.41.7 版本发布啦! • 已更新 #Chromium 至更新版本 • 实施了多项质量改进 🔗 点击此处了解更多详情。 🆓 获取 30 天免费试用。

AI在自动化测试中的伦理挑战

在软件测试领域,人工智能(AI)已经不再是遥不可及的未来技术,而是正在深刻影响着测试过程的现实力量。尤其是在自动化测试领域,AI通过加速测试脚本生成、自动化缺陷检测、测试数据生成等功能,极大提升了测试…

单片机基础模块学习——超声波传感器

一、超声波原理 左边发射超声波信号,右边接收超声波信号 左边的芯片用来处理超声波发射信号,中间的芯片用来处理接收的超声波信号 二、超声波原理图 T——transmit 发送R——Recieve 接收 U18芯片对输入的N_A1信号进行放大,然后输入给超声…

蓝桥杯之c++入门(一)【C++入门】

目录 前言5. 算术操作符5.1 算术操作符5.2 浮点数的除法5.3 负数取模5.4 数值溢出5.5 练习练习1:计算 ( a b ) ⋆ c (ab)^{\star}c (ab)⋆c练习2:带余除法练习3:整数个位练习4:整数十位练习5:时间转换练习6&#xff…

Redis --- 分布式锁的使用

我们在上篇博客高并发处理 --- 超卖问题一人一单解决方案讲述了两种锁解决业务的使用方法,但是这样不能让锁跨JVM也就是跨进程去使用,只能适用在单体项目中如下图: 为了解决这种场景,我们就需要用一个锁监视器对全部集群进行监视…

房屋租赁系统在数字化时代中如何重塑租赁服务与提升市场竞争力

内容概要 在当今快速发展的数字化时代,房屋租赁系统的作用愈发重要。随着市场需求的变化,租赁服务正面临着新的挑战与机遇。房屋租赁系统不仅仅是一个简单的管理工具,更是一个能够提升用户体验和市场竞争力的重要平台。其核心功能包括合同管…

INCOSE需求编写指南-附录 D: 交叉引用矩阵

附录 Appendix D: 交叉引用矩阵 Cross Reference Matrices Rules to Characteristics Cross Reference Matrix NRM Concepts and Activities to Characteristics Cross Reference Matrix Part 1 NRM Concepts and Activities to Characteristics Cross Reference Matrix Part…

Java---入门基础篇(上)

前言 本片文章主要讲了刚学Java的一些基础内容,例如注释,标识符,数据类型和变量,运算符,还有逻辑控制等,记录的很详细,带你从简单的知识点再到练习题.如果学习了c语言的小伙伴会发现,这篇文章的内容和c语言大致相同. 而在下一篇文章里,我会讲解方法和数组的使用,也是Java中基础…

新版231普通阿里滑块 自动化和逆向实现 分析

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向过程 补环境逆向 部分补环境 …

探索AI(chatgpt、文心一言、kimi等)提示词的奥秘

大家好,我是老六哥,我正在共享使用AI提高工作效率的技巧。欢迎关注我,共同提高使用AI的技能,让AI成功你的个人助理。 "AI提示词究竟是什么?" 这是许多初学者在接触AI时的共同疑问。 "我阅读了大量关于…

商密测评题库详解:商用密码应用安全性评估从业人员考核题库详细解析(9)

1. 申请商用密码测评机构需提交材料考点 根据《商用密码应用安全性测评机构管理办法(试行)》,申请成为商用密码应用安全性测评机构的单位应当提交的材料不包括( )。 A. 从事与普通密码相关工作情况的说明 B. 开展测评工作所需的软硬件及其他服务保障设施配备情况 C. 管…

Flink中的时间和窗口

在批处理统计中,我们可以等待一批数据都到齐后,统一处理。但是在实时处理统计中,我们是来一条就得处理一条,那么我们怎么统计最近一段时间内的数据呢?引入“窗口”。 所谓的“窗口”,一般就是划定的一段时…

Linux 进程概念

目录 一、前言 二、概念实例,正在执行的程序等 三、描述进程-PCB 四、组织进程 五、查看进程 ​编辑六、通过系统调用获取进程标示符 七、进程切换和上下文数据 1.进程切换 2.上下文数据 一、前言 在Linux中,每个执行的程序叫做进程&#xff…

allegro修改封闭图形线宽

说在前面 我们先把最优解说在前面,然后后面再说如果当时不熟悉软件的时候为了挖孔是用了shapes该怎么修改回来。 挖空最方便的方式是在cutout层画一个圆弧,下面开始图解,先add一个圆弧 z 最好是在画的时候就选择好层,如果忘记了后续再换回去也行,但好像软件有bug,此处并…

使用openwrt搭建ipsec隧道

背景:最近同事遇到了个ipsec问题,做的ipsec特性,ftp下载ipv6性能只有100kb, 正面定位该问题也蛮久了,项目没有用openwrt, 不过用了开源组件strongswan, 加密算法这些也是内核自带的,想着开源的不太可能有问题&#xff…

Day29(补)-【AI思考】-精准突围策略——从“时间贫困“到“效率自由“的逆袭方案

文章目录 精准突围策略——从"时间贫困"到"效率自由"的逆袭方案**第一步:目标熵减工程(建立四维坐标)** 与其他学习方法的结合**第二步:清华方法本土化移植** 与其他工具对比**~~第三步:游戏化改造…

手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion(代码)

手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion(代码) 目录 手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion(代码)Stable Diffusion 原理图Stable Diffusion的原理解释Stable Diffusion 和Di…

vscode+WSL2(ubuntu22.04)+pytorch+conda+cuda+cudnn安装系列

最近在家过年闲的没事,于是研究起深度学习开发工具链的配置和安装,之前欲与天公试比高,尝试在win上用vscodecuda11.6vs2019的cl编译器搭建cuda c编程环境,最后惨败,沦为笑柄,痛定思痛,这次直接和…

【ESP32】ESP-IDF开发 | WiFi开发 | TCP传输控制协议 + TCP服务器和客户端例程

1. 简介 TCP(Transmission Control Protocol),全称传输控制协议。它的特点有以下几点:面向连接,每一个TCP连接只能是点对点的(一对一);提供可靠交付服务;提供全双工通信&…