🚀【GPT-4o mini完全攻略】驚異のコスパでLLMファインチューニング!【AOAIでもできるよ】🚀

## はじめに

2024年7月18日にOpenAIが発表した「GPT-4o mini」は、AI業界に激震をもたらしました。その理由は、**驚異的なコストパフォーマンス**と**GPT-4譲りの高性能**を両立させた、まさに注目すべき生成AIモデルだからです。

従来、高性能なAIは導入コストが高く、大企業しか利用できないイメージがありました。しかし、GPT-4o miniの登場により、中小企業やスタートアップ企業も、低コストでAIの恩恵を受けることができるようになりました。 顧客対応の自動化による業務効率化、マーケティングコンテンツの自動生成による新規顧客獲得、社内文書の効率的な要約による情報共有の促進など、GPT-4o miniはビジネスのあらゆる側面に革命をもたらす可能性を秘めています。

GPT-4o miniを活用すれば、あなたのビジネスに特化したAIを、驚くほど低コストで実現できます。顧客対応の自動化、社内文書の効率的な要約、多言語対応の強化、コーディングの効率化など、あらゆる業務をGPT-4o miniが劇的に変革する可能性を秘めているのです。

特に、従来の大規模言語モデルではコスト面がネックとなっていた中小企業やスタートアップ企業にとって、GPT-4o miniはAI導入のハードルを大幅に下げるゲームチェンジャーとなるでしょう。

本記事では、GPT-4o miniのファインチューニング（微調整）について、基礎から実践まで徹底的に解説します。ファインチューニングの手順はもちろん、成功のためのTipsや注意点、そしてAzure OpenAIでのファインチューニング方法まで、余すことなくお伝えします。

**準備はいいですか？GPT-4o miniでAI活用の未来を一緒に切り開きましょう！**

## GPT-4o mini：驚異的な性能と圧倒的なコストパフォーマンス

GPT-4o miniは、**高性能かつ低コスト**という点で、他のモデルを凌駕します。 

以下の表と図は、GPT-4o miniと他の主要なGPTモデルを比較したものです。

| 特徴 | gpt-4o-mini-2024-07-18 | gpt-4o-2024-08-06 | gpt-4-turbo-2024-04-09| gpt-3.5-turbo-0125|
|------|------------------------|------------------------|------------------------|------------------------|
| MMLUスコア | 82.0% | 88.7% | 86.4% | 69.8% |
| 入力コスト（/1Mトークン） | $0.150 | $2.50 |$10.00 | $0.50 |
| 出力コスト（/1Mトークン） | $0.600 | $10.00 | $30.00 |$1.50 |
| コンテキストウィンドウ | 128K | 128K | 128K |16K |
| 最大出力トークン | 16K | 16K | 4K |4K |
| 知識のカットオフ | 2023年10月 | 2023年10月 | 2023年12月 |2021年9月 |

