前言
首先对于OpenAI API - Fine-tuning Model (微调模型) 概念与基本使用 中的代码部分,向各位朋友道歉,对不起,没有给出实际可运行代码,而是基于原理用AI直接写的代码,今天我特别补充一篇,从代码的角度给出实际用例(包括简单训练数据示例),但是上一篇的原理部分和代码逻辑部分是正确的,为大家解释了 模型微调的基础概念。
一 训练样本数据
{"messages": [{ "role": "user", "content": "房子价格为$500,000,挂牌经纪公司是XYZ Realty,联系人John Doe,联系电话123-456-7890。" },{ "role": "assistant", "content": "$500,000" }]}
{"messages": [{ "role": "user", "content": "XYZ Realty的John Doe挂牌了一处房产,售价为$660,000,联系电话123-456-7890。" },{ "role": "assistant", "content": "$660,000" }]}
{"messages": [{ "role": "user", "content": "John Doe联系号码是123-456-7890,他在XYZ Realty挂牌了一处售价为$440,000的房产。" },{ "role": "assistant", "content": "$440,000" }]}
{"messages": [{"role": "user", "content": "Jane Smith在ABC Realty挂牌了一处房产,售价为$750,000,联系电话987-654-3210。"},{"role": "assistant", "content": "$750,000"}]}
{"messages": [{"role": "user", "content": "房子价格为$820,000,挂牌经纪公司是DEF Realty,联系人Emily Davis,联系电话321-654-0987。"},{"role": "assistant", "content": "$820,000"}]}
{"messages": [{"role": "user", "content": "在GHI Realty,Michael Brown挂牌了一处房产,售价为$590,000,联系电话567-890-1234。"},{"role": "assistant", "content": "$590,000"}]}
我们以数据提取为例,训练数据是一条无规则的房产综合信息,其中在不确定的位置和不确定的写法上包含了房子的基础报价,我们的目的就是通过微调模型训练,能够让模型在接收到这类数据时能准确的提取出我们需要的价格信息
这其中可能出现错误
可能出现的错误,以及中文解释
这里我强调几个重点
1. 文件格式必须是jsonl格式,否则会报告训练文件格式错误
2. 每一行样本数据必须严格校验,json格式必须正确,注意一些特殊字符的处理,一条样本数据在文件中必须是一行,决不能换行,也不能格式化,否则也会报格式错误
3. 训练数据最少10条,如果小于10天也会提示相应错误
4. 我们训练数据的格式 往往取决于你用的模型,在下面的错误示例中你会看到关于这种错误的提示
综上所述,当我们要训练复杂数据的时候,一定要严格校验数据内容格式规则的准确性
# 错误代码:无效的训练文件。
error_code:'invalid_training_file'
# 错误信息:任务因无效的训练文件而失败。预期文件为 JSONL 格式,包含 prompt 和 completion 键且值为字符串。第1行的 completion 值不是字符串。
message:'The job failed due to an invalid training file. Expected file to have JSONL format with prompt/completion keys with string values. completion value on line 1 is not a string.'
# 参数:training_file.
param:'training_file'
# -------------------------------------------------------------------------
# 错误代码:无效的训练文件。
code='invalid_training_file'
# 错误信息:任务因无效的训练文件而失败。文件格式无效。输入文件 file-6HJEZl0kWmwPX**** 为 prompt-completion 格式,但指定的模型 gpt-3.5-turbo-0125 是一个聊天模型,需要聊天格式的数据。详情请参见 https://platform.openai.com/docs/guides/fine-tuning/preparing-your-dataset。
message='The job failed due to an invalid training file. Invalid file format. Input file file-6HJEZl0kWmwPXhU0P0OewspU is in the prompt-completion format, but the specified model gpt-3.5-turbo-0125 is a chat model and requires chat-formatted data. See https://platform.openai.com/docs/guides/fine-tuning/preparing-your-dataset for details.'
# 参数:training_file
param='training_file'
# -------------------------------------------------------------------------
# 错误代码:无效的训练文件。
code='invalid_training_file'
# 错误信息:任务因无效的训练文件而失败。预期文件为 JSONL 格式,每一行都应是一个有效的 JSON 字典。第1行不是一个字典。
message='The job failed due to an invalid training file. Expected file to have JSONL format, where every line is a valid JSON dictionary. Line 1 is not a dictionary.'
# 参数:training_file
param='training_file'
# -------------------------------------------------------------------------
# 错误代码:无效的训练文件。
code='invalid_training_file'
# 错误信息:任务因无效的训练文件而失败。预期文件为 JSONL 格式,每一行都应是一个有效的 JSON 字典。第1行不是一个字典。
message='The job failed due to an invalid training file. Expected file to have JSONL format, where every line is a valid JSON dictionary. Line 1 is not a dictionary.'
# 参数:training_file
param='training_file'
# -------------------------------------------------------------------------
# 错误代码:无效的示例数量。
code='invalid_n_examples'
# 错误信息:训练文件有3个示例,但必须至少有10个示例。
message='Training file has 3 example(s), but must have at least 10 examples.'
# 参数:training_file
param='training_file'
# -------------------------------------------------------------------------
# 错误代码:无效的训练文件。
code='invalid_training_file'
# 错误信息:任务因无效的训练文件而失败。预期文件为 JSONL 格式,每一行都应是一个有效的 JSON 字典。第4行不是一个字典。
message='The job failed due to an invalid training file. Expected file to have JSONL format, where every line is a valid JSON dictionary. Line 4 is not a dictionary.'
# 参数:training_file
param='training_file'
# -------------------------------------------------------------------------
# 当没有相关错误的时候 错误这块返回的内容应该是这样的
error=Error(code=None, message=None, param=None)
二. 上传训练数据文件,并得到文件ID,因为在后续的接口中我们需要用到这个文件ID
from openai import OpenAI
# API_KEY 推荐在环境变量中设置
client = OpenAI()
response = client.files.create(
file=open("../training_data_20240517.jsonl", "rb"),
purpose="fine-tune"
)
print(response.id)
# file_id = 'file-a9NbjfkzV7WgWWWWWWWWWWWW'
三. 创建微调任务并返回微调任务的ID
file_id = 'file-a9NbjfkzV7WWWWWWWWWWWWWW'
fine_response = client.fine_tuning.jobs.create(
training_file=file_id,
model="gpt-3.5-turbo-0125"
)
print(fine_response)
id='ftjob-DmoBKHHez9nGRyWWWWWWWWWWWW'
四. 返回与客户账户关联的所有微调任务的详细信息,包括每个任务的状态、创建时间、模型类型等
list_fine_tuning_jobs = client.fine_tuning.jobs.list()
print(list_fine_tuning_jobs)
{
"object": "list",
"data": [
{
"id": "ft-XXXXXXXXXXXX",
"object": "fine-tune",
"created_at": 1627389272,
"updated_at": 1627389272,
"status": "succeeded",
"fine_tuned_model": "model-name",
"organization_id": "org-XXXXXXXX",
"hyperparams": {
"n_epochs": 4,
"batch_size": 8,
...
},
"result_files": [
{
"id": "file-XXXXXXXXXX",
"object": "file",
"bytes": 12345,
"created_at": 1627389272,
"filename": "result-file-name",
"purpose": "fine-tune"
}
],
...
},
...
]
}
主要字段:
- id:微调任务的唯一标识符。
- object:对象类型,通常为 "fine-tune"。
- created_at:任务创建时间(UNIX 时间戳)。
- updated_at:任务更新时间(UNIX 时间戳)。
- status:微调任务的状态(如 "succeeded"、"pending"、"failed" 等)。
- fine_tuned_model:微调生成的模型名称。
- organization_id:与任务关联的组织标识符。
- hyperparams:微调使用的超参数(如训练轮数、批量大小等)。
- result_files:微调结果文件的详细信息。
用途:
- 监控任务状态:可以检查每个微调任务的状态,了解哪些任务已完成,哪些任务正在进行,哪些任务失败等。
- 获取任务结果:可以获取已完成任务的结果文件信息,用于下载和进一步分析。
- 管理微调任务:方便地管理和跟踪所有微调任务,提高工作效率。
五. 使用训练模型
当我们成功开始一个训练任务后,不管成功过还是失败,系统都会在训练结束后,将训练结果(成功OR失败) 以邮件的形式发送到OPENAI账号邮箱中,邮箱中会特别告知我们的模型名称。
模型名称格式:ft:gpt-3.5-turbo-0125:brokeragename-technologies-inc::3f32dd5dg
fine_tuning_model = 'ft:gpt-3.5-turbo-0125:brokerage_name-technologies-inc::3f32dd5dg'
completion = client.chat.completions.create(
model=fine_tuning_model,
messages=[
{"role": "user", "content":'''我有一个闲置的房子打算售价5000美金'''}
]
)