财之道 - 分享付费文章

微调 gpt 3.5 实战指北

生财有术 ·

许山山2023年09月04日22:01

OpenAI于八月底开放了gpt3.5的fine-tune接口,并提供了一份文档来指导如何进行fine-tuning。

本文将通过微调一个风向标拆解模型的实战过程来跟大家分享一下微调gpt3.5的方法。

关于chatgpt分析风向标可以看这篇帖子:https://wx.zsxq.com/dweb2/index/topicdetail/584558552552284

通过阅读本文你可以了解到:

1.微调gpt3.5的方法和流程2.使用chatgpt代码解释器来辅助生成数据集的方法3.判断微调是否适合你的场景

在开始讲具体操作步骤之前,先来跟大家分享一下我这两天实际的一些体验。

首先最重要的就是,什么时候使用fine-tuning,以及fine-tuning能做到什么。

以下是我个人的一些感受:

4.当你需要训练模型生成更稳定的输出时(例如json)5.当你想让模型学习到特定的风格或者完成特定的任务时6.当你想要减少Token的消耗(但是注意这不一定会更便宜)7.抵抗prompt的逆向

接下来给大家看一下我微调的风向标模型和官方模型的效果对比。

每组中上图是微调模型,下图是原版模型。

第一组:

第二组:

如果大家仔细阅读上面的内容,你们可能并不会觉得fine-tuning后的效果一定就比原版好,因为有些分析原版的3.5也已经做的很好了。

并且由于我的数据集的质量不一定特别的好(GPT3.5生成的),可能也会有所影响,一般来说,模型决定了性能的下限,数据的质量决定了性能的上限。

而如果不深究内容,只看结构的话,你有没有发现微调后的模型输出的风格特别接近【微调可以输出特定格式,学习特定风格】,而我们并没有在prompt中强调输出的格式应该是什么样的【抵抗prompt的逆向】。然后下面是我用来生成微调数据集的prompt:


在微调模型之前,每次调用3.5的API我都需要用这一长串的prompt【微调可以减少Token的消耗,但是并不一定更便宜,因为微调模型的调用价格更贵了】。

好了,如果你读到了这里并且觉得微调可能对你有帮助,那就和我一起看看具体怎么做吧。(还有一些废话科普,来自官方文档,不想读可以直接跳到实战部分)。

什么是微调(Fine-tuning)

微调是一种机器学习技术,专门用于调整预先训练好的模型以适应特定的任务或应用。这意味着,如果你有一个特定的应用场景,比如客户服务自动回复,微调允许你使用专门的数据集来训练模型,使其更准确地响应与该场景相关的问题。

示例:假设你运营一个电商网站,并希望使用聊天机器人来回答有关退货政策的问题。通过微调,你可以训练模型更准确地回答这一类问题,而不是提供一般性的或不准确的信息。

再说的简单一点,假如大语言模型是一个运营实习生,那么微调后的模型就是一个有着3年丰富工作经验的运营。微调可以让模型表现的更【专业】。

下面是一个对比表,展示微调和传统命令(Prompting)之间的主要差异:

示例:

•命令:如果你只需要模型回答一些基础的数学问题,比如ast_mathcalQ+mathcalQ等于多少?”,通常使用命令就足够了。•微调:但如果你需要模型进行更复杂的金融分析或预测,那么微调可能是更好的选择,因为你可以使用特定的金融数据集来训练模型。

很好,让我们继续到第二部分:可微调的模型。

可微调的模型

OpenAI提供了几种不同版本的GPT模型供微调,其中最常用的是GPT-3.5-turbo。这个模型在性能和易用性方面都表现得相当出色。

支持微调的模型

•GPT-3.5-turbo(推荐)•Babbage-002•Davinci-002
OpenAI正在努力为GPT-4提供微调支持,并预计这一功能将在不久的将来推出。

如何选择模型

选择哪个模型进行微调主要取决于你的具体需求:

•GPT-3.5-turbo:如果你需要一个综合性能强、成本效益高的模型,这是最佳选择。•Babbage-002和Davinci-002:如果你是从旧版模型迁移过来,或有特定的需求,这些模型也是不错的选择。

何时应使用微调适用场景

微调在以下几种情况下特别有效:

