前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenAI放开ChatGPT微调接口!国内厂商压力山大!|附详细微调操作指南

OpenAI放开ChatGPT微调接口!国内厂商压力山大!|附详细微调操作指南

作者头像
技术人生黄勇
发布2024-07-19 18:21:45
540
发布2024-07-19 18:21:45
举报
文章被收录于专栏:技术人生黄勇

OpenAI 于近日放开 ChatGPT 微调接口,这对于开发者来说无疑是一个利好消息。微调可以帮助开发者根据自己的特定需求对 ChatGPT 进行个性化定制,从而提升模型的性能。

本文将详细介绍 ChatGPT 微调的价格、使用场景、步骤、数据集准备和结果分析,助力开发者充分发挥 ChatGPT 的潜力。

01

昨天看到好些媒体报道OpenAI官宣上线了微调(Fine-tuning)接口,现阶段支持ChatGPT-3.5,后续将来继续推出GPT-4的版本。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

官方表示:微调后的GPT-3.5 Turbo,在具体任务中,性能与GPT-4实力相当,甚至反超GPT-4。

对于这个官方更新,还有朋友问我,“这意思怎么理解?”‍‍‍

自ChatGPT-3.5 Turbo推出以来,因为这个大模型是个通用模型,开发者和企业一直努力寻求定制化模型,从而为用户打造独特且与众不同的体验。

例如,针对不同的任务:写作、推理、改写、营销等等,写一些有针对性的提示词Prompt。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

或者根据不同的行业,和垂直行业知识库结合,让通用模型在特定行业内更专业。

通过此次微调接口的发布,开发者可以进行有监督微调,以提升GPT在特定应用场景下的性能表现。‍‍‍‍

在官方的内部测试版本中,微调客户已经可以通过监督微调显著提升模型在常见应用案例中的表现,例如:

  • 提升了可操作性: 微调允许模型更好地遵循指令。如使输出更为简洁或始终使用特定语言进行回应。

例如,开发者可以通过微调确保在使用德语提示时,模型总是以德语作出回应。

  • 稳定的输出格式: 微调增强了模型保持一致的响应格式能力,对于需要特定响应格式的应用(如代码补全或编写API调用)而言,这一点至关重要。开发者可以借助微调,更可靠地将用户提示转化为高质量的JSON片段,以在自身系统中使用。

曾经有朋友问过类似的问题:“在使用prompt template批量调用api处理文本的时候,怎么设置能尽可能让response保持一致的风格呢?如果在chat界面 有上下文的情况下,反复用这个模板处理给出的格式是统一的没问题,但是用api每次独立调用返回就会导致不一致。”

按官方的说法,经过微调后,应该可以避免类似问题。

  • 个性化风格: 不同的品牌对外发出的声音是不一样的,微调可以提升模型输出质量、调整语调以更符合企业品牌风格,使其与其品牌风格更加一致,不论是成熟稳重还是锐意进取型的风格。
  • 更短的提示,相同的性能:微调还使企业能够在缩短响应时间的同时保持类似性能水平。通过对GPT-3.5-Turbo进行微调,现在可以处理4k token,是未微调模型的两倍。在早期测试中,通过对模型的微调,将提示的文本大小减少了高达90%,从而加快了每个API调用的速度并降低了成本。

能够做到这点是因为,微调能够训练出超过提示范围的示例。

GPT 模型已经过大量文本的预训练。为了有效地使用模型,我们在和ChatGPT对话时,在提示中包含说明,有时还包含几个示例,使用示范来展示如何执行任务,这类示范通常称为“小样本学习”。

微调通过训练超出提示范围的更多示例来改进小样本学习,可以在大量任务上取得更好的结果。一旦模型经过微调,用户就不需要在提示中提供那么多示例。

同时,我们还可以继续使用提示工程、信息检索和函数调用等其他技术,与微调相结合,会使大模型发挥出最强大的能力。

说人话就是,未微调的ChatGPT就是一个大众化的厨师,什么菜(中西餐,国内各种菜系)都能做,你跟他说做川菜的水煮鱼(通过提示词Prompt),他给你做一份中规中矩的水煮鱼,你再说得详细一些(提示词细化),他做得更贴近你的口味爱好。‍‍‍‍

微调之后,他就成了你家专属的川菜厨师,有你家定制化的内容(微调数据):比如辣度在大众化的基础上调高,或者减轻,甚至不辣。放多多的鱼肉片,配菜不使用豆芽,使用别的你喜爱的某种配菜等等。

或者微调后,他学会了做以前不会做的菜。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

02

价格

微调成本分为两部分:初始训练成本和使用成本:

  • 培训:0.008 美元/1K token‍‍
  • 使用输入:0.012 美元/1K token‍‍
  • 使用输出:0.016 美元/1K token‍

