大模型具有生成和理解自然语言的强大能力,但在专属领域中,通用模型往往表现不尽如人意。为了解决这一问题,越来越多的人希望能够使用基于专业或行业领域的大语言模型,以提高回答问题的准确性。
从零开始训练一个大模型所需的算力、成本以及数据质量和数量的要求都非常高,因此并不适用于所有人。
然而,我们可以选择在已有的大模型(例如GPT系列)上进行微调。微调是指在已经训练好的大模型的基础上,使用专业领域的数据进行进一步训练。通过在原有大模型的基础上添加专业领域的数据,可以对模型进行微调,从而减少大模型出错的概率和降低模型出现幻觉的次数。这种方法不仅能够显著提升模型在特定领域的表现,还能够在一定程度上控制成本,是一种切实可行的解决方案。
微调允许我们在已有大模型的基础上,加入特定领域的新数据,从而增强模型在该领域的知识和表现能力。例如,通过加入医学领域的数据,模型可以更准确地回答医学相关的问题。
通用大模型在某些专业领域可能会出现错误或不准确的信息。通过微调,我们可以利用高质量的领域特定数据来修正这些错误,从而提高模型的准确性和可靠性。
与从零开始训练一个大模型相比,微调所需的资源和成本大大降低。微调只需要在已有模型的基础上进行进一步训练,这使得微调的成本和算力需求更容易计算和管理,对于中小型企业和个人用户来说尤其实用。
在开始微调之前,需要确认微调的方向并收集相应的专业知识,以便模型能够学习该领域的专业内容,这样,经过多次微调后,模型才能给出令人满意的结果。需要包含如下步骤:
可微调的模型如下:
数据示例格式如下:
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already."}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?"}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters."}]}
示例文件下载:点击下载 jsonl 文件
在准备好数据之后,就可以开始模型的微调。主要分为以下几个步骤:
上述准备好的数据可以保存进jsonl文件,主要在这个文件中,每行都是完整的一条json数据,即每一行都是完整的一次对话。使用文件 API 上传文件,以便与微调作业一起使用。
from openai import OpenAI
client=OpenAI()
client.files.create(
file=open('<jsonl文件路径>','rb'),
purpose='fine-tune'
)
一次上传文件的大小最大为 1G,但是不建议使用这么大的数据量进行微调,上传文件需要时间并且不太可能需要那么大的数据量才能看到改进。
确保数据集上传正确后,就可以创建微调作业,可以通过界面化或者编程的方式来创建微调作业。示例如下:
from openai import OpenAI
client = OpenAI()
client.fine_tuning.jobs.create(
training_file="file-abc123", # 训练文件上传到 OpenAI API 时返回的文件 ID。可以使用后缀参数自定义微调模型的名称
model="gpt-3.5-turbo" # 要微调的模型的名称
)
使用上述创建微调任务后,一般情况下会有一个等待微调成功的时间,可以使用以下的 API 随时查看微调的结果:
# 检查微调任务的状态
job_retrieved = client.fine_tuning.jobs.retrieve('ftjob-abc123')
# 列出存在的10条job
client.fine_tuning.jobs.list(limit=10)
# 列出微调中的10条事件
client.fine_tuning.jobs.list_events(fine_tuning_job_id="ftjob-abc123", limit=10)
# 删除一个微调的模型
client.models.delete("ft:gpt-3.5-turbo:abc276")
等待模型微调成功后,即可直接调用该模型进行测试,为了方便看出差异,可以同时调用 gpt-3.5-turbo 和微调后的模型并且询问同一个问题,便能看出微调的效果:
completion = client.chat.completions.create(
model="gpt-3.5-turbo",
# 修改调用的模型类型
# model="<微调后的模型>",
messages=[
{"role": "system", "content": "<给出系统角色需要提前给出的提问背景信息>"},
{"role": "user", "content": "<用户提问的问题>"}
],
# 控制生成文本时的随机性
temperature=0.7,
# 生成的响应数量
n=1,
# 用于终止生成的令牌列表或字符串。
stop=None
)
# 打印看出答案
print(completion_fine.choices[0].message.content)
为了完成对模型的微调,需考虑到一次微调的结果很可能不如预期,因此可以通过不断调整训练数据集来提高模型输出的质量。具体可参考内容如下:
检查现有示例:
追加新的示例:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。