GPT-3.5 Turbo fine-tuningを試してみた
TL;DR
- Pythonのライブラリが用意されているので今すぐ試せる
- あくまで技術の選択肢
- プロンプトエンジニアリングやグラウンディングなど他の技術と併せて活用する
GPT-3.5 Turbo fine-tuning
先日OpenAI社からGPT-3.5 Turboのfine-tuning対応が発表されました。
せっかくなので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を実践する
説明を読んでも納得感はないので、公式にしたがって実際に動かしてみましょう。
ライブラリのインストール
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件から始めて、モデルが改善する兆しを確認することを推奨しています。
兆しがない場合はデータを増やすことより、タスクの設定の見直しやデータそのものを再構築する方が有効であるとのことです。
ファイルのアップロード
作成した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からメールが届きます。
進捗情報を確認することも可能です。
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にアクセスします。
右側の設定でModel
にft-gpt-3.5
から始まるfine-tuningされたモデルを選択します。
左側SYSTEM欄にシステム用のプロンプトを入力します。
ここでは学習データと同じ情報と、問い合わせ相手の名前を与えます。
USER
プロンプトに学習データ一行目と同じフォーマットの「ウェブサイトを見て、御社のサクサククッキーについての詳しい情報が欲しいのですが。」を与えてみます。
submit
を押下すると、回答が表示されます。
学習データとして与えた「もちろん、特定の製品について何を知りたいですか?」と近い文章が表示されました。
Fine-tuningしていないモデルとの比較
同じ質問をfine-tuningしていない従来のモデルに与えてみましょう。
存在しないサクサククッキーの説明を延々とし始めました。
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はこれまでの技術を代替するものではなく、目的に応じて組み合わせていくことが大切なようです。
株式会社ソルクシーズの事業戦略室のアカウントです。 ジュニアエンジニア向けのお役立ち記事を中心に投稿しています。 採用サイト:solxyz.co.jp/recruit/ 未経験採用も実施中です!
Discussion