
ChatGPTのfine-tuningをpythonでやってみた
はじめに
今話題のchatGPTをビジネスで使用するために、何をするべきか考えています。その中で、ある程度答えが決まっている業務で使えそうなfine-tuningのやりかたとその効果について考察しました。
chatGPT pluginsがリリースされたことで、fine-tuning自体を選択肢とすべきかは検討したほうがいいと思います。
fine-tuning(ファインチューニング)とは、機械学習モデルを特定のタスクやデータセットに対してより適切に動作させるために、既存の学習済みモデルを少し調整するプロセスです。
機械学習の分野では、大規模なデータセットで事前に訓練されたモデル(例えば、OpenAIのGPT-3など)がよく使われます。これらのモデルは、さまざまなタスクに対して汎用的に使用できますが、特定のタスクや状況において最適な結果を得るためには、追加の調整が必要となることがあります。
fine-tuningでは、学習済みモデルをベースに、新しいデータセットやタスクに対して短期間の学習を行います。このプロセスにより、モデルは新しいデータセットやタスクに適応し、より正確な結果を出力するようになります。この方法は、新しいタスクに対してゼロからモデルを訓練するよりも効率的であり、計算リソースや時間を節約することができます。
業務で決まった手順や受け答えなどが、あらかじめ用意されている場合にはこの方法が有効な場合があります。
手順と仕組
fine-turningというとtensor-flowなんかを使ってローカルでやるものと思ってましたが、OpenAI社の用意するAPIで実行する仕組みになっています。
以下の流れを頭にいれておくと、コードの理解が容易になります。
ローカルでトレーニングデータを作成
OpenAIへ1で作成したファイルをアップロード。APIを使ってファイルをアップロードし、file_idというものを取得
file_idとトレーニングの元となるOpenAIが用意しているトレーニング済みモデルを指定し、fine-tuningのAPIリクエストを実行
リクエストから完了までにはかなりの時間がかかる。そのため、fine-tuning_idというものを3で実行した際に取得しておき、定期的にステータスを確認し、完了を待つ。完了すると専用のモデルIDが発行される
専用のモデルIDを取得し、APIにプロンプトを投げて、ChatGPTの返答を受け取る
API Keyを取得する
OpenAIのAPIを利用するためには、まずAPIキーを取得する必要があります。以下の手順でAPIキーを取得できます。
OpenAIサイトへアクセス: OpenAIの公式ウェブサイト (https://openai.com/product) にアクセスし、「Get started」または「Sign in」ボタンをクリックして、アカウントにログインします。アカウントがない場合は、新規登録を行ってください。
APIキーのページへ移動: ダッシュボードにログインしたら、左側のナビゲーションメニューから「API Keys」をクリックします。
APIキーを生成: 「API Keys」ページで、「Create an API key」ボタンをクリックして新しいAPIキーを生成します。生成されたキーは、次のような形式になります: sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxx
「Payment methods」でカード情報などを入力(ここで入力しないと、APIを使用したときに、エラーで使用できない)
playgraund(https://platform.openai.com/examples)で色々試してみましょう。ここで遊べれば準備は完了です。


pip install --upgrade openai
コマンドラインで実行します。
pip install --upgrade openai
トレーニング用データの準備
用意したAPI KEYを設定します
import openai
import json
api_key = 'your_openai_api_Key'
#set openai api key
openai.api_key = api_key
OpenAIへアップロードするトレーニング用のJsonファイルを作成します。
ファイル名はtraining_data.jsonlとします。
{"prompt": "Where is the billing ->", "completion": " You find the billing in the left-hand side menu.\n"}
{"prompt": "How do I upgrade my account ->", "completion": " Visit you user settings in the left-hand side menu, then click 'upgrade account' button at the top.\n"}
promtは質問文です。そしてcompletionは答えとだと思ってください。質問に対しての答えを用意しています。
作成したトレーニング用ファイルをアップロードする
ファイルを作成したらいよいよAPIを使用してファイルをアップロードします。
upload_response = openai.File.create(
file=open(file_name, "rb"),
purpose='fine-tune'
)
file_id = upload_response.id
file_id = upload_response.id でfile_Idを取得しておきます。このIDを指定していよいよfine-tuningをします。
fine-tuningを実行する
model="davinci"とあります。これはGPT3を表しています。このあたりの詳しい説明はこちらのドキュメントを参照してください。(https://platform.openai.com/docs/models/gpt-3)
print(file_id)
fine_tune_response = openai.FineTune.create(training_file=file_id, model="davinci")
print(fine_tune_response) をみてみましょう。
{
"created_at": 1679569086,
"events": [
{
"created_at": 1679569086,
"level": "info",
"message": "Created fine-tune: ft-GKqIJtdK11541MNuq4L6mREmwT",
"object": "fine-tune-event"
}
],
"fine_tuned_model": null,
"hyperparams": {
"batch_size": null,
"learning_rate_multiplier": null,
"n_epochs": 4,
"prompt_loss_weight": 0.01
},
"id": "ft-GKqIJtdK16UMNuq555mREmwT",
"model": "davinci",
"object": "fine-tune",
"organization_id": "org-TZfAzd2MLxZITGg3FEY3w71l5",
"result_files": [],
"status": "pending",
"training_files": [
{
"bytes": 274,
"created_at": 1679568992,
"filename": "file",
"id": "file-Jru0n1eWSOFjxliasaesdeefaj0ReVj",
"object": "file",
"purpose": "fine-tune",
"status": "processed",
"status_details": null
}
],
"updated_at": 1679569086,
"validation_files": []
}
"fine_tuned_model": null
これはまだfine-tuningしたモデルができていないことを表します。モデルが作成されるとあなただけのIDが作成されます。
”id": "ft-GKqIJtdK16UMNuq555mREmwT"
このft-から始まるidはこのfine-tuningタスクのidです。このidでタスクのステータスを確認することができます。
"status": "pending"
これはまだfine-tuningがペンディングになっています。作成完了までには長い時間がかかりますので、このステータスが完了になるまで、待つ必要があります。
"id": "file-Jru0n1eWSOFjxliasaesdeefaj0ReVj",
これは指定したfile idです。アップロードしたファイルはこのidを指定して、再使用できます
モデルのチューニングが終わるまでステータスをチェックする
ft-から始まるidを指定して、fine-tuningのタスクの状況を確認します。
fine_tune_id = 'ft-GKqIJtdK16UMNuq555mREmwT'
def get_fine_tune_status():
# Retrieve the fine-tuning process details using the OpenAI package
fine_tune = openai.FineTune.retrieve(fine_tune_id)
# Check if the status field exists in the response
if 'status' not in fine_tune:
print(f"Error: {fine_tune}")
return None
# Return the status and the fine-tuned model ID (if available)
return fine_tune['status'], fine_tune.get('fine_tuned_model', None)
# Call the function to get the fine-tuning status and model ID
status, fine_tuned_model_id = get_fine_tune_status()
print(f"Fine-tune status: {status}")
print(f"Fine-tuned model ID: {fine_tuned_model_id}")
fine_tune_id = 'ft-GKqIJtdK16UMNuq555mREmwT'
こちらで、あなたが取得したft-から始まるidを指定してください。
ループを一定間隔で回して監視するなどするのでしょうが、朝起きてチェックしてできてるか微妙、、というスピード感ですので、お任せします。
Fine-tune status: succeeded
Fine-tuned model ID: davinci:ft-personal-2023-03-XX-XX-XX-XX
Fine-tuned model ID: davinci:ft-personal-2023-03-XX-XX-XX-XX
上記があなたが作成したfine-tuning モデルです
終わりましたか? 試してみましょう!
modelにあなたが取得したmodel IDを入力して実行しましょう。
def chat_with_fine_tuned_gpt3(prompt, model="davinci:ft-personal-2023-03-XX-XX-XX-XX"):
response = openai.Completion.create(
model=model,
prompt = prompt,
temperature=0
)
answer = chat_with_fine_tuned_gpt3(prompt='How do I find my billing? ->')
print(answer['choices'][0]['text'])
Your initial billing statement will be mailed to the physical address you provided.
いかがでしたでしょうか。答えは様々あったかと思います。データが少ないので正直よくわらない結果となりました。
今後は
データを増やしたらどうなるでしょうか。一般企業のFAQなどのデータでどう返答が変わるでしょうか。気になるところです。