ChatGPTをファインチューニングして、FAQシステムを作ってみる

環境構築

Google Colaboratory の導入

今回は、Pythonの実行環境として、Google Colaboratoryを使います。

Colab とは

Colab(正式名称「Colaboratory」)では、ブラウザ上で Python を記述、実行できます。以下の機能を使用できます。
・環境構築が不要
・GPU に料金なしでアクセス
・簡単に共有
Colab は、学生からデータ サイエンティストAI リサーチャーまで、皆さんの作業を効率化します。詳しくは、Colab の紹介動画をご覧ください。下のリンクからすぐに使ってみることもできます。

ノートブックを新規作成

ファイル名をわかりやすい名前に変更する

作成したファイルは、マイドライブ > Colab Notebooks に格納されます

ChatGPTに学習させる

学習データを用意する

学習データは、JSONL形式にする必要があります。
学習させるには、最低でも10個必要らしい。
今回は、以下のデータを作成し、ファイル名は「training_data.jsonl」としました。

{"prompt": "クレジットカードは使えますか?", "completion": "各種クレジットカード(Visa、MasterCard、JCB、American Express、DINERS 等)をご利用いただけます。\nVisa、MasterCardでは分割払い(3 / 5 / 6 / 12 / 15 / 18 / 20 / 24 回払いまで)をご利用可能です。"}
{"prompt": "希望日時の予約が取れません。", "completion": "一日にご案内できるお席に限りがあり、ご予約が取りづらい状況でご迷惑をおかけしております。"}
{"prompt": "予約は必要ですか?", "completion": "予約制となっております。"}
{"prompt": "確認メールが届きません", "completion": "詳しくは<a href='https://google.com' target='_blank'>こちらのページ</a>をご確認ください。"}
{"prompt": "商品Aの値段はいくらですか?", "completion": "1000円(税別)です。"}
{"prompt": "商品Bの値段はいくらですか?", "completion": "2000円(税別)です。"}
{"prompt": "商品Cの値段はいくらですか?", "completion": "3000円(税別)です。"}
{"prompt": "商品Dの値段はいくらですか?", "completion": "4000円(税別)です。"}
{"prompt": "商品Eの値段はいくらですか?", "completion": "5000円(税別)です。"}
{"prompt": "商品Fの値段はいくらですか?", "completion": "6000円(税別)です。"}

用意したJSONLデータをアップロードする

今回は ChatGPT-FineTune.ipynb と同階層にアップします。

Google Drive をマウントさせる

Google Drive 上のファイルを読み込めるようにマウントさせます。

OpenAI のインストール

# openai のインストール
!pip install openai

学習データファイルのアップロード

import os
from openai import OpenAI

# APIキーとモデル名を設定
API_KEY = "your-api-key"
MODEL = "gpt-4o-mini"

os.environ["OPENAI_API_KEY"] = API_KEY

client = OpenAI()

# 学習データファイルのアップロード
training_file = client.files.create(
    file=open("/content/drive/MyDrive/Colab Notebooks/training_data.jsonl", "rb"),
    purpose="fine-tune"
)

# 確認
print(training_file)

id=’file-xxxxx’
という id が返ってくるので控えておく。

ファインチューニング実行

# ファインチューニングの開始
from openai import OpenAI
client = OpenAI()

fine_tune_job = client.fine_tuning.jobs.create(
    training_file="file-xxxxx",
    model=MODEL
)

実行結果

BadRequestError: Error code: 400 –
{‘error’: {
‘message’: ‘Model gpt-4o-mini is not available for fine-tuning or does not exist.’,
‘type’: ‘invalid_request_error’,
‘param’: None,
‘code’: ‘model_not_available’
}}

え、、、

gpt-4o-mini はファインチューニングに対応していない??

公式のドキュメントを見てみる。

Fine-tuning is currently available for the following models:

  • gpt-4o-2024-08-06
  • gpt-4o-mini-2024-07-18
  • gpt-4-0613
  • gpt-3.5-turbo-0125
  • gpt-3.5-turbo-1106
  • gpt-3.5-turbo-0613
  • babbage-002
  • davinci-002

確かに gpt-4o-mini は記載されていない。
gpt-4o-mini-2024-07-18 に変更してみたところ、実行時のエラーは出なくなった。