例如,一个gpt-3.5-turbo包含 100,000 个token的训练文件并训练 3 个epoch 的微调作业的预期成本为 2.40 美元。

为了让朋友们对训练成本有更直观的印象,我使用谷歌的 Cloab 训练了一个1197条新闻邮件数据集,文件大小1.52M,训练一次花为 0.78 美元。

见下图:Usage:$0.78

从使用的价格上来看,微调后的GPT-3.5大约是原始版本的8倍。

03

何时使用微调‍‍

微调 GPT 模型可以使其更好地适应特定应用,但这需要仔细投入时间和精力。

所以官方建议首先尝试通过提示工程、提示链接(将复杂的任务分解为多个提示)和函数调用来获得良好的结果,主要原因是:

  • 对于许多任务,模型最初可能表现不佳,但通过更好的提示,还是可以获得更好的结果,并且可能不需要进行微调。
  • 迭代提示和其他策略比微调迭代具有更快的反馈循环,后者需要创建数据集并运行训练作业。
  • 在仍然需要微调的情况下,最初的提示工程工作不会浪费 - 在微调数据中使用良好的提示(或将提示链接/工具使用与微调相结合)时,会获得较好结果。

微调可以改善结果的一些场景:

  • 设置风格、基调、格式或其他定性方面
  • 提高产生所需输出的可靠性
  • 纠正未能遵循复杂提示的问题
  • 以特定方式处理许多边缘情况
  • 执行难以在提示中阐明的新技能或任务

简单来说,用提示词解决不了的场景——前提是对提示词足够熟练,建议使用微调,因为毕竟微调成本高,周期相对长。‍‍‍‍‍‍‍‍‍‍‍‍‍

04

如何微调

微调(Fine-tuning)是指在预训练的基础上,使用特定领域或任务的数据集来进一步训练模型,使其在特定任务上表现更好。对于 ChatGPT 这样的预训练语言模型,微调是将其在特定应用场景下进行个性化和定制化,以便更好地满足特定需求。

通常的微调操作步骤:

选择任务和数据集: 选择一个特定的任务,如客户支持、编程帮助、医疗咨询等,然后准备一个包含与任务相关的数据集。这个数据集会包含问题、回答以及相关的上下文信息。

模型架构: 基于预训练模型(如 GPT-3.5)的架构,根据任务的需求对模型进行微调。微调的部分可能涉及调整模型的权重和参数,以便更好地适应特定任务。

标注数据: 数据集需要进行标注,将问题、回答和上下文信息配对起来,为模型提供训练样本。在标注时,要确保问题和回答的配对是准确的,以便模型能够从中学习。

训练: 使用标注的数据集对模型进行训练。在微调过程中,模型的初始权重通常是基于预训练模型的,然后根据任务数据进行微小的权重调整。

评估和调整: 在训练过程中,可以使用验证集来定期评估模型的性能。根据性能评估结果,可以进行超参数调整、训练轮次调整等,以进一步提升模型在特定任务上的表现。

微调的目的是使模型能够更好地理解和生成与特定任务相关的语言。通过这种方式,模型可以在特定领域内生成更有用、准确的回答,并更好地适应用户的需求。

下面是OpenAI官方的微调步骤例子。

第一步:准备微调的数据

代码语言:javascript
复制
{
  "messages": [
    { "role": "system", "content": "You are an assistant that occasionally misspells words" },
    { "role": "user", "content": "Tell me a story." },
    { "role": "assistant", "content": "One day a student went to schoool." }
  ]
}

注:官方给出的微调数据例子是以一次用户和大模型完整的对话为一条训练数据,这样的训练效果最好。

system:系统,指定助手(assistant)的个性或提供有关助手在整个对话过程中应如何表现的具体说明。‍‍‍‍‍‍‍‍‍‍‍‍‍

user:用户,也就是问问题的我们。这部分写问题。

assistant:助手,也就是大语言模型ChatGPT。这部分写模型应该回复的内容。‍

第二步:上传文件‍

代码语言:javascript
复制
curl -https://api.openai.com/v1/files \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -F "purpose=fine-tune" \
  -F "file=@path_to_your_file" 

第三步:创建微调任务‍‍

代码语言:javascript
复制
curl https://api.openai.com/v1/fine_tuning/jobs \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
  "training_file": "TRAINING_FILE_ID",
  "model": "gpt-3.5-turbo-0613",
}'

注:这里 $OPENAI_API_KEY 改成自己的OpenAI账号里的Key。

模型完成微调过程后,会生成一个新的微调模型,名称类似这样:“ft:gpt-3.5-turbo:org_id”,微调模型可以直接使用,和chatgpt的基础模型共享速率限制。

第四步:使用微调模型

