TRL documentation
チャットテンプレート
チャットテンプレート
チャットテンプレートとは、モデルが学習された文字列にメッセージを整形するためのJinja2スニペットです。例:
>>> from transformers import AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2-0.5B-Instruct")
>>> tokenizer.chat_template
"{% for message in messages %}{% if loop.first and messages[0]['role'] != 'system' %}{{ '<|im_start|>system\nYou are a helpful assistant.<|im_end|>\n' }}{% endif %}{{'<|im_start|>' + message['role'] + '\n' + message['content'] + '<|im_end|>' + '\n'}}{% endfor %}{% if add_generation_prompt %}{{ '<|im_start|>assistant\n' }}{% endif %}"
>>> tokenizer.apply_chat_template([{"role": "user", "content": "Hi!"}], tokenize=False)
'<|im_start|>system\nYou are a helpful assistant.<|im_end|>\n<|im_start|>user\nHi!<|im_end|>\n'ほとんどの場合、チャットテンプレートについて心配する必要はありません。モデルはトークナイザーとともにテンプレートが同梱されており、TRLが自動的に適用してくれます。この仕組みは完全に透明です。ただし、TRLのいくつかのレシピは、同梱されているテンプレートの多くに含まれていない機能に依存しています。
- SFT with
assistant_only_loss=Trueには、アシスタントの出力の周りに{% generation %}/{% endgeneration %}マーカーが必要であり、これによりロスマスクがアシスタントのトークンのみを対象にできます。 - ツール呼び出し付きGRPOでは、テンプレートがプレフィックス保存型である必要があります。ツールメッセージを追加しても、それ以前のメッセージのレンダリング方法が変わらないようにしてください。
TRLは、一般的なモデルファミリー(Qwen、Llama、DeepSeek-V3、GPT-OSSなど)用にパッチを適用したテンプレートをtrl/chat_templates/に同梱しており、サポート対象のモデルでは自動的に差し替えを行います。その他のモデルについては、テンプレートを自分でパッチする必要があります。このページの残りの部分では、同梱されているテンプレートをカタログ形式で紹介します。
サポートされているモデルファミリー
TRL は、初期化時にサポートされているモデルを識別し、必要に応じてトレーニング用のテンプレートに切り替えることができるよう、元のテンプレートの参照コピーを保存します。認識されるファミリーは以下の通りです: Cohere, Cohere2, DeepSeek-V3 (DeepSeek-R1, DeepSeek-R1-0528, DeepSeek-V3-0324 を含む), DeepSeek-R1-Distill, DiffusionGemma, Gemma, Gemma3, Gemma4 (Gemma-4-12B, Gemma-4-26B-A4B, Gemma-4-31B を含む), GLM-4-MoE (4.5, 4.6, 4.7), GLM-5, GLM-5.1, GLM-5.2, GLM-5.3, GLM-5.3-Flash, GPT-OSS, Idefics3, LFM2, LFM2.5 (LFM2.5-1.2B-Instruct, LFM2.5-2.6B, LFM2.5-24B-A2B を含む), LFM2.5-VL (LFM2.5-VL-450M を含む), Llama 3 / 3.1 / 3.2, Llava-Next, Mistral Large 4, Mistral Medium 3.5, Muse Glimmer, Muse Spark Open, Nemotron 3 (Nano, Super, Ultra), Nemotron 3.5 Lightning, Phi-3, Phi-3.5, Qwen2-VL, Qwen2.5 (ベースのチェックポイントを含む), Qwen2.5-VL, Qwen3 (Instruct-2507 および Thinking-2507 のバリアントを含む), Qwen3-Coder (Qwen3-Coder-Next を含む), Qwen3-VL, Qwen3.5, Qwen3.6, Qwen3.8, SmolVLM (SmolVLM2 を含む)。
トレーニングテンプレート
トレーニング固有の問題を修正するパッチ済みテンプレート。ツールが有効な場合(GRPO)またはassistant_only_loss=Trueの場合(SFT)に、初期化時に差し替えられます。
cohere_training.jinja
Cohereテンプレートのパッチ済みバージョン。cohere.jinjaとの差分:
{% generation %} / {% endgeneration %} でアシスタントメッセージの出力をラップし、return_assistant_tokens_mask=True が SFT のアシスタント専用損失に対して正しいマスクを生成するようにします。
cohere2_training.jinja
Cohere2 テンプレートのパッチ済みバージョン。cohere2.jinja との差分:
ロールディスパッチの{% endif %}の後ろにある末尾の<|END_OF_TURN_TOKEN|>を、各ロールのブランチ内に移動し、アシスタントのブランチ(<|START_RESPONSE|>...<|END_RESPONSE|><|END_OF_TURN_TOKEN|>)を{% generation %} / {% endgeneration %}でラップしてください。これにより、return_assistant_tokens_mask=TrueがSFTのアシスタント専用の損失に対して正しいマスクを生成します。
deepseek_r1_distill_training.jinja
Patched DeepSeek-R1-Distill テンプレート。deepseek_r1_distill.jinja との差分:
- アシスタントのコンテンツにおける
'</think>'による分割を削除します。元の処理では</think>までを含むすべてのテキストが削除されるため、学習ターゲットから推論が静かに削除されてしまいます。 - SFTのassistantのみ損失計算のために、assistantメッセージの出力を
{% generation %}/{% endgeneration %}マーカーでラップします。assistantターンを開始する<|Assistant|>と<|tool▁outputs▁end|>は、プロンプトがすでにそれらで終わっているため、マーカーの外側に残ります。
deepseekv3_training.jinja
Patched DeepSeek-V3 テンプレート。deepseekv3.jinja との差分:
tool['function']['arguments']に対して| tojsonを使用することで、argumentsをdictとして渡すことができます(transformers のドキュメントに記載されている形式です)。元のテンプレートは生の文字列連結を使用しており、dict 入力でクラッシュします。- アシスタントのコンテンツにおける
'</think>'による分割を削除し、推論ブロックが常にレンダリングされるようにしました。元の処理では</think>を含むそれまでのすべてのテキストが削除されるため、学習ターゲットから推論が静かに削除されてしまいます。 - SFTのassistantのみ損失計算のために、assistantメッセージの出力を
{% generation %}/{% endgeneration %}マーカーでラップします。assistantターンを開始する<|Assistant|>と<|tool▁outputs▁end|>は、プロンプトがすでにそれらで終わっているため、マーカーの外側に残ります。
deepseekv3_v2_training.jinja
Patched DeepSeek-R1-0528 テンプレート。deepseekv3_v2.jinja との差分:
deepseekv3_training.jinjaに示すように、argumentsをdictとして渡せるように、tool['function']['arguments']に| tojsonを使用します。- アシスタントのコンテンツにおける
'</think>'による分割を削除し、推論ブロックが常にレンダリングされるようにしました。元の処理では</think>を含むそれまでのすべてのテキストが削除されるため、学習ターゲットから推論が静かに削除されてしまいます。 - SFTのassistantのみ損失計算のために、assistantメッセージの出力を
{% generation %}/{% endgeneration %}マーカーでラップします。ツール出力の後にassistantターンを開始する<|tool▁outputs▁end|>は、プロンプトがすでにそれによって終わっているため、マーカーの外側に残ります。
deepseekv3_v3_training.jinja
Patched DeepSeek-V3 template (used by deepseek-ai/DeepSeek-V3). deepseek_r1_distill_training.jinja と同じ差分を deepseekv3_v3.jinja に適用しています: SFT の assistant-only loss 用に、assistant メッセージの出力の周りに {% generation %} / {% endgeneration %} マーカーを配置し、assistant ターンを開始する <|Assistant|> と <|tool▁outputs▁end|> はそれらの外側に残しています。
deepseekv3_v4_training.jinja
deepseek-ai/DeepSeek-V3-0324で使用される、パッチ適用済みのDeepSeek-V3-0324テンプレートです。deepseekv3_v2_training.jinjaと同じ差分をdeepseekv3_v4.jinjaに適用しています。具体的には、ツール呼び出しの引数に| tojsonを適用し、アシスタントの出力の前後に{% generation %} / {% endgeneration %}マーカーを挿入しています。
diffusion_gemma_training.jinja
パッチ適用済みのDiffusionGemmaテンプレート。diffusion_gemma.jinjaとの差分:
モデルが出力するターン内の各部分(thinking チャネル、ツール呼び出し、コンテンツ、および閉じタグ <turn|>)を {% generation %} / {% endgeneration %} で囲み、return_assistant_tokens_mask=True を使用して SFT のアシスタント専用損失に対して正しいマスクが生成されるようにします。ターン内に埋め込まれたツール応答は環境から提供されるため、generation ブロックの外に保持します。
gemma_training.jinja
パッチ適用済みのGemmaテンプレート(GemmaとGemma2で共有され、両者は同一のチャットテンプレートを搭載しています)。gemma.jinjaとの差分:
統合アシスタントの出力を分割し、<start_of_turn>model\n ヘッダー(モデルによって生成されないプロンプトキュー)を生成ブロックの外に配置し、SFT のアシスタント専用損失のためにアシスタントの内容を {% generation %} / {% endgeneration %} マーカーで囲みます。
gemma3_training.jinja
Gemma 3 テンプレートのパッチ済みバージョン。gemma_training.jinja と同じ差分(統合された出力行をロール別のブランチに分割し、<start_of_turn>model\n というプロンプトキューを生成ブロックの外に配置するとともに、アシスタントの内容を {% generation %} / {% endgeneration %} でラップする)を、システムメッセージとマルチモーダルなコンテンツブロックをサポートする Gemma 3 のベーステンプレートに適用したものです。
glm4moe_training.jinja
パッチ適用済みのGLM-4-MoEテンプレート。glm4moe.jinjaとの差分:
Close each assistant turn inside the generation block with the role marker that opens the next turn (<|observation|> after tool calls, otherwise <|user|> or <|system|>). GLM’s original template has no end-of-turn token: a turn is ended by the next message’s role marker, and GLM declares <|user|> and <|observation|> as end-of-sequence tokens, so the training template appends the marker to the assistant turn to keep the stop token in the loss mask, and the following message no longer renders its own marker.
{% generation %} / {% endgeneration %} マーカーでアシスタントメッセージの出力(思考ブロックおよびツール呼び出しを含む)をラップし、SFTにおけるアシスタントのみを対象とした損失計算を行います。enable_thinking=False の場合、生成プロンプトは空の \n<think></think> で終わるため、思考ブロックはマーカーの外側に残ります。
qwen3_training.jinja
パッチを適用したQwen3テンプレート。qwen3.jinjaとの差分:
loop.last に基づいて条件付きで省略する元のロジックは、ツールメッセージが追加された際にアシスタントのレンダリングを変更し、プレフィックスの保持を破綻させるため、メッセージの位置に関わらず常に思考ブロックを含める必要があります。
- {%- if loop.index0 > ns.last_query_index %}
- {%- if loop.last or (not loop.last and reasoning_content) %}
- {{- '<|im_start|>' + message.role + '\n<think>\n' + reasoning_content.strip('\n') + '\n</think>\n\n' + content.lstrip('\n') }}
- {%- else %}
- {{- '<|im_start|>' + message.role + '\n' + content }}
- {%- endif %}
- {%- else %}
- {{- '<|im_start|>' + message.role + '\n' + content }}
- {%- endif %}
+ {{- '<|im_start|>' + message.role + '\n<think>\n' + reasoning_content.strip('\n') + '\n</think>\n\n' + content.lstrip('\n') }}{% generation %} / {% endgeneration %} でアシスタントメッセージの出力をラップし、return_assistant_tokens_mask=True が SFT のアシスタントのみを対象とした損失に対して正しいマスクを生成するようにします。生成プロンプトが事前入力する思考ブロックの部分(enable_thinking=False での <think>\n\n</think>\n\n)は、プロンプトがすでにそれを含む形で終わるため、マーカーの外側に残ります。その他の Qwen3 学習テンプレートも、<think>\n のように、それぞれの生成プロンプトが事前入力する部分を同様に扱います。
qwen3_v2_training.jinja
修正済みのオリジナル Qwen3 テンプレート(2025年5月以前にリリースされた Qwen3 チェックポイント、および現在の Qwen3 ベースチェックポイントに同梱されています)。qwen3_training.jinja と同じ差分を qwen3_v2.jinja に適用しています。
qwen3_vl_training.jinja
Qwen3-VLテンプレートのパッチ済みバージョン。qwen3_vl.jinjaとの差分:
アシスタントメッセージの出力(content と tool_calls の両方)を {% generation %} / {% endgeneration %} でラップし、return_assistant_tokens_mask=True が SFT のアシスタント専用損失に対して正しいマスクを生成するようにします。
gptoss_training.jinja
Patched GPT-OSS テンプレート。gptoss.jinja との差分:
{% generation %} / {% endgeneration %} でアシスタントメッセージの出力をラップし、return_assistant_tokens_mask=True が SFT のアシスタント専用損失に対して正しいマスクを生成するようにします。ターンを開始する <|start|>assistant は、生成プロンプトがすでにそれ.endsWith で終わっているため、マーカーの外側に残ります。
idefics3_training.jinja
Patched Idefics3 テンプレート。idefics3.jinja との差分:
アシスタントメッセージを独自のブランチに分割し、{% generation %} / {% endgeneration %} マーカーでアシスタントの内容を囲みます。これにより、return_assistant_tokens_mask=True を使用して、SFTのアシスタント専用損失に対して正しいマスクを生成できます。
lfm2_training.jinja
パッチ適用済みのLFM2テンプレート。lfm2.jinjaとの差分:
統合メッセージ出力行をロール別のブランチに分割し、<|im_start|>assistant\n のプロンプトキューを生成ブロックの外側に配置します(モデルによって生成されないため)。一方、アシスタントの内容と <|im_end|>\n(モデルが生成し、そこで停止することを学習する必要がある)は生成ブロックの内側に配置します。アシスタントの内容を {% generation %} / {% endgeneration %} でラップすることで、return_assistant_tokens_mask=True が SFT のアシスタント専用損失に対して正しいマスクを生成するようにします。
lfm2_v2_training.jinja
パッチ適用済みのLFM2テンプレート、後の改訂版。lfm2_v2.jinjaとの差分:
{% generation %} / {% endgeneration %} でアシスタントの出力をラップしてください。tool_calls をレンダリングするブランチと、プレーンなコンテンツのブランチの両方でこれを行うことで、return_assistant_tokens_mask=True が SFT のアシスタント専用ロスに対して正しいマスクを生成します。<|im_start|>assistant\n というプロンプトキューは生成ブロックの外に置かれ、コンテンツ、ツール呼び出し、および <|im_end|>\n は生成ブロック内に置かれます。
llama3_training.jinja
パッチ適用済みのLlama 3テンプレート。llama3.jinjaとの差分:
{% generation %} / {% endgeneration %} でアシスタントメッセージの出力をラップし、return_assistant_tokens_mask=True が SFT のアシスタント専用損失に対して正しいマスクを生成するようにします。
llava_next_training.jinja
Patched Llava-Next テンプレート。llava_next.jinja との差分:
- SFTのassistantのみ損失計算のために、assistantメッセージの出力を
{% generation %}/{% endgeneration %}マーカーでラップします。 </s>の後に続くスペースを生成ブロックの外に保ちます。トークナイザーはこのスペースを次のターンの最初のトークン(▁[)にマージするため、そうしないとアシスタントの出力としてマスクされてしまい、マスクされた範囲の末尾にある</s>停止トークンが隠れてしまいます。
mistral_large_4_training.jinja
Mistral Large 4 テンプレートのパッチを適用しました。mistral_large_4.jinja との差分: mistral_medium_3_5_training.jinja と同じ変更で、アシスタントのターン(コンテンツ、ツール呼び出し、ターン終了トークン)を {% generation %} / {% endgeneration %} でラップし、return_assistant_tokens_mask=True を使用して SFT のアシスタント専用損失に対して正しいマスクを生成するようにしました。
mistral_medium_3_5_training.jinja
Patched Mistral Medium 3.5 template. mistral_medium_3_5.jinja との差分: 元のテンプレートはすでにプレフィックスを保持しているため、唯一の変更点は、アシスタントのターン(コンテンツ、ツール呼び出し、ターン終了トークン)を {% generation %} / {% endgeneration %} でラップすることです。これにより、return_assistant_tokens_mask=True を使用して SFT のアシスタント専用損失に対して正しいマスクを生成できます。
muse_glimmer_training.jinja
Muse Glimmer テンプレートのパッチ済みバージョン。muse_glimmer.jinja との差分: ターンのすべての ATEM チャネルを含むアシスタントブランチ全体を {% generation %} / {% endgeneration %} で囲み、return_assistant_tokens_mask=True が SFT のアシスタント専用損失に対して正しいマスクを生成するようにします。ターンを開始する <|start|>assistant は、生成プロンプトがすでにそれによって終わっているため、マーカーの外側に残します。
muse_spark_training.jinja
Muse Spark Open テンプレートのパッチ済みバージョン。muse_spark.jinja との差分: 元のテンプレートの {% generation %} マーカーは、ターンを開始する <|start|>assistant にも適用されますが、生成プロンプトはすでにこの部分で終わっています。学習テンプレートでは、マーカーの前にこれを出力することで、return_assistant_tokens_mask=True の際にこの部分が学習対象にならないようにしています。レンダリングされたテキストは変更ありません。
nemotron_3_nano_training.jinja
Patched Nemotron Nano template. nemotron_3_nano.jinja との差分: 元のテンプレートはすでにプレフィックスを保持しているため、変更点はアシスタントメッセージの出力を {% generation %} / {% endgeneration %} でラップすることです。これにより、return_assistant_tokens_mask=True を使用して SFT のアシスタントのみを対象とした損失計算を行う際に、正しいマスクが生成されます。生成プロンプトが事前に入力する思考ブロックの部分(<think>\n、または enable_thinking=False の場合の <think></think>)は、プロンプトがすでにそれらで終わっているため、マーカーの外側に残ります。
nemotron_3_super_training.jinja
Patched Nemotron Super テンプレート。nemotron_3_super.jinja との差分: nemotron_3_nano_training.jinja と同じです — 元のテンプレートはすでにプレフィックスを保持しているため、変更点はアシスタントメッセージの出力を {% generation %} / {% endgeneration %} でラップすることです。これにより、return_assistant_tokens_mask=True を使用して SFT のアシスタントのみを対象とした損失計算で正しいマスクが生成されます。生成プロンプトが事前に入力する思考ブロックの部分(<think>\n、または enable_thinking=False の場合の <think></think>)は、プロンプトがすでにそれらで終わっているため、マーカーの外側に残ります。
nemotron_3_ultra_training.jinja
Patched Nemotron Ultra template. nemotron_3_ultra.jinja との差分: nemotron_3_nano_training.jinja と同じです。元のテンプレートはすでにプレフィックスを保持しているため、変更点はアシスタントメッセージの出力を {% generation %} / {% endgeneration %} でラップすることです。これにより、return_assistant_tokens_mask=True を使用して SFT のアシスタントのみを対象とした損失計算を行う際に、正しいマスクが生成されます。生成プロンプトが事前に入力する思考ブロックの部分(<think>\n、または enable_thinking=False の場合の <think></think>)は、プロンプトがすでにその部分で終わっているため、マーカーの外側に残ります。
nemotron_3_5_lightning_training.jinja
Patched Nemotron 3.5 Lightning テンプレート。nemotron_3_5_lightning.jinja との差分: nemotron_3_nano_training.jinja と同じです — 元のテンプレートはすでにプレフィックスを保持しているため、変更点はアシスタントメッセージの出力を {% generation %} / {% endgeneration %} でラップすることです。これにより、return_assistant_tokens_mask=True を使用して SFT のアシスタントのみを対象とした損失計算を行う際に、正しいマスクが生成されます。生成プロンプトが事前に入力する思考ブロックの部分(<think>\n、または enable_thinking=False の場合の <think></think>)は、プロンプトがすでにそれらで終わっているため、マーカーの外側に残ります。
phi3_training.jinja
パッチ適用済みのPhi-3テンプレート。phi3.jinjaとの差分:
{% generation %} / {% endgeneration %} でアシスタントメッセージの出力をラップし、return_assistant_tokens_mask=True が SFT のアシスタント専用損失に対して正しいマスクを生成するようにします。
phi3_5_training.jinja
パッチ適用済みのPhi-3.5テンプレート。phi3_5.jinjaとの差分:
{% generation %} / {% endgeneration %} でアシスタントメッセージの出力をラップし、return_assistant_tokens_mask=True が SFT のアシスタント専用損失に対して正しいマスクを生成するようにします。
qwen2_5_training.jinja
パッチを適用したQwen2.5テンプレート。qwen2_5.jinjaとの差分:
{% generation %} / {% endgeneration %} でアシスタントメッセージの出力をラップし、return_assistant_tokens_mask=True が SFT のアシスタント専用損失に対して正しいマスクを生成するようにします。
qwen2_5_base_training.jinja
修正済みの Qwen2.5 base テンプレート(Qwen2.5-0.5B などの base チェックポイントで使用されます。これらのテンプレートは、デフォルトのシステムプロンプトのみ instruct 版と異なります)。qwen2_5_training.jinja と同じ差分を qwen2_5_base.jinja に適用します。
qwen2_5_vl_training.jinja
パッチ適用済みのQwen2.5-VLテンプレート(バイト単位で同一のテンプレートを同梱しているQwen2-VLにも使用されます)。qwen2_5_vl.jinjaとの差分:
アシスタントメッセージを独自のブランチに分割し、{% generation %} / {% endgeneration %} マーカーでアシスタントの内容を囲みます。これにより、return_assistant_tokens_mask=True を使用して、SFTのアシスタント専用損失に対して正しいマスクを生成できます。
qwen3_instruct_2507_training.jinja
Qwen3-Instruct-2507テンプレートの修正版(Qwen3-4B-Instruct-2507のようなモデルで使用されます。これらのモデルには、reasoning_content / <think>の解析、multi_step_toolのトラッキング、enable_thinkingフラグを備えたよりシンプルなQwen3バリアントが同梱されています)。qwen3_instruct_2507.jinjaとの差分:
{% generation %} / {% endgeneration %} でアシスタントメッセージの出力をラップし、return_assistant_tokens_mask=True が SFT のアシスタント専用損失に対して正しいマスクを生成するようにします。
qwen3_thinking_2507_training.jinja
Qwen3-Thinking-2507 テンプレートのパッチ済みバージョン(Qwen3-4B-Thinking-2507 などのモデルで使用され、生成プロンプトに <think>\n を事前入力します)。qwen3_thinking_2507.jinja との差分: qwen3_training.jinja と同じ変更セットで、loop.index0 > ns.last_query_index の条件分岐を削除し、思考ブロックが常に出力されるようにしています(プレフィックスの保持)。また、SFT におけるアシスタントのみを対象とした損失計算のために、アシスタントの出力を {% generation %} / {% endgeneration %} マーカーで囲んでいます。
qwen3_5_think_training.jinja / qwen3_5_nothink_training.jinja
enable_thinkingフラグのデフォルト値だけが異なる2つのバリエーションで共通のロジックを持つ、パッチ済みのQwen3.5テンプレート:
qwen3_5_think_training.jinjaはデフォルトで思考機能が有効になっており、Qwen3.5-4B 以上のモデルで使用されます。qwen3_5_nothink_training.jinjaはデフォルトで思考機能を無効にし、Qwen3.5-2B 以下のモデルで使用されます。
qwen3_5_think.jinja / qwen3_5_nothink.jinja との差分: qwen3_training.jinja と同じです(loop.index0 > ns.last_query_index の条件を削除して思考ブロックを常に出力し、アシスタントの出力を {% generation %} / {% endgeneration %} で囲みます)。
qwen3_6_training.jinja
Qwen3.6 テンプレートのパッチ済みバージョン。qwen3_6.jinja との差分: qwen3_training.jinja と同じ (loop.index0 > ns.last_query_index の条件分岐を削除して thinking ブロックを常に出力するようにし、アシスタントの出力を {% generation %} / {% endgeneration %} でラップする)。
qwen3_8_training.jinja
Qwen3.8テンプレートのパッチ済みバージョン。qwen3_8.jinjaとの差分: preserve_thinking / loop.index0 > ns.last_query_indexの条件分岐を削除し、thinkingブロックが常に出力されるようにしました。これにより、呼び出し側がpreserve_thinking=Falseを渡した場合でも、プレフィックスの保持が成立します。また、SFTにおけるassistantのみを対象とした損失計算のために、assistantの出力を{% generation %} / {% endgeneration %}マーカーで囲み、generationプロンプトが事前に入力するthinkingブロックの部分はそれらのマーカーの外側に配置しました。
smolvlm_training.jinja
パッチ適用済みのSmolVLMテンプレート(バイト単位で同一のテンプレートを同梱するSmolVLM2でも使用されます)。smolvlm.jinjaとの差分:
アシスタントメッセージを独自のブランチに分割し、{% generation %} / {% endgeneration %} マーカーでアシスタントの内容を囲みます。これにより、return_assistant_tokens_mask=True を使用して、SFTのアシスタント専用損失に対して正しいマスクを生成できます。
関連ユーティリティ
これらのテンプレートに対して操作を行うヘルパー関数(clone_chat_template()、is_chat_template_prefix_preserving、get_training_chat_template())については、Chat Template Utilitiesを参照してください。