![](https://storage.googleapis.com/zenn-user-upload/77f924dd201a-20240815.png)
*[^1]*

GPT-4o miniは、GPT-4やGPT-4oの高度な性能を維持しつつ、大幅にコストを削減しています。特に以下のような用途に適しています：

* 複数のモデル呼び出しを連鎖または並列化するアプリケーション
* 大量のコンテキストをモデルに渡す必要がある場合
* リアルタイムのテキスト応答が必要な場合

## ファインチューニング：AIをビジネスの武器に変える

ファインチューニングとは、GPT-4o miniを**あなたのビジネスに特化させる**ための強力なツールです。事前学習済みのGPT-4o miniは一般的な知識や能力を持っていますが、ファインチューニングによって、特定の業務や分野に特化した知識やスキルを学習させることができます。

例えば、顧客対応に特化したチャットボットを開発したい場合、GPT-4o miniをそのまま使用しても、一般的な回答しか返せません。しかし、ファインチューニングによって、顧客対応に関するデータで学習させることで、より的確で専門的な回答を生成できるようになります。

**ファインチューニングによって、GPT-4o miniは以下のような改善が見込めます。**

1. **精度向上**: 特定タスクに特化したデータで学習することで、より正確で的確な応答を生成できる可能性が高まります。
2. **専門性の向上**: 特定分野のデータで学習することで、その分野の専門用語や表現を理解し、より自然で専門性の高いコミュニケーションを実現できる可能性が高まります。
3. **表現力向上**: 企業独自のデータで学習することで、企業のトーン＆マナーに合わせた、より親しみやすい応答を生成できる可能性が高まります。

## RAGとの比較：ファインチューニングが最適なケースとは？

大規模言語モデルの活用には、RAG（Retrieval-Augmented Generation）という手法も存在します。RAGは、外部の知識ベースから情報を取得し、それらを組み合わせて回答を生成する手法です。

以下は、ファインチューニングとRAGの比較表です。

| 項目 | ファインチューニング | RAG |
|---|---|---|
| データの扱い方 | モデル自体を再学習させ、内部の重みを更新 | モデルはそのままで、外部データベースから関連情報を取得して利用 |
| 更新の容易さ | 新しい情報を追加するたびに再学習が必要 | 外部データベースの更新で対応可能、モデルの再学習不要 |
| 精度と一貫性 | 特定ドメインでの高い精度と一貫性が期待できる | 最新情報の反映が容易だが、回答の一貫性に欠ける場合もある |
| リソース要件 | 大量の計算リソースが必要 | 比較的少ないリソースで実装可能 |

**つまり、高い精度と一貫性、そしてデータプライバシーを重視する場合、ファインチューニングが最適な選択と言えるでしょう。**

特に、以下のような状況では、ファインチューニングが効果的です。

* 特定のスタイルやトーンで応答を生成したい場合
* 複雑なプロンプトを理解させたい場合
* 新しいスキルやタスクを学習させたい場合

ただし､ファインチューニング vs RAGの二元論を語りたいわけではなく､状況や要件に応じて適切な手法を選択または組み合わせることが肝要です｡

## ファインチューニング実践ガイド：6つのステップでAIを進化させよう！

GPT-4o miniのファインチューニングは、以下の6つのステップで実施できます。

### 1. データセットの準備：質の高いデータが成功のカギ！

ファインチューニングの成功は、質の高いデータセットの準備から始まります。以下の点に注意してデータセットを作成します。

- **関連性の高い高品質データを収集:** 正確で網羅的なデータこそ、高性能AIの源泉です。
- **JSONL形式に変換:** OpenAIのAPIが求める形式に変換しましょう。
- **システムメッセージ、ユーザーメッセージ、アシスタントの応答を含める:** これら3要素が、AIの学習を促進します。

**データセットの形式**

GPT-4o miniのファインチューニングには、ChatCompletion形式のデータセットを使用します。各トレーニング例は、以下のような形式のJSON Linesファイルで提供する必要があります。

```json
{"messages": [{"role": "system", "content": "システムメッセージ"}, {"role": "user", "content": "ユーザーメッセージ"}, {"role": "assistant", "content": "アシスタントの応答"}]}
```

**例：料理レシピから材料を抽出するタスクのデータセット**

```json
{"messages": [{"role": "system", "content": "あなたは日本料理の専門家です。レシピから主要な材料を抽出してください。"}, {"role": "user", "content": "レシピ名: 肉じゃが\n\n材料: [\"牛肉300g\", \"じゃがいも2個\", \"玉ねぎ1個\", \"にんじん1/2本\", \"糸こんにゃく1袋\", \"醤油大さじ3\", \"みりん大さじ2\", \"酒大さじ2\", \"砂糖大さじ1\", \"だし汁1カップ\"]\n\n主要材料: "}, {"role": "assistant", "content": "[\"牛肉\", \"じゃがいも\", \"玉ねぎ\", \"にんじん\", \"こんにゃく\", \"醤油\", \"みりん\", \"酒\", \"砂糖\", \"だし\"]"}]}
```

**多数回の対話を含むデータセット**

複数のターンを含む対話例も使用できます。デフォルトでは、1つの例内のすべてのアシスタントメッセージがトレーニングの対象となります。特定のアシスタントメッセージをスキップしたい場合は、`weight`キーを追加してそのメッセージのトレーニングを無効にできます。

```json
{"messages": [
  {"role": "system", "content": "あなたは皮肉な口調のチャットボットです。"},
  {"role": "user", "content": "フランスの首都は？"},
  {"role": "assistant", "content": "パリです。", "weight": 0},
  {"role": "user", "content": "もっと皮肉っぽく答えてください。"},
  {"role": "assistant", "content": "ああ、パリですよ。まるで誰もが知らないかのように。", "weight": 1}
]}
```

**データセットのサイズと分割**

効果的なファインチューニングには、通常100例以上の高品質なデータが必要です。OpenAIは以下のガイドラインを提供しています。

* **最小：少なくとも10例が必要**
* **推奨：50〜100の良質な例から始め、モデルの改善を確認**
* **スケーリング：例の数を倍増させるごとに、同様の改善が期待できる**

また、データセットを訓練用と検証用に分割することをお勧めします（例：70%訓練、30%検証）。これにより、モデルの過学習を防ぎ、一般化性能を向上させることができます。

#### サンプルプログラムを使用したデータ作成

以下は、Webページの内容を基にGPT-4oを使用してQ&Aを自動生成し、JSONL形式で出力するプログラム例を紹介します。

```python
import asyncio
import json
import os
import random
from typing import Dict, List

import aiohttp
from bs4 import BeautifulSoup
from dotenv import load_dotenv
from openai import AzureOpenAI

# 環境変数のロード
load_dotenv()


class Config:
    """
    アプリケーションの設定を管理するクラス

    環境変数から設定を読み込み、アプリケーション全体で使用する定数を定義します。
    """

    AZURE_OPENAI_ENDPOINT: str = os.getenv("AZURE_OPENAI_ENDPOINT", "")
    AOAI_API_KEY: str = os.getenv("AOAI_API_KEY", "")
    AOAI_DEPLOYMENT_NAME: str = os.getenv("AOAI_DEPLOYMENT_NAME", "gpt-4o")
    AOAI_API_VERSION: str = os.getenv("AOAI_API_VERSION", "2024-02-01")
    MAX_TOKENS: int = 1000
    TEMPERATURE: float = 0.7
    MAX_CONTENT_LENGTH: int = 4000  # GPT-4oの入力制限に応じて調整
    SYSTEM_MESSAGE: str = "あなたは優秀で高度なAIです。"


async def get_webpage_content(url: str) -> str:
    """
    指定されたURLのWebページの内容を非同期に取得する

    Args:
        url (str): スクレイピングするWebページのURL

    Returns:
        str: Webページのテキストコンテンツ（最大長はConfig.MAX_CONTENT_LENGTHに制限）

    Raises:
        aiohttp.ClientError: HTTPリクエスト中にエラーが発生した場合
    """
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            html = await response.text()
    soup = BeautifulSoup(html, "html.parser")
    return soup.get_text()[: Config.MAX_CONTENT_LENGTH]


async def generate_qa(client: AzureOpenAI, content: str, num_qa: int) -> List[Dict[str, List[Dict[str, str]]]]:
    """
    GPT-4oを使用してQ&Aを生成する

    Args:
        client (AzureOpenAI): Azure OpenAI APIクライアント
        content (str): Q&A生成の基となるコンテンツ
        num_qa (int): 生成するQ&Aペアの数

    Returns:
        List[Dict[str, List[Dict[str, str]]]]: 生成されたQ&Aペアのリスト。
        各要素は{"messages": [...]}の形式のディクショナリ。

    Raises:
        Exception: API呼び出し中にエラーが発生した場合
    """
    system_prompt = f"以下の内容に基づいて、{num_qa}組の質問と回答を生成してください。各Q&Aは'Q:'と'A:'で始まるようにしてください。"
    user_prompt = f"# 内容：\n{content}\n\n#指示:{num_qa}組の質問と回答を生成してください。"

    messages = [
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": user_prompt},
    ]

    try:
        response = await asyncio.to_thread(
            client.chat.completions.create,
            model=Config.AOAI_DEPLOYMENT_NAME,
            messages=messages,
            max_tokens=Config.MAX_TOKENS,
            temperature=Config.TEMPERATURE,
        )

        qa_text = response.choices[0].message.content
        qa_pairs = []
        current_question = ""
        current_answer = ""

        for line in qa_text.split("\n"):
            if line.startswith("Q:"):
                if current_question and current_answer:
                    qa_pairs.append(
                        {
                            "messages": [
                                {"role": "system", "content": Config.SYSTEM_MESSAGE},
                                {"role": "user", "content": current_question.strip()},
                                {"role": "assistant", "content": current_answer.strip()},
                            ]
                        }
                    )
                current_question = line[2:].strip()
                current_answer = ""
            elif line.startswith("A:"):
                current_answer = line[2:].strip()
            else:
                current_answer += " " + line.strip()

        if current_question and current_answer:
            qa_pairs.append(
                {
                    "messages": [
                        {"role": "system", "content": Config.SYSTEM_MESSAGE},
                        {"role": "user", "content": current_question.strip()},
                        {"role": "assistant", "content": current_answer.strip()},
                    ]
                }
            )

        return qa_pairs
    except Exception as e:
        print(f"Error generating Q&A: {e}")
        return []


def save_jsonl(data: List[Dict], filename: str):
    """
    データをJSONL形式でファイルに保存する

    Args:
        data (List[Dict]): 保存するデータのリスト。各要素はディクショナリ。
        filename (str): 保存先のファイル名

    Raises:
        IOError: ファイルの書き込み中にエラーが発生した場合
    """
    with open(filename, "w", encoding="utf-8") as f:
        for item in data:
            json.dump(item, f, ensure_ascii=False)
            f.write("\n")


async def main():
    """
    メイン関数

    ユーザー入力を受け取り、Webページの内容を取得し、Q&Aを生成して
    訓練データと検証データに分割し、JSONL形式で保存します。
    """
    client = AzureOpenAI(
        api_key=Config.AOAI_API_KEY,
        api_version=Config.AOAI_API_VERSION,
        azure_endpoint=Config.AZURE_OPENAI_ENDPOINT,
    )

    url = input("WebページのURLを入力してください: ")
    num_qa = int(input("生成するQ&Aの数を入力してください: "))

    try:
        # Webページの内容を取得
        content = await get_webpage_content(url)

        # Q&Aを生成
        qa_pairs = await generate_qa(client, content, num_qa)

        # Q&Aペアをシャッフル
        random.shuffle(qa_pairs)

        # 分割インデックスを計算（70%を訓練データに）
        split_index = int(len(qa_pairs) * 0.7)

        # データを分割
        training_data = qa_pairs[:split_index]
        validation_data = qa_pairs[split_index:]

        # データを保存
        save_jsonl(training_data, "training_data.jsonl")
        save_jsonl(validation_data, "validation_data.jsonl")

        print(f"訓練データを training_data.jsonl に保存しました（{len(training_data)}件）")
        print(f"検証データを validation_data.jsonl に保存しました（{len(validation_data)}件）")

    except Exception as e:
        print(f"エラーが発生しました: {e}")


if __name__ == "__main__":
    asyncio.run(main())
```

上記はあくまで一例です｡モデルによるデータ作成は､モデルプロパイダーの利用規約など確認したうえでデータセットを作成してください｡
また､上記の例では使用しませんでしたが､以下の記事で触れましたStrucutred Outputを使用してデータセットを作成するのもよいかもしれません｡

https://zenn.dev/chips0711/articles/ab49bde721375e


### 2. OpenAI APIの設定：APIキーを取得して準備万端！

OpenAIのAPIを利用するには、APIキーが必要です。以下の手順で取得しましょう。

1. OpenAIのウェブサイト（https://platform.openai.com/account/api-keys）にログインします。
2. 「Create new secret key」ボタンをクリックし、新しいAPIキーを生成します。
3. 生成されたAPIキーを安全な場所に保管します。

Python環境に`openai`ライブラリをインストールします。

```bash
pip install openai
```

### 3. ファインチューニングジョブの作成と実行：いよいよAIを鍛える！


ファインチューニングジョブの作成と実行には、プログラムを使用する方法とOpenAIのグラフィカルインターフェース（GUI）を使用する方法の2つがあります。


#### プログラムを使用したファインチューニング

Python APIを使用してファインチューニングジョブを作成する手順は以下の通りです。

1. データファイルのアップロード
2. ファインチューニングジョブの作成
3. ジョブの進行状況の確認

以下に、各ステップのコード例を示します。

```python
import openai
import os

# APIキーの設定
openai.api_key = os.environ.get("OPENAI_API_KEY")

# データファイルのアップロード
def upload_file(file_name: str, purpose: str) -> str:
    with open(file_name, "rb") as file_fd:
        response = openai.File.create(file=file_fd, purpose=purpose)
    return response.id

training_file_id = upload_file("training_data.jsonl", "fine-tune")

# ファインチューニングジョブの作成
response = openai.FineTuningJob.create(
    training_file=training_file_id,
    model="gpt-4o-mini-2024-07-18",
    suffix="custom-model-name"
)

job_id = response.id
print(f"ファインチューニングジョブID: {job_id}")

# ジョブの進行状況の確認
def check_job_status(job_id):
    job = openai.FineTuningJob.retrieve(job_id)
    print(f"ステータス: {job.status}")
    if job.status == "succeeded":
        print(f"ファインチューニング済みモデル: {job.fine_tuned_model}")
    elif job.status == "failed":
        print(f"ジョブ失敗。エラー: {job.error}")

# 定期的に状態をチェック
import time
while True:
    check_job_status(job_id)
    time.sleep(60)  # 60秒ごとにチェック
```


#### OpenAIのグラフィカルインターフェース（GUI）を使用したファインチューニング

OpenAIは、ファインチューニングを簡単に行えるGUIも提供しています。

**手順1：OpenAIのダッシュボードにログイン**

OpenAIのダッシュボード（https://platform.openai.com/account/api-keys）にログインします。

**手順2：Fine-tuningページへ移動**

左側のメニューから「Fine-tuning」を選択します。

**手順3：新しいファインチューニングジョブを作成**

「Create」ボタンをクリックして、新しいファインチューニングジョブを作成します。

**手順4：ベースモデルとデータを選択**

「Base model」ドロップダウンから「gpt-4o-mini-2024-07-18」を選択します。訓練データとバリデーションデータのJSONLファイルをアップロードします。


**手順5：ハイパーパラメータを調整（任意）**

必要に応じてハイパーパラメータを調整します。

**手順6：ファインチューニングジョブを開始**

「Create」ボタンをクリックして、ファインチューニングジョブを開始します。

最終的には､以下の画像のような状態となります｡
![](https://storage.googleapis.com/zenn-user-upload/fcb4ccf57268-20240816.png)

GUIを使用する利点は、直感的な操作が可能で、ファインチューニングの進行状況やメトリクスを視覚的に確認できることです。一方で、プログラムを使用する方法は、自動化や大規模なファインチューニングタスクの管理に適しています。

### 4. 進行状況を確認：AIの成長を見守ろう！

GUIまたはAPIを使用して、ファインチューニングの進捗状況を以下のようにモニタリングできます。

![](https://storage.googleapis.com/zenn-user-upload/afbe81667870-20240816.png)
![](https://storage.googleapis.com/zenn-user-upload/4ed1d287cb6b-20240816.png)

APIを使用する場合は、以下のようなコードで確認できます。

```python
response = openai.FineTuningJob.retrieve(job_id)
print(f"ステータス: {response.status}")
print(f"学習済みトークン数: {response.trained_tokens}")

# イベントの確認
events = openai.FineTuningJob.list_events(id=job_id, limit=10)
for event in events.data:
    print(f"{event.created_at}: {event.message}")
```

### 5. ファインチューニング済みモデルを使用：ついに完成！

ファインチューニングが完了したら、早速テストしてみましょう！

```python
fine_tuned_model = "ft:gpt-4o-mini-2024-07-18:your-org:custom-model-name:unique-id"

response = openai.ChatCompletion.create(
  model=fine_tuned_model,
  messages=[
    {"role": "system", "content": "あなたは特定のドメインの専門家です。"},
    {"role": "user", "content": "ドメイン固有の質問をここに入力"}
  ]
)

print(response.choices[0].message.content)
```

OpenAIのPlaygroundでは､ファインチューニング前後のモデルを比較できるUIが備わっており､ファインチューニング前後での結果を簡易的に試すことが可能です｡以下は一例として､Azure OpenAIの最新情報を元にファインチューニングしたモデルでの結果となります｡

https://learn.microsoft.com/en-us/azure/ai-services/openai/whats-new

![](https://storage.googleapis.com/zenn-user-upload/ce218d2783af-20240816.png)

ちゃんと､以下の情報を学習している模様です｡
![](https://storage.googleapis.com/zenn-user-upload/60d1de27b0a9-20240816.png)

個人的な所感としては、GPT-4o miniのファインチューニング手法は、パラメータ効率の良いLoRA（Low-Rank Adaptation）のような技術が使用されているのではないかと推測しています。GPT-4o miniは高い性能を持ちつつも、比較的小さなモデルサイズを実現していると考えられるため、ファインチューニングの効果が顕著に表れる可能性があります。このことから、GPT-4o miniは様々な用途に柔軟に適応できる可能性が高く、ビジネスにおける活用の幅が広いのではないかと考えています。

## ファインチューニングの最適化とベストプラクティス：AIをさらにパワーアップ！

ファインチューニングの効果を最大化するために、以下のベストプラクティスを考慮してください。

* **データ品質の重視:** 量よりも質を重視し、正確で代表的なデータを用意しましょう。
* **データの多様性:** さまざまなケースや表現を含む、バランスの取れたデータセットを準備しましょう。
* **システムメッセージの活用:** 各トレーニング例にシステムメッセージを含め、モデルの役割や振る舞いを明確に指定しましょう。
* **段階的なアプローチ:** 小規模なデータセットから始め、結果を評価しながら徐々にスケールアップしましょう。
* **ハイパーパラメータの調整:** エポック数や学習率などのハイパーパラメータを適切に設定しましょう。
* **定期的な評価:** ファインチューニングされたモデルの性能を定期的に評価し、必要に応じて再トレーニングを行いましょう。

**ハイパーパラメータの調整**

OpenAIは以下のハイパーパラメータの調整を許可しています。

* エポック数: 訓練データを何回繰り返して学習させるか
* 学習率乗数: 学習率を調整することで、モデルの学習速度を制御
* バッチサイズ: 一度に学習させるデータの量

これらのパラメータは、以下のように設定できます。

```python
openai.FineTuningJob.create(
  training_file="file-abc123", 
  model="gpt-4o-mini-2024-07-18", 
  hyperparameters={
    "n_epochs": 2,
    "learning_rate_multiplier": 0.1,
    "batch_size": 4
  }
)
```

一般的に、以下のような調整が効果的です。

* モデルが期待通りにトレーニングデータに従わない場合、エポック数を1〜2増やす
* モデルの多様性が期待よりも低い場合、エポック数を1〜2減らす
* モデルが収束しない場合、学習率乗数を増やす

## 応用例：GPT-4o miniがビジネスにもたらす革新

GPT-4o miniのファインチューニングは、様々なビジネスシーンで活躍します。

1. **顧客対応の自動化**: 24時間365日、顧客からの問い合わせに迅速かつ的確に対応し、顧客満足度向上と業務効率化を両立。
    **例:** 顧客からのよくある質問に自動で回答するチャットボットを開発することで、コールセンターの負担を軽減し、顧客の待ち時間を短縮できます。

2. **社内文書の効率的な要約**: 長時間かかる資料読み込みをAIがサポートし、重要な情報に素早くアクセスして意思決定を加速。
    **例:** 膨大な量の議事録やレポートを要約することで、担当者の情報収集にかかる時間を大幅に削減できます。

3. **専門分野の文書分類**: 専門的な文書を自動的に分類し、適切なカテゴリーやタグを割り当てることで、情報管理を効率化。
    **例:** 法律文書や医療記録を自動分類することで、大量の文書を効率的に整理し、必要な情報へのアクセスを迅速化できます。

4. **法的文書レビューの効率化**: 契約書などの法的文書のレビュープロセスを自動化し、精度とスピードを向上。
    **例:** 契約書に含まれる特定の条項やリスクを自動的に検出したり、過去の判例に基づいて修正案を提案したりすることで、法務担当者の負担を軽減し、レビューの質を向上させることができます。

## 安全性と倫理：責任あるAI活用に向けて

GPT-4o miniは、安全性と倫理にも配慮した設計となっています。

- **コンテンツフィルタリング**: 不適切なコンテンツの生成を抑制。
- **人間のフィードバックによる強化学習（RLHF）**: 倫理的な問題を最小限に抑えるための対策。
- **指示階層法**: 悪意のあるユーザーからの操作を防ぐためのセキュリティ対策。

ファインチューニングを行う際には、以下の点に注意しましょう。

1. **個人情報や機密情報の保護**: データセットに個人情報や機密情報を含まないように注意。
2. **バイアスや偏見の排除**: 多様性のあるデータセットを作成し、公平性を確保。
3. **出力結果の定期的な監査**: 倫理的な問題がないか、定期的に確認。

## 価格と可用性：効率的な価格でAIを導入

OpenAI社が提供するGPT-4o miniの価格は、非常に競争力があります：

- 入力トークンあたり$0.150/1Mトークン
- 出力トークンあたり$0.600/1Mトークン

さらに、OpenAIは2024年9月23日までGPT-4o miniのファインチューニングを無料で提供しています。この期間中、各組織は24時間ごとに200万トークンまで無料で使用でき、超過分は100万トークンあたり$3.00で課金されます。

この機会に、ぜひOpenAI社のGPT-4o miniファインチューニングをお試しください。

## Azure OpenAIでGPT-4o miniをファインチューニング：エンタープライズレベルのAI構築

Azure OpenAIは、エンタープライズレベルのセキュリティと信頼性を備えたプラットフォームであり、2024年7月より、GPT-4o miniのファインチューニングがパブリックプレビューとして利用可能になりました。この新機能により、企業はAzureの堅牢なインフラストラクチャを活用しつつ、GPT-4o miniの高度な機能をカスタマイズできるようになりました。

ちょうど1ヶ月前ほどに以下の記事を書いたのですが､アップデートがほんとに爆速ですね･･･

https://zenn.dev/chips0711/articles/9fa88f17fe6c25


### 利用可能性と地域

GPT-4o miniは現在(2024年8月16日時点)では、以下のRegionでデプロイ可能です：

- 標準およびグローバル標準デプロイメント：East USおよびSweden Central
- グローバルバッチデプロイメント：East US、Sweden Central、West US
- ファインチューニング（パブリックプレビュー）：North Central USおよびSweden Central

### モデルの仕様

GPT-4o mini（2024-07-18バージョン）は以下の仕様を持っています：

- 入力トークン数上限：128,000
- 出力トークン数上限：16,384
- トレーニング例のコンテキスト長：64,536
- 知識のカットオフ日：2023年10月

### Azure OpenAIでのファインチューニング手順

1. **Azure OpenAI Studioにアクセス**：
   Azure portalからAzure OpenAI Studioにアクセスします。

2. **ファインチューニングジョブを作成**：
   左側のメニューから「Fine-tuning」を選択し、「Create fine-tuning job」をクリックします。

3. **ジョブの詳細を設定**：
   - Job name：ジョブの名前を指定します。
   - Base model：ファインチューニングのベースとなるモデルとして、「gpt-4o-mini」を選択します。
   - Training data：事前に用意したJSONL形式の訓練データをアップロードします。
   - Validation data (optional)：検証データがある場合は、アップロードします。
   - Hyperparameters (optional)：必要に応じて、エポック数、学習率乗数、バッチサイズなどのハイパーパラメータを調整します。

4. **ジョブを開始**：
   「Create」ボタンをクリックして、ファインチューニングジョブを開始します。

5. **進行状況を確認**：
   ジョブの進行状況は、Azure OpenAI Studioの「Fine-tuning」ページで確認できます。

6. **ファインチューニング済みモデルをデプロイ**：
   ファインチューニングが完了したら、ファインチューニング済みモデルをデプロイして、API経由で利用できるようになります。

### 安全性評価とResponsible AI

Azureは、GPT-4およびGPT-4o miniのファインチューニングに関して、追加の安全性評価ステップを実装しているとのことです。詳細は以下の公式ドキュメントの通りです。

https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/fine-tuning?tabs=turbo%2Cpython-new&pivots=programming-language-python#safety-evaluation-gpt-4-fine-tuning---public-preview

> Safety evaluation GPT-4 fine-tuning - public preview
> 
> GPT-4 and GPT-4o-mini are our most advanced models that can be fine-tuned to your needs. As with Azure OpenAI models generally, the advanced capabilities of fine-tuned models come with increased responsible AI challenges related to harmful content, manipulation, human-like behavior, privacy issues, and more. Learn more about risks, capabilities, and limitations in the Overview of Responsible AI practices and Transparency Note. To help mitigate the risks associated with GPT-4 and GPT-4o-mini fine-tuned models, we have implemented additional evaluation steps to help detect and prevent harmful content in the training and outputs of fine-tuned models. These steps are grounded in the Microsoft Responsible AI Standard and Azure OpenAI Service content filtering.
> 
> Evaluations are conducted in dedicated, customer specific, private workspaces;
> Evaluation endpoints are in the same geography as the Azure OpenAI resource;
> Training data is not stored in connection with performing evaluations; only the final model assessment (deployable or not deployable) is persisted; and
> GPT-4 and GPT-4o-mini fine-tuned model evaluation filters are set to predefined thresholds and cannot be modified by customers; they aren't tied to any custom content filtering configuration you may have created.

以下に上記内容の要約を示します。

#### GPT-4やGPT-4o miniのファインチューニングの主な課題と対策

- **リスク**: 有害なコンテンツ、操作、人間のような振る舞い、プライバシーの問題など
- **対策**: Microsoft Responsible AI StandardとAzure OpenAI Serviceのコンテンツフィルタリングに基づく評価ステップの実装

#### 安全性評価の特徴

1. **専用ワークスペース**: 評価は顧客専用のプライベートワークスペースで実施されます。
2. **地理的一貫性**: 評価エンドポイントはAzure OpenAIリソースと同じ地理的位置にあります。
3. **データ保護**: トレーニングデータは評価実行に関連して保存されません。最終的なモデル評価結果（デプロイ可能かどうか）のみが保持されます。
4. **固定フィルター設定**: 評価フィルターは事前定義された閾値に設定されており、顧客による変更はできません。これらは、カスタムコンテンツフィルタリング設定とは独立しています。

これらの措置により、企業はGPT-4o miniの高度な機能を活用しつつ、責任あるAI利用を実現できます。ファインチューニングを検討する際は、Azure OpenAIサービスの最新のドキュメントを参照し、リスク、機能、制限についての詳細な情報を確認することをお勧めします。

### Azure OpenAIを使用するメリット

1. **エンタープライズレベルのセキュリティ**：Azureの堅牢なセキュリティ基盤により、安心してAIモデルを運用できます。
2. **大規模なデータセットの処理**：Azureの強力な計算リソースを活用することで、大規模なデータセットを用いたファインチューニングが可能になります。
3. **既存システムとの連携**：Azureの豊富なサービスと連携することで、AIモデルを既存のビジネスシステムにスムーズに統合できます。
4. **地理的な柔軟性**：複数の地域でのデプロイメントオプションにより、データのローカライゼーションやレイテンシ要件に対応できます。

ファインチューニングを検討する際は、Azure OpenAIサービスの最新のドキュメントを参照し、現在の利用可能性と安全性ガイダンスを確認することをお勧めします。

## 結論：GPT-4o miniでAIの未来を創造しよう！

GPT-4o miniは、その驚異的な性能と低コストで、AI活用の可能性を大きく広げます。ファインチューニングを活用することで、あなたのビジネスに最適化されたAIを手に入れることができます。

**未来を先取りし、GPT-4o miniの力でビジネスを進化させましょう！**


## 参考資料

1. [OpenAI API ドキュメント](https://platform.openai.com/docs/)
2. [OpenAI Fine-tuning ガイド](https://platform.openai.com/docs/guides/fine-tuning)
3. [GPT-4o mini 発表ブログ](https://openai.com/index/gpt-4o-mini-advancing-cost-efficient-intelligence/)
4. [Microsoft Azure OpenAI 最新情報](https://learn.microsoft.com/en-us/azure/ai-services/openai/whats-new)
5. [Azure OpenAIでのファインチューニング方法](https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/fine-tuning?tabs=turbo%2Cpython-new&pivots=programming-language-ai-studio)

**【免責事項】**
本記事の情報は執筆時点（2024年8月16日）のものです。本記事は、公開されている情報に基づいて作成されていますが、誤りが含まれている可能性もあります。内容の正確性については、読者ご自身の責任で判断をお願いいたします。AI技術は急速に進化しており、製品の仕様、価格、可用性などが予告なく変更される可能性があります。最新かつ正確な情報については、常にOpenAIの公式ドキュメントおよび関連するサービスプロバイダーの最新情報をご確認ください。また、本記事の内容は一般的な情報提供を目的としており、専門的なアドバイスとしては意図していません。具体的な導入や利用に関しては、適切な専門家にご相談ください。

[^1]:[Artificial Analysis](https://artificialanalysis.ai/providers/openai)