GPTモデルのファインチューニング

# はじめに

こんにちは、Gakken LEAP のバックエンドエンジニアの Matsuura です。

何やら巷ではAIが話題になっていますね。
その中でもChatGPTやOpenAIといったワードをよく耳にします。
OpenAIは、人工知能技術を手軽に利用できるようなサービスを展開しています。OpenAI APIを利用することで、テキスト生成や自然言語理解など、多彩な機能が簡単に実現できます。

OpenAIが開発したGPTシリーズは、その高い性能と多様性から注目を集めています。
一方で、GPTは事前学習された汎用モデルであり、特定のタスクやドメインに対して最適化されていないことがあります。そのため、社内用のWikiや特定のサービス用のチャットボットとしての利用にGPTは適していません。

その問題を解決するのがファインチューニングです。
ファインチューニングを行うことで、GPTを独自のニーズに合わせてカスタマイズすることができます。

本記事では、OpenAI APIを用いたGPTモデルのファインチューニングについて解説します。

# 0. 準備

## OpenAIコマンドのインストール

以下のコマンドでOpenAIが提供している公式の[Python用ライブラリ](https://github.com/openai/openai-python)をインストールします。
これによりOpenAIコマンドとそれを実行するのに必要なライブラリ(pandasなど)がインストールされます。すでに他のライブラリがインストール済みであれば、後者のコマンドを実行してください。

``` bash
pip install openai[datalib]
# もしくは
pip install openai
```

執筆時にインストールしたバージョンは1.28.0でした。

```bash
openai -V
# openai 1.28.0
```

## OpenAI APIキーの取得と設定

まず、以下のURLにアクセス・サインインしてください。

<https://platform.openai.com/api-keys>

次に画面右上の「Create new secret key」を選択し、必要に応じて「Name」や「Project」を設定し、下の「Create secret key」をクリックしてください。
![apikey-1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712998/f8f51ede-4fcf-5351-4345-2ca72ea1add2.png)

すると、画面にAPIキーが表示されます。
![apikey-2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712998/a452b324-238f-4173-01ca-7a1b48c73c91.png)

ここで取得したAPIキーはコピーしておきます。
忘れた場合、再取得が必要になるので、安全に保管しておきましょう。

次に環境変数に以下を追加します。

> OPENAI_API_KEY="取得したAPIキー"

コマンドの場合は以下を実行、もしくは.bash_profileに追加しておきましょう。

```bash
export OPENAI_API_KEY="取得したAPIキー"
# .bash_profileに設定した場合は以下で設定更新も実施
source .bash_profile
```

以上で準備は完了です。

# 1. OpenAI APIを用いたファインチューニング

OpenAIのAPIを用いてGPTモデルをファインチューニングするための手順は以下の通りです。

## 1.1 データセットの準備

ファインチューニングに使用するデータセットを準備します。データセットは、モデルが特定のタスクを学習するために必要な情報が含まれている必要があります。データセットは以下の形式で用意してください。

- 入力データとターゲットデータのペアを作成（CSVなど）
- データをJSONL形式に変換

データのJSONL形式への変換には、以下のOpenAIのコマンドを利用することができます。
このコマンドでは、JSONLが正しいフォーマットになっているかも判断してくれます。

```bash
openai tools fine_tunes.prepare_data -f <生成したJSONLファイルorCSVなど>
```

## 1.2 ファインチューニングの実行

ファインチューニングを実行するには以下のコマンドを利用します。

```bash
openai api fine_tunes.create -t <学習に使用するJSONLファイル> -m <BaseModel>
```

このコマンドにおいてBaseModelとは、ファインチューニングを行う際のベースとなるモデルを指します。上記コマンドでは以下の値を設定することができます。これらのモデルは、それぞれ異なる性能や対応するAPI利用料金が設定されています。

- davinci: 最も高度な自然言語処理機能を備えたモデル
- curie: 大規模なトレーニングデータと高速計算能力を兼ね備えたモデル
- babbage: より短時間のトレーニングで使用可能なモデル
- ada: 制限された予算でトレーニングできるように設計されたモデル

コマンド実行後は、学習が完了するまで待機する必要がありますが、途中でタイムアウトになることがあります。リトライ用のコマンドがログに記録されますが、基本的には一度ファインチューニングコマンドを実行すると裏で処理が維持されるため、基本的にリトライコマンドは実行しなくても大丈夫です。学習データ量によって変わりますが、10分置きに以下のページでファインチューニングによるAPI使用量があれば、学習が完了したと考えてよいでしょう。
<https://platform.openai.com/account/usage>

## 1.3 ファインチューニングしたモデルの利用方法

ファインチューニングしたモデルを利用するには以下のコマンドを実行します。

```bash
openai api completions.create -m <生成したモデル名> -p <プロンプト>
```

生成したモデル名は1.2に記載したURL、もしくは以下のコマンドを実行することで確認することができます。

```bash
openai api models.list
```

# おわりに

本記事では、OpenAI APIを用いたGPTモデルのファインチューニングについて解説しました。これにより、独自のニーズに合わせたカスタマイズが可能になります。ファインチューニングの手順や実行方法、利用方法についても説明しましたので、ぜひ実践してみてください。

GPTモデルのファインチューニングを活用し、独自のAIアプリケーションやサービスを開発することで、より効果的でスムーズな業務遂行や問題解決を実現できるでしょう。

また、OpenAI API以外にも、EmbeddingsでのファインチューニングやLlamaIndexのベクター検索を使用したチャットボットも作成しましたので、次回以降の記事で紹介していきます。

---

Gakken LEAP では教育をアップデートしていきたいエンジニアを絶賛大募集しています！！

https://gakken-leap.co.jp/recruit/