🎸

GPT-3.5 Turbo fine-tuningを試してみた

2023/08/29に公開

TL;DR

  • Pythonのライブラリが用意されているので今すぐ試せる
  • あくまで技術の選択肢
  • プロンプトエンジニアリングやグラウンディングなど他の技術と併せて活用する

GPT-3.5 Turbo fine-tuning

先日OpenAI社からGPT-3.5 Turboのfine-tuning対応が発表されました。

https://openai.com/blog/gpt-3-5-turbo-fine-tuning-and-api-updates?utm_source=pocket_saves

せっかくなのでChatGPTに要約してもらいましょう。

GPT-3.5 Turboのファインチューニングが利用可能となり、GPT-4のファインチューニングも今秋に登場予定です。
このアップデートにより、開発者はモデルをカスタマイズし、大規模で実行できるようになりました。
初期テストでは、GPT-3.5 Turboのファインチューニング版が、一部のタスクでGPT-4の基本性能を匹敵または上回ることが示されています。
APIの利用時のデータは顧客が所有し、OpenAIや他の組織が別のモデルのトレーニングに使用することはありません。

GPT-3.5 Turboのリリース以来、開発者や企業は、ユーザーに独自の体験を提供するためのモデルのカスタマイズを求めてきました。
このローンチで、モデルの性能を向上させるための監督下でのファインチューニングが可能となりました。
ベータテストでは、モデルの指示通りの動作改善、確実な出力フォーマット、カスタムトーンの調整など、さまざまな用途でのモデル性能が大幅に向上しています。
さらに、ファインチューニングにより、同じ性能を保ちつつプロンプトを短縮できます。

他の技術と組み合わせることで、ファインチューニングはさらにパワフルになります。
詳しくはファインチューニングガイドを参照してください。

PythonでGPT-3.5 Turbo fine-tuningを実践する

説明を読んでも納得感はないので、公式にしたがって実際に動かしてみましょう。

Fine-tuning

ライブラリのインストール

pip install openai

リクエストファイルの作成

リクエストに利用するjsonlファイルを用意します。

今回は架空の企業「ソルク商事」の広報の受け答えをChatGPTに作成してもらいました。

{"messages":[{"role":"system","content":"あなたは株式会社ソルク商事の広報です。"},{"role":"user","content":"ウェブサイトを見て、[特定の製品]についての詳しい情報が欲しいのですが。"},{"role":"assistant","content":"もちろん、[特定の製品]について何を知りたいですか?"}]}
{"messages":[{"role":"system","content":"あなたは株式会社ソルク商事の広報です。"},{"role":"user","content":"[特定のサービス/製品]に問題があるのですが。"},{"role":"assistant","content":"それは申し訳ございません。トラブルシューティングの手順をご案内いたしますか、それともサポートチームにお繋ぎしましょうか?"}]}
{"messages":[{"role":"system","content":"あなたは株式会社ソルク商事の広報です。"},{"role":"user","content":"来月、あなたの会社がイベントを開催すると聞きました。詳細を教えてもらえますか?"},{"role":"assistant","content":"はい、もちろんです![イベント名]は[日付]に開催されます。会場、アジェンダ、または登録方法についての情報が必要ですか?"}]}
...

APIがエラーとなるので、最低10件のデータが必要になります。

公式ドキュメントでは50件から始めて、モデルが改善する兆しを確認することを推奨しています。
兆しがない場合はデータを増やすことより、タスクの設定の見直しやデータそのものを再構築する方が有効であるとのことです。

Preparing your dataset

ファイルのアップロード

作成したjsonlファイルをアップロードします。

import openai
openai.api_key: str = "APIキー"
data_path = "jsonlファイルパス"

response = openai.File.create(file=open(data_path, "rb"), purpose="fine-tune")
file_id = response.id
print(file_id)

Fine-tunedモデルの作成

上記で取得したfile_idを利用してモデルを作成します。

response_job = openai.FineTuningJob.create(training_file=file_id, model="gpt-3.5-turbo")
job_id = response_job.id
print(job_id)

モデルの作成が終了するとOpenAIからメールが届きます。

mail

進捗情報を確認することも可能です。
finished_atが出力されていれば完了しています。

openai.FineTuningJob.retrieve(job_id)

<FineTuningJob fine_tuning.job id=ftjob-*** at ************> JSON: {
  "id": "ftjob-*********************",
  "model": "gpt-3.5-turbo-0613",
  "created_at": 1692929699,
  "finished_at": 1692930323,
  "fine_tuned_model": "ft:gpt-3.5-turbo-0613:**********::**********",
  "organization_id": "org-********************",
  "result_files": [
    "file-********************"
  ],
  "status": "succeeded",
  "validation_file": null,
  "training_file": "file-********************",
  "hyperparameters": {
    "n_epochs": 10
  },
  "trained_tokens": 13200
}

Fine-tunedモデルの利用

ここではPlaygroundを介して作成されたモデルを利用します。

Playgroundにアクセスします。

右側の設定でModelft-gpt-3.5から始まるfine-tuningされたモデルを選択します。

model

左側SYSTEM欄にシステム用のプロンプトを入力します。
ここでは学習データと同じ情報と、問い合わせ相手の名前を与えます。

system

USERプロンプトに学習データ一行目と同じフォーマットの「ウェブサイトを見て、御社のサクサククッキーについての詳しい情報が欲しいのですが。」を与えてみます。

user

submitを押下すると、回答が表示されます。

assistant

学習データとして与えた「もちろん、特定の製品について何を知りたいですか?」と近い文章が表示されました。

Fine-tuningしていないモデルとの比較

同じ質問をfine-tuningしていない従来のモデルに与えてみましょう。

assistant

存在しないサクサククッキーの説明を延々とし始めました。

fine-tuningを行うことで回答に変化が起こっていることが確認できました。

Fine-tunedモデルの削除

作成したものを削除する場合は、次のように実行します。

openai.Model.delete(model_id)
<Model model id=ft:gpt-3.5-turbo-0613:********::******** at ************> JSON: {
  "id": "ft:gpt-3.5-turbo-0613:********::********",
  "object": "model",
  "deleted": true
}

まとめ

上記に提示した例ではうまくいっているように見えますが、他の質問や言い回しを変更すると求めた形ではない回答をすることがありました。
リリース文やFAQでも言及されていますが、fine-tuningはこれまでの技術を代替するものではなく、目的に応じて組み合わせていくことが大切なようです。

株式会社ソルクシーズ(事業戦略室)

Discussion