代码语言:javascript
复制
curl https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
  "model": "ft:gpt-3.5-turbo:org_id",
  "messages": [
    {
      "role": "system",
      "content": "You are an assistant that occasionally misspells words"
    },
    {
      "role": "user",
      "content": "Hello! What is fine-tuning?"
    }
  ]
}'

注:使用时也是 completions 接口,只是模型名称变了,是第三步生成的微调模型。

05

微调数据集要点

1. 数据多样性:创建一系列多样的对话示例,这些示例应该与你在实际应用中期望模型回应的对话相似。多样性的数据有助于模型的泛化能力。

2. 明确的问题和回复:除了在微调前进行的提示工程外,当提示工程无法解决某些问题时,可以将这些问题和正确答案放入微调数据集中,直接提升模型的效果。

3. 避免过多拒绝性回答:避免数据中出现大量类似于“我不能回答这个”的回复。模型会根据训练数据中的内容来做出决策,如果经常看到某种回答,模型可能会在实际使用中过于频繁地产生相似的回答。

4. 训练示例完整性:确保训练示例包含生成回复所需的全部信息,包括全面的问题和回答。

5. 训练示例一致性:如果多人创建训练数据,要确保一致性,避免人与人之间的差异影响模型性能。

6. 数据格式:所有训练示例的格式应与推理阶段的预期格式相同。

7. 数据量迭代:可考虑逐步增加训练示例的数量,帮助模型更好地学习任务,尤其是边缘情况。

8. 注意token长度限制:确保每个训练示例在GPT-3.5 Turbo中不超过4096个tokens,超过部分会被截断。

关于微调数据集的数量,OpenAI提供了如下建议:微调GPT-3.5 Turbo模型至少需要10条数据,而50-100条精选数据已经足够好。

官方建议从50条精心制作的数据开始微调,即可看到明显的性能提升。

06

微调结果分析

OpenAI提供了一些简单微调结果统计分析指标:

首先就是看微调过程中的评估统计指标,如训练loss、训练token准确率、测试loss和测试token准确率。这些统计数据旨在提供一个训练过程顺利的初步检查:损失应该减少,token准确率应该增加。

如上图所示,训练后的分类准确率达到了 99.6%。

"Classification accuracy"(分类准确率)是一种常用的评估指标,用于衡量分类模型在预测分类标签时的正确性。分类任务是指将输入数据分为不同的类别或标签。在这样的任务中,模型会根据输入的特征,预测出一个或多个类别,然后将其与真实的标签进行比较,从而计算出分类准确率。

具体来说,分类准确率是正确预测的样本数占总样本数的比例。它通常以百分比表示,例如,一个分类准确率为 90% 的模型意味着模型在测试数据集上有 90% 的样本被正确分类。

07

联想

在文章《OpenAI 或于 2024 年底破产?外媒也这么爱标题党》我曾提到:“限制大模型的,只有算力和数据”。‍‍‍‍‍‍‍

ChatGPT 的之前训练数据来自于互联网上的各种网站和平台,这之后如何进一步发展?换句话说,如何获得更多,更高质量的数据?‍

联系到OpenAI于2023年8月7日推出的一款网络爬虫机器人:GPTBot是为了改进未来的AI模型而设计的,它会从互联网上收集各种类型和主题的数据,比如新闻、故事、诗歌、对话等。

这些数据会被用来训练和升级OpenAI的大语言模型,使它们能够更准确地理解和生成自然语言。‍‍

从国内一家中文网站的访问日志可以看到:OpenAI的GPTBot对网页的爬取是很频繁的,每隔几分钟就来一次。

公开的信息已经有渠道和工具获取了,那垂直行业领域里,如何获取呢?‍‍‍‍‍‍‍‍‍‍‍

这次公开的微调API接口是不是能够帮助大模型再次进化,在个性化的基础上“更准确地理解和生成自然语言”?‍

“与我们所有的 API 一样,传入和传出微调 API 的数据归客户所有, OpenAI或任何其他组织不会使用该数据来训练其他模型。”

参考资料:

https://platform.openai.com/docs/guides/fine-tuning/

https://www.datalearner.com/blog/1051692762419727

阅读推荐:

中国AI软件出海第一名,竟然是这个团队

AIGC产业梳理

解锁人工智能项目开发的关键:Python 基础库详解与进阶学习

Atom Capital:大模型在金融领域落地,想说爱你不容易

$100亿模型的扩张有望2年内实现通用人工智能—与 Claude 创始人Dario Amodei 访谈录

深度解析 Llama 2 的资源汇总:不容错过

OpenAI又推新:使用ChatGPT进行内容审核

中文大模型 Chinese-LLaMA-Alpaca-2 开源且可以商用

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 技术人生黄勇 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档