微調GPT-4o-Mini生成ブログ記事

7月18日にリリースされた新モデルGPT-4o-miniは、GPT-3.5を超え、GPT-4に近い性能を持ち、価格はGPT-3.5の半分で、応答速度も全シリーズモデルの中で最速です。OpenAIは本日、GPT-4o-miniの微調インターフェースを正式に公開し、2024年9月23日まで、毎日2Mトークンの無料クレジットがあります。

Llama 3.1 405Bを使えないわけではなく、GPT-4o-miniの方がコストパフォーマンスが良いのです。

1 微調適用シーン

一般的な簡単なタスクには、プロンプト(Prompting)を作成するだけでモデルがうまく完了できます。タスクが比較的複雑な場合、思考チェーン(Chain of Thought)を使用して複雑なタスクを複数のステップに分解し、段階的に推論することができます。しかし、高精度と一貫性のある出力が必要なタスクには、微調(Fine-tuning)が必要です。

以下の表は、これら三つの方法の利点と欠点、および応用シーンを比較したものです。

方法 利点 欠点 応用シーン
微調 高品質な結果を提供 データの準備とトレーニングに多くの時間とリソースが必要 安定、信頼性、高品質な出力が必要
複雑なタスクや特定の分野のカスタマイズに適用 フィードバックループが遅く、トレーニングコストが高い 特定のタスクや分野でのモデル性能の改善
トークンを節約し、遅延を減らす 深層学習の基礎知識が必要 タスクに高精度または独特のスタイル、トーン、フォーマットが必要な場合
プロンプト 迅速な反復とテスト プロンプトの設計品質に依存 一般的なタスクの迅速なプロトタイプとテスト
初期探索と一般的なタスクに適している 複雑なタスクには不十分な場合がある モデル出力を柔軟に調整する必要がある場合
追加のデータ準備やトレーニングリソースが不要 多くの例と複雑なロジックのタスクには不適
思考チェーン ステップごとのロジックと推論を提供 プロンプトの複雑さと長さを増加させる 推論とロジックステップが必要なタスクを処理
複雑なタスクの性能を改善 トークン使用量と遅延を増加させる 多ステップの問題解決が関与するシーン
多様な戦略とツールを組み合わせやすい 非常に複雑なタスクには依然として不十分な場合がある 明確なロジックフローとステップ実行が必要な場合

NFL定理は、どの方法もすべてのシーンに適用できるわけではないと教えてくれます。ここでも同様に、微調が他の二つの方法よりも優れているとは限りません。しかし、微調は「説明しにくいタスク」に適用されることは明らかです。例えば、あるスタイルやトーンなどです。さらに、これら三つの方法は互いに排他的ではなく、微調モデルに精巧に設計されたプロンプトを使用し、さらには思考チェーンを組み合わせることで、より良い結果を達成できるかもしれません。

単に記事や段落を書く場合は、プロンプトで十分です。しかし、ブログ記事を書く場合、SEOを考慮すると、コアキーワードの出現頻度など、多くの詳細があります。これらの詳細を大モデルがすべて理解できるとは限らず、ユーザーとしてもプロンプトでうまく説明できるとは限りません。したがって、このようなブログ記事を書くには微調を使用できます。

2 データ準備

データはjsonl形式で組織する必要があります。各行は1つのjsonです。例:

1
2
3
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already."}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?"}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters."}]}

また、複数の対話で重みを設定することもできます。weightを0に設定すると、モデルがそのような回答を避けます。

1
2
3
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already.", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "William Shakespeare", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "384,400 kilometers", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters.", "weight": 1}]}

もちろん、データ処理は最も時間がかかるため、ここでは私が作成したデータセットを直接使用することもできます。このデータセットは大モデルの微調に使用され、reads.alibaba.comサイトの13の分類分野から3000以上のページをクロールしたもので、処理済みデータだけでなく、元データやクローラーコードもオープンソース化されています。

準備したデータをアップロードし、返されたファイルIDを記録します。

1
2
3
4
5
6
7
from openai import OpenAI
client = OpenAI()

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

3 微調モデル

データを準備し、誤りがないことを確認し、トークンコストを確認した後、微調タスクを作成できます。

1
2
3
4
5
6
7
from openai import OpenAI
client = OpenAI()

client.fine_tuning.jobs.create(
  training_file="file-zWptPbsD37ZnemssjpsK6CnF", 
  model="gpt-4o-mini"
)

このステップの詳細なパラメータ設定については、公式APIドキュメントを参照してください。

OpenAI 微調UI

上記の2ステップもUIインターフェースで迅速に完了でき、タスクを提出した後、UIインターフェースで進捗と損失の変化をリアルタイムで確認できます。

OpenAI 微調過程ログ

4 モデル呼び出し

以下のコードで微調タスクの状態を確認し、作業が成功した後、fine_tuned_modelフィールドにモデルの名前が入力されます。この名前を記録して呼び出しを行います。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
from openai import OpenAI
client = OpenAI()

# 微調タスクリストを確認
client.fine_tuning.jobs.list(limit=10)

# 微調タスクの詳細を確認
client.fine_tuning.jobs.retrieve("ftjob-gvP0VB7RlWcF3QHdQrEVf49Y")

# タスクをキャンセル
client.fine_tuning.jobs.cancel("ftjob-gvP0VB7RlWcF3QHdQrEVf49Y")

# タスクのログを確認
client.fine_tuning.jobs.list_events(fine_tuning_job_id="ftjob-gvP0VB7RlWcF3QHdQrEVf49Y", limit=10)

# 微調モデルを削除
client.models.delete("ft:gpt-3.5-turbo:acemeco:suffix:abc123")

呼び出し方法は公式のモデルと同じで、モデル名を1つ変更するだけで済みます。例えば:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from openai import OpenAI
client = OpenAI()

completion = client.chat.completions.create(
  model="ft:gpt-4o-mini-2024-07-18:personal:0724:9oMH6S7A",
  messages=[
    {"role": "system", "content": "Please write an SEO article of no less than 800 words based on the title I gave you, including at least 4 subtitles by HTML format. Do not include the <h1> , <body> tag.  Do not include the <html> tag in the start and end of the content. Directly start with the content."},
    {"role": "user", "content": f"title:{task.title},core keyword:{task.coreKeywords},related keyword:{task.relatedKeywords}"}
  ]
)
print(completion.choices[0].message)

5 評価結果

トレーニング中に参考にできる指標が2つあり、それぞれ損失値とトークン正確率です。公式の説明は以下の通りです:

検証損失と検証トークン正確率は、2つの異なる方法で計算されます。各ステップ中の小バッチデータで計算され、各エポックの終わりに全体の検証セットで計算されます。全体の検証損失と全体の検証トークン正確率の指標は、モデルの全体的な性能を追跡する最も正確な指標です。これらの統計は、トレーニングが順調に進んでいることを確認するための合理的なチェックを提供します(損失は減少し、トークン正確率は増加するはずです)。

しかし、指標はあくまで参考であり、実際の効果は自分で評価する必要があります。微調後のモデルは少なくとも以下の改善があります:

  • 記事の長さが20%増加
  • 記事の構造がトレーニングデータにより近くなる
  • フォーマットエラー(例えばmarkdownフォーマット、CSSの追加など)が発生しなくなる

「What is the Difference Between a Mural and a Mosaic?」という題で生成された記事は以下の通りです:

評価結果

6 参考記事

Buy me a coffee~
Tim 支付宝支付宝
Tim 贝宝贝宝
Tim 微信微信
0%