ChatGPT开发实战
1.概述
前段时间使用体验了ChatGPT的用法,感受到ChatGPT的强大,通过搜索关键字或者输入自己的意图,能够快速得到自己想要的信息和结果。今天笔者将深挖一下ChatGPT,给大家介绍如何使用ChatGPT的API来实战开发一些例子。
2.内容
2.1 ChatGPT起源
这个还得从谷歌发布BERT模型开始了解。BERT 是预训练语言表示法的一种方法。预训练涉及 BERT 如何首先针对大量文本进行训练,例如维基百科。然后,您可以将训练结果应用于其他自然语言处理 (NLP) 任务,例如问答系统和情感分析。借助 BERT 和 AI Platform Training,您可以在大约 30 分钟内训练各种 NLP 模型。
而OpenAI与BERT类似,做出了初代的GPT模型。它们的思想都是类似的,都是预计Transformer这种双向编码器,来获取文本内部的一些联系。
2.2 如何注册ChatGPT
由于OpenAI不允许国内手机注册申请账号,这里我们需要使用到虚拟手机号来注册接收信息(一次性购买使用),关于如果使用虚拟手机号,网上有很多资料和流程,这里就不细说了。大致流程如下:
- 准备一个邮箱,比如QQ邮箱、GMAIL等
- 访问OpenAI的官网地址
- 访问虚拟手机号网站,然后选择OpenAI购买虚拟机手机号(大概1块钱)
然后,注册成功后,我们就可以使用OpenAI的一些接口信息了。体验结果如下:

3.实战应用
3.1 数据集准备
在实战应用之前,我们需要准备好需要的数据集,我们可以从OpenAI的官网中通过Python API来生成模拟数据。具体安装命令如下所示:
pip install --upgrade openai
然后,我登录到OpenAI官网,申请一个密钥,用来获取一些训练所需要的数据。比如我们获取一个差评的代码实现如下:
import openai
import time
import pandas as pd
import numpy as np
openai.api_key = "<填写自己申请到的密钥地址>" completion = openai.Completion.create(engine="davinci", prompt="This hotel was terrible.",max_tokens=120)
print("Terrible Comment:")
print(completion.choices[0]['text'])
执行结果如下:

接着,我们来获取一个好评的代码例子,具体实现如下:
completion = openai.Completion.create(engine="davinci", prompt="This hotel was great.",max_tokens=120)
print("Great Comment:")
print(completion.choices[0]['text'])
执行结果如下:

现在,我们来获取所需要的数据集代码,具体实现如下所示:
print("Generating 500 good and bad reviews")
good_reviews = []
bad_reviews = []
for i in range(0,500):
completion = openai.Completion.create(engine="davinci", prompt="This hotel was great.",max_tokens=120)
good_reviews.append(completion.choices[0]['text'])
print('Generating good review number %i'%(i))
completion = openai.Completion.create(engine="davinci", prompt="This hotel was terrible.",max_tokens=120)
bad_reviews.append(completion.choices[0]['text'])
print('Generating bad review number %i'%(i))
display = np.random.choice([0,1],p=[0.7,0.3])
# 这里由于OpenAI的接口调用限制,控制一下循环调用频率
time.sleep(3)
if display ==1:
display_good = np.random.choice([0,1],p=[0.5,0.5])
if display_good ==1:
print('Printing random good review')
print(good_reviews[-1])
if display_good ==0:
print('Printing random bad review')
print(bad_reviews[-1])
# Create a dataframe with the reviews and sentiment
df = pd.DataFrame(np.zeros((1000,2)))
# Set the first 500 rows to good reviews
df.columns = ['Reviews','Sentiment']
df['Sentiment'].loc[0:499] = 1
df['Reviews'] = good_reviews+bad_reviews
# Export the dataframe to a csv file
df.to_csv('generated_reviews.csv')
执行结果如下:

3.2 开始进行算法训练
有了数据之后,我们可以建立和训练一种机器学习算法,当我们处理文本的时候,首先需要做的是使用矢量器,矢量器是将文本转换为矢量的东西。相似的的文本有着相似的向量,不同的文本具有不相似的向量。
而矢量化的步骤有很多方法可以实现,为了实现文本中的功能,我们借助Python的TFIDF矢量器的库来实现。
具体实现代码如下所示:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix,plot_confusion_matrix
from sklearn.feature_extraction.text import TfidfVectorizer # Split the data into training and testing
labeled_data = pd.read_csv('generated_reviews.csv').drop(columns=['Unnamed: 0'])
labeled_data.Sentiment = labeled_data.Sentiment.astype(int)
labeled_data = labeled_data.dropna().reset_index() # print head of the data
print(labeled_data.head())
头部数据结果如下所示:

接着,我们对数据进行矢量化,具体实现代码如下所示:
dataset = labeled_data vectorizer = TfidfVectorizer (max_features=2500, min_df=7, max_df=0.8)
tokenized_data = vectorizer.fit_transform(dataset['Reviews']).toarray() labels = np.array(dataset["Sentiment"]) # Label is already an array of 0 and 1 rf = RandomForestClassifier(n_estimators=100) X = tokenized_data
y = labels
X_train, X_test,y_train, y_test = train_test_split(X,y,test_size=0.2) rf.fit(X_train,y_train) plot_confusion_matrix(rf,X_test,y_test) # save the result to disk
plt.title('Confusion Matrix')
plt.savefig('result.png')
这里涉及到使用随机森林的模型,随机森林是一种有监督的机器学习算法。由于其准确性,简单性和灵活性,它已成为最常用的一种算法。事实上,它可以用于分类和回归任务,再加上其非线性特性,使其能够高度适应各种数据和情况。

