見出し画像

ChatGPTのfine-tuningをpythonでやってみた

はじめに

今話題のchatGPTをビジネスで使用するために、何をするべきか考えています。その中で、ある程度答えが決まっている業務で使えそうなfine-tuningのやりかたとその効果について考察しました。
chatGPT pluginsがリリースされたことで、fine-tuning自体を選択肢とすべきかは検討したほうがいいと思います。

fine-tuning(ファインチューニング)とは、機械学習モデルを特定のタスクやデータセットに対してより適切に動作させるために、既存の学習済みモデルを少し調整するプロセスです。

機械学習の分野では、大規模なデータセットで事前に訓練されたモデル(例えば、OpenAIのGPT-3など)がよく使われます。これらのモデルは、さまざまなタスクに対して汎用的に使用できますが、特定のタスクや状況において最適な結果を得るためには、追加の調整が必要となることがあります。

fine-tuningでは、学習済みモデルをベースに、新しいデータセットやタスクに対して短期間の学習を行います。このプロセスにより、モデルは新しいデータセットやタスクに適応し、より正確な結果を出力するようになります。この方法は、新しいタスクに対してゼロからモデルを訓練するよりも効率的であり、計算リソースや時間を節約することができます。

業務で決まった手順や受け答えなどが、あらかじめ用意されている場合にはこの方法が有効な場合があります。

手順と仕組

fine-turningというとtensor-flowなんかを使ってローカルでやるものと思ってましたが、OpenAI社の用意するAPIで実行する仕組みになっています。

以下の流れを頭にいれておくと、コードの理解が容易になります。

  1. ローカルでトレーニングデータを作成

  2. OpenAIへ1で作成したファイルをアップロード。APIを使ってファイルをアップロードし、file_idというものを取得

  3. file_idとトレーニングの元となるOpenAIが用意しているトレーニング済みモデルを指定し、fine-tuningのAPIリクエストを実行

  4. リクエストから完了までにはかなりの時間がかかる。そのため、fine-tuning_idというものを3で実行した際に取得しておき、定期的にステータスを確認し、完了を待つ。完了すると専用のモデルIDが発行される

  5. 専用のモデルIDを取得し、APIにプロンプトを投げて、ChatGPTの返答を受け取る

API Keyを取得する

