# データセットガイド

## データセットとは何ですか？

LLMにとって、データセットはモデルの訓練に使用できるデータの集合です。訓練に有用であるためには、テキストデータがトークン化可能な形式である必要があります。また、ここでは [Unsloth内でデータセットを使用する方法](#applying-chat-templates-with-unsloth).

データセット作成の重要な要素の一つはあなたの [チャットテンプレート](https://unsloth.ai/docs/jp/ji-ben/chat-templates) とそれをどのように設計するかです。トークン化も重要で、テキストを単語、サブワード、文字などのトークンに分割し、LLMが効果的に処理できるようにします。これらのトークンは埋め込みに変換され、モデルが意味と文脈を理解できるように調整されます。

### データ形式

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

<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>インストラクト</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" %}
より良いデータセットを作る最良の方法の一つは、ShareGPTのようなHugging Faceのより一般化されたデータセットと組み合わせて、モデルをより賢く多様にすることです。また、 [合成的に生成されたデータ](#synthetic-data-generation).
{% endhint %}

## 🦥 Unslothデータレシピ

[Unslothデータレシピ](https://unsloth.ai/docs/jp/xin-zhe/studio/data-recipe) PDFやCSVファイルのようなドキュメントをアップロードし、それらを利用可能なデータセットに変換できます。グラフノードワークフローを通じて、視覚的にデータセットを作成および編集できます。

レシピページがメインの入口です。レシピはブラウザにローカル保存されるため、後で保存した作業に戻ることができます。ここから空のレシピを作成するか、ガイド付き学習用レシピを開くことができます。

<div data-with-frame="true"><figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fc5m3JX1kUA3UwmdcJcxH%2FArea.gif?alt=media&#x26;token=33bbd908-7d6c-456a-bc58-ce495c0adca1" alt=""><figcaption></figcaption></figure></div>

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

概要として、一般的なワークフローは次のようになります：

1. レシピページを開きます。
2. 新しいレシピを作成するか既存のレシピを開きます。
3. ブロックを追加してデータセットのワークフローを定義します。
4. クリック **検証** して設定の問題を早期に発見します。
5. プレビューを実行してサンプル行を素早く確認します。
6. レシピが準備できたらフルデータセットのビルドを実行します。
7. 進行状況と出力はグラフ上でまたは **実行** ビューで詳細をライブに確認します。
8. 生成されたデータセットを **Studio** そしてモデルを微調整します。詳細を読む：

{% content-ref url="../../xin-zhe/studio/data-recipe" %}
[data-recipe](https://unsloth.ai/docs/jp/xin-zhe/studio/data-recipe)
{% endcontent-ref %}

## データのフォーマット

関連する基準を特定し、必要なデータを収集したら、訓練準備が整った機械可読形式にデータをフォーマットできます。

### LLM訓練の一般的なデータ形式

について [**や**](https://unsloth.ai/docs/jp/ji-ben/continued-pretraining)、特定の構造を持たない生テキスト形式を使用します：

```json
  "text": "パスタ・カルボナーラは伝統的なローマのパスタ料理です。ソースは生卵とすりおろしたペコリーノ・ロマーノチーズ、黒胡椒を混ぜることで作られます。熱いパスタはカリカリのグアンチャーレ（塩漬け豚頬）と卵の混合物と絡められ、残留熱によってクリーミーなソースが生まれます。一般的な誤解にもかかわらず、本物のカルボナーラにはクリームやにんにくは含まれません。この料理は20世紀中頃のローマで起源を持つ可能性がありますが、その正確な起源は議論されています..."
```

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

モデルを新しいタスクに適応させ、特定の指示セットに基づいて単一ターンでテキストを出力させたい場合、 **指示（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`の間で交互に並び、自然な対話の流れを可能にします。

もう一つの一般的な形式はOpenAIのChatML形式で、Hugging Faceがデフォルトで使用しているものです。これはおそらく最も使用される形式で、 `user` と `assistant`

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

### Unslothでのチャットテンプレートの適用

通常ChatML形式に従うデータセットの場合、訓練や微調整のためにデータセットを準備するプロセスは4つの簡単なステップで構成されます：

* Unslothが現在サポートしているチャットテンプレートを確認します:\\

  ```
  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` 正しいチャットテンプレートをトークナイザーに適用するには:\\

  ```
  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, }
  ```

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

  ```
  # データセットのインポートと読み込み
  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" 形式の代わりに "from" / "value" キーを使用するShareGPT形式なら、まず `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形式に変換する必要がある場合、1つの方法は生データを処理するPythonスクリプトを作成することです。要約タスクに取り組んでいる場合は、ローカルのLLMを使用して各例の指示と出力を生成できます。

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

<mark style="color:緑;">**A:**</mark> ターゲットのデータセットが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 Issuesに機能要望を提出してください [フォーラム](https://github.com/unslothai/unsloth)。一時的な回避策として、機能要望が承認されマージされるまでトークナイザー自身のapply\_chat\_template関数を使用することもできます。

## 合成データ生成

ローカルのLLM（Llama 3.3（70B）など）やOpenAIのGPT-4.5を使用して合成データを生成することもできます。一般に、最高品質の出力を確保するためにLlama 3.3（70B）のようなより大きなモデルを使用する方が良いです。vLLM、Ollama、llama.cppのような推論エンジンを直接使用して合成データを生成できますが、収集や追加データのプロンプトには手作業が必要になるでしょう。合成データの目標は3つあります：

* 完全に新しいデータを生成する — ゼロから、または既存のデータセットから
* データセットを多様化してモデルが [過学習しないようにする](https://unsloth.ai/docs/jp/meru/lora-hyperparameters-guide#avoiding-overfitting-and-underfitting) そして特定化しすぎないようにする
* 既存のデータを拡張する、例：データセットを自動的に選択した正しいフォーマットに構造化する

### Unslothを合成データに使用する

Unsloth Studioの任意の非構造化または構造化データを簡単にアップロードでき、 [データレシピ](https://unsloth.ai/docs/jp/xin-zhe/studio/data-recipe) それは自動的に使用可能な／合成データセットに変換します。詳細は [ガイドをご覧ください](https://unsloth.ai/docs/jp/xin-zhe/studio/data-recipe).

<div data-with-frame="true"><figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2FQ6e19jESrJg0VjHnX58c%2Fdata%20recipes%20final.png?alt=media&#x26;token=8d74e453-815d-4790-83d1-76d0bc80a3ce" alt="" width="563"><figcaption></figcaption></figure></div>

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

目的は、指定したフォーマットのQAデータを生成および処理するようモデルにプロンプトを与えることです。モデルは提供した構造と文脈を学習する必要があるため、少なくとも既に10例のデータを用意しておくことを確認してください。例となるプロンプト：

* **既存のデータセットで会話をさらに生成するためのプロンプト**:

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

  {% code overflow="wrap" %}

  ```
  コカ・コーラの製品レビューをポジティブ、ネガティブ、ニュートラルのいずれかに分類した例を10件作成してください。
  ```

  {% endcode %}
* **フォーマットされていないデータセットのためのプロンプト**:

  {% code overflow="wrap" %}

  ```
  私のデータセットを微調整用のQA ChatML形式に構造化してください。そして同じトピックとフォーマットで合成データの例を5件生成してください。
  ```

  {% endcode %}

生成されたデータの品質を確認して、関連性のない応答や低品質の応答を削除または改善することを推奨します。データセットによってはモデルが過学習しないように様々な面でバランスを取る必要があるかもしれません。改善したデータセットを再びLLMに入力して、さらにガイダンスを加えてデータを再生成することができます。

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

### データセットはどのくらい大きくすべきですか？

一般的には、ある程度の結果を得るために微調整には最低でも100行以上のデータを推奨します。最適な性能のためには1,000行以上のデータセットが望ましく、多くの場合データが多いほど良い結果になります。データセットが小さすぎる場合は合成データを追加したり、Hugging Faceのデータセットを追加して多様化することも可能です。ただし、微調整されたモデルの有効性はデータセットの品質に大きく依存するため、データを徹底的にクリーンアップして準備することが重要です。

### 推論（reasoning）モデルを微調整したい場合、データセットをどのように構造化すべきですか？

既に推論能力を持つモデル（例：DeepSeek-R1の蒸留版など、DeepSeek-R1-Distill-Llama-8Bなど）を微調整したい場合でも、質問/タスクと回答のペアに従う必要があります。ただし、回答には推論／チェーン・オブ・ソート形式のプロセスと、解答を導き出すために取ったステップを含めるように変更する必要があります。\
\
推論を持たないモデルを将来的に推論能力を備えさせたい場合は、今回は回答に推論を含めない標準的なデータセットを利用する必要があります。この訓練プロセスは「 [強化学習とGRPO](https://unsloth.ai/docs/jp/meru/reinforcement-learning-rl-guide).

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

微調整用に複数のデータセットがある場合、次のいずれかが可能です：

* すべてのデータセットの形式を標準化し、それらを単一のデータセットに結合してこの統合データセットで微調整を行う。
* を使用して、 [複数データセット](https://colab.research.google.com/drive/1njCCbE1YVal9xC83hjdo2hiGItpY_D6t?usp=sharing) ノートブックを使って複数のデータセットで直接微調整する。

### 同じモデルを複数回微調整できますか？

既に微調整されたモデルを複数回微調整することは可能ですが、すべてのデータセットを組み合わせて単一のプロセスで微調整を行う方が望ましいです。すでに微調整されたモデルを再訓練すると、以前の微調整プロセスで得られた品質や知識が変化する可能性があります。

## Unslothでのデータセットの使用

### Alpacaデータセット

Google Colab上でUnsloth内でAlpacaデータセットを使用する例を参照してください：

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-1d66d8714e44d90513dd87b9356eec67886ab3f7%2Fimage.png?alt=media" 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="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-0dde50e386e7b245d3e8a57e10a4a81755b3769a%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

各行には指示、入力、出力の3つの列があることがわかります。基本的に各行を下記のように1つの大きなプロンプトに結合します。それを使用して言語モデルを微調整し、これによりChatGPTに非常に近いものになりました。このプロセスを私たちは **教師あり指示微調整**.

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-8b3663c5d80adcb935ff77661500f08e13c9af2d%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

### 複数列での微調整

しかし大きな問題は、ChatGPTスタイルのアシスタントでは1つの指示／1つのプロンプトのみを許容し、複数の列／入力を許さないことです。例えばChatGPTでは1つのプロンプトを送信しなければならず、複数のプロンプトは送れません。

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-d90162c2685ced871f4151369aadcaee40a9c54f%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

これは本質的に、微調整が実際に機能するためには複数の列を1つの大きなプロンプトに「結合」しなければならないことを意味します！

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

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-a2df04874bfc879182cb66c789341d49700227ea%2FMerge.png?alt=media" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-b3da2b36afe37469cd3962f37186e758871864a5%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

他の微調整ライブラリでは、すべての列を1つのプロンプトに結合して微調整用にデータセットを手動で準備する必要があります。Unslothでは、これを一度に行う `to_sharegpt` という関数を提供しています！

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-62b94dc44f2e343020d31de575f52eb22be4b0fc%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

これには多くのカスタマイズを許可するため少し複雑ですが、いくつかポイントがあります：

* すべての列名を波かっこで囲む必要があります `{}`。これらは実際のCSV／Excelファイルの列名です。
* オプションのテキストコンポーネントは `[[]]`で囲む必要があります。例えば「input」列が空の場合、結合関数はそのテキストを表示せずスキップします。これは欠損値のあるデータセットに便利です。
* 出力またはターゲット／予測の列を `output_column_name`で選択します。Alpacaデータセットでは、これは `output`.

になります。

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-e6228cf6e5c0bb4e4b45e6f3e045910d567c33d2%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

例えば、タイタニックデータセットでは、各列／テキストの一部をオプションにして以下のような大きな結合プロンプト形式を作成できます。

| 例えば、データセットが多くの欠損データを含む次のような形だと仮定します： | 出港港（Embarked） | 年齢（Age） |
| ------------------------------------ | ------------- | ------- |
| 運賃（Fare）                             | 23            |         |
|                                      | 18            | 7.25    |

S

1. その場合、結果が次のようになることは望みません： **乗客はSから出港しました。彼らの年齢は23です。彼らの運賃は**.
2. 空（EMPTY） **乗客はSから出港しました。彼らの年齢は23です。彼らの運賃は**乗客は

から出港しました。彼らの年齢は18です。彼らの運賃は$7.25です。 `[[]]`代わりに列を

1. でオプションとして囲むことで、この情報を完全に除外できます。 **乗客はSから出港しました。彼らの年齢は23です。彼らの運賃は**.]]
2. \[\[乗客はSから出港しました。]] \[\[彼らの年齢は23です。]] \[\[彼らの運賃は **乗客はSから出港しました。彼らの年齢は23です。彼らの運賃は**\[\[乗客は

から出港しました。]] \[\[彼らの年齢は18です。]] \[\[彼らの運賃は$7.25です。]]

1. となり、
2. 結果は次のようになります：

### 乗客はSから出港しました。彼らの年齢は23です。

彼らの年齢は18です。彼らの運賃は$7.25です。

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-2a65cd74ddd03a6bcbbc9827d9d034e4879a8e6a%2Fdiff.png?alt=media" alt=""><figcaption></figcaption></figure>

マルチターン会話 `お気づきかもしれませんが、Alpacaデータセットは単一ターンである一方で、ChatGPTは対話的で複数ターンで話しかけることができます。例えば左側が我々の望む形ですが、右側のAlpacaデータセットは単一の会話しか提供しません。微調整された言語モデルには、ChatGPTのようにマルチターン会話の方法を学習させたいのです。` そこで我々は

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-2b1b3494b260f1102942d86143a885225c6a06f2%2Fcombine.png?alt=media" alt=""><figcaption></figcaption></figure>

conversation\_extension `output_column_name` パラメータを導入しました。これは本質的に単一ターンデータセットのランダムな行を選択して、それらを1つの会話に結合します。例えば3に設定すると、ランダムに3行を選択して1つに結合します！長く設定しすぎると訓練が遅くなる可能性がありますが、チャットボットや最終的な微調整を大幅に改善する可能性があります。

次に予測／出力の列を `standardize_sharegpt` に設定します。Alpacaデータセットでは、それはoutput列になります。

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-7bf83bf802191bda9e417bbe45afa181e7f24f38%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

## その後、我々はデータセットを微調整に正しい形式にするために単に

関数を使用します！必ずこれを呼んでください！ [ビジョン微調整](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_\(11B\)-Vision.ipynb#scrollTo=vITh0KVJ10qX) 視覚またはマルチモーダルモデルの微調整用データセットには画像入力も含まれます。例えば、

Llama 3.2 Visionノートブック [こちら](https://www.google.com/url?q=https%3A%2F%2Fhuggingface.co%2Fdatasets%2Funsloth%2FRadiology_mini)では、放射線画像がどのようにX線、CTスキャン、超音波を分析する際に医療専門家を支援できるかを示す放射線症例を使用します。

サンプル版のROCO放射線データセットを使用します。データセットにアクセスできます

```
。データセットには医学的状態や疾患を示すX線、CTスキャン、超音波が含まれ、各画像には専門家によって書かれたキャプションがあります。目標はVLMを微調整して医療専門家にとって有用な分析ツールにすることです。
    データセットを見て、最初の例が何を示しているかを確認しましょう：
    Dataset({
})
```

| features: \['image', 'image\_id', 'caption', 'cui'],                                                                                                                                                                                  | num\_rows: 1978 |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- |
| <img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-97d4489827403bd4795494f33d01a10979788c30%2Fxray.png?alt=media" alt="" data-size="original"> | 画像              |

キャプション

```python
[
パノラマ放射線写真は右後上顎に骨融解性病変を示し、上顎洞底の吸収を伴います（矢印）。
  データセットをフォーマットするには、すべての視覚微調整タスクは次のようにフォーマットする必要があります：
},
{ "role": "user",
  "content": [{"type": "text",  "text": instruction}, {"type": "image", "image": image} ]
},
]
```

{ "role": "assistant",

```notebook-python
"content": [{"type": "text",  "text": answer} ]

我々はVLMに専門の放射線技師であるよう指示するカスタム指示を作成します。また、単一の指示だけでなく、複数のターンを追加して動的な会話にすることもできます。
    instruction = "あなたは専門の放射線技師です。この画像で見えるものを正確に記述してください。"
        パノラマ放射線写真は右後上顎に骨融解性病変を示し、上顎洞底の吸収を伴います（矢印）。
          def convert_to_conversation(sample):
            conversation = [
            "content" : [
        },
        {"type" : "text",  "text"  : instruction},
          def convert_to_conversation(sample):
            {"type" : "image", "image" : sample["image"]} ]
        },
    ]
    { "role" : "assistant",
{"type" : "text",  "text"  : sample["caption"]} ]
```

return { "messages" : conversation }

```notebook-python
pass
```

データセットを微調整のための「正しい」形式に変換しましょう：

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

{% code overflow="wrap" %}

```
最初の例は今や以下のように構造化されています：
   converted_dataset[0]
     {'messages': [{'role': 'user',
    'content': [{'type': 'text',
     'text': 'あなたは専門の放射線技師です。この画像で見えるものを正確に記述してください。'},
  {'type': 'image',
   converted_dataset[0]
     'image': <PIL.PngImagePlugin.PngImageFile image mode=L size=657x442>}]},
```

{% endcode %}

{'role': 'assistant',

```notebook-python
'text': 'パノラマ放射線写真は右後上顎に骨融解性病変を示し、上顎洞底の吸収を伴います（矢印）。'}]}]}

微調整を行う前に、視覚モデルが既に画像を解析する方法を知っているかもしれません。これを確認してみましょう！
"content": [{"type": "text",  "text": answer} ]

FastVisionModel.for_inference(model) # 推論用に有効化！
    image = dataset[0]["image"]
        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線（Orthopantomogram, OPG）であるように見えます。

* パノラマ放射線写真は通常の歯構造を示しています。

* 上側右側に放射線透亮領域として表れる異常部位があり、これが上顎洞に対応しています。
**主な観察点**
```

\* 左上歯間の骨は比較的放射線不透過性を示しています。 [\* 画像上部には2本の大きな矢印があり、この領域の詳細な検査が必要であることを示唆しています。矢印の一方は左側、もう一方は右側に位置しています。しかし、いくつかの点でのみは、（原文の続きに依存するため省略されます）](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_\(11B\)-Vision.ipynb#scrollTo=vITh0KVJ10qX).


---

# Agent Instructions: 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:

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

The question should be specific, self-contained, and written in natural language.
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.
