> For the complete documentation index, see [llms.txt](https://unsloth.ai/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://unsloth.ai/docs/jp/meru/fine-tuning-llms-guide/datasets-guide.md).

# データセットガイド

## データセットとは？

LLMにとって、データセットとはモデルの訓練に使えるデータの集まりです。学習に役立てるには、テキストデータはトークナイズできる形式である必要があります。また、あなたはどのように [Unsloth内でデータセットを使うか](#applying-chat-templates-with-unsloth).

データセットを作成するうえで重要な要素の1つは、あなたの [チャットテンプレート](/docs/jp/ji-ben/chat-templates.md) と、それをどのように設計するかです。トークナイゼーションも重要です。なぜなら、テキストをトークンに分割するからです。トークンは単語、サブワード、文字などであり、LLMが効果的に処理できるようになります。これらのトークンはその後埋め込み（embeddings）に変換され、モデルが意味や文脈を理解するのを助けるよう調整されます。

### データ形式

トークナイズのプロセスを可能にするために、データセットはトークナイザーで読み取れる形式である必要があります。

<table data-full-width="false"><thead><tr><th>形式</th><th>説明</th><th>学習タイプ</th></tr></thead><tbody><tr><td>生コーパス</td><td>ウェブサイト、本、記事などのソースから得られた生のテキスト。</td><td>継続事前学習（CPT）</td></tr><tr><td>Instruct</td><td>モデルに従わせたい指示と、目指す出力の例。</td><td>教師ありファインチューニング（SFT）</td></tr><tr><td>会話</td><td>ユーザーとAIアシスタントの複数ターンの会話。</td><td>教師ありファインチューニング（SFT）</td></tr><tr><td>RLHF</td><td>ユーザーとAIアシスタントの会話で、アシスタントの応答がスクリプト、別のモデル、または人間の評価者によって順位付けされます。</td><td>強化学習（RL）</td></tr></tbody></table>

{% hint style="info" %}
これらの各タイプには、異なる形式のスタイルが存在することに注意する価値があります。
{% endhint %}

## はじめに

データを整形する前に、次の点を特定しておきたいです。

{% stepper %}
{% step %} <mark style="color:緑;">データセットの目的</mark>

データセットの目的を知ることで、どのデータが必要か、どの形式を使うべきかを判断しやすくなります。

目的としては、要約のような新しいタスクに合わせてモデルを適応させることや、特定のキャラクターになりきる能力を高めることなどがあります。例えば：

* チャットベースの対話（Q\&A、新しい言語の学習、カスタマーサポート、会話）。
* 構造化タスク（[分類](https://colab.research.google.com/github/timothelaborie/text_classification_scripts/blob/main/unsloth_classification.ipynb)、要約、生成タスク）。
* ドメイン特化データ（医療、金融、技術）。
  {% endstep %}

{% step %} <mark style="color:緑;">出力のスタイル</mark>

出力のスタイルによって、望む出力を実現するためにどのデータソースを使うべきかが分かります。

例えば、目指す出力の種類はJSON、HTML、テキスト、コードなどかもしれません。あるいはスペイン語、英語、ドイツ語などにしたいのかもしれません。
{% endstep %}

{% step %} <mark style="color:緑;">データソース</mark>

必要なデータの目的とスタイルが分かったら、データの品質と [量](#how-big-should-my-dataset-be) を分析する必要があります。Hugging Face と Wikipedia はデータセットの優れたソースであり、特に言語を学習するモデルを訓練したい場合は Wikipedia が有用です。

データのソースはCSVファイル、PDF、あるいはウェブサイトでも構いません。また [合成生成する](#synthetic-data-generation) こともできますが、各例が高品質で関連性があることを নিশ্চিতするために、より慎重な対応が必要です。
{% endstep %}
{% endstepper %}

{% hint style="success" %}
より良いデータセットを作る最善の方法の1つは、ShareGPTのようなHugging Faceのより汎用的なデータセットと組み合わせて、モデルをより賢く、多様にすることです。さらに [合成生成されたデータ](#synthetic-data-generation).
{% endhint %}

## 🦥 Unsloth データレシピ

[Unsloth Data Recipes](/docs/jp/shii/studio/data-recipe.md) は、PDF や CSV ファイルなどの文書をアップロードし、使用可能なデータセットに変換できます。グラフノードのワークフローを通じて、データセットを視覚的に作成・編集します。

レシピページは主な प्रवेश点です。レシピはブラウザ内にローカル保存されるため、保存した作業に後で戻れます。ここから、空のレシピを作成するか、ガイド付き学習レシピを開けます。

<div data-with-frame="true"><figure><img src="/files/32c0d7501026a7267427f20ae93d1a1d8e08aced" alt=""><figcaption></figcaption></figure></div>

Data Recipes も同じ基本的な流れです。レシピページを開き、レシピを作成または選択し、エディタでワークフローを作成し、検証してプレビューを実行し、出力が正しければフルデータセットを実行します。シードデータと生成ブロックを追加し、ワークフローを検証し、サンプル出力をプレビューしてから、フルデータセットの構築を実行します。

一見すると、通常のワークフローは次のようになります:

1. レシピページを開きます。
2. 新しいレシピを作成するか、既存のものを開きます。
3. ブロックを追加して、データセットのワークフローを定義します。
4. クリック **検証** して、設定の問題を早めに見つけます。
5. プレビューを実行して、サンプル行をすばやく確認します。
6. レシピの準備ができたら、フルデータセットのビルドを実行します。
7. 進捗と出力をグラフ上または **実行** ビューで詳細を確認します。
8. Unslothで結果のデータセットを選択し、モデルをファインチューニングします。詳細はこちら：

{% content-ref url="/pages/1efc27ff794b527bf40ca1399ab10a6c28cc4b61" %}
[Data Recipes](/docs/jp/shii/studio/data-recipe.md)
{% endcontent-ref %}

## データの整形

関連する条件を特定し、必要なデータを収集したら、そのデータを学習可能な機械可読形式に整形できます。

### LLM学習でよく使われるデータ形式

損失なしの [**継続事前学習**](/docs/jp/ji-ben/continued-pretraining.md)では、特定の構造を持たない生テキスト形式を使います：

```json
  "text": "カルボナーラはローマの伝統的なパスタ料理です。ソースは、生卵にすりおろしたペコリーノ・ロマーノチーズと黒コショウを混ぜて作ります。その後、熱いパスタをカリカリにしたグアンチャーレ（豚の頬肉の塩漬け）と卵の混合物に和え、残った熱でクリーミーなソースを作ります。一般に信じられていることに反して、本場のカルボナーラにクリームやニンニクは入りません。この料理は20世紀半ばのローマで生まれた可能性が高いですが、正確な起源については議論があります..."
```

この形式は自然な言語の流れを保ち、モデルが連続したテキストから学習できるようにします。

モデルを新しいタスクに適応させ、特定の一連の指示に基づいて1ターンでテキストを出力させたい場合は、 **Instruction** 形式を [Alpacaスタイルで](https://docs.unsloth.ai/basics/tutorial-how-to-finetune-llama-3-and-use-in-ollama#id-6.-alpaca-dataset)

```json
"Instruction": "モデルに実行させたいタスク。"

"Input": "任意ですが有用で、本質的にはユーザーのクエリになります。"

"Output": "タスクの期待される結果と、モデルの出力。"
```

複数ターンの会話を行いたい場合は、ShareGPT形式を使えます：

```json
{
  "conversations": [
    {
      "from": "human",
      "value": "カルボナーラの作り方を手伝ってくれますか？"
    },
    {
      "from": "gpt",
      "value": "伝統的なローマ式レシピがよいですか、それとも簡単な版がよいですか？"
    },
    {
      "from": "human",
      "value": "伝統的な版でお願いします"
    },
    {
      "from": "gpt",
      "value": "本場のローマ風カルボナーラは、パスタ、グアンチャーレ、卵、ペコリーノ・ロマーノ、黒コショウのわずか数種類の材料だけで作られます。詳しいレシピはいかがですか？"
    }
  ]
}
```

テンプレート形式では "from"/"value" 属性キーを使い、メッセージは `human`と `gpt`の間で交互になります。これにより自然な対話の流れが可能になります。

もう1つの一般的な形式はOpenAIのChatML形式で、Hugging Face のデフォルトでもあります。おそらく最も使われている形式で、 `user` と `assistant`

```
{
  "messages": [
    {
      "role": "user",
      "content": "1+1は？"
    },
    {
      "role": "assistant",
      "content": "2です！"
    },
  ]
}
```

### UnslothでChatテンプレートを適用する

通常のChatML形式に従うデータセットでは、学習やファインチューニングのためにデータセットを準備するプロセスは、次の4つの簡単なステップで構成されます：

* Unslothが現在サポートしているChatテンプレートを確認してください：\\

  ```
  from unsloth.chat_templates import CHAT_TEMPLATES
  print(list(CHAT_TEMPLATES.keys()))
  ```

  \
  これにより、Unslothで現在サポートされているテンプレートの一覧が表示されます。以下は出力例です：\\

  ```
  ['unsloth', 'zephyr', 'chatml', 'mistral', 'llama', 'vicuna', 'vicuna_old', 'vicuna old', 'alpaca', 'gemma', 'gemma_chatml', 'gemma2', 'gemma2_chatml', 'llama-3', 'llama3', 'phi-3', 'phi-35', 'phi-3.5', 'llama-3.1', 'llama-31', 'llama-3.2', 'llama-3.3', 'llama-32', 'llama-33', 'qwen-2.5', 'qwen-25', 'qwen25', 'qwen2.5', 'phi-4', 'gemma-3', 'gemma3']
  ```

  \\
* 使用 `get_chat_template` トークナイザーに正しいChatテンプレートを適用するには：\\

  ```
  from unsloth.chat_templates import get_chat_template

  tokenizer = get_chat_template(
      tokenizer,
      chat_template = "gemma-3", # これを正しい chat_template 名に変更してください
  )
  ```

  \\
* フォーマット関数を定義します。以下は例です：\\

  ```
  def formatting_prompts_func(examples):
     convos = examples["conversations"]
     texts = [tokenizer.apply_chat_template(convo, tokenize = False, add_generation_prompt = False) for convo in convos]
     return { "text" : texts, }
  ```

  \
  \
  この関数はデータセット全体をループし、定義したChatテンプレートを各サンプルに適用します。\\
* 最後に、データセットを読み込み、必要な変更を適用しましょう： \\

  ```
  # データセットをインポートして読み込む
  from datasets import load_dataset
  dataset = load_dataset("repo_name/dataset_name", split = "train")

  # mapメソッドを使ってデータセットにフォーマット関数を適用する
  dataset = dataset.map(formatting_prompts_func, batched = True,)
  ```

  \
  データセットがChatMLの "role"/"content" 形式ではなく、ShareGPTの "from"/"value" キーを使っている場合は、 `standardize_sharegpt` 関数を使って最初に変換できます。修正版のコードは次のようになります：\
  \\

  ```
  # データセットをインポート
  from datasets import load_dataset
  dataset = load_dataset("mlabonne/FineTome-100k", split = "train")

  # 必要に応じてデータセットを "role"/"content" 形式に変換する
  from unsloth.chat_templates import standardize_sharegpt
  dataset = standardize_sharegpt(dataset)

  # mapメソッドを使ってデータセットにフォーマット関数を適用する
  dataset = dataset.map(formatting_prompts_func, batched = True,)
  ```

### データ整形のQ\&A

<mark style="color:緑;">**Q:**</mark> Alpacaのinstruct形式はどう使えばいいですか？

<mark style="color:緑;">**A:**</mark> データセットがすでにAlpaca形式で整形されている場合は、Llama3.1で示したように整形手順に従ってください [ノートブック ](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_\(8B\)-Alpaca.ipynb#scrollTo=LjY75GoYUCB8)。データをAlpaca形式に変換する必要がある場合は、生データを処理するPythonスクリプトを作成する方法があります。要約タスクに取り組んでいるなら、ローカルLLMを使って各例の指示と出力を生成できます。

<mark style="color:緑;">**Q:**</mark> standardize\_sharegptメソッドは常に使うべきですか？

<mark style="color:緑;">**A:**</mark> targetのデータセットがsharegpt形式で、モデルが代わりにChatML形式を期待している場合にのみ、standardize\_sharegptメソッドを使ってください。

\ <mark style="color:緑;">**Q:**</mark> トークナイザーに付属のapply\_chat\_template関数を使わないのはなぜですか。

<mark style="color:緑;">**A:**</mark> この `chat_template` モデルが最初に元のモデル作成者によってアップロードされたときの属性には、誤りが含まれていることがあり、更新に時間がかかる場合があります。一方、Unslothでは、 `chat_template` 量子化バージョンをリポジトリにアップロードする際、各モデルの `get_chat_template` と `apply_chat_template` メソッドを徹底的に確認し、必要な修正を行っています。また、私たちのメソッドは高度なデータ操作機能を提供しており、Chat Templatesのドキュメントに完全に記載されています [ページ](https://docs.unsloth.ai/basics/chat-templates).

<mark style="color:緑;">**Q:**</mark> Unslothが今のところサポートしていないテンプレートだったらどうすればいいですか？

<mark style="color:緑;">**A:**</mark> unslothのGitHub issueフォーラムに機能要望を投稿してください [フォーラム](https://github.com/unslothai/unsloth)。一時的な回避策として、機能要望が承認されて統合されるまで、トークナイザー本来のapply\_chat\_template関数を使うこともできます。

## 合成データ生成

Llama 3.3 (70B) のようなローカルLLMや OpenAI の GPT 4.5 を使って合成データを生成することもできます。一般的には、最高品質の出力を確保するために Llama 3.3 (70B) のようなより大きなモデルを使う方がよいです。vLLM、Ollama、llama.cpp のような推論エンジンを直接使って合成データを生成することもできますが、それを収集し、さらに多くのデータを促すための手作業が必要になります。合成データには3つの目的があります：

* まったく新しいデータを作る - ゼロから、または既存のデータセットから
* データセットを多様化して、モデルが [過学習](/docs/jp/meru/fine-tuning-llms-guide/lora-hyperparameters-guide.md#avoiding-overfitting-and-underfitting) しすぎて、特定化されすぎないようにする
* 既存データの拡張 例：データセットを自動的に選んだ正しい形式に構造化する

### 合成データにUnslothを使う

Unsloth Studioの [データレシピ](/docs/jp/shii/studio/data-recipe.md) に、構造化されていないデータや構造化データを簡単にアップロードでき、 [自動的に使える / 合成データセットに変換してくれます。詳細は](/docs/jp/shii/studio/data-recipe.md).

<div data-with-frame="true"><figure><img src="/files/1e242ab6bcf04c0b9f709e28e6dc6e17fca1b887" alt="" width="563"><figcaption></figcaption></figure></div>

### ローカルLLMまたはChatGPTを合成データに使う

目的は、指定した形式のQAデータをモデルに生成・処理させるようプロンプトを与えることです。モデルは、与えられた構造と文脈を学習する必要があるため、少なくとも10個の既存のデータ例を用意してください。プロンプト例：

* **既存データセットに対してさらに対話を生成するプロンプト**:

  <pre data-overflow="wrap"><code><strong>私が提供したデータセットの例を使って、構造に従い、例に基づいた会話を生成してください。
  </strong></code></pre>
* **データセットがない場合のプロンプト**:

  {% code overflow="wrap" %}

  ```
  Coca-Cola の商品レビューを10件作成し、ポジティブ、ネガティブ、ニュートラルのいずれかに分類してください。
  ```

  {% endcode %}
* **整形されていないデータセット向けのプロンプト**:

  {% code overflow="wrap" %}

  ```
  ファインチューニング用に、私のデータセットをQAのChatML形式になるように構造化してください。その後、同じトピックと形式で合成データの例を5件生成してください。
  ```

  {% endcode %}

生成されたデータの品質を確認し、無関係または品質の低い応答を削除または改善することを推奨します。データセットによっては、モデルが過学習しないよう、多くの面でバランスを取る必要がある場合もあります。その後、このクリーンなデータセットをLLMに戻してさらにデータを再生成し、今度はより多くの指示を与えることができます。

## データセットFAQ + ヒント

### データセットはどれくらいの大きさが必要ですか？

一般的には、妥当な結果を得るために、ファインチューニング用として少なくとも100行のデータを最低限使うことを推奨します。最適な性能を目指すなら、1,000行を超えるデータセットが望ましく、この場合、より多くのデータが通常より良い結果につながります。データセットが小さすぎる場合は、合成データを追加したり、Hugging Face のデータセットを追加して多様化することもできます。ただし、ファインチューニングしたモデルの有効性はデータセットの品質に大きく依存するため、データを十分にクリーンアップし、準備してください。

### 推論モデルをファインチューニングしたい場合、データセットはどのように構成すればよいですか？

DeepSeek-R1 の蒸留版（例：DeepSeek-R1-Distill-Llama-8B）のように、すでに推論能力を持つモデルをファインチューニングしたい場合でも、質問/タスクと回答のペアに従う必要があります。ただし、回答には推論/チェーン・オブ・ソートのプロセスと、答えを導くために踏んだ手順を含めるように変更する必要があります。\
\
推論能力を持たないモデルに推論能力を後から持たせるよう訓練したい場合は、標準的なデータセットを使いますが、今度は回答に推論を含めません。この学習プロセスは [強化学習とGRPO](/docs/jp/meru/reinforcement-learning-rl-guide.md).

### 複数のデータセット

ファインチューニング用のデータセットが複数ある場合、次のいずれかができます：

* すべてのデータセットの形式を標準化し、1つのデータセットに統合して、この統合データセットでファインチューニングする。
* を使ってください [複数データセット](https://colab.research.google.com/drive/1njCCbE1YVal9xC83hjdo2hiGItpY_D6t?usp=sharing) ノートブックを使って複数のデータセットを直接ファインチューニングする。

### 同じモデルを複数回ファインチューニングできますか？

すでにファインチューニング済みのモデルを何度もファインチューニングすることはできますが、代わりにすべてのデータセットを統合して、1回のプロセスでファインチューニングする方が最善です。すでにファインチューニングされたモデルを再学習すると、前回のファインチューニングで得られた品質や知識が変化する可能性があります。

## Unslothでデータセットを使う

### Alpacaデータセット

Google ColabでUnsloth内のAlpacaデータセットを使う例をご覧ください：

<figure><img src="/files/0492d42993631eec9d2ee1a7bd4ced17bbbaded5" alt=""><figcaption></figcaption></figure>

これから使うのは、GPT-4自身を呼び出して作成されたAlpacaデータセットです。これは52,000件の指示と出力のリストで、Llama-1のリリース時に非常に人気がありました。なぜなら、ベースLLMのファインチューニングをChatGPT自身に匹敵するものにしたからです。

AlpacaデータセットのGPT4版にアクセスできます [こちら](https://huggingface.co/datasets/vicgalle/alpaca-gpt4.)。以下にデータセットの例をいくつか示します：

<figure><img src="/files/c0c028d5062e7eb3773189dce9dbfc29f61cbc8d" alt=""><figcaption></figcaption></figure>

各行に3つの列、つまりinstruction、input、outputがあることが分かります。実際には、各行を次のような1つの大きなプロンプトにまとめます。その後、これを使って言語モデルをファインチューニングし、ChatGPTに非常によく似たものにしました。このプロセスを **教師あり指示ファインチューニング**.

<figure><img src="/files/be8a75e47462bee85bee1259e5df5bd499b4542e" alt=""><figcaption></figcaption></figure>

### ファインチューニングのための複数カラム

しかし大きな問題は、ChatGPT風のアシスタントでは1つのinstruction / 1つのpromptしか許可されず、複数のカラム / 入力は使えないことです。例えばChatGPTでは、複数のプロンプトではなく1つのプロンプトを送信しなければなりません。

<figure><img src="/files/137e75def851ac465b7e74ac3b96c30e6aa3b53f" alt=""><figcaption></figcaption></figure>

つまり、ファインチューニングを実際に機能させるには、複数のカラムを1つの大きなプロンプトに「結合」する必要があるということです！

例えば、有名なタイタニックのデータセットには非常に多くのカラムがあります。あなたの仕事は、年齢、客室クラス、運賃などに基づいて乗客が生存したか死亡したかを予測することでした。これをそのままChatGPTに渡すことはできず、これらの情報を1つの大きなプロンプトに「結合」しなければなりません。

<figure><img src="/files/8f47f35cdf8d1f462b31a2248dd1f0c9c5400095" alt=""><figcaption></figcaption></figure>

例えば、乗客に関するすべての情報を含む「結合済み」の単一プロンプトでChatGPTに尋ねれば、その乗客が死亡したか生存したかを推測・予測させることができます。

<figure><img src="/files/dbc237c05d1eb881c5b29bc6572b4513cb35e0da" alt=""><figcaption></figcaption></figure>

他のファインチューニングライブラリでは、すべてのカラムを1つのプロンプトに結合して、ファインチューニング用にデータセットを手動で準備する必要があります。Unslothでは、次の関数を提供するだけです `to_sharegpt` これ1つで実現できます！

<figure><img src="/files/ea5638a2a5d3f0d8bb26dcc61ef05869367fca95" alt=""><figcaption></figcaption></figure>

ここでは少し複雑になります。かなり柔軟にカスタマイズできるからですが、いくつかポイントがあります：

* すべてのカラムを波括弧で囲む必要があります `{}`。これらは実際のCSV / Excelファイル内のカラム名です。
* 任意のテキスト要素は `[[]]`で囲む必要があります。例えば「input」カラムが空なら、結合関数はそのテキストを表示せず、これをスキップします。これは欠損値のあるデータセットに便利です。
* 出力またはターゲット / 予測カラムを `output_column_name`で選択します。Alpacaデータセットでは、これは `output`.

例えばタイタニックのデータセットでは、下のような大きな結合プロンプト形式を作成でき、各カラム / テキストの一部は任意になります。

<figure><img src="/files/7893ddfca1b71ac2b74077096f18e345bd91e11b" alt=""><figcaption></figcaption></figure>

例えば、データセットが次のように多くの欠損を含んでいるとします：

| 乗船港 | 年齢 | 運賃   |
| --- | -- | ---- |
| S   | 23 |      |
|     | 18 | 7.25 |

すると、結果が次のようになるのは望ましくありません：

1. 乗客はSから乗船しました。年齢は23歳です。運賃は **EMPTY**.
2. 乗客は **EMPTY**から乗船しました。年齢は18歳です。運賃は7.25ドルです。

その代わりに、次のようにカラムを任意で囲むことで `[[]]`、この情報を完全に除外できます。

1. \[\[乗客はSから乗船しました。]] \[\[年齢は23歳です。]] \[\[運賃は **EMPTY**.]]
2. \[\[乗客は **EMPTY**から乗船しました。]] \[\[年齢は18歳です。]] \[\[運賃は7.25ドルです。]]

は次のようになります：

1. 乗客はSから乗船しました。年齢は23歳です。
2. 年齢は18歳です。運賃は7.25ドルです。

### 複数ターンの会話

気づかなかったかもしれませんが、Alpacaデータセットは1ターン形式です。一方、ChatGPTの使用は対話的で、複数ターンで会話できます。例えば、左側が私たちが望むものですが、右側のAlpacaデータセットは単一会話しか提供しません。私たちは、ファインチューニングされた言語モデルに、ChatGPTのように複数ターン会話をどう行うかを何とか学習させたいのです。

<figure><img src="/files/850bbe22af1e6e8304e5a34a7fcc08915e34f02d" alt=""><figcaption></figcaption></figure>

そこで私たちは `conversation_extension` パラメータを導入しました。これは基本的に、1ターンのデータセットからランダムな行をいくつか選び、それらを1つの会話に結合します！例えば3に設定すると、3行をランダムに選んで1つに結合します！長くしすぎると学習は遅くなりますが、チャットボットや最終的なファインチューニングの品質は大きく向上する可能性があります！

<figure><img src="/files/c7fae704073c784115a78c6a0a88d4d51544ec66" alt=""><figcaption></figcaption></figure>

次に `output_column_name` 予測 / 出力カラムに。Alpacaデータセットでは、出力カラムになります。

その後、 `standardize_sharegpt` 関数を使って、ファインチューニングに適した形式にデータセットを整えるだけです！これは必ず呼び出してください！

<figure><img src="/files/323f5402e3bc525f250606d1195dfb6003af0972" alt=""><figcaption></figcaption></figure>

## Visionファインチューニング

Visionモデルやマルチモーダルモデルをファインチューニングするためのデータセットには、画像入力も含まれます。例えば、 [Llama 3.2 Vision ノートブック](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_\(11B\)-Vision.ipynb#scrollTo=vITh0KVJ10qX) では、放射線画像のケースを使って、AIが医療従事者によるX線、CTスキャン、超音波の分析をより効率的に支援する方法を示しています。

ROCO放射線画像データセットのサンプル版を使います。データセットには [こちら](https://www.google.com/url?q=https%3A%2F%2Fhuggingface.co%2Fdatasets%2Funsloth%2FRadiology_mini)にアクセスできます。データセットには、医学的状態や疾患を示すX線、CTスキャン、超音波が含まれています。各画像には専門家が書いた説明文が付いています。目的は、VLMをファインチューニングして、医療従事者にとって有用な分析ツールにすることです。

データセットを見て、最初の例が何を示しているか確認しましょう：

```
Dataset({
    features: ['image', 'image_id', 'caption', 'cui'],
    num_rows: 1978
})
```

| 画像                                                                                      | キャプション                                   |
| --------------------------------------------------------------------------------------- | ---------------------------------------- |
| <img src="/files/9743fe5d359738fca09f4ad17cfefb80e9ba915d" alt="" data-size="original"> | パノラマX線写真は、右後方上顎に骨の吸収を伴う溶骨性病変を示しています（矢印）。 |

データセットを整形するには、すべてのVisionファインチューニングタスクを次のように整形する必要があります：

```python
[
{ "role": "user",
  "content": [{"type": "text",  "text": instruction}, {"type": "image", "image": image} ]
},
{ "role": "assistant",
  "content": [{"type": "text",  "text": answer} ]
},
]
```

VLMに専門の放射線技師として振る舞うよう依頼するカスタム指示を作成します。また、単に1つの指示だけでなく、複数ターンを追加して動的な会話にすることもできます。

```notebook-python
instruction = "あなたは専門の放射線技師です。この画像に何が写っているかを正確に説明してください。"

def convert_to_conversation(sample):
    conversation = [
        { "role": "user",
          "content" : [
            {"type" : "text",  "text"  : instruction},
            {"type" : "image", "image" : sample["image"]} ]
        },
        { "role" : "assistant",
          "content" : [
            {"type" : "text",  "text"  : sample["caption"]} ]
        },
    ]
    return { "messages" : conversation }
pass
```

データセットをファインチューニング用の「正しい」形式に変換しましょう：

```notebook-python
converted_dataset = [convert_to_conversation(sample) for sample in dataset]
```

最初の例は次のように構造化されます：

```notebook-python
converted_dataset[0]
```

{% code overflow="wrap" %}

```
{'messages': [{'role': 'user',
   'content': [{'type': 'text',
     'text': 'あなたは専門の放射線技師です。この画像に何が写っているかを正確に説明してください。'},
    {'type': 'image',
     'image': <PIL.PngImagePlugin.PngImageFile image mode=L size=657x442>}]},
  {'role': 'assistant',
   'content': [{'type': 'text',
     'text': 'パノラマX線写真は、右後方上顎に骨の吸収を伴う溶骨性病変を示しています（矢印）。'}]}]}
```

{% endcode %}

ファインチューニングを行う前に、もしかするとVisionモデルはすでに画像の分析方法を知っているかもしれません。これが本当か確認してみましょう！

```notebook-python
FastVisionModel.for_inference(model) # 推論を有効化！

image = dataset[0]["image"]
instruction = "あなたは専門の放射線技師です。この画像に何が写っているかを正確に説明してください。"

messages = [
    {"role": "user", "content": [
        {"type": "image"},
        {"type": "text", "text": instruction}
    ]}
]
input_text = tokenizer.apply_chat_template(messages, add_generation_prompt = True)
inputs = tokenizer(
    image,
    input_text,
    add_special_tokens = False,
    return_tensors = "pt",
).to("cuda")

from transformers import TextStreamer
text_streamer = TextStreamer(tokenizer, skip_prompt = True)
_ = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128,
                   use_cache = True, temperature = 1.5, min_p = 0.1)
```

そして結果は次のとおりです：

```
このX線写真は、上顎と下顎の歯列を示すパノラマ画像、具体的にはオルソパントモグラム（OPG）に見えます。

* パノラマX線写真は正常な歯科構造を示しています。
* 右上に異常な領域があり、X線透過性の骨領域として表されており、上顎洞に対応しています。

**主な観察点**

* 左上の歯の間の骨は比較的X線不透過です。
* 画像の上部には2本の大きな矢印があり、この領域をより詳しく調べる必要があることを示しています。1本は左側の位置に、もう1本は右側の位置にあります。ただし、
```

詳細は、 [ノートブックのデータセットセクションをご覧ください](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_\(11B\)-Vision.ipynb#scrollTo=vITh0KVJ10qX).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://unsloth.ai/docs/jp/meru/fine-tuning-llms-guide/datasets-guide.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