OpenAIのAPIを利用するためには、まずAPIキーを取得する必要があります。以下の手順でAPIキーを取得できます。

  1. OpenAIサイトへアクセス: OpenAIの公式ウェブサイト (https://openai.com/product) にアクセスし、「Get started」または「Sign in」ボタンをクリックして、アカウントにログインします。アカウントがない場合は、新規登録を行ってください。

  2. APIキーのページへ移動: ダッシュボードにログインしたら、左側のナビゲーションメニューから「API Keys」をクリックします。

  3. APIキーを生成: 「API Keys」ページで、「Create an API key」ボタンをクリックして新しいAPIキーを生成します。生成されたキーは、次のような形式になります: sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxx

  4. 「Payment methods」でカード情報などを入力(ここで入力しないと、APIを使用したときに、エラーで使用できない)

  5. playgraund(https://platform.openai.com/examples)で色々試してみましょう。ここで遊べれば準備は完了です。

API Keysへ


ここで支払い方法を指定する

pip install --upgrade openai

コマンドラインで実行します。

pip install --upgrade openai

トレーニング用データの準備


用意したAPI KEYを設定します

import openai
import json

api_key = 'your_openai_api_Key'

#set openai api key
openai.api_key = api_key

OpenAIへアップロードするトレーニング用のJsonファイルを作成します。
ファイル名はtraining_data.jsonlとします。

{"prompt": "Where is the billing ->", "completion": " You find the billing in the left-hand side menu.\n"}
{"prompt": "How do I upgrade my account ->", "completion": " Visit you user settings in the left-hand side menu, then click 'upgrade account' button at the top.\n"}

promtは質問文です。そしてcompletionは答えとだと思ってください。質問に対しての答えを用意しています。

作成したトレーニング用ファイルをアップロードする

ファイルを作成したらいよいよAPIを使用してファイルをアップロードします。

upload_response = openai.File.create(
file=open(file_name, "rb"),
purpose='fine-tune'
)
file_id = upload_response.id

file_id = upload_response.id でfile_Idを取得しておきます。このIDを指定していよいよfine-tuningをします。

fine-tuningを実行する


model="davinci"とあります。これはGPT3を表しています。このあたりの詳しい説明はこちらのドキュメントを参照してください。(https://platform.openai.com/docs/models/gpt-3)

print(file_id)
fine_tune_response = openai.FineTune.create(training_file=file_id, model="davinci")

print(fine_tune_response) をみてみましょう。

{
"created_at": 1679569086,
"events": [
{
"created_at": 1679569086,
"level": "info",
"message": "Created fine-tune: ft-GKqIJtdK11541MNuq4L6mREmwT",
"object": "fine-tune-event"
}
],
"fine_tuned_model": null,
"hyperparams": {
"batch_size": null,
"learning_rate_multiplier": null,
"n_epochs": 4,
"prompt_loss_weight": 0.01
},
"id": "ft-GKqIJtdK16UMNuq555mREmwT",
"model": "davinci",
"object": "fine-tune",
"organization_id": "org-TZfAzd2MLxZITGg3FEY3w71l5",
"result_files": [],
"status": "pending",
"training_files": [
{
"bytes": 274,
"created_at": 1679568992,
"filename": "file",
"id": "file-Jru0n1eWSOFjxliasaesdeefaj0ReVj",
"object": "file",
"purpose": "fine-tune",
"status": "processed",
"status_details": null
}
],
"updated_at": 1679569086,
"validation_files": []
}

"fine_tuned_model": null


これはまだfine-tuningしたモデルができていないことを表します。モデルが作成されるとあなただけのIDが作成されます。

”id": "ft-GKqIJtdK16UMNuq555mREmwT"

このft-から始まるidはこのfine-tuningタスクのidです。このidでタスクのステータスを確認することができます。

"status": "pending"

これはまだfine-tuningがペンディングになっています。作成完了までには長い時間がかかりますので、このステータスが完了になるまで、待つ必要があります。

"id": "file-Jru0n1eWSOFjxliasaesdeefaj0ReVj",

これは指定したfile idです。アップロードしたファイルはこのidを指定して、再使用できます

モデルのチューニングが終わるまでステータスをチェックする

ft-から始まるidを指定して、fine-tuningのタスクの状況を確認します。

fine_tune_id = 'ft-GKqIJtdK16UMNuq555mREmwT'

def get_fine_tune_status():
    # Retrieve the fine-tuning process details using the OpenAI package
    fine_tune = openai.FineTune.retrieve(fine_tune_id)

    # Check if the status field exists in the response
    if 'status' not in fine_tune:
        print(f"Error: {fine_tune}")
        return None

    # Return the status and the fine-tuned model ID (if available)
    return fine_tune['status'], fine_tune.get('fine_tuned_model', None)

# Call the function to get the fine-tuning status and model ID
status, fine_tuned_model_id = get_fine_tune_status()
print(f"Fine-tune status: {status}")
print(f"Fine-tuned model ID: {fine_tuned_model_id}")

fine_tune_id = 'ft-GKqIJtdK16UMNuq555mREmwT'
こちらで、あなたが取得したft-から始まるidを指定してください。
ループを一定間隔で回して監視するなどするのでしょうが、朝起きてチェックしてできてるか微妙、、というスピード感ですので、お任せします。

Fine-tune status: succeeded
Fine-tuned model ID: davinci:ft-personal-2023-03-XX-XX-XX-XX

Fine-tuned model ID: davinci:ft-personal-2023-03-XX-XX-XX-XX

上記があなたが作成したfine-tuning モデルです

終わりましたか? 試してみましょう!

modelにあなたが取得したmodel IDを入力して実行しましょう。

def chat_with_fine_tuned_gpt3(prompt, model="davinci:ft-personal-2023-03-XX-XX-XX-XX"):
    response = openai.Completion.create(
        model=model,
        prompt = prompt,
        temperature=0
    )

answer = chat_with_fine_tuned_gpt3(prompt='How do I find my billing? ->')
print(answer['choices'][0]['text'])
Your initial billing statement will be mailed to the physical address you provided.

いかがでしたでしょうか。答えは様々あったかと思います。データが少ないので正直よくわらない結果となりました。

今後は

データを増やしたらどうなるでしょうか。一般企業のFAQなどのデータでどう返答が変わるでしょうか。気になるところです。


この記事が気に入ったらサポートをしてみませんか?