•设置风格和语调:如果你需要模型以特定的风格或语调(例如正式或幽默)进行回应•提高可靠性:当模型需要在高风险或敏感的场景(例如医疗或法律咨询)中提供更可靠的输出。•处理复杂命令和边缘案例:当任务包含许多特定的子任务或边缘案例时。•特定技能或任务:如果你需要模型执行一项特定的任务,例如代码生成或特定领域的问答。

与其他方法的比较

在决定是否进行微调之前,通常推荐先尝试其他方法,如命令工程(PromptEngineering)或函数调用,因为这些方法的反馈循环更快。

比较:

•命令工程:通过优化命令来提高模型性能,但可能无法处理复杂或特定的任务。

•函数调用:可以用于执行简单的计算任务,但不适用于需要深度理解的场景。•微调:最适用于高度特定和复杂的任务,但需要更多的时间和资源。

科普到此结束,接下来就开始我们的实战部分了。

数据集的结构和格式

准备数据集

为了进行微调,您需要准备一个特定格式的数据集。数据集应该是一个包含多个对话示例的集合,每个示例都应模拟实际使用场景中的对话。

数据格式示例

示例


这种数据集可以直接用于微调GPT-3.5-turbo,使其更适用于风向标的拆解任务。

重要注意事项

•确保数据集包含与您期望的应用场景高度相关的对话。•数据集中的每个示例都应该限制在4096个Token内。

推荐的数据量

•最低要求:为了微调一个模型,至少需要提供10个示例。

•一般推荐:在GPT-3.5-turbo上进行微调,通常建议使用50到100个训练示例以获得明显的性能改善。

•进一步优化:如果初步微调后的模型表现良好,但仍有提升空间,可以考虑进一步增加数据量。数据量的每倍增,通常都会带来模型性能的相应提升。(但不一定会一直保持。)

原始数据的生成

我是通过调用gpt3.5的API然后使用上面那个很长的拆解风向标的prompt生成的(这个模版最早来源于刀姐的风向标作业。)

如果你不会写程序也没关系,可以直接把prompt放到chatgpt里,每次复制一个结果出来。例如在代码解释器中我们可以使用如下的prompt:


然后我们这样输入:

backslashnVnQbackslashnVnQvnAbackslashnVnQmathttbackslashnAbackslashnVnQbackslashnVnQmathttbackslashnA

这样操作大概10次以后你就有了一个可以用来训练的最小数据集了。

当然,chatgpt的代码解释器还有更强大的用法。

首先我们明确定义一下任务:

接下来不停的让它继续就好了:

这是一种结合chatgpt本身和代码解释器进行自动化的方法,虽然不如直接写程序高效,但是对于不会编程的人来说,还是有一定的效率提升的。

如果在这个过程中遇到问题,说清楚然后让ChatGPT进行修改。

这样我们得到了一份可以用来训练的数据:

不过还需要一点小小的修改,因为我们不需要这么长的systemprompt:

上传文件

为了能够训练我们的模型,首先需要把文件上传到OpenAI,这里给大家推荐一个开源工具:
有能力的圈友可以拉下来自己部署一下,不懂技术的圈友可以直接用他这里提供的链接:

http://system2.space:8001/

注意:为了安全,用完以后一定要记得删除你的APIKey。

首先第一步在下方输入你的OpenAIAPIKey然后按回车:

接下来我会使用我的魔改版做示范,和原版大差不差,就是用了自己的环境放心一些:

那接下来就上传刚才我们生成的数据集:

我的魔改版就是这里加了一个预估的花费消耗,可以看到微调这10条数据我需要花费0.13刀,还是比较贵的。

开始微调

我的版本需要手动上传到opanai(为了看花费),原版从本地就直接上传到opanai了,然后openai那边会对文件进行校验,没有问题以后会变成processed状态,这时候再点击创建fine-tuningjob就可以了。

等一段时间(根据数据集大小几分钟到几小时不等)之后再来点击GetFine-TuningJobDetail查看job的状态,如果status变成了"succeed",就表示训练完成了,然后就可以去playground试试效果了。

测试微调模型

这样我们就有了一个专门用于分析风向标的定制模型,是不是很酷?

感兴趣的话赶紧去试试吧,娱乐一下的成本也就在2刀以内,技能树可以收获一条【能够微调gpt3.5模型】。

最后想勾搭一下出海有数据的大佬一起合作,有意向的大佬评论区留言吧~

知识星球

#无标签