2025年12月7日
ハードウェア
LLMファインチューニングのデータ形式|Alpaca形式とChatML形式の比較とUnsloth実装指針
LLMファインチューニングで用いる代表的なデータ形式、Alpaca形式とChatML形式を比較します。歴史的背景・データ構造・性能特性の違いを整理し、Unslothでの実装方法と、用途に応じた形式選定の判断基準を解説します。

概要
ファインチューニングの成否を左右する要素の一つが「データフォーマット」です。同じ学習内容であっても、どの形式でモデルに入力するかによって、学習効率と最終的な応答品質が変わります。本稿では、LLMファインチューニングにおける代表的な2つの形式である Alpaca形式 と ChatML形式 を取り上げ、歴史的背景からデータ構造、性能特性、そして Unsloth を用いた実装方法までを整理します。あわせて、社内向けの日本語ローカルLLMを構築する際に、どちらの形式を選ぶべきかの判断基準を示します。
要点は次のとおりです。
- Instruction Tuningは2021年のGoogle FLANに始まり、InstructGPTを経てChatGPTへと発展した「指示に従うAI」を実現する基盤技術である。
- ファインチューニングのデータ形式は、主にシングルターン向けの「Alpaca形式」とマルチターン向けの「ChatML形式」の2系統に大別される。
- Llama 3系・Qwen2.5/Qwen3・Gemma 3などの近年のモデルはChat形式を前提に学習されており、Unslothは両形式に対応している。
ファインチューニングとは
ファインチューニング(Fine-tuning)とは、事前学習済みの大規模言語モデル(LLM)に対し、特定のタスクやドメインに特化したデータセットで追加学習を行う手法です。ゼロからモデルを訓練するプレトレーニングと比較して、少ないデータ量と計算リソースで目的に沿ったモデルを構築できる点が大きな利点です。
DigitalBaseでは、社内ナレッジや専門用語を取り込んだ業務特化モデルの構築にあたり、まずデータ形式の設計から検討することを推奨しています。形式の選択は後工程の学習効率と運用品質に直結するためです。
Instruction Tuningとは
概念の誕生
Instruction Tuning(指示チューニング)とは、事前学習済みの言語モデルに「指示→応答」形式のデータで追加学習を施し、ユーザーの指示に従って適切な応答を生成できるようにする手法です。
この概念は2021年にGoogleが発表した「FLAN(Finetuned Language Net)」で体系化されました。FLANは、62種類の自然言語処理タスクを「指示形式」に変換したデータセットで言語モデルを学習させることにより、未知のタスクへの汎化能力が大きく向上することを示しました。
InstructGPTの影響
2022年にOpenAIが発表した「InstructGPT」は、Instruction Tuningの実用化において重要な役割を果たしました。人間のフィードバックを用いた強化学習(RLHF: Reinforcement Learning from Human Feedback)と組み合わせることで、より人間の意図に沿った応答が可能になりました。このInstructGPTの成果が、後のChatGPTやGPT-4の基盤技術となり、現在の対話型AIの普及につながっています。
Instruction Tuningの3つの世代
Instruction Tuningは、大きく3つの世代に整理できます。第1世代はFLANに代表される「タスク指示型」で、特定のNLPタスクを指示形式で学習させるものでした。第2世代はInstructGPTやAlpacaに代表される「汎用指示型」で、より多様な指示に対応できるようになりました。第3世代はChatGPTのような「対話型」で、マルチターンの会話を通じて指示を理解し実行できます。
Alpaca形式の歴史と特徴
歴史的背景
2023年3月、Stanford大学の研究チームが「Alpaca」を公開しました。これは、Meta社のLLaMA 7Bモデルを、OpenAIのtext-davinci-003から生成した52,000件の指示応答データでファインチューニングしたものです。当時としては革新的な成果で、低コストで一定の指示追従性能を実現できることを示し、オープンソースLLM開発の流れを加速させました。
このAlpacaプロジェクトで採用されたデータ形式が「Alpaca形式」(Instruction形式)と呼ばれ、以降のオープンソースLLM開発における標準フォーマットの一つとなりました。
データ構造
Alpaca形式は、3つのフィールドで構成されます。
{ "instruction": "次の文章を英語に翻訳してください", "input": "今日は良い天気です", "output": "It is a nice day today." }
inputフィールドはオプションで、単純なタスクでは省略されることもあります。
{ "instruction": "日本の首都はどこですか?", "input": "", "output": "日本の首都は東京です。" }
プロンプトテンプレート
実際の学習時には、これらのフィールドを以下のようなテンプレートに変換します。
### Instruction: 次の文章を英語に翻訳してください ### Input: 今日は良い天気です ### Response: It is a nice day today.
メリットと限界
Alpaca形式の最大の利点は、その単純さにあります。既存のQ&Aデータセットやタスク別データを容易にこのフォーマットへ変換できます。
一方、明確な限界もあります。「シングルターン」にしか対応していない点です。対話システムではユーザーとAIが複数回やり取りを行いますが、Alpaca形式ではマルチターン会話を自然に表現できません。
ChatML形式の登場と進化
ChatMLとは
ChatML(Chat Markup Language)は、OpenAIがGPT-3.5/4で採用した会話フォーマットです。複数のメッセージを「役割(role)」と「内容(content)」のペアとして構造化することで、マルチターン会話を自然に表現できます。
データ構造
ChatML形式では、会話をmessages配列として表現します。
{ "messages": [ {"role": "system", "content": "あなたは親切なアシスタントです。"}, {"role": "user", "content": "こんにちは"}, {"role": "assistant", "content": "こんにちは。何かお手伝いできることはありますか?"}, {"role": "user", "content": "今日の天気を教えて"}, {"role": "assistant", "content": "申し訳ありませんが、リアルタイムの天気情報にはアクセスできません。お住まいの地域の天気予報サイトをご確認ください。"} ] }
実際のトークン化
ChatML形式では、特殊トークンを用いて各メッセージの境界を明確にします。
<|im_start|>system あなたは親切なアシスタントです。<|im_end|> <|im_start|>user こんにちは<|im_end|> <|im_start|>assistant こんにちは。何かお手伝いできることはありますか?<|im_end|>
この特殊トークン(<|im_start|>, <|im_end|>)により、モデルは発話者の切り替わりを正確に認識し、適切なタイミングで応答を生成できます。
ShareGPT形式との関係
ChatML形式と近い構造を持つものとして「ShareGPT形式」があります。これは、ChatGPTとの会話ログを共有するサービス「ShareGPT」から派生したフォーマットで、from/valueというキー名を用います。
{ "conversations": [ {"from": "human", "value": "こんにちは"}, {"from": "gpt", "value": "こんにちは。何かお手伝いできることはありますか?"} ] }
Unslothではstandardize_sharegpt関数を用いて、このShareGPT形式をChatML(role/content)形式に変換できます。
2つの形式の比較
| 比較項目 | Alpaca形式 | ChatML形式 |
|---|---|---|
| 登場時期 | 2023年3月 | 2023年(OpenAI API) |
| 会話ターン | シングルターンのみ | マルチターン対応 |
| システムプロンプト | テンプレートに固定 | 柔軟に設定可能 |
| データ変換の容易さ | 簡単 | やや複雑 |
| 推奨ユースケース | 分類・抽出・翻訳など | チャットボット・対話AI |
| 最新モデルの対応 | 限定的 | ほぼ全モデル対応 |
Unslothでの実装
Unslothは、メモリ効率の良いファインチューニングを実現するライブラリで、両方の形式に対応しています。
対応しているチャットテンプレート一覧
Unslothは以下のチャットテンプレートをサポートしています。
from unsloth.chat_templates import CHAT_TEMPLATES print(list(CHAT_TEMPLATES.keys())) # 出力例: # ['unsloth', 'zephyr', 'chatml', 'mistral', 'llama', 'vicuna', # 'alpaca', 'gemma', 'gemma2', 'llama-3', 'llama-3.1', 'llama-3.2', # 'llama-3.3', 'qwen-2.5', 'phi-4', 'gemma-3']
ChatML形式での実装例
from unsloth import FastLanguageModel from unsloth.chat_templates import get_chat_template # モデルとトークナイザーの読み込み model, tokenizer = FastLanguageModel.from_pretrained( model_name="unsloth/Llama-3.2-3B-Instruct", max_seq_length=2048, load_in_4bit=True, ) # ChatMLテンプレートを適用 tokenizer = get_chat_template( tokenizer, chat_template="chatml", ) # データセットのフォーマット関数 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}
Alpaca形式での実装例
from unsloth import FastLanguageModel model, tokenizer = FastLanguageModel.from_pretrained( model_name="unsloth/Llama-3.2-3B", max_seq_length=2048, load_in_4bit=True, ) # Alpaca形式のプロンプトテンプレート alpaca_prompt = """### Instruction: {instruction} ### Input: {input} ### Response: {output}""" def formatting_func(examples): texts = [] for instruction, input_text, output in zip( examples["instruction"], examples["input"], examples["output"] ): text = alpaca_prompt.format( instruction=instruction, input=input_text, output=output ) texts.append(text) return {"text": texts}
シングルターンからマルチターンへの変換
Unslothのconversation_extensionパラメータを用いると、シングルターンのAlpacaデータセットを擬似的にマルチターン会話へ拡張できます。これにより、単純なデータセットでもより自然な対話能力を学習させることが可能になります。
どちらを選ぶべきか
ChatML形式を推奨するケース
対話型のチャットボットやアシスタントを構築する場合は、ChatML形式を推奨します。Llama 3系・Qwen2.5/Qwen3・Gemma 3などの近年のモデルは、事前学習の段階でChat形式のデータを用いており、同じフォーマットでファインチューニングすることで効率的に性能を引き出せます。
また、システムプロンプトによる動作制御が必要な場合や、会話履歴を踏まえた応答生成が求められる場合も、ChatML形式が適しています。
Alpaca形式で十分なケース
一方、テキスト分類、情報抽出、翻訳、要約など、明確な入出力関係があるタスクでは、Alpaca形式でも十分な性能を発揮できます。データ準備が簡単で、既存のデータセットを流用しやすい利点もあります。
日本語ローカルLLMへの応用
日本語のローカルLLM開発においても、データ形式の選択は重要な意味を持ちます。日本語の対話データは英語と比べて限られているため、少ないデータで効果的に学習できる形式の選定が成果を左右します。とくに業務特化型のチャットボット開発では、社内ナレッジや専門用語を含むデータをChatML形式で整備し、ファインチューニングすることで、セキュアかつ高精度な対話システムを構築できます。Unslothのようなメモリ効率に優れたライブラリを活用すれば、コンシューマグレードのGPU(RTX 3090/4090クラス)でも実用的なファインチューニングが可能です。
まとめ
ファインチューニングのデータ形式は、Instruction Tuningの発展とともに、シングルターン向けのAlpaca形式から、マルチターンを自然に扱えるChatML形式へと重心が移ってきました。対話用途や近年のChat系モデルを前提とするならChatML形式を、分類・抽出・翻訳といった明確な入出力タスクならAlpaca形式を、というのが基本的な選定指針です。Unslothは両形式に対応しているため、用途に応じた形式を選んだうえで、効率的にファインチューニングを進められます。
