嗨,大家好,我是王大神。作为一名AI技术博主,我一直关注着最新的人工智能技术,尤其是OpenAI的GPT系列模型。今天,我将与大家分享如何使用GPT-3.5 Turbo进行自定义Fine-tuning,以便训练出符合特定需求的AI模型。
Fine-tuning是一种强大的技术,它可以让我们根据自己的数据和任务来定制GPT-3.5 Turbo模型,使其能够更好地适应特定应用领域。在本教程中,我将以实际案例为例,演示如何使用食谱数据集进行Fine-tuning,以创建一个食谱信息提取模型。
步骤一:准备工作
在开始Fine-tuning之前,我们需要完成一些准备工作。首先,确保你的Python包安装最新版本的OpenAI。你可以使用以下命令来安装:
!pip install --upgrade openai
接下来,我们需要导入所需的库和设置OpenAI API密钥:
import json
import openai
import os
import pandas as pd
from pprint import pprint
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "")
步骤二:数据准备
Fine-tuning的成功与否很大程度上取决于数据的质量和准备工作。在本例中,我们将使用食谱数据集进行Fine-tuning,这个数据集包含了各种食谱以及每个食谱中提取出的通用食材列表,适用于命名实体识别(NER)任务。
2.1 数据集加载
首先,我们需要加载我们要使用的数据集,并确保它足够专注于模型学习,同时也足够通用,以便不会错过未见过的示例。在这个例子中,我们从RecipesNLG数据集中提取了一个子集,只包含来自www.cookbooks.com的文档。
# 读取我们要使用的数据集,这将是RecipesNLG数据集,我们已经清理过,只包含来自www.cookbooks.com的文档
recipe_df = pd.read_csv("data/cookbook_recipes_nlg_10k.csv")
recipe_df.head()
这个数据集的前几行看起来像这样:
title | ingredients | directions | link | source | NER |
---|---|---|---|---|---|
No-Bake Nut Cookies | ["1 c. firmly packed brown sugar", ... | ["In a heavy 2-quart saucepan, mix brown sugar...", ... | www.cookbooks.com/Recipe-Details.aspx?id=44874 | www.cookbooks.com | ["brown sugar", "milk", "vanilla", "nuts", ... |
Jewell Ball'S Chicken | ["1 small jar chipped beef, cut up", ... | ["Place chipped beef on bottom of baking dish....", ... | www.cookbooks.com/Recipe-Details.aspx?id=699419 | www.cookbooks.com | ["beef", "chicken breasts", "cream of mushroom... |
Creamy Corn | ["2 (16 oz.) pkg. frozen corn", ... | ["In a slow cooker, combine all ingredients. C...", ... | www.cookbooks.com/Recipe-Details.aspx?id=10570 | www.cookbooks.com | ["frozen corn", "cream cheese", "butter", ... |
Chicken Funny | ["1 large whole chicken", ... | ["Boil and debone chicken.", "Put bite size pi...", ... | www.cookbooks.com/Recipe-Details.aspx?id=897570 | www.cookbooks.com | ["chicken", "chicken gravy", "cream of mushroo... |
Reeses Cups(Candy) | ["1 c. peanut butter", ... | ["Combine first four ingredients and press in ...", ... | www.cookbooks.com/Recipe-Details.aspx?id=659239 | www.cookbooks.com | ["peanut butter", "graham cracker crumbs", "bu... |
2.2 数据准备
在Fine-tuning过程中,我们需要将数据准备成适合模型的格式。对于ChatCompletion格式的Fine-tuning,每个训练示例都是一个简单的消息列表。示例中包含以下角色的消息:系统消息、用户消息和助手消息。在我们的例子中,用户消息包括食谱的标题和食材信息,而助手消息包括提取出的通用食材列表。
以下是一个示例训练示例的格式:
[
{
"role": "system",
"content": "You are a helpful recipe assistant. You are to extract the generic ingredients from each of the recipes provided."
},
{
"role": "user",
"content": "Title: No-Bake Nut Cookies\n\nIngredients: [\"1 c. firmly packed brown sugar\", \"1/2 c. evaporated milk\", \"1/2 tsp. vanilla\", ...]\n\nGeneric ingredients: "
},
{
"role": "assistant",
"content": "[\"brown sugar\", \"milk\", \"vanilla\", ...]"
}
]
我们可以使用以下代码来准备训练数据:
training_data = []
system_message = "You are a helpful recipe assistant. You are to extract the generic ingredients from each of the recipes provided."
def create_user_message(row):
return f"""Title: {row['title']}\n\nIngredients: {row['ingredients']}\n\nGeneric ingredients: """
def prepare_example_conversation(row):
messages = []
messages.append({"role": "system", "content": system_message})
user_message = create_user_message(row)
messages.append({"role": "user", "content": user_message})
messages.append({"role": "assistant", "content": row["NER"]})
return {"messages": messages}
for _, row in recipe_df.iterrows():
training_data.append(prepare_example_conversation(row))
# 将数据保存到文件中
with open("fine_tuning_data.jsonl", "w") as outfile:
for example in training_data:
outfile.write(json.dumps(example) + "\n")
现在,我们已经准备好了Fine-tuning所需的训练数据。
步骤三:Fine-tuning
接下来,我们将使用准备好的数据集对GPT-3.5 Turbo进行Fine-tuning。在进行Fine-tuning之前,请确保你有足够的计算资源和时间,因为Fine-tuning可能需要一些时间。
import openai
# 定义Fine-tuning的训练参数
fine_tuning_params = {
"model": "text-davinci-003",
"checkpoint": "latest", # 或者选择一个特定的checkpoint
"dataset": {
"path": "fine_tuning_data.jsonl",
"split": 0.8, # 数据集分割为训练和验证集
},
"max_steps": 10000, # 训练的最大步数
"save_checkpoint_every": 1000, # 每隔多少步保存一个checkpoint
"overwrite": True, # 如果已经存在同名的模型,是否覆盖
}
# 开始Fine-tuning
response = openai.ChatCompletion.create(**fine_tuning_params)
pprint(response)
Fine-tuning的时间长度取决于所选参数和模型的大小,但一旦完成,你就会获得一个定制的模型,可以用于特定任务。
步骤四:使用Fine-tuned模型
一旦Fine-tuning完成,你就可以使用新的Fine-tuned模型来执行特定任务。在我们的示例中,我们可以使用模型来提取食谱中的通用食材列表。
def extract_generic_ingredients(title, ingredients):
prompt = f"Title: {title}\n\nIngredients: {ingredients}\n\nGeneric ingredients: "
response = openai.ChatCompletion.create(
model="your-fine-tuned-model-name", # 使用你的Fine-tuned模型名字
messages=[
{"role": "system", "content": "You are a helpful recipe assistant. You are to extract the generic ingredients from this recipe."},
{"role": "user", "content": prompt},
],
)
assistant_response = response['choices'][0]['message']['content']
return assistant_response
# 示例:提取通用食材列表
recipe_title = "No-Bake Nut Cookies"
recipe_ingredients = ["1 c. firmly packed brown sugar", "1/2 c. evaporated milk", "1/2 tsp. vanilla", ...]
generic_ingredients = extract_generic_ingredients(recipe_title, recipe_ingredients)
print("Generic ingredients:", generic_ingredients)
这样,你就可以使用Fine-tuned模型执行特定的任务了。
结论
在本文中,我向大家介绍了如何使用GPT-3.5 Turbo进行自定义Fine-tuning,以便训练出符合特定需求的AI模型。通过准备数据、进行Fine-tuning和使用Fine-tuned模型,你可以为各种任务创建定制的AI助手。希望这个教程对你有所帮助,祝你在Fine-tuning旅程中取得成功!