💬チャットテンプレート

会話形式、ChatML、ShareGPT、Alpaca 形式などを含むチャットテンプレートの基本とカスタマイズオプションを学びましょう!

当社のGitHubには、Llama、Mistral、Phi-4などでUnslothが使用するすべてのチャットテンプレートの一覧があります。フォーマットやユースケースについてヒントが必要な場合は、ここで確認できます: github.com/unslothai/unsloth/blob/main/unsloth/chat_templates.pyarrow-up-right

Colabのチャットテンプレートノートブック一覧:

新しいトークンの追加

Unslothには次のような関数があります: add_new_tokens この関数を使うとファインチューニングに新しいトークンを追加できます。例えば、次を追加したい場合: <CHARACTER_1>, <THINKING> および <SCRATCH_PAD> 次のように行えます:

model, tokenizer = FastLanguageModel.from_pretrained(...)
from unsloth import add_new_tokens
add_new_tokens(model, tokenizer, new_tokens = ["<CHARACTER_1>", "<THINKING>", "<SCRATCH_PAD>"])
model = FastLanguageModel.get_peft_model(...)
circle-exclamation

マルチターン会話

気づかなかった場合の問題点として、Alpacaデータセットはシングルターンであるのに対し、ChatGPTを使っていたときは対話的で複数ターンで会話できました。例えば、左側が我々の望む形ですが、右側のAlpacaデータセットは単一の会話しか提供しません。ファインチューニングされた言語モデルにChatGPTのようなマルチターン会話のやり方を何らかの形で学習させたいのです。

そこで私たちは conversation_extension パラメータを導入しました。これは本質的にシングルターンデータセットのいくつかのランダムな行を選択し、それらを1つの会話にマージします!例えば、これを3に設定すると、ランダムに3行を選択して1つにマージします。長すぎる設定は学習を遅くする可能性がありますが、チャットボットや最終的なファインチューニング結果を大幅に改善することがあります!

次に output_column_name を予測/出力カラムに設定します。Alpacaデータセットの場合は出力カラムになります。

その後、私たちは standardize_sharegpt 関数を使ってデータセットをファインチューニングに適した正しい形式にします!必ずこれを呼び出してください!

カスタマイズ可能なチャットテンプレート

ファインチューニング自体のチャットテンプレートを指定できるようになりました。有名なAlpaca形式は以下の通りです:

しかし、ChatGPTスタイルのファインチューニングはプロンプトが1つだけ必要だと言ったのを覚えていますか?Unslothを使ってすべてのデータセットカラムを1つにマージできたので、実質的に以下のようなチャットテンプレートを1つの入力カラム(instruction)と1つの出力で作成できます:

ただし、必ず {INPUT} というフィールドを指示文用に配置し、 {OUTPUT} というフィールドをモデルの出力用に配置する必要があります。実際にはオプションで {SYSTEM} というフィールドも許可しており、ChatGPTのようにシステムプロンプトをカスタマイズするのに便利です。例えば、以下はいくつかのカスタマイズ可能なかっこいい例です:

OpenAIモデルで使用されるChatML形式の場合:

あるいはLlama-3のテンプレート自体を使用することもできます(これはLlama-3のinstructバージョンを使用する場合にのみ機能します):実際にはオプションで {SYSTEM} というフィールドも許可しており、ChatGPTのようにシステムプロンプトをカスタマイズするのに便利です。

または、乗客が死亡したか生存したかを予測するTitanic予測タスクのように、このColabノートブックにはCSVおよびExcelのアップロードが含まれています: https://colab.research.google.com/drive/1VYkncZMfGFkeCEgN2IzbZIKEDkyQuJAS?usp=sharingarrow-up-right

Unslothでチャットテンプレートを適用する

通常チャットMLフォーマットに従うデータセットの場合、トレーニングやファインチューニングのためのデータセット準備プロセスは4つの簡単なステップで構成されます:

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

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

    \

  • を使用して get_chat_template をトークナイザに適用する:\

    \

  • フォーマット関数を定義します。例:\

    この関数はデータセットをループし、定義したチャットテンプレートを各サンプルに適用します。\

  • 最後に、データセットを読み込み必要な変更を適用しましょう: \

    データセットがChatMLの"role"/"content"形式の代わりに"from"/"value"キーを持つShareGPT形式を使用している場合、まず変換するために standardize_sharegpt 関数を使用できます。修正後のコードは次のようになります:\n\

詳細情報

データセットが以下のような辞書のリストのリストであると仮定すると:

当社の get_chat_template を使用してフォーマットできます。次を選択してください: chat_template を次のいずれかに設定できます: zephyr, chatml, mistral, llama, alpaca, vicuna, vicuna_old, unsloth、および mapping を使用して辞書値をマップします から, value など。 map_eos_token<|im_end|> を学習なしでEOSにマップすることを可能にします。

カスタムチャットテンプレートを自分で作成することもできます!例えば、私たちが内部的に使用しているチャットテンプレートは以下です。必ず tuple(custom_template, eos_token) を渡してください。ここで eos_token はテンプレート内で使用される必要があります。

最終更新

役に立ちましたか?