ファインチューニングの実行ステータスの確認

from openai import OpenAI
client = OpenAI()

# 直近10件のファインチューニングの結果を表示
client.fine_tuning.jobs.list(limit=10)

実行結果

error=Error(code=’invalid_training_file’,
message=’The job failed due to an invalid training file. Invalid file format. Input file file-xxxxx is in the prompt-completion format, but the specified model gpt-4o-mini-2024-07-18 is a chat model and requires chat-formatted data. See https://platform.openai.com/docs/guides/fine-tuning/preparing-your-dataset for details.’, param=’training_file’)

うーん、、データの形式に問題があるとのこと、、、

jsonl ファイルをチャット形式の形に整形してみる。

{"messages":[{"role":"user","content":"クレジットカードは使えますか?"},{"role":"assistant","content":"各種クレジットカード(Visa、MasterCard、JCB、American Express、DINERS 等)をご利用いただけます。\nVisa、MasterCardでは分割払い(3 / 5 / 6 / 12 / 15 / 18 / 20 / 24 回払いまで)をご利用可能です。"}]}
{"messages":[{"role":"user","content":"希望日時の予約が取れません。"},{"role":"assistant","content":"一日にご案内できるお席に限りがあり、ご予約が取りづらい状況でご迷惑をおかけしております。"}]}
{"messages":[{"role":"user","content":"予約は必要ですか?"},{"role":"assistant","content":"予約制となっております。"}]}
{"messages":[{"role":"user","content":"確認メールが届きません"},{"role":"assistant","content":"詳しくは<a href=\"https://google.com\" target=\"_blank\">こちらのページ</a>をご確認ください。"}]}
{"messages":[{"role":"user","content":"商品Aの値段はいくらですか?"},{"role":"assistant","content":"1000円(税別)です。"}]}
{"messages":[{"role":"user","content":"商品Bの値段はいくらですか?"},{"role":"assistant","content":"2000円(税別)です。"}]}
{"messages":[{"role":"user","content":"商品Cの値段はいくらですか?"},{"role":"assistant","content":"3000円(税別)です。"}]}
{"messages":[{"role":"user","content":"商品Dの値段はいくらですか?"},{"role":"assistant","content":"4000円(税別)です。"}]}
{"messages":[{"role":"user","content":"商品Eの値段はいくらですか?"},{"role":"assistant","content":"5000円(税別)です。"}]}
{"messages":[{"role":"user","content":"商品Fの値段はいくらですか?"},{"role":"assistant","content":"6000円(税別)です。"}]}

再度実行

client.fine_tuning.jobs.list(limit=10)

FineTuningJob(
id=’ftjob-xxxxx’,
created_at=1724984458,
error=Error(code=None, message=None, param=None),
fine_tuned_model=None,
finished_at=None,
hyperparameters=Hyperparameters(n_epochs=10, batch_size=1, learning_rate_multiplier=1.8),
model=’gpt-4o-mini-2024-07-18′,
object=’fine_tuning.job’,
status=’running’,
trained_tokens=None,
training_file=’file-xxxxx’,
estimated_finish=1724984869,
)

10分後

FineTuningJob(
id=’ftjob-xxxxx’,
created_at=1724984458,
error=Error(code=None, message=None, param=None),
fine_tuned_model=’ft:gpt-4o-mini-2024-07-18:personal::xxxxx’, ← これが作成された
finished_at=1724984873,
hyperparameters=Hyperparameters(n_epochs=10, batch_size=1,
model=’gpt-4o-mini-2024-07-18′,
object=’fine_tuning.job’,
status=’succeeded’, ← 成功!
trained_tokens=3690,
training_file=’file-xxxxx’,
estimated_finish=None,
)

学習したモデルを使ってみる

from openai import OpenAI
client = OpenAI()

completion = client.chat.completions.create(
  model="ft:gpt-4o-mini-2024-07-18:personal::xxxxx",
  messages=[
    {"role": "system", "content": "あなたは優秀なカスタマーサポートです。"},
    {"role": "user", "content": "予約しなくても行けますか?"}
  ]
)
print(completion.choices[0].message)

実行結果

予約制となっております。

動いた!!!

けどjsonlの形式の問題は引っかかるなぁ、、

コメント