🐾

GPT-4o mini Fine-tuningモデルで広告コピーを作ろう!

はじめに

こんにちは、D2Cのデータサイエンティストの髙橋と申します。
現在、キョウソウAIという広告制作に特化したAIソリューションを開発しております。

先日、OpenAI社がXにて以下の内容をポストしていました。
https://x.com/OpenAIDevs/status/1815836887631946015

ついに、弊社の環境においてもGPT-4o miniでFine-tuningができるようになりました。

ここで注意点を挙げると、今回のリリースは対象者が限定されています。
OpenAI APIにはTier制が導入されていて、今回はTier4,5に属するユーザが対象となっています。
Tier制について詳しく知りたい方はこちらを参照してください。

問題設定

早速、GPT-4o miniを用いてFine-tuningを試してみたいと思います。
Fine-tuningとは、特定のタスクに特化させるために、新しいデータを用いて事前学習済みモデルのパラメータ[1]を再学習させる手法です。

今回の目的は、広告コピーの自動生成を実現することです。
配信実績が良好だった広告コピーを学ばせて、弊社のコピーライターの「相棒」を作りたいと思います。

広告制作においては、どの会社でも「稼働逼迫」が課題になっているのではないでしょうか。
そのため、広告コピーを自動生成できると、制作業務の効率化につながると考えております。

ただし、生成された広告コピーが必ずプロと同じ水準になるかというと、そうではないと思います。
生成物には必ず人間の監修が必要で、以下のポイントを押さえる必要があります。

  • 広告コピーとしての品質は十分か
  • 内容に虚偽が含まれていないか
  • 既存の権利を侵害していないか

その意味で、今回のモデルは広告コピーのたたき台を用意する「相棒」を目指したいと思います。

実は、同様の取り組みをGPT-3.5 Turboでも実施しており、そちらも記事になっております。
よろしければ、お手すきの際にご覧いただければ幸甚でございます。
https://zenn.dev/d2c_mtech_blog/articles/0517324e9ead41

実装手順

事前準備

今回はPythonでのコーディングを前提にして実装していきます。
GUI操作でもFine-tuningを行うことができますが、この記事ではスコープ外となります。

前述の通り、今回の対象者はTier4,5の方ですので、記事の内容も既存ユーザ向けになっております。
ですが、念のため最初にやらなければならないことを記載させていただきます。

  • アカウントの登録
  • API Keyの新規作成
  • クレジットカード情報の登録

また、OpenAI APIではタスクやモデルの種類、トークン数に応じたコストがかかります。
例えば、Fine-tuningモデルのコストは以下通りで、詳細については画像をクリックしてください。

ちなみに、新旧比較[2]すると、GPT-4o miniへの乗り換えによって以下のようにコスト削減できます。

Input Output Training
▲90% ▲80% ▲62.5%

データセットの準備

まずは、今回のタスクに合わせてデータセットを作っていきます。

GPT-3.5 Turbo以降は、JSONL形式の会話型データセットに変換する必要があります。
以前の記事でGPT-3.5 Turboの性能を検証した際のデータセット[3]を以下に例示させていただきます

{"messages":[

{"role": "system", # モデルに対して役割を定義する
"content": "あなたはコピーライターです。"}, 

{"role": "user", # ユーザからのPromptを入力する
"content": "受験生に向けたキャッチコピーを作成してください。クライアントは株式会社ジアタマ製薬で、学力向上効果をアピールしてジアタマ・ヨクナールを売り出しています。"}, 

{"role": "assistant", # GPTからのCompletionを入力する
"content": "勉強の新時代、ジアタマの力。脳に新しい風を吹き込み、才能を目覚めさせよう。"}

]}

今回のケースでは、Promptには「広告コピーの与件情報」を含めていきます。
一方で、Completionには「配信実績の良好な広告コピー」を入力したいと思います。

ここで気になるのは、果たしてどの程度のデータ数があれば良いのか、ということです。
OpenAIによると、品質の良い50件のデータセットから検証を始めるのがおすすめ、とのことです。

We recommend starting with 50 well-crafted demonstrations and seeing if the model shows signs of improvement after fine-tuning.
出典:Fine-tuning - OpenAI API

私は過去に作成したデータセット550件分を使用していこうと思います。
このデータセットには、架空のコピー(ジアタマ・ヨクナール)だけではなく自社の広告コピーも含まれます。

データセットのアップロード

次に、OpenAI APIを利用してデータセットをアップロードしていきます。
1GBまでしかアップロードできませんが、そこまでのデータサイズは不要であると公式ドキュメントに記載があります。

api_upload
from openai import OpenAI
client = OpenAI(api_key = API_Key) # ご自身のAPI Keyを入力してください

client.files.create(
  file = open("train_data.jsonl", "rb"),
  purpose = "fine-tune"
)