它之所以被称为 “森林”,是因为它生成了决策树森林。然后,来自这些树的数据合并在一起,以确保最准确的预测。虽然单独的决策树只有一个结果和范围狭窄的群组,但森林可以确保有更多的小组和决策,从而获得更准确的结果。它还有一个好处,那就是通过在随机特征子集中找到最佳特征来为模型添加随机性。总体而言,这些优势创造了一个具有广泛多样性的模型。
我们执行这个模型,然后输出结果如下图所示:

4.总结
OpenAI API 几乎可以应用于任何涉及理解或生成自然语言或代码的任务。它提供一系列具有不同功率级别的模型,适用于不同的任务,并且能够微调您自己的自定义模型。这些模型可用于从内容生成到语义搜索和分类的所有领域。
ChatGPT开发实战的更多相关文章
- chrome拓展开发实战:页面脚本的拦截注入
原文请访问个人博客:chrome拓展开发实战:页面脚本的拦截注入 目前公司产品的无线站点已经实现了业务平台组件化,所有业务组件的转场都是通过路由来完成,而各个模块是通过requirejs进行统一管理, ...
- 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING
<Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th 2014 Email:skyseraph00@163.com 更多精彩请直接 ...
- CSS高效开发实战:CSS 3、LESS、SASS、Bootstrap、Foundation --读书笔记(1)设定背景图
技术的新发展,除计算机可以接入互联网之外,平板电脑.智能手机.智能电视等其他设备均可访问互联网.在多设备时代,构建多屏体验也不是听说的那么难. 但是这也增加了学习CSS的难度?不知道如何上手,只懂一点 ...
- 《Node.js开发实战详解》学习笔记
<Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...
- 第九篇 :微信公众平台开发实战Java版之如何实现自定义分享内容
第一部分:微信JS-SDK介绍 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统 ...
- 第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息
第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...
- 第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据O ...
- 第六篇 :微信公众平台开发实战Java版之如何自定义微信公众号菜单
我们来了解一下 自定义菜单创建接口: http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_to ...
- 第五篇 :微信公众平台开发实战Java版之如何获取公众号的access_token以及缓存access_token
一.access_token简介 为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台 开放了许多接口,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等, 开 ...
- 第四篇 :微信公众平台开发实战Java版之完成消息接受与相应以及消息的处理
温馨提示: 这篇文章是依赖前几篇的文章的. 第一篇:微信公众平台开发实战之了解微信公众平台基础知识以及资料准备 第二篇 :微信公众平台开发实战之开启开发者模式,接入微信公众平台开发 第三篇 :微信公众 ...
随机推荐
- Redis 先操作数据库和先删除缓存, 一致性分析
初始状态: 数据库和缓存中v=10 第一种,先删除缓存在操作数据库: 线程1准备更新数据库的值v=20,先删除缓存, 此时线程2进来, 缓存未命中,查询数据库v=10, 写入缓存v=10, cpu回到 ...
- 【深入浅出 Yarn 架构与实现】1-1 设计理念与基本架构
一.Yarn 产生的背景 Hadoop2 之前是由 HDFS 和 MR 组成的,HDFS 负责存储,MR 负责计算. 一)MRv1 的问题 耦合度高:MR 中的 jobTracker 同时负责资源管理 ...
- Vivado_8位流水灯
Design 代码中的计数器设置是因为我的开发板的时钟是100MHZ的,也就是1秒完成了100_000_000次时钟信号,所以我设置计数器为100_000_000次. 也就是说,我让流水灯的变化周期为 ...
- JMeter自定义HTTP组件
JMeter是一个优秀的开源项目,我们可以在jmeter的官网了解到如何使用和如何二次开发:https://jmeter.apache.org/ 因工作需要,最近做了一个JMeter自定义的http组 ...
- EventBridge助力阿里云视觉智能开放平台AI智能存储实践
本文作者:李建,阿里巴巴达摩院技术专家. 01 视觉智能开放平台(VIAPI)业务场景介绍 阿里云视觉智能开放平台(简称 VIAPI),是基于之前很多技术实践经验积累的 AI 能力的沉淀平台.目前整个 ...
- ES6高级编程(一)
一.JavaScript概要 1.1.JavaScript组成 JavaScript主要由三部分构成,分别是ECMAScript.DOM与BOM ECMAScript定义了该语言的语法.类型.语句.关 ...
- vmware workstation NAT模式配置
一. 配置虚拟网络编辑器 1. 打开虚拟网络编辑器 2. 点击右下角更改设置 3. 选择NAT模式 点击选中NAT模式的虚拟网络,默认为VMnet8(可调整),可设置NAT模式的子网IP和掩码 4. ...
- 云原生之旅 - 12)使用 Kaniko 在 Kubernetes上构建 Docker 容器镜像
前言 前一篇文章[云原生之旅 - 11)基于 Kubernetes 动态伸缩 Jenkins Build Agents]有讲到在 Kubernetes Pod (Jenkins build agent ...
- 我引用中没有Spire.Pdf,但是发现无法解析的“Spire.Pdf”的不同版本之间存在冲突
问题: 导出错误!未能加载文件或程序集"Spire.Pdf, Version=8.6.1.0, Culture=neutral, PublicKeyToken=663f351905198cb ...
- Java锁的逻辑(结合对象头和ObjectMonitor)
我们都知道在Java编程中多线程的同步使用synchronized关键字来标识,那么这个关键字在JVM底层到底是如何实现的呢. 我们先来思考一下如果我们自己实现的一个锁该怎么做呢: 首先肯定要有个标记 ...