米国OpenAIは、APIサービスにおいて、8月23日(水)に大規模言語モデル「GPT-3.5 Turbo」のファインチューニング機能をリリースしました。GPT-3.5 Turboは、ChatGPTに使われている技術です。
ファインチューニングにより、企業は自らのデータを活用してGPTモデルを特定のニーズに合わせてカスタマイズできるようになりました。
なお、ファインチューニングの公式ドキュメントはこちらで読めます。
ファインチューニングとは
ファインチューニングとは、既存のモデルのパラメーターを微調整して再トレーニングすることです。(Fine-tuning = 微調整)
これにより、モデルの扱いやすさ、一貫性、論調・口調をカスタマイズできます。
ファインチューニングのメリット
ファインチューニングには以下のようなメリットがあります。
- プロンプトだけより高品質な結果
- プロンプトに収めることができる例よりも多くの例でのトレーニング
- より短いプロンプトによるトークンの節約
- 低遅延のリクエスト
そもそも、ファインチューニング無しの場合、通常はGPTモデルを効果的に使用するために、プロンプトに複数の例を含めることがあります。タスクの実行方法を示す例を使用することを「few-shot learning(少数例学習)」と呼びます。
ファインチューニングを利用すれば、プロンプトに収めることができるよりも多くの例でのトレーニングにより、この「few-shot learning」を向上させます。このため、様々なタスクでより良い結果を得られます。
さらに、モデルがファインチューニングされると、プロンプトで多くの例を提供する必要がなくなります。
これにより、プロンプトを減らすことが出来るためコストの節約、そして応答速度の向上を可能にします。
また、クオリティも改善します。早期体験したユーザーの中では、GPT-3.5のファインチューニングによりGPT-4を超えるパフォーマンスを達成した例もいくつかあるようです。GPT-4は価格が高いので、価格を抑えながらGPT-4と同じクオリティを発揮できる意味でもGPT-3.5のファインチューニングは役立つでしょう。
ファインチューニングのデメリット
ファインチューニングには、以下のようなデメリットもあります。
- 通常利用よりも価格が高い(現在、約8倍。GPT-4よりは安いが…)
- 何度もチューニングが必要になる可能性
- 結果的にユースケースによっては効果が低い可能性(無駄足になるかも)
以上のように、ファインチューニングは価格が上がるのもそうですし、やれば何でも良くなるってわけでもないので注意が必要です。
ファインチューニングの例
以前OpenAIが提供していたGPT-3(text-davinci)でのファインチューニングの例で、面白い例がありますので紹介します。
ミルクボーイのネタでGPT-3をファインチューニングしてみた (1) ~入門編~
この例では、最終的に以下のように芸人のネタを再現しようとするモデルになることが出来ました。
プロンプトとして「オカンが好きな朝ご飯を忘れたらしい->」を与えると、GPTは「朝ご飯忘れたとかそんなんどうでもいーのよ!」と出力するようになりました。
正確にネタのレベルを再現できているかは怪しいですが、口調に関してはそのものですね。
この例でもわかりますが、ファインチューニングでは、口調を調整するにはうってつけのようです。タメ口にするとか、方言にするとかは簡単に出来るのではないでしょうか。
一応、元ネタを知らない方は「ミルクボーイ公式チャンネル」のこちらを参照。
ファインチューニングの価格
ファインチューニングの価格は「トレーニング費用」「使用費用」の2つに分かれる
ファインチューニングは、ファインチューニングを実行する際のトレーニング費用と、そのモデルを利用する際の「使用費用」の2つに分かれます。
トレーニング費用 (training cost)
トレーニング費用は、1,000トークンにつき0.008ドルです。最初のトレーニング時のみかかります。
- $0.008 / 1K Tokens
使用費用 (usage cost)
使用費用は、インプットの場合は1,000トークンにつき0.012ドル。アウトプットの場合は0.016ドルです。
- input: $0.012 / 1K Tokens
- output: $0.016 / 1K Tokens
gpt-3.5-turbo (4K) の価格が下記なので、ファインチューニングモデルは通常モデルの大体約8倍のコストがかかります。
- input: $0.0015 / 1K tokens
- output: $0.002 / 1K tokens
ファインチューニングのやり方
ここからはファインチューニングのやり方をご紹介します。
① 学習させたいデータを用意する
まず、学習させたいデータを用意します。これは「このように応答してほしい」というパターンを学習させていくイメージですので、応答すべき文言を入れたデータ↓を用意します。この例では、全ての応答を嫌がるAIを作ろうとしてみます。
{
"messages": [
{ "role": "system", "content": "あなたはAIアシスタントです。" },
{ "role": "user", "content": "面白い話を教えて" },
{ "role": "assistant", "content": "ごめんなさい。嫌です。" }
]
}
② データのファイルをアップロードする
データをJSONLファイルにして、アップロードします。ただし、以下に注意。
- JSONではなくJSONLであることに注意
- レスポンスのファイルIDを保存しておいてください
openai.File.create(
file=open("mydata.jsonl", "rb"),
purpose='fine-tune'
)
③ ファインチューニングを実行する
ファインチューニングのジョブを開始させます。先ほどアップロードの際にレスポンスにあったファイルのIDをtraining_fileとして送信します。
これには時間がかかりますので、完了まで待ちます。完了するとメールが届きます。
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
openai.FineTuningJob.create(training_file="TRAINING_FILE_ID", model="gpt-3.5-turbo")
④ ファインチューニングされたモデルを実際に利用する
ファインチューニングが完了したら、あとは利用するだけです。
これは通常のGPT-3.5-turboを利用する際とほぼ変わりませんね。
“model”の値をファインチューニングしたモデルにするだけのようです。↓
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
completion = openai.ChatCompletion.create(
model="ft:gpt-3.5-turbo:my-org:custom_suffix:id",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello!"}
]
)
print(completion.choices[0].message)
以上です。
その他に、ファインチューニングのトレーニングのステータスを把握したり、ファインチューニングしたモデル一覧を表示するAPIがあります。
さらに詳しい内容は公式ドキュメントのこちらで読めます。
GPT-4 と GPT-3.5-Turbo-16k のファインチューニング
両方とも、今年(2023年)の後半にはリリース予定です。
この記事の著者
阿部 隼也
Abe Shunya
株式会社プッシュ 代表取締役社長・創業者。東京都出身。横浜市立大学在学中に当社を創業し、SEOなどデジタルマーケティング事業や、ChatGPT入門講座を代表とするプライムアカデミー事業を立ち上げた。技術も好きで、自らコードを書きながらサービスを開発する。
Twitter(X)アカウント