使用ChatGPT在指定数据集上进行对话
ChatGPT不全面简介 ChatGPT是一种基于预训练的自然语言生成模型,是GPT系列模型的一种。ChatGPT的论文并没有公开发表,最相关的一篇工作就是InstructGPT(Training language models to follow instructions with human feedback)了,发表时间是2022年3月4日。 InstructGPT基于GPT-3.5来训练的,但是GPT-3.5官方并没有释放出来。InstructGPT是结合了RLHF(reinforcement learning from human feedback)(Christiano et al., 2017; Stiennon et al., 2020)—基于人工反馈的强化学习方法 — 训练出来的文本生成模型。 上面的图展示了InstractGPT训练的三个过程: 从prompt数据库当中采样prompt列表,通过人工标注,用于对GPT-3进行微调; 训练强化学习的奖励模型,采用的方法是输入prompt到多个模型,人工标注生成的内容的相关性;通过标注的相关性数据训练奖励模型; 使用奖励模型来优化InstructGPT models (PPO-ptx)。 在指定数据集上进行对话 什么意思呢?举个栗子,给定你一个文本文件,让ChatGPT根据给定的文本内容来回答你提出的问题。下面看一个具体的例子,我在阅读InstructGPT的论文的时候,英文不太好,摘要不想,就让ChatGPT告诉我摘要在讲什么,还得中文回答我: 看这个回答还是太长了,我得让他再精简一点,要求50个字讲清楚: 虽然对字段的精确理解还差了一些,但确实短了不少😄。 现在来讲一下大概的原理。GPT模型本身就是一个In-context learning的过程,可以根据给定的上下文,生成与上下文非常相关的内容。 有了这个原理,我们就有思路了,如果是一个给定的数据集,而不是一段文本呢?另外,还有一个信息非常重要,我们是使用OpenAI的官方API(gpt-3.5-turbo模型)来实现这个demo,OpenAI的API的token数量是有限制的,所以上下文的内容长度是有限制的。那么很明显了,需要把问题和问题相关的文本块要像上面那样去组织,然后丢给OpenAI的API来回答即可。 流程图 我们来画个流程图 分步骤实现 首先把准备的语料切分成文本块,官方给的例子是按句子进行切分,然后合并相邻的两个句子,如果合并后的长度在500个token以内就保留合并的内容,如果超过这个阈值就不合并。 def split_into_many(text, max_tokens=500): sentences = text.split('. ') n_tokens = [len(tokenizer.encode(" " + sentence)) for sentence in sentences] chunks = [] tokens_so_far = 0 chunk = [] for sentence, token in zip(sentences, n_tokens): if tokens_so_far + token > max_tokens: chunks.append(". ".join(chunk) + ".") chunk = [] tokens_so_far = 0 if token > max_tokens: continue chunk.append(sentence) tokens_so_far += token + 1 return chunks 这个split_into_many函数就是对一大段文本进行切分用的,按照. 分割文本,分割后以max_tokens为阈值进行合并。最后返回文本块数组。 ...