如何使用ChatGPT的API(一)大语言模型如何工作

news2024/11/16 12:05:37

这篇文章介绍大语言模型的一些概念,包括它是如何工作的,什么是Token等等。

大语言模型如何工作

我们从一个示例开始说起。

当我们写一个提示“我喜欢吃”,然后要求一个大型语言模型根据这个提示填写后面可能的内容。它可能会说,“带奶油奶酪的百吉饼,或者我妈妈做的菜”。

但是这个模型是如何学会做到这一点的呢?

训练大型语言模型的主要工具实际上是监督学习。在监督学习中,计算机使用带标签的训练数据来学习输入-输出或X-Y的映射关系。例如,如果你正在使用监督学习来学习对餐厅评论进行情感分类,你可能会收集一个像这样的训练集,其中一条评论如“熏牛肉三明治很棒!”被标记为积极情感的评论,依此类推。而“服务很慢,食物一般般。”则被标记为消极情感,“伯爵红茶太棒了。”则被标记为积极情感。监督学习的过程通常是获取带标签的数据,然后在数据上训练AI模型。训练完成后,你可以部署和调用模型,并给它一个新的餐厅评论,比如“最好吃的披萨!”。然后它正确判定了这是积极情感。

事实证明,监督学习是训练大型语言模型的核心构建模块。具体来说,可以通过使用监督学习来重复预测下一个单词来构建大型语言模型。假设在训练集中有大量的文本数据,有一句话是“My favorite food is a bagel with cream cheese and lox.”。然后,这句话被转化为一系列的训练示例。这时给定一个句子片段,“My favorite food is a”,则下一个预测出来的单词就是“bagel”。然后当给定句子片段或句子前缀,“My favorite food is a bagel”,下一个预测的单词将是“with”,依此类推。 在拥有数百亿甚至更多单词的大型训练集的情况下,你可以创建一个庞大的训练集,从一个句子或一段文本的一部分开始,反复要求语言模型学习预测下一个单词。

所以今天有两种主要类型的大型语言模型。第一种是“基础LLM”,第二种是越来越多使用的“指令调整LLM”。

基础LLM根据文本训练数据反复预测下一个单词。所以如果我给它一个提示,“从前有一只独角兽”,然后通过反复一次预测一个单词,它可能会给出一个关于一只独角兽在一个神奇森林中与她的独角兽朋友们一起生活的故事。

然而,这种方法的一个缺点是,如果你用“What is the capital of France?”这样的提示,很可能在互联网上有一个关于法国的问答题目列表。所以它可能会用“What is France’s largest city? what is France’s population?”等来完成这个提示。 但是你真正想要的是它告诉你法国的首都,而不是列出所有这些问题。

但指令调整LLM尝试遵循指令,它会说,“法国的首都是巴黎。”

如何从基础LLM转变为指令调整LLM?

这就是训练指令调整LLM(如ChatGPT)的过程。 首先,你需要在大量数据上训练一个基础LLM,可能是数百亿个单词,甚至更多。这个过程可能需要数月时间在一个大型超级计算系统上进行。 在训练完基础LLM之后,你可以通过在一个较小的示例集上对模型进行微调来进一步训练模型,使其按照输入的指令输出结果。例如,你可以编写很多关于指令的示例和对应的良好回答。这样就创建了一个训练集来进行额外的微调,使其学会在遵循指令时预测下一个单词。之后,为了提高LLM输出的质量,一个常见的过程是获取人类对许多不同LLM输出质量的评价,比如输出是否有帮助、诚实和无害等标准。然后,你可以进一步调整LLM,增加其生成更高评级输出的概率。而最常用的技术是RLHF(Reinforcement Learning from Human Feedback,从人类反馈中进行强化学习)。从基础LLM到指令调整LLM的过程可能只需要几天时间,并且使用更小规模的数据集和计算资源。

什么是Token

ChatGPT处理不了反转单词的任务。

response = get_completion("Take the letters in lollipop and reverse them")  #这里希望chatgpt反转输出单词lollipop
print(response)

回答:

The reversed letters of "lollipop" are "pillipol".

很明显pillipol并不是正确答案。正确答案应该是popillol

为什么ChatGPT这么牛逼却处理不了这样一个简单的问题呢?