ちなみに、今回は検証を目的にサンプルコードを記載していることをご了承ください。
情報漏洩のリスクなどがあるため、商用環境ではAPI Keyをハードコーディングしないようにしましょう。

上記のアップロード処理を行うと、以下のような返り値が出力されるはずです。

FileObject(id='file-XXX', bytes=XXX, created_at=XXX, filename='train_data.jsonl', object='file', purpose='fine-tune', status='processed', status_details=None)

このうち、引数idに記載のある'file-XXX'が今回のデータセット名になります。

Fine-tuning

いよいよ、GPT-4o miniのFine-tuningモデルを活用していきます。
実行するコードはとてもシンプルで、上記のデータセット名を引数training_fileに記載します。

fine-tuning_job
client.fine_tuning.jobs.create(
  training_file = File_Name,  # アップロードしたファイル名を入力してください
  model = "gpt-4o-mini-2024-07-18"
)

注意点としては、上記のコードを実行するとすぐに返り値が出力されます。
そのため、Fine-tuningが爆速で終わったように見えるのですが、実際にはジョブは完了していません。
OpenAIからメールでジョブの完了が通知されるので、それまでしばしお待ちください。

今回のジョブの詳細は以下の通りです。
前回のGPT-3.5 Turboとの比較ができるようにまとめております。

モデル名 データサイズ 実行時間 コスト
GPT-4o mini 532KB(学習データ 550件) 約0.5h 無料
GPT-3.5 Turbo(1106版) 532KB(学習データ 550件) 約1h 約4ドル

モデルの推論

最後に、完成したモデルを用いて広告コピーを生成してみましょう。

メールの中に「モデル名」が記載されているので、こちらを用いて推論を実行していきます。
以下のように「ジョブ名」も本文に含まれているため、混同しないように注意しましょう。

Your fine-tuning job <ジョブ名> has successfully completed, and a new model <モデル名> has been created for your use.

モデルの性能を評価したいので、前回と同様のテーマで検証してみたいと思います。
以下のサンプルコードの中で、引数modelに上記のモデル名を入力してください。

inference
response = client.chat.completions.create(
  model = Model_Name, # Fine-tuningモデル名を入力してください
  messages = [
    {"role": "system", "あなたはコピーライターです。"},
    {"role": "user", "content": "受験生に向けたキャッチコピーを作成してください。クライアントは株式会社ジアタマ製薬で、学力向上効果をアピールしてジアタマ・ヨクナールを売り出しています。"}
  ]
)
print(response.choices[0].message)

架空のクライアント「株式会社ジアタマ製薬」の主力商品「ジアタマ・ヨクナール」を売り出すための広告コピーは、以下のように生成されました。

ChatCompletionMessage(content='賢者の一錠、「ジアタマ」の魔法。', role='assistant', function_call=None, tool_calls=None)

引数contentに生成した広告コピーが記載されています。
前回の結果と比較できるよう、モデル名と広告コピー、その結果が得られるまでに試行した回数を記載します。

モデル名 広告コピー 試行回数
GPT-4o mini 賢者の一錠、「ジアタマ」の魔法 2回
GPT-3.5 Turbo(1106版) いま、知薬の新時代。勉強の質を変える一粒 5回

広告コピーの質としては、素人目線ではどちらも悪くないように思われます。
ただ、GPT-4o miniはより少ない試行回数でそれらしい広告コピーを生成できました。

その後も推論を繰り返してみたところ、素人目線で良いと思える広告コピーが出力されました。

「頭脳のカギ、ジアタマ一錠。未来への扉、学びで開け」
「IQブースト、一錠で未来を拓け」

あくまで肌感覚ですが、GPT-4o miniはワードセンスも良いと思いました。

おわりに

今回は、以前の記事を踏襲してGPT-4o miniのFine-tuningモデルを検証してみました。
破格のコストメリットはもちろん、処理時間や性能の面でも着実な進化を遂げていると感じました。

LLMについては各社競争が激化していて、現時点で目を見張るほどの性能を持つAIばかりです。
半年も経たずに、この領域のデファクト・スタンダードは変わっていくと思われます。恐ろしい話です。

日々の業務を言い訳にせず、絶えず変化する技術トレンドをキャッチアップしていきたいと思いました。

最後までお読みいただき、誠にありがとうございました!

参考情報

執筆にあたって、以下のページを参考にさせていただきました。
https://platform.openai.com/docs/guides/fine-tuning
https://www.jdla.org/document/#ai-guideline

脚注
  1. 学習によって得られる重みやバイアスなど ↩︎

  2. 新:GPT-4o mini, 旧:GPT-3.5 Turbo ↩︎

  3. 可読性を高めるために縦型で記載していますが、通常は一行に集約して記載します ↩︎

D2C m-tech

Discussion