概要
ファインチューニングの成否を左右する要素の一つが「データフォーマット」です。同じ学習内容であっても、どの形式でモデルに入力するかによって、学習効率と最終的な応答品質が変わります。社内向けの日本語ローカルLLMを構築する際の判断材料として、Alpaca形式 と ChatML形式 のデータ構造、Unslothでの取り扱い、用途に応じた選定基準を整理します。
ファインチューニングとは
ファインチューニング(Fine-tuning)とは、事前学習済みの大規模言語モデル(LLM)に対し、特定のタスクやドメインに特化したデータセットで追加学習を行う手法です。ゼロからモデルを訓練するプレトレーニングと比較して、少ないデータ量と計算リソースで目的に沿ったモデルを構築できる点が大きな利点です。
DigitalBaseでは、社内ナレッジや専門用語を取り込んだ業務特化モデルの構築にあたり、まずデータ形式の設計から検討することを推奨しています。形式の選択は後工程の学習効率と運用品質に直結するためです。
Instruction Tuningとは
Instruction Tuning(指示チューニング)とは、事前学習済みの言語モデルに「指示→応答」形式のデータで追加学習を施し、ユーザーの指示に従って適切な応答を生成できるようにする手法です。
Alpaca形式の特徴
データ構造
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形式を推奨するケース
対話型のチャットボットやアシスタントを構築する場合は、ChatML形式を推奨します。
また、システムプロンプトによる動作制御が必要な場合や、会話履歴を踏まえた応答生成が求められる場合も、ChatML形式が適しています。
Alpaca形式で十分なケース
一方、テキスト分類、情報抽出、翻訳、要約など、明確な入出力関係があるタスクでは、Alpaca形式でも十分な性能を発揮できます。データ準備が簡単で、既存のデータセットを流用しやすい利点もあります。
日本語ローカルLLMへの応用
日本語のローカルLLM開発においても、データ形式の選択は重要な意味を持ちます。日本語の対話データは英語と比べて限られているため、少ないデータで効果的に学習できる形式の選定が成果を左右します。
まとめ
対話用途や近年のChat系モデルを前提とするならChatML形式を、分類・抽出・翻訳といった明確な入出力タスクならAlpaca形式を選ぶことが基本です。Unslothは両形式に対応しているため、用途に応じた形式を選んだうえで、効率的にファインチューニングを進められます。
