ChatGPT最近大火?教你实现破产版ChatGPT(一)数据预处理

目录

一.前言

二.下载数据文件

三.导包并设置使用GPU

四.加载和预处理数据

五.为模型准备数据


一.前言

最近ChatGPT大火,成功破圈,到底是个啥?

简单说,它是一个模型,一个语言模型!它是以对话方式与人进行交互的AI语言模型!

在很早以前,国内的大厂百度,就开发过“文心·NLP模型”等语言处理模型,比如用文心·NLP模型生成段落和文章,能做到开篇和文末点题,首位呼应,对文本相关内容进行引用等……

文心·NLP模型总体效果一般,有点差强人意,特别是在人类文字和人类语言的理解方面,有很多不融洽,输出的内容很多都存在衔接生硬牵强的问题。

也正因为如此,所以它也一直不温不火,只有少数相关公司和研究人工智能与机器学习的用户知道它,以前我了解后,觉得还有很长的路要走。

但这几天的ChatGPT明显不一样,对很多不懂不关注相关技术的人,都展示出了极强的吸引力,ChatGPT短短一周不到的时间,用户达到百万级,成功破圈,说明它是有值得研究的地方的。

在本教程中,我们探索一个好玩有趣的循环的序列到序列(sequence-to-sequence)的模型用例。我们将用Cornell Movie-Dialogs Corpus 处的电影剧本来训练一个简单的聊天机器人。

在人工智能研究领域中,对话模型是一个非常热门的话题。聊天机器人可以在各种设置中找到,包括客户服务应用和在线帮助。这些机器人通常 由基于检索的模型提供支持,这些模型的输出是某些形式问题预先定义的响应。在像公司IT服务台这样高度受限制的领域中,这些模型可能足够了, 但是,对于更一般的用例它们还不够健壮。让一台机器与多领域的人进行有意义的对话是一个远未解决的研究问题。最近,深度学习热潮已经允许 强大的生成模型,如谷歌的神经对话模型Neural Conversational Model,这标志着向多领域生成对话模型迈出了一大步。 在本教程中,我们将在PyTorch中实现这种模型。

教程要点

  • 对Cornell Movie-Dialogs Corpus数据集的加载和预处理
  • 用Luong attention mechanism(s)实现一个sequence-to-sequence模型
  • 使用小批量数据联合训练解码器和编码器模型
  • 实现贪婪搜索解码模块
  • 与训练好的聊天机器人互动

二.下载数据文件

下载数据文件点击这里并将其放入到当前目录下的data/ 文件夹下。

三.导包并设置使用GPU

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literalsimport torch
from torch.jit import script, trace
import torch.nn as nn
from torch import optim
import torch.nn.functional as F
import csv
import random
import re
import os
import unicodedata
import codecs
from io import openimport itertools
import mathUSE_CUDA = torch.cuda.is_available()
device = torch.device("cuda" if USE_CUDA else "cpu")

四.加载和预处理数据

#**********************************2.加载和预处理数据**********************************
'''
下一步就是格式化处理我们的数据文件并将数据加载到我们可以使用的结构中。 
Cornell Movie-Dialogs Corpus是一个丰富的电影角色对话数据集: * 10,292 对电影角色之间的220,579次对话 * 617部电影中的9,035个电影角色 * 总共304,713发言量
这个数据集庞大而多样,在语言形式、时间段、情感上等都有很大的变化。我们希望这种多样性使我们的模型能够适应多种形式的输入和查询。
首先,我们通过数据文件的某些行来查看原始数据的格式
'''
corpus_name = "cornell movie-dialogs corpus"
corpus = os.path.join("data", corpus_name)def printLines(file, n=10):with open(file, 'rb') as datafile:lines = datafile.readlines()#输出前n行的数据for line in lines[:n]:print(line)#printLines(os.path.join(corpus, "movie_lines.txt"))#**************************************2.1创建格式化数据文件 start **************************************
'''
为了方便起见,我们将创建一个格式良好的数据文件,其中每一行包含一个由tab制表符分隔的查询语句和响应语句对。
以下函数便于解析原始 movie_lines.txt 数据文件。 
* loadLines:将文件的每一行拆分为字段(lineID, characterID, movieID, character, text)组合的字典 
* loadConversations :根据movie_conversations.txt将loadLines中的每一行数据进行归类 
* extractSentencePairs: 从对话中提取句子对
'''
# 将文件的每一行拆分为字段字典
#fields中是各列字段的名字,即["lineID", "characterID", "movieID", "character", "text"]
def loadLines(fileName, fields):lines = {}with open(fileName, 'r', encoding='iso-8859-1') as f:for line in f:values = line.split(" +++$+++ ")# Extract fieldslineObj = {}for i, field in enumerate(fields):lineObj[field] = values[i]#每一个键值对对应一行数据,键是这一行的lineID,值是这一行对应的数据对象,即lineObj是字典(lines)里的字典lines[lineObj['lineID']] = lineObj#lines是对整个movie_lines.txt文件操作之后返回的含有格式化原数据的字典return lines# 将 `loadLines` 中的行字段分组为基于 *movie_conversations.txt* 的对话
#utterance话语
#fields中是各列字段的名字,即["character1ID", "character2ID", "movieID", "utteranceIDs"]
def loadConversations(fileName, lines, fields):conversations = []with open(fileName, 'r', encoding='iso-8859-1') as f:for line in f:values = line.split(" +++$+++ ")# Extract fields,和上面的那个函数的lineObj一个道理,即把movie_conversations.txt的每行的数据提取到一个字典中convObj = {}for i, field in enumerate(fields):convObj[field] = values[i]# Convert string to list (convObj["utteranceIDs"] == "['L598485', 'L598486', ...]")#eval函数的作用自行百度,就是会把字符串里的表达式进行计算lineIds = eval(convObj["utteranceIDs"])# Reassemble lines,Reassemble:重新组装convObj["lines"] = [] #给字典新加一个键值对,此键为linesfor lineId in lineIds:#即根据lineId把上面那个函数格式化的每行对应的字典对象添加到字典convObj的lines对应的值中convObj["lines"].append(lines[lineId])conversations.append(convObj)# conversations是对整个movie_conversations.txt文件操作之后返回的含有格式化原数据的字典return conversations# 从对话中提取一对句子
def extractSentencePairs(conversations):qa_pairs = []for conversation in conversations:# Iterate over all the lines of the conversationfor i in range(len(conversation["lines"]) - 1):  # We ignore the last line (no answer for it)#strip函数返回删除前导和尾随空格的字符串副本。如果给定了chars而不是None,则删除chars中的字符。inputLine = conversation["lines"][i]["text"].strip()targetLine = conversation["lines"][i+1]["text"].strip()# Filter wrong samples (if one of the lists is empty)if inputLine and targetLine:qa_pairs.append([inputLine, targetLine])#提取了文件中的所有对话return qa_pairs#******************************现在我们将调用这些函数来创建文件,我们命名为formatted_movie_lines.txt。******************************
# 定义新文件的路径(待生成)
datafile = os.path.join(corpus, "formatted_movie_lines.txt")'''
#delimiter:分隔符
delimiter = '\t'
#print('delimiter:',delimiter)
# codecs.decode()方法的使用参考https://zhuanlan.zhihu.com/p/377436438
delimiter = str(codecs.decode(delimiter, "unicode_escape"))
#print('delimiter:',delimiter)# 初始化行dict,对话列表和字段ID
lines = {}
conversations = []
MOVIE_LINES_FIELDS = ["lineID", "characterID", "movieID", "character", "text"]
MOVIE_CONVERSATIONS_FIELDS = ["character1ID", "character2ID", "movieID", "utteranceIDs"]# 加载行和进程对话,即调用函数进行格式化
print("\nProcessing corpus...")
lines = loadLines(os.path.join(corpus, "movie_lines.txt"), MOVIE_LINES_FIELDS)
print("\nLoading conversations...")
conversations = loadConversations(os.path.join(corpus, "movie_conversations.txt"),lines, MOVIE_CONVERSATIONS_FIELDS)# 写入新的csv文件
print("\nWriting newly formatted file...")
with open(datafile, 'w', encoding='utf-8') as outputfile:writer = csv.writer(outputfile, delimiter=delimiter, lineterminator='\n')pairs=extractSentencePairs(conversations)print('句子对数为:',pairs.__len__())for pair in pairs:writer.writerow(pair)# 打印一个样本的行
print("\nSample lines from file:")
printLines(datafile)
'''
#**************************************2.1创建格式化数据文件 end **************************************#*******************************2.2 加载和清洗数据 start *******************************
'''
我们下一个任务是创建词汇表并将查询/响应句子对(对话)加载到内存。
注意我们正在处理词序,这些词序没有映射到离散数值空间。因此,我们必须通过数据集中的单词来创建一个索引。
为此我们创建了一个Voc类,它会存储从单词到索引的映射、索引到单词的反向映射、每个单词的计数和总单词量。
这个类提供向词汇表中添加单词的方法(addWord)、添加所有单词到句子中的方法 (addSentence) 和清洗不常见的单词方法(trim)。更多的数据清洗在后面进行。
'''
# 默认词向量
PAD_token = 0  # Used for padding short sentences
SOS_token = 1  # Start-of-sentence token
EOS_token = 2  # End-of-sentence tokenclass Voc:def __init__(self, name):self.name = nameself.trimmed = False#单词的索引号(键是单词,值是索引)self.word2index = {}#各个单词的数量(键是单词,值是数量)self.word2count = {}#通过索引可以找到单词self.index2word = {PAD_token: "PAD", SOS_token: "SOS", EOS_token: "EOS"}#单词序号,012已经被使用,所以就从3开始了self.num_words = 3  # Count SOS, EOS, PAD#把句子中的每一个单词查出来执行添加单词的操作def addSentence(self, sentence):for word in sentence.split(' '):self.addWord(word)def addWord(self, word):##如果之前没遇到过这个单词if word not in self.word2index:#这个单词的序号self.word2index[word] = self.num_words#这个单词的总数self.word2count[word] = 1#通过单词序号找到单词self.index2word[self.num_words] = wordself.num_words += 1else:#如果之前已经遇到了这个单词那么只对单词总数+1self.word2count[word] += 1# 删除低于特定计数阈值的单词,即单词出现频率太低def trim(self, min_count):if self.trimmed:returnself.trimmed = Truekeep_words = []for k, v in self.word2count.items():if v >= min_count:keep_words.append(k)print('keep_words {} / {} = {:.4f}'.format(#len(self.word2index)即代表总的单词数len(keep_words), len(self.word2index), len(keep_words) / len(self.word2index)))# 重初始化字典self.word2index = {}self.word2count = {}self.index2word = {PAD_token: "PAD", SOS_token: "SOS", EOS_token: "EOS"}self.num_words = 3 # Count default tokensfor word in keep_words:self.addWord(word)'''
现在我们可以组装词汇表和查询/响应语句对。在使用数据之前,我们必须做一些预处理。
首先,我们必须使用unicodeToAscii将 unicode 字符串转换为 ASCII。
然后,我们应该将所有字母转换为小写字母并清洗掉除基本标点之 外的所有非字母字符 (normalizeString)。
最后,为了帮助训练收敛,我们将过滤掉长度大于MAX_LENGTH 的句子 (filterPairs)。
'''
MAX_LENGTH = 10  # Maximum sentence length to consider# 将Unicode字符串转换为纯ASCII,多亏了https://stackoverflow.com/a/518232/2809427
def unicodeToAscii(s):return ''.join(c for c in unicodedata.normalize('NFD', s)if unicodedata.category(c) != 'Mn')# Lowercase, trim, and remove non-letter characters
def normalizeString(s):s = unicodeToAscii(s.lower().strip())#re.sub函数作用:https://blog.csdn.net/weixin_44799217/article/details/115100715s = re.sub(r"([.!?])", r" \1", s)s = re.sub(r"[^a-zA-Z.!?]+", r" ", s)s = re.sub(r"\s+", r" ", s).strip()return s# 初始化Voc对象 和 格式化pairs对话存放到list中
# datafile就是我们上面生成的formatted_movie_lines.txt
#corpus_name就是"cornell movie-dialogs corpus"
def readVocs(datafile, corpus_name):print("Reading lines...")# Read the file and split into lineslines = open(datafile, encoding='utf-8').read().strip().split('\n')# Split every line into pairs and normalizepairs = [[normalizeString(s) for s in l.split('\t')] for l in lines]voc = Voc(corpus_name)return voc, pairs# 如果对 'p' 中的两个句子都低于 MAX_LENGTH 阈值,则返回True,即合法
#p是句子对
def filterPair(p):# Input sequences need to preserve the last word for EOS token#一对句子中只要有一个句子里的单词数超过≥MAX_LENGTH就不合法!所以很多句子都被筛去了return len(p[0].split(' ')) < MAX_LENGTH and len(p[1].split(' ')) < MAX_LENGTH# 过滤满足条件的 pairs 对话
def filterPairs(pairs):# 返回合法句子对的集合return [pair for pair in pairs if filterPair(pair)]# 使用上面定义的函数,返回一个填充的voc对象和对列表
def loadPrepareData(corpus, corpus_name, datafile, save_dir):print("Start preparing training data ...")voc, pairs = readVocs(datafile, corpus_name)print("Read {!s} sentence pairs".format(len(pairs)))pairs = filterPairs(pairs)print("Trimmed to {!s} sentence pairs".format(len(pairs)))print("Counting words...")for pair in pairs:voc.addSentence(pair[0])voc.addSentence(pair[1])print("Counted words:", voc.num_words)return voc, pairs# 加载/组装voc和对
save_dir = os.path.join("data", "save")
voc, pairs = loadPrepareData(corpus, corpus_name, datafile, save_dir)
# 打印一些对进行验证
# print("\npairs:")
# for pair in pairs[:10]:
#     print(pair)'''
另一种有利于让训练更快收敛的策略是去除词汇表中很少使用的单词。减少特征空间也会降低模型学习目标函数的难度。
我们通过以下两个步 骤完成这个操作: 
* 使用voc.trim函数去除 MIN_COUNT 阈值以下单词 。 
* 如果句子中包含词频过小的单词,那么整个句子也被过滤掉。
'''
MIN_COUNT = 3    # 修剪的最小字数阈值def trimRareWords(voc, pairs, MIN_COUNT):# 修剪来自voc的MIN_COUNT下使用的单词,即单词出现频率低于MIN_COUNT的话那么就会筛掉voc.trim(MIN_COUNT)# Filter out pairs with trimmed wordskeep_pairs = []for pair in pairs:input_sentence = pair[0]output_sentence = pair[1]keep_input = Truekeep_output = True# 检查输入句子for word in input_sentence.split(' '):if word not in voc.word2index:keep_input = Falsebreak# 检查输出句子for word in output_sentence.split(' '):if word not in voc.word2index:keep_output = Falsebreak# 只保留输入或输出句子中不包含修剪单词的对if keep_input and keep_output:keep_pairs.append(pair)print("Trimmed from {} pairs to {}, {:.4f} of total".format(len(pairs), len(keep_pairs), len(keep_pairs) / len(pairs)))return keep_pairs# 修剪voc和对
pairs = trimRareWords(voc, pairs, MIN_COUNT)
# for pair in pairs[:10]:
#     print(pair)
#*******************************2.2 加载和清洗数据 end *******************************
#**********************************2.加载和预处理数据**********************************

五.为模型准备数据

尽管我们已经投入了大量精力来准备和清洗我们的数据,将它变成一个很好的词汇对象和一系列的句子对,但我们的模型最终希望数据以 numerical torch张量作为输入。可以在seq2seq translation tutorial 中找到为模型准备处理数据的一种方法。 在该教程中,我们使用batch size大小为1,这意味着我们所要做的就是将句子对中的单词转换为词汇表中的相应索引,并将其提供给模型。

但是,如果你想要加速训练或者想要利用GPU并行计算能力,则需要使用小批量mini-batches来训练。

使用小批量mini-batches也意味着我们必须注意批量处理中句子长度的变化。为了容纳同一batch中不同大小的句子,我们将使我们的批量输 入张量大小(max_length,batch_size),其中短于max_length的句子在EOS_token之后进行零填充(zero padded)。

如果我们简单地将我们的英文句子转换为张量,通过将单词转换为索引indicesFromSentence和零填充zero-pad,我们的张量的大小将是 (batch_size,max_length),并且索引第一维将在所有时间步骤中返回完整序列。但是,我们需要沿着时间对我们批量数据进行索引并且包 括批量数据中所有序列。因此,我们将输入批处理大小转换为(max_length,batch_size),以便跨第一维的索引返回批处理中所有句子的时 间步长。 我们在zeroPadding函数中隐式处理这个转置。

#*******************************3.为模型准备数据 start *******************************
def indexesFromSentence(voc, sentence):#print([3,3,3]+[2])输出[3, 3, 3, 2],即输出句子中每个单词的序号,最后一个序号是结束符号符的数字2return [voc.word2index[word] for word in sentence.split(' ')] + [EOS_token]# zip 对数据进行合并了,相当于行列转置了
def zeroPadding(l, fillvalue=PAD_token):#参数前加一个星号,将传递进来的参数放在同一个元组中,该参数的返回值是一个元组# (在本案例中即把indexesFromSentence返回的列表转化成元组)# itertools.zip_longest作用参考https://blog.csdn.net/yiweiwei516/article/details/118182889return list(itertools.zip_longest(*l, fillvalue=fillvalue))# 记录 PAD_token的位置为0, 其他的为1
def binaryMatrix(l, value=PAD_token):m = []for i, seq in enumerate(l):#即m是一个二维矩阵,一行就对应一个句子,然后用0/1来表示句子中单词是否为填充符m.append([])for token in seq:if token == PAD_token:m[i].append(0)else:m[i].append(1)return m# 返回填充前(加入结束index EOS_token做标记)的长度 和 填充后的输入序列张量
def inputVar(l, voc):#返回值是列表里套列表,每个列表里是每个句子里的各单词对应的索引序号indexes_batch = [indexesFromSentence(voc, sentence) for sentence in l]#indexes就是里层的单个列表,lengths也是个列表,然后转换成了张量,里面每个值对应了每个句子的长度lengths = torch.tensor([len(indexes) for indexes in indexes_batch])# 填充加转置,返回值是列表里面套一个个元组padList = zeroPadding(indexes_batch)#torch.LongTensor是64位整型padVar = torch.LongTensor(padList)return padVar, lengths# 返回填充前(加入结束index EOS_token做标记)最长的一个长度 和 填充后的输出序列张量, 和 填充后的标记 mask
def outputVar(l, voc):indexes_batch = [indexesFromSentence(voc, sentence) for sentence in l]max_target_len = max([len(indexes) for indexes in indexes_batch])padList = zeroPadding(indexes_batch)padVar = torch.LongTensor(padList)mask = binaryMatrix(padList)#torch.ByteTensor构建一个Byte类型的张量mask = torch.ByteTensor(mask)return padVar, mask, max_target_len# 返回给定batch对的所有项目
def batch2TrainData(voc, pair_batch):pair_batch.sort(key=lambda x: len(x[0].split(" ")), reverse=True)input_batch, output_batch = [], []#将语句对分开for pair in pair_batch:print(pair)input_batch.append(pair[0])output_batch.append(pair[1])# 返回填充前(加入结束index EOS_token做标记)的长度 和 填充后的输入序列张量inp, lengths = inputVar(input_batch, voc)# 返回填充前(加入结束index EOS_token做标记)最长的一个长度 和 填充后的输出序列张量, 和 填充后的标记 maskoutput, mask, max_target_len = outputVar(output_batch, voc)return inp, lengths, output, mask, max_target_len# 验证例子
print('***********************************************************************************')
small_batch_size = 5
#random模块中choice()可以从序列中获取一个随机元素,并返回一个(列表,元组或字符串中的)随机项
#batches是随机从所有语句对中国选取的5个语句对
batches = batch2TrainData(voc, [random.choice(pairs) for _ in range(small_batch_size)])
input_variable, lengths, target_variable, mask, max_target_len = batchesprint("input_variable:", input_variable)
print("lengths:", lengths)
print("target_variable:", target_variable)
print("mask:", mask)
print("max_target_len:", max_target_len)
#*******************************3.为模型准备数据 end *******************************

以下代码期间的一些测试,有的时候如果自己不太清楚到底输入了什么输出了什么,就直接打印出来看看,是一个不错的方式:

import itertools#delimiter:分隔符
# import codecs
#
# delimiter = '\t'
# print('delimiter:',delimiter)
# # codecs.decode()方法的使用参考https://zhuanlan.zhihu.com/p/377436438
# delimiter = str(codecs.decode(delimiter, "unicode_escape"))
# print('delimiter:',delimiter)#测试没见过的语法:
'''
lines=['abc','de','f']
def back_for_test():result=[line for line in lines]return result;print(back_for_test())
'''#indexesFromSentence测试
# print([3,3,3]+[2])
#输出[3,3,3,2]#zeroPadding测试PAD_token=0
def zeroPadding(l, fillvalue=PAD_token):#参数前加一个星号,将传递进来的参数放在同一个元组中,该参数的返回值是一个元组# (在本案例中即把indexesFromSentence返回的列表转化成元组)# itertools.zip_longest作用参考https://blog.csdn.net/yiweiwei516/article/details/118182889#print(itertools.zip_longest(*l, fillvalue=fillvalue))return list(itertools.zip_longest(*l, fillvalue=fillvalue))print(zeroPadding((['abc','kevin','kobe'])))#也相当于做了转置
'''
本来传入的矩阵是['abc','kevin','kobe'],可以看作如下
[a b ck e v i nk o b e
]
输出是[('a', 'k', 'k'), ('b', 'e', 'o'), ('c', 'v', 'b'), (0, 'i', 'e'), (0, 'n', 0)],可以看作如下
[a k kb e oc v b0 i e0 n 0
]
相当于做了转置还填充了PAD_token
'''

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

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

相关文章

“提效”|教你用ChatGPT玩数据

ChatGPT与数据分析&#xff08;二&#xff09; 上文给简单聊了一下为什么ChatGPT不能取代数据分析师&#xff0c;本文我们来深入感受一下如何让GPT帮助数据分析师“提效”。 场景一&#xff1a;SQL取数 背景&#xff1a;多数数据分析师都要用SQL语言从数据库中提取数据&#x…

ChatGPT技术

目录 一、什么是ChatGPT&#xff1f;二、ChatGPT的技术背景三、ChatGPT的主要特点四、ChatGPT的工作原理五、ChatGPT为何成功&#xff1f; 一、什么是ChatGPT&#xff1f; ChatGPT本质是一个对话模型&#xff0c;它可以回答日常问题、进行多轮闲聊&#xff0c;也可以承认错误回…

【ChatGPT】如何利用ChatGPT来快速统计Excel数据?

自从人工智能横空而出&#xff0c;它在人们的生活中产生了巨大的影响。尤其在企业办公领域&#xff0c;借助人工智能的力量&#xff0c;能够迅速产出丰富多样的内容&#xff0c;无论对于企业还是个人都具有重要的帮助。 想象一下&#xff0c;通过与人工智能的合作&#xff0c;您…

训练一个ChatGPT需要多少数据?

“风很大”的ChatGPT正在席卷全球。作为OpenAI在去年底才刚刚推出的机器人对话模型&#xff0c;ChatGPT在内容创作、客服机器人、游戏、社交等领域的落地应用正在被广泛看好。这也为与之相关的算力、数据标注、自然语言处理等技术开发带来了新的动力。 自OpenAI发布ChatGPT以来…

ChatGPT在数据分析中的应用

最近&#xff0c;机器学习和人工智能技术在数据分析领域中发挥着越来越大的作用。而chatgpt正是这个领域最受欢迎的仿人聊天 AI 。但是&#xff0c;对于许多数据科学家和分析师来说&#xff0c;chatgpt并不是他们首选的工具。相反&#xff0c;pandas、sk-learn是数据科学家的最…

ChatGPT数据集之谜

半个月以来&#xff0c;ChatGPT这把火越烧越旺。国内很多大厂相继声称要做中文版ChatGPT&#xff0c;还公布了上线时间表&#xff0c;不少科技圈已功成名就的大佬也按捺不住&#xff0c;携巨资下场&#xff0c;要创建“中国版OpenAI“。 不过&#xff0c;看看过去半个月在群众眼…

一文详解 ChatGPT:背后的技术,数据,未来发展

文章目录 一文详解 ChatGPTChatGPT背后的技术基于 Transformer 的预训练语言模型提示学习与指令精调思维链&#xff08;Chain of Thought&#xff0c;COT&#xff09;基于人类反馈的强化学习&#xff08;Reinforcement Learning with Human Feedback&#xff0c;RLHF&#xff0…

4个公式8个案例学会与chatGPT对话

一、什么是Prompt? (1)Prompt的概念 我们在使用GPT的时候,给GPT发送的消息就是Prompt. 例如,当我们问ChatGPT"WPS是什么软件?"时: 其中,"WPS是什么软件?"这句话就是Prompt. (2)为什么要学习Prompt? Prompt是我们和GPT交流的方式,我们需要让GPT了解…

与ChatGPT的一次技术对话

文章目录 前言 - 向引领前沿技术的伟大工作者致敬提问&#xff1a;请给我推荐几个最先进的目标检测AI模型提问&#xff1a;YOLOv4是什么原理&#xff0c;有什么创新提问&#xff1a;请问你知道yolov5吗提问&#xff1a; 那yolov5又有什么创新呢提问&#xff1a;你刚刚的回答正确…

ChatGPT入门案例|商务智能对话客服(一)

ChatGPT是人工智能研究实验室OpenAI新推出的一种人工智能技术驱动的自然语言处理工具,使用了Transformer神经网络架构,也是GPT-3.5架构,这是一种用于处理序列数据的模型,拥有语言理解和文本生成能力,尤其是它会通过连接大量的语料库来训练模型,这些语料库包含了真实世界中…

最近火爆了的对话ChatGPT

前言 相信最近小伙伴们已经被ChatGPT的惊艳效果刷屏了&#xff0c;之前笔者也介绍过一些对话方向的工作&#xff0c;感兴趣的小伙伴可以穿梭&#xff1a; 对话系统最新综述II https://zhuanlan.zhihu.com/p/446760658 在对话系统中建模意图、情感: https://zhuanlan.zhihu.com/…

ChatGPT对话数据备份

ChatGPT对话数据备份 文章目录 ChatGPT对话数据备份1. 背景2. 其他&#xff08;失败的&#xff09;方法2.1 右键另存为2.2 直接copy html代码 3. 编写Javascript脚本3.1 思路过程3.2 安装教程3.3 使用说明3.4 最终效果 1. 背景 之前在ChatGPT更新时有好几天都无法查看过往对话…

ChatGPT教程之 01 什么是ChatGPT革命性的对话生成新工具

今天,我想揭开 ChatGPT 的神秘面纱——GANs*(生成对抗网络)的一个迷人的新应用程序,它在 AI 社区中引起了很大的轰动。 对于那些不熟悉 GAN 的人来说,它们是一种神经网络,它使用两个相互竞争的网络——一个生成器和一个鉴别器——来创建逼真的输出。生成器创建假输出,而…

AIGC:ChatGPT(一个里程碑式的对话聊天机器人)的简介(意义/功能/核心技术等)、使用方法(七类任务)、案例应用(提问基础性/事实性/逻辑性/创造性/开放性的问题以及编程相关)之详细攻略

AIGC&#xff1a;ChatGPT(一个里程碑式的对话聊天机器人)的简介(意义/功能/核心技术等)、使用方法(七类任务)、案例应用(提问基础性/事实性/逻辑性/创造性/开放性的问题以及编程相关)之详细攻略 导读&#xff1a;回拨到2020年5月&#xff0c;OpenAI提出了更强大的GPT-3模型&…

聊聊ChatGPT是如何组织对话的

为什么要组织对话&#xff1f; 总所周知&#xff0c;ChatGPT的训练大致可分为下图中展示的几个阶段&#xff0c;其中&#xff0c;在Pretraining阶段&#xff0c;模型的训练数据是纯文本&#xff0c;目标是根据上文预测下一个token&#xff0c;而在后面的几个阶段中&#xff0c…

和ChatGPT的一番对话

试用了一下ChatGPT&#xff0c;问了几个问题&#xff0c;虽然对人工智能充满信心&#xff0c;但是ChatGPT给我的感觉还没有形成气候。TA的很多回答是基于一些网络信息进行的糅合&#xff0c;甚至只是简单的复制。不过&#xff0c;毕竟还是处在发展的初级阶段&#xff0c;存在一…

如何与ChatGPT愉快地聊天

原文链接&#xff1a;https://mp.weixin.qq.com/s/ui-O4CnT_W51_zqW4krtcQ 人工智能的发展已经走到了一个新的阶段&#xff0c;在这个阶段&#xff0c;人工智能可以像人一样与我们进行深度的文本交互。其中&#xff0c;OpenAI的ChatGPT是一个具有代表性的模型。然而&#xff0…

实现chatgpt自然对话

1.概述 ChatGPT是当前自然语言处理领域的重要进展之一&#xff0c;通过预训练和微调的方式&#xff0c;ChatGPT可以生成高质量的文本&#xff0c;可应用于多种场景&#xff0c;如智能客服、聊天机器人、语音助手等。本文将详细介绍ChatGPT的原理、实战演练和流程图&#xff0c…

【ChatGPT实战】12.一键免费部署你的私人-ChatGPT-网页

正常来说搭建一个私人ChatGPT网页需要一定的网页开发技术和费用。幸运的是&#xff0c;现在有一种简便的方法可以一键免费部署你的私人ChatGPT网页。 本文将教大家如何实现&#xff0c;按照我的教程免费部署你自己的私人 ChatGPT 网页&#xff0c;让你的小伙伴们通过访问你的C…

免费无需魔法会语音聊天的ChatGPT

今天发现了一个很好的ChatGPT&#xff0c;可以语音聊天&#xff0c;而且免费无需魔法 角色目前包括夏洛克、雷电影等等&#xff0c;对话的声调完全模拟了原角色&#xff01; 目前只有英文和日语两种对话&#xff0c;我们可以文字输入或者语音输入&#xff0c;中文即可&#xff…