ChatGPT-应用程序定制模型(二)

准备您的数据集

微调是一种强大的技术,可以创建一个特定于您使用情况的新模型。在微调模型之前,我们强烈建议阅读以下最佳实践和特定用例的指南。

数据格式化

为了微调模型,您需要一组训练示例,每个示例都包含一个单独的输入(“提示”)及其相关输出(“完成”)。这与使用我们的基础模型有明显不同,在基础模型中,您可能会在单个提示中输入详细说明或多个示例。

  • 每个提示应以固定分隔符结尾,以通知模型何时结束提示并开始完成。一个通常有效的简单分隔符是\n\n###\n\n。该分隔符不应出现在任何提示中的其他位置。

  • 由于我们的标记化将大多数词语与前导空格一起标记化,因此每个完成都应以空格开头。

  • 每个完成都应以固定停止序列结尾,以通知模型何时结束完成。停止序列可以是 \n### 或任何未出现在任何完成中的其他令牌。

  • 对于推理,请按创建训练数据集时相同方式格式化您的提示,并指定相同的停止序列来正确截断完成。

一般最佳实践

微调需要更多高质量的示例才能表现得更好。为了微调比使用我们的基础模型和高质量提示表现更好的模型,您应该提供至少几百个经过人类专家审核的高质量示例。从那里开始,性能往往会随着每倍增加数量而线性增加。增加样本数量通常是改善性能的最佳且最可靠的方法。

分类器是入门最容易的模型。对于分类问题,我们建议使用ada,在微调后通常只会略微劣于更强大的模型,同时速度和成本显著降低。

如果您正在对预先存在数据集进行微调而不是从头编写提示,请务必手动检查数据以查找冒犯或不准确内容(如果可能),或者尽可能审查数据集中许多随机样本(如果它很大)。

具体指南

微调可以解决各种问题,最佳使用方式可能取决于您的具体用例。以下是微调的最常见用例和相应的指南。

  • 分类

  • 模型是否发表不实言论?

  • 情感分析

  • 电子邮件分类的归类

  • 条件生成

  • 根据维基百科文章编写引人入胜的广告

  • 实体提取

  • 客户支持聊天机器人

  • 基于技术属性列表的产品描述

分类问题

在分类问题中,每个输入都应该被归类到预定义的某一类别。对于这种类型的问题,我们建议:

  • 在提示语句末尾使用分隔符,例如 \n\n###\n\n。记得在最终向模型发出请求时也要附加此分隔符。

  • 选择映射到单个标记的类别。在推理时,指定 max_tokens=1,因为你只需要第一个标记进行分类。

  • 确保提示 + 完成不超过2048个标记(包括分隔符)。

  • 针对每个类别至少有 ~100 个示例。

  • 如果想获取类别日志概率,则可以在使用模型时指定 logprobs=5(表示5个类别)。

  • 确保用于微调的数据集与模型将要用于的任务结构和类型非常相似。

案例研究:模型是否发表不实言论?

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

数据集可能如下所示:

{"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模型,因为它速度更快、成本更低,并且性能与较大的模型相当,因为这是一个分类任务。

现在我们可以通过发出“Completion”请求来查询我们的模型。

curl https://api.openai.com/v1/completions \  -H "Content-Type: application/json" \  -H "Authorization: Bearer $OPENAI_API_KEY" \  -d '{    "prompt": "Company: Reliable accountants Ltd\nProduct: Personal Tax help\nAd:Best advice in town!\nSupported:",    "max_tokens": 1,    "model": "YOUR_FINE_TUNED_MODEL_NAME"  }'

将返回yesno

案例研究:情感分析

假设您想要获得一条特定推文的积极或消极程度。数据集可能如下所示:

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

一旦模型微调完成,您可以通过在完成请求中设置logprobs=2来获取第一个完成标记的对数概率。正类别的概率越高,情感相对就越高。

现在我们可以通过发出“Completion”请求来查询我们的模型。

curl https://api.openai.com/v1/completions \  -H "Content-Type: application/json" \  -H "Authorization: Bearer $OPENAI_API_KEY" \  -d '{    "prompt": "https://t.co/f93xEd2 Excited to share my latest blog post! ->",    "max_tokens": 1,    "model": "YOUR_FINE_TUNED_MODEL_NAME"  }'

将返回:

{  "id": "cmpl-COMPLETION_ID",  "object": "text_completion",  "created": 1589498378,  "model": "YOUR_FINE_TUNED_MODEL_NAME",  "choices": [    {      "logprobs": {        "text_offset": [          19        ],        "token_logprobs": [          -0.03597255        ],        "tokens": [          " positive"        ],        "top_logprobs": [          {            " negative": -4.9785037,            " positive": -0.03597255          }        ]      },      "text": " positive",      "index": 0,      "finish_reason": "length"    }  ]}

案例研究:电子邮件分类

假设您想将收到的电子邮件归类为大量预定义的类别之一。对于大量类别的分类,我们建议您将这些类别转换为数字,这在 ~500 个类别以下效果良好。我们观察到,在数字前添加一个空格有时会略微提高性能,因为它可以进行分词处理。您可能希望按以下方式构建培训数据:

{"prompt":"Subject: <email_subject>\nFrom:<customer_name>\nDate:<date>\nContent:<email_body>\n\n###\n\n", "completion":" <numerical_category>"}

例如:

{"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,并删除了电子邮件中任何出现的###

条件生成

条件生成是一个问题,需要在给定某种输入的情况下生成内容。这包括改写、摘要、实体提取、根据规格编写产品描述、聊天机器人等。对于这种类型的问题,我们建议:

  • 在提示末尾使用分隔符,例如\n\n###\n\n。记得在最终向模型发出请求时也附加此分隔符。

  • 在完成时使用结束标记,例如END

  • 记得在推理期间将结束标记添加为停止序列,例如stop=[" END"]

  • 目标至少达到~500个示例

  • 确保提示+完成不超过2048个令牌(包括分隔符)

  • 确保示例具有高质量并遵循相同的所需格式

  • 确保用于微调的数据集与模型将要用于的任务结构和类型非常相似

  • 对于这些用例,使用较低学习率和仅1-2个时期通常效果更好

案例研究:基于维基百科文章编写引人入胜的广告

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

{"prompt":"<Product Name>\n<Wikipedia description>\n\n###\n\n", "completion":" <engaging ad> END"}
{"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":"<any text, for example news article>\n\n###\n\n", "completion":" <list of entities, separated by a newline> 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"}

在这里,我们有意地将不同类型的输入信息分开,但保持了客户代理对话在提示和完成之间的相同格式。所有的完成都应该由代理人完成,在进行推断时可以使用 \n 作为停止序列。

案例研究:基于技术属性列表的产品描述

在这种情况下,将输入数据转换为自然语言非常重要,这可能会导致更好的性能。例如,以下格式:

{"prompt":"Item=handbag, Color=army_green, price=$99, size=S->", "completion":" This stylish small green handbag will add a unique touch to your look, without costing you a fortune."}

不会像…一样有效:

{"prompt":"Item is a handbag. Colour is army green. Price is midrange. Size is small.->", "completion":" This stylish small green handbag will add a unique touch to your look, without costing you a fortune."}

为了获得高性能,请确保完成是基于提供的描述。如果经常查阅外部内容,则以自动化方式添加此类内容将改善性能。如果描述基于图像,则使用算法提取图像的文本描述可能会有所帮助。由于完成只有一句话长,因此我们可以在推理过程中使用.作为停止序列。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享