chatgpt-fine-tuning(模型训练)

2,137 阅读7分钟

chatgpt-训练(fine-tuning)

一、  目的

chatgpt数据仅有2021年以前的数据,同时企业的私有数据chatgpt也不具备,为了让chatgpt更全面以及更有针对性的提供服务,就需要提供较新的数据以及企业私有数据对chatgpt进行训练:fine-tuning (注:采用训练模型返回的结果均为训练数据类的结果集,chatgpt会根据问题的语义进行结果集的匹配,所以训练数据决定了训练模型的精确度和范围)

二、  训练步骤

2.1、环境准备:

安装openai(python环境3以上)

pip install --upgrade openai

绑定key

export OPENAI_API_KEY="<OPENAI_API_KEY>" (windows不适用)

2.2、准备数据:

2.2.1、分类

在分类问题中,提示中的每个输入都应对应到预定义的类别

判断真假:判断真实性

假设您希望确保您网站上的广告文字提及正确的产品和公司。换句话说,您要确保模型没有胡编乱造。您可能想要微调过滤掉不正确广告的分类器。

数据集可能类似于以下内容:

{"prompt":"Company: BHFF insurance\nProduct: allround insurance\nAd:One stop shop for all your insurance needs!\nSupported:", "completion":" yes"}
{"prompt":"Company: Loft conversion specialists\nProduct: -\nAd:Straight teeth in weeks!\nSupported:", "completion":" no"}

在上面的示例中,我们使用了包含公司名称、产品和相关广告的结构化输入。作为分隔符,我们使用\nSupported:它清楚地将提示与完成分开。对于足够数量的示例,分隔符不会产生太大影响(通常小于 0.4%),只要它没有出现在提示或完成中即可。

对于这个用例,我们微调了一个 ada 模型,因为它会更快、更便宜,而且性能将与更大的模型相当,因为它是一个分类任务

判断好坏:判断情绪

假设您想要了解特定文字的正面或负面程度。数据集可能类似于以下内容:

{"prompt":"Overjoyed with the new iPhone! ->", "completion":" positive"}
{"prompt":"@lakers disappoint for a third straight night https://t.co/38EFe43 ->", "completion":" negative"}

对模型进行微调后,您可以通过在logprobs=2完成请求上设置来取回第一个完成令牌的对数概率。正类别的概率越高,相对情绪就越高。

区分类别:邮件分类

假设您希望将收到的电子邮件归入大量预定义类别之一。对于大量类别的分类,我们建议您将这些类别转换为数字,最多可处理约 500 个类别。我们观察到,由于标记化,在数字前添加一个空格有时会对性能略有帮助。您可能希望按如下方式构建训练数据:

{"prompt":"Subject: Update my address\nFrom:Joe Doe\nTo:support@ourcompany.com\nDate:2021-06-03\nContent:Hi,\nI would like to update my billing address to match my delivery address.\n\nPlease let me know once done.\n\nThanks,\nJoe\n\n###\n\n", "completion":" 4"}

在上面的示例中,我们使用了一封上限为 2043 个令牌的传入电子邮件作为输入。(这允许使用 4 个标记分隔符和一个标记完成,总计为 2048。)作为分隔符,我们使用并删除了电子邮件中\n\n###\n\n出现的所有内容。###

2.2.2、条件生成

条件生成是需要在给定某种输入的情况下生成内容的问题。这包括释义、总 结、实体提取、编写给定规范的产品描述、聊天机器人等。

生成:广告

这是一个生成用例,因此您需要确保提供的样本具有最高质量,因为微调模 型将尝试模仿给定示例的风格(和错误)。一个好的起点是大约 500 个示例。示 例数据集可能如下所示:

{"prompt":"Samsung Galaxy Feel\nThe Samsung Galaxy Feel is an Android smartphone developed by Samsung Electronics exclusively for the Japanese market. The phone was released in June 2017 and was sold by NTT Docomo. It runs on Android 7.0 (Nougat), has a 4.7 inch display, and a 3000 mAh battery.\nSoftware\nSamsung Galaxy Feel runs on Android 7.0 (Nougat), but can be later updated to Android 8.0 (Oreo).\nHardware\nSamsung Galaxy Feel has a 4.7 inch Super AMOLED HD display, 16 MP back facing and 5 MP front facing cameras. It has a 3000 mAh battery, a 1.6 GHz Octa-Core ARM Cortex-A53 CPU, and an ARM Mali-T830 MP1 700 MHz GPU. It comes with 32GB of internal storage, expandable to 256GB via microSD. Aside from its software and hardware specifications, Samsung also introduced a unique a hole in the phone's shell to accommodate the Japanese perceived penchant for personalizing their mobile phones. The Galaxy Feel's battery was also touted as a major selling point since the market favors handsets with longer battery life. The device is also waterproof and supports 1seg digital broadcasts using an antenna that is sold separately.\n\n###\n\n", "completion":"Looking for a smartphone that can do it all? Look no further than Samsung Galaxy Feel! With a slim and sleek design, our latest smartphone features high-quality picture and video capabilities, as well as an award winning battery life. END"}

这里我们使用了多行分隔符,因为维基百科文章包含多个段落和标题。我们还使用了一个简单的结束标记,以确保模型知道何时应该完成完成

生成:提炼总结

这类似于语言转换任务。为了提高性能,最好按字母顺序或按照它们在原始文本中出现的相同顺序对不同的提取实体进行排序。这将有助于模型跟踪需要按顺序生成的所有实体。数据集可能如下所示:

{"prompt":"Portugal will be removed from the UK's green travel list from Tuesday, amid rising coronavirus cases and concern over a "Nepal mutation of the so-called Indian variant". It will join the amber list, meaning holidaymakers should not visit and returnees must isolate for 10 days...\n\n###\n\n", "completion":" Portugal\nUK\nNepal mutation\nIndian variant END"}

多行分隔符效果最好,因为文本可能包含多行。理想情况下,输入提示的类 型会高度多样化(新闻文章、维基百科页面、推文、法律文件),这反映了提取 实体时可能遇到的文本。

生成:聊天机器人

聊天机器人通常会包含有关对话的相关上下文(订单详细信息)、到目前为止的对话摘要以及最近的消息。对于这个用例,相同的过去对话可以在数据集中生成多行,每次都有稍微不同的上下文,对于每个代理生成作为完成。这个用例将需要几千个示例,因为它可能会处理不同类型的请求和客户问题。为确保高质量的性能,我们建议审查对话样本以确保代理消息的质量。可以使用单独的文本转换微调模型生成摘要。数据集可能如下所示:

{"prompt":"Summary: <summary of the interaction so far>\n\nSpecific information:<for example order details in natural language>\n\n###\n\nCustomer: <message1>\nAgent: <response1>\nCustomer: <message2>\nAgent:", "completion":" <response2>\n"}
{"prompt":"Summary: <summary of the interaction so far>\n\nSpecific information:<for example order details in natural language>\n\n###\n\nCustomer: <message1>\nAgent: <response1>\nCustomer: <message2>\nAgent: <response2>\nCustomer: <message3>\nAgent:", "completion":" <response3>\n"}

2.3、数据验证

通过官方的数据验证工具,会验证传入的数据的正确性,同时会生成符合要求的jsonl文件。(支持上传CSV、TSV、XLSX、JSON或JSONL文件)

openai tools fine_tunes.prepare_data -f <LOCAL_FILE>
openai --api-key <OPENAI_API_KEY> tools fine_tunes.prepare_data -f <数据文件> (windows适用)

2.4、训练:

准备好数据集之后,通过命令行开始训练

基本模型分类:

ada:最快、价格最低的模型,适用于简单的分析文本,简单分类,文本修正,关键词搜索等

babbage:比ada价格、性能高一点的模型,适用于一般类型的分类识别、语义分析等

curie :性能、功能、价格高于babbage,适用于语言翻译、复杂的分类,情感、总结等

davinci:功能、性能、价格最高的模型,适用于表达复杂的意图、因果关系分析、创意生成、语义搜索、摘要总结等

openai api fine_tunes.create -t <数据文件> -m <基础模型>
openai --api-key <OPENAI_API_KEY> api fine_tunes.create -t <数据文件> -m <基础模型>   (windows使用本命令)

训练会根据数据量大小、选择的模型,花费不同的时长(可以通过查询训练模型查看训练的状态),训练完成后,通过查询,获得训练完成后的模型名称

# 查询全部训练模型清单(windows需要加 --api-key <OPENAI_API_KEY>)
openai api fine_tunes.list

# Retrieve the state of a fine-tune. The resulting object includes
# job status (which can be one of pending, running, succeeded, or failed)
# and other information
# 检索作业状态
openai api fine_tunes.get -i <YOUR_FINE_TUNE_JOB_ID>

# Cancel a job 取消作业
openai api fine_tunes.cancel -i <YOUR_FINE_TUNE_JOB_ID>

等待训练

训练中

训练完成

三、  使用

完成训练后可以通过模型名称来调用训练好的模型(注:采用训练模型返回的结果均为训练数据类的结果集,chatgpt会根据问题的语义进行结果集的匹配,所以训练数据决定了训练模型的精确度和范围)

CLI (windows需要加 --api-key <OPENAI_API_KEY>)

openai api completions.create -m <模型名称> -p "你的问题"

cURL

curl https://api.openai.com/v1/completions \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt": YOUR_PROMPT, "model": FINE_TUNED_MODEL}'

Pyton

import openai
openai.Completion.create(
    model=FINE_TUNED_MODEL,
    prompt=YOUR_PROMPT)

Node.js:

const response = await openai.createCompletion({
  model: FINE_TUNED_MODEL
  prompt: YOUR_PROMPT,
});

四、  删除

如果不再使用以上模型,可以进行删除

CLI

openai api models.delete -i <FINE_TUNED_MODEL>

CURL

curl -X "DELETE" https://api.openai.com/v1/models/<FINE_TUNED_MODEL> \
  -H "Authorization: Bearer $OPENAI_API_KEY"

Python:

import openai
openai.Model.delete(FINE_TUNED_MODEL)

附件:以下为一个机场导航训练的示例数据模板

示例.json