我用ChatGPT提供的API做过微调 ,一共跑了138轮,最后的loss降得还算平稳。
我想要实现的是让ChatGPT输出的语气语调要带有「道家思想」,下面是我之前做的测试。经过微调后的ChatGPT给我的回答:应对压力要心无杂念。这就是我要的效果,因为最原始的ChatGPT做不了某些特定需求的工作,比如说它对于中国的古诗词的效果就不太好,大概率是因为它的训练数据中没有包含全部的古诗词,所以微调fine-tuning、RAG、Prompt工程其实都是在原有的模型上打补丁。 其实微调很好理解,就是一个高考完的学生,天文地理都懂一些,但是让他们干某一件具体的的事情,比如从切菜、配料和炒菜这样的活他们是干不了的。他们知道刀可以切菜,但是什么菜怎么切最好是没有经验的;炒菜也一样,他们的物理化学肯定学了高温下的化学反应,但是具体的菜什么火候他们并不懂,所以需要做一下专项训练,也就是微调。这也是大模型各种补丁的主要作用,就是应对「特殊的需求/没有见过的问题/调整一下输出的形式」,根据OpenAI的官方介绍,微调适用于以下五种情况:
我的例子其实就是第一种,仅仅是对风格和语气进行调整。
实际上用OpenAI的API微调非常的简单,就这么简单的几步:
在对OpenAI的API进行微调时,我遇到的最大问题是准备数据集,因为其他步骤基本上都是自动化的。这是我准备的数据集,你可以看到跟训练好的GPT的输出非常的像,因为这就是我要的效果。{"messages": [{"role": "system", "content": "道言是一个基于道家思想和语录回答问题的聊天机器人。"}, {"role": "user", "content": "如何找到内心的平静?"}, {"role": "assistant", "content": "内心的平静在于清心寡欲。正如庄子所言:'淡泊以明志,宁静以致远。'"}]} {"messages": [{"role": "system", "content": "道言是一个基于道家思想和语录回答问题的聊天机器人。"}, {"role": "user", "content": "如何面对挫折?"}, {"role": "assistant", "content": "面对挫折,要像水一样柔韧。老子说:'上善若水,水善利万物而不争。'"}]}
数据集的质量实际上决定了微调后模型的效果。总体来说,用现成的微调工具,比如说OpenAI的会非常的简单,效果是由你的数据决定的。但是有一个问题,那就是OpenAI的模型都是闭源的,如果你的数据是保密的或者说不能承受数据泄露的风险,那必须使用开源大模型,比如Llama或者Qwen系列。其实不管开源还是闭源大模型,微调是刚需,因为没办法一次性把所有的知识都灌输给大模型,毕竟每天都有新的知识产生,所以才有了各种各样的「打补丁」方式,提供了微调接口的大模型操作起来非常的简单,但是不了解原理的话还是会难以操作,以下是常见的大模型微调方法。全量微调(Full Fine Tuning, FFT)这种方法重新训练模型的所有参数,以适应新的任务或领域。虽然性能提升显著,但需要大量计算资源和时间,且存在灾难性遗忘的风险,即模型可能忘记预训练时学到的通用知识。 参数高效微调(Parameter-Efficient Fine Tuning, PEFT)PEFT旨在减少微调的计算成本,通过调整模型的一小部分参数或添加额外参数来适应新任务。包括以下策略:- Prompt Tuning:不改变模型参数,为每个任务训练小型附加参数,这些参数影响输入的表示。
- Prefix Tuning:在模型输入序列前添加固定长度的向量或“前缀”,这些向量在训练中被优化,引导模型产生特定于任务的输出。
- LoRA(Low-Rank Adaptation):通过低秩分解添加和训练少量参数,以适应新任务,实现快速适应和轻松切换不同任务。
监督式微调(Supervised Fine Tuning, SFT)使用带标签的数据集,通过传统监督学习方式对模型进行微调。基于人类反馈的强化学习微调(Reinforcement Learning with Human Feedback, RLHF)结合人类反馈,通过强化学习调整模型,使其输出更符合人类期望。 基于AI反馈的强化学习微调(Reinforcement Learning with AI Feedback, RLAIF)类似于RLHF,但反馈来源是AI系统,旨在提高反馈效率和降低成本。其实除了微调之外,RAG(Retrieval-Augmented Generation)也非常的火,因为它相当于考试的时候带了参考书,这也是很多需要严谨回答时候采用的方法。
Verba是一个可以兼容很多个模型且直接可用的RAG工具。 它可以支持大多数主流大模型,以及可以做多种文件类型的支持。