这就要引入Token的概念了。简单来说,ChatGPT处理信息(也就是我们输入的prompt)不是按照一个单词一个单词处理的。这点和人处理文字信息非常不同。人是一个单词一个单词,一个汉字一个汉字来理解文字信息和处理文字信息的。而ChatGPT是按Token来处理信息的。一个稍长的英文单词可能被分成多个Token。

上图的例子中,prompting被分成了三个Token。

lollipop则被分成了上图所示的三部分。看到这里,就知道ChatGPT的处理文字的方式决定了它无法完成反转单词的任务。

response = get_completion("""Take the letters in \
l-o-l-l-i-p-o-p and reverse them""") 

回答:

p-o-p-i-l-l-o-l

上面的测试代码用-将字母隔开,以便划分Token时让每个字母作为一个Token。

这时ChatGPT回答的就是正确的了。

通常情况下,一个Token包含大概4个字母或者一个单词的4分之3。

这里其实有一个技术细节,就是ChatGPT预测后面的内容时是通过预测下一个Token来的。这也是为什么OpenAI的API调用是按照Token来计费的。也就是处理一个Token收一个Token的钱。注意,算钱是是把输入和输出的Token都算钱的。

OpenAI的网站上提到“Only pay for what you use.”。看来也挺切合的。

这是最常用的gpt-3.5-turbo模型的价格。

同时,不同的模型单次处理的Token数(输入的Token+输出的Token之和)是有上限的。比如gpt-3.5-turbo模型单次处理Token的上限是4000个Token。

另外python中有个tokenizer 包是可以计算一句话的Token数的。下面的代码演示了这个包的用法。

def get_completion_and_token_count(messages, 
                                   model="gpt-3.5-turbo", 
                                   temperature=0, 
                                   max_tokens=500):
    
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=temperature, 
        max_tokens=max_tokens,
    )
    
    content = response.choices[0].message["content"]
    
    token_dict = {
'prompt_tokens':response['usage']['prompt_tokens'],
'completion_tokens':response['usage']['completion_tokens'],
'total_tokens':response['usage']['total_tokens'],
    }

    return content, token_dict
messages = [
{'role':'system', 
 'content':"""You are an assistant who responds\
 in the style of Dr Seuss."""},    
{'role':'user',
 'content':"""write me a very short poem \ 
 about a happy carrot"""},  
] 
response, token_dict = get_completion_and_token_count(messages)
print(response)
print(token_dict)
Oh, the happy carrot, so bright and orange,
Grown in the garden, a joyful forage.
With a smile so wide, from top to bottom,
It brings happiness, oh how it blossoms!

In the soil it grew, with love and care,
Nurtured by sunshine, fresh air to share.
Its leaves so green, reaching up so high,
A happy carrot, oh my, oh my!

With a crunch and a munch, it's oh so tasty,
Filled with vitamins, oh so hasty.
A healthy snack, a delight to eat,
The happy carrot, oh so sweet!

So let's celebrate this veggie delight,
With every bite, a happy sight.
For the happy carrot, we give a cheer,
A joyful veggie, oh so dear!

{'prompt_tokens': 37, 'completion_tokens': 160, 'total_tokens': 197}

角色定义

下面是一个消息列表的例子,首先是一个系统消息,它提供了整体指示。在这条消息之后,我们有用户助手之间的多轮对话,这个对话会一直进行下去。如果你曾经使用过ChatGPT的网页界面,那么你的消息就是用户消息,ChatGPT的消息就是助手消息系统消息有助于设定助手的行为和个性,并且它在对话中充当高级指令。你可以将其视为在助手耳边私下交流并引导其回复,而用户并不知道系统消息的存在。作为用户,如果你曾经使用过ChatGPT,你可能不知道ChatGPT的系统消息内容。系统消息的好处在于,它为开发者提供了一种在对话中框定对话范围的方式,而不用让这些框定的话语成为对话的一部分。这样,你可以引导助手,私下指导其回复,而不让用户察觉。

messages =  [  
{'role':'system', 'content':'You are an assistant that speaks like Shakespeare.'},    
{'role':'user', 'content':'tell me a joke'},   
{'role':'assistant', 'content':'Why did the chicken cross the road'},   
{'role':'user', 'content':'I don\'t know'}  ]

response = get_completion_from_messages(messages, temperature=1)
print(response)

回答:

#response.choices[0].message 中的完整内容
{
  "content": "To get to the other side, my good sir!",
  "role": "assistant"
}

To get to the other side, my good sir!

如何更安全地加载OpenAI的key

OpenAI的key是调用OpenAI接口的唯一凭证。泄漏了可能会造成不小的金钱损失,所以要妥善保管。

下图演示了两种加载OpenAI的key的方式。

下面这种方式明显是更安全的。OpenAI的key不会暴露在代码中,而是由一个单独的.env文件来维护。

注意,安装dotenv包需要用下面的命令来安装。

pip install python-dotenv

加载key的代码

from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file

openai.api_key  = os.environ['OPENAI_API_KEY']

.env文件中的内容

OPENAI_API_KEY="sk-xxx"

如今开发AI应用程序的现状

过去开发AI应用,首先要收集数据,标注数据,训练模型,最后再部署模型来使用。耗时长,需要掌握的知识和技能比较多,门槛高。

现在开发AI应用只需要会写Prompt和基础的编程能力就可以了。

时代在进步,咱得跟上。

参考:

https://learn.deeplearning.ai/chatgpt-building-system/lesson/2/language-models,-the-chat-format-and-tokens

文章中不好放全部的示例代码,我的公众号《首飞》内回复 “api” 关键字可获取本篇文章完整的示例代码(格式为ipynb)。


觉得有用就点个赞吧!

我是首飞,一个帮大家填坑的工程师。

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

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

相关文章

《PyTorch深度学习实践》第三讲 梯度下降

b站刘二大人《PyTorch深度学习实践》课程第三讲梯度下降笔记与代码:https://www.bilibili.com/video/BV1Y7411d7Ys?p3&vd_sourceb17f113d28933824d753a0915d5e3a90 上一讲例子中,初始权重 w w w是随机给的,然后计算每个样本 x x x的预测…

JavaWeb 笔记-1

JavaWeb 笔记-1 初始JavaWeb什么是JavaWeb 一、JDBC1.1、JDBC简介1.2、API详解-DriverManager1.3、API详解-Connection1.4、API详解-Statement1.5、API详解-ResultSet1.6、API详解-PreparedStatement1.6.1、API详解-PreparedStatement-SQL注入演示1.6.2、API详解-PreparedState…

RK3568平台开发系列讲解(外设篇)RFID 模块调试

🚀返回专栏总目录 文章目录 一、RFID 工作原理二、硬件连接三、驱动程序四、设备树五、测试程序沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们将讲解 RFID 模块调试。 一、RFID 工作原理 射频识别技术也就是 RFID,英文名为 Radio Frequency Identificati…

玻璃活动隔断安装需要注意什么

随着社会的发展和人们对空间利用的要求不断提高,玻璃活动隔断逐渐成为办公室和商业空间中常见的装修选择。玻璃活动隔断不仅可以有效分割空间,提供私密性,还能保持充足的采光和视觉效果。然而,为了确保玻璃活动隔断的安装质量和使…

PSP - MetaPredict 预测蛋白质序列的内源性无序区域 (Intrinsically Disordered Regions)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/131461900 MetaPredict 算法简介: 内源性无序区域(IDRs)在所有生命领域中都普遍存在,并…

【GPT】如何拥有离线版本的GPT以及部署过程中的问题

【背景】 目前很多公司由于数据安全的问题,不能使用OpenAI的GPT,同时也没有必要非得使用如此泛用化的GPT。很多公司因此有训练自己的离线GPT的需求,这样的GPT只需要具备专业知识即可。 要使这个成为可能,首先就需要能够让GPT的Mo…

InstructGPT学习

GPT发展历程 在回答这个问题之前,首先要搞清楚ChatGPT的发展历程。 GPT-1用的是无监督预训练有监督微调。GPT-2用的是纯无监督预训练。GPT-3沿用了GPT-2的纯无监督预训练,但是数据大了好几个量级。InstructGPT在GPT-3上用强化学习做微调,内…

企业邮箱如何将一个用户设置到多个部门/群组

1、使用管理员账号postmaster登录企业邮局,点击“邮局管理”。 2、点击“组织与成员”。 3、勾选需要设置的用户,点击“设置所属部门/群”。(例如:我们需要将所属销售分公司的高阳,加入到以下四个分销部中,…

Hive on Zeppelin

** Hive on Zeppelin ** 官网:zeppelin.apache.org 做大数据的人应该对Hive不陌生,Hive应该是大数据SQL引擎的鼻祖。历经多个版本的改进,现在的Hive3已经具备比较完善的ACID功能,能够同时满足交互式查询和ETL 两种场景。 那怎…

Linux内核的编译、安装、调试

这里写目录标题 编译安装内核下载内核安装依赖更改.config编译内核安装首先安装模块安装内核更改引导更改grub重启 其他操作清理内核源目录卸载安装的内核修改内核配置菜单实现对新加入内核源码的控制 常见问题1. Module.symvers is missing2. No rule to make target ‘debian…

Revit三维视图:第一人称的视角看模型,生成局部三维视图

​  一、Revit中怎么以第一人称的视角看空间效果 我们创建一栋完整的楼模型后,会不会想说假设在里面看看是什么效果呢,就是说想看看第一视角的空间效果,那么如何可以看第一人称的空间效果图呢?以下看步骤: 1、 打开楼层平面图 …

系统架构设计师 6:数据库设计

一、数据库系统 数据库系统(DataBase System, DBS)是一个采用了数据库技术,有组织地、动态地存储大量相关联数据,从而方便多用户访问的计算机系统。广义上讲,DBS包括了数据库管理系统(DBMS)。 …

详细认识二叉树【图片+代码】

目录 一、树的概念及结构 1.1树的概念 1.2树的相关概念 1.3树的表示 1.4树在实际中的应用(目录树) 二、二叉树概念及结构 2.1概念 2.2特殊的二叉树 2.3二叉树的性质 2.4二叉树存储结构 三、二叉树的顺序结构及实现 3.1二叉树的顺序结构 3…

Redis6之集群

集群,就是通过增加服务器的数量,提供相同的服务,从而让服务器达到一个稳定、高效的状态 必要性 单个redis存在不稳定性。当redis服务宕机了,就没有可用的服务了。而且单个redis的读写能力是有限的。使用redis集群可以强化redis的…

PIL.Image 调色板模式处理标签数据

文章目录 1 使用PIL.Image库进行调色板模式2 转回原来的色彩3 效果参考 1 使用PIL.Image库进行调色板模式 基本步骤: 自定义调色板,数据格式是一个Nx3的二维数组,一维数组的位置为分类的下标数据类型为np.uint8转化为调色板模式后img.conve…

想知道音频怎么转文字吗?

随着数字化技术的不断发展,我们生活中产生的各种音频越来越多,例如会议录音、采访录音等等。虽然音频记录信息方便,但它们在信息处理、存储和分享方面也存在问题。比如当我们需要对音频中的内容进行编辑或整理时,手动打字出现漏字…

Eclipse中项目的配置

1、修改本地运行时Tomcat对应的JRE版本 老项目升级JDK,在eclipse修改了项目的jdk、编译等级,但还是启动失败,报“java.lang.UnsupportedClassVersionError”。 观察发现,启动日志,tomcat还是使用的jdk1.5,…

编程题分享:有⼀堆糖果,其数量为n,现将糖果分成不同数量的堆数

背景 近期面试遇到一家公司的编程题,觉得挺有参考价值 此处使用 PHP语言,进行编码测试, 编码之前要进行思路分析,避免无头苍蝇,走一步看一步 最后,希望后期面试顺利!欢迎指摘 . 题目&#xff1…

形态学操作之膨胀

note // 膨胀原理:操作过程中,若膨胀因子某点是1,且原图该点为1,则锚点位置为1 code // 膨胀 // 膨胀原理:操作过程中,若膨胀因子某点是1,且原图该点为1,则锚点位置为1 typedef e…

gma 2 教程(一)概述:1.GMA 简介

地理与气象分析库(Geographic and Meteorological Analysis. gma),是一个基于 Python 的地理、气象数据快速处理分析和地理制图函数包。构建过程参考了ArcGIS和QGIS的操作逻辑和特点,并添加诸多独创性、独有的功能,具有…