TRL documentation

Шаблоны чата

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v1.18.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Шаблоны чата

Шаблон чата — это фрагмент 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 с assistant_only_loss=True необходимы маркеры {% generation %} / {% endgeneration %} вокруг вывода ассистента, чтобы маска потерь применялась только к токенам ассистента.
  • Для GRPO с вызовами инструментов шаблон должен быть сохраняющим префикс: добавление сообщения инструмента не должно изменять способ рендеринга предыдущих сообщений.

TRL поставляет исправленные шаблоны в trl/chat_templates/ для распространённых семейств моделей (Qwen, Llama, DeepSeek-V3, GPT-OSS, …) и автоматически подставляет их для поддерживаемых моделей. Для любой другой модели вам потребуется самостоятельно исправить её шаблон. Остальная часть этой страницы содержит каталог поставляемых шаблонов.

Поддерживаемые семейства моделей

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:

Переместите завершающий <|END_OF_TURN_TOKEN|> из позиции после {% endif %} в каждую ветку роли и оберните ветку ассистента (<|START_RESPONSE|>...<|END_RESPONSE|><|END_OF_TURN_TOKEN|>) в {% generation %} / {% endgeneration %}, чтобы return_assistant_tokens_mask=True формировал корректные маски для SFT-потерь, рассчитываемых только по токенам ассистента.

deepseek_r1_distill_training.jinja

Шаблон DeepSeek-R1-Distill с исправлениями. Отличия от deepseek_r1_distill.jinja:

  • Убирает разбиение на содержимом ассистента по '</think>'. В исходной реализации удаляется всё вплоть до </think> включительно, что приводит к невидимому удалению рассуждений из целевых данных для обучения.
  • Оборачивает вывод сообщения ассистента маркерами {% generation %} / {% endgeneration %} для SFT-потерь только для ассистента. Маркеры <|Assistant|> и <|tool▁outputs▁end|>, открывающие ход ассистента, остаются вне маркеров, поскольку промпт уже заканчивается ими.

deepseekv3_training.jinja

Шаблон DeepSeek-V3 с исправлениями. Различия по сравнению с deepseekv3.jinja:

  • Использует | tojson для tool['function']['arguments'], чтобы arguments можно было передавать в виде dict (формат, описанный в документации transformers). Исходный шаблон использует прямую конкатенацию строк, что приводит к сбою при вводе в формате dict.
  • Убирает разделение по '</think>' в содержимом ассистента, чтобы блок рассуждений всегда отображался. В исходной версии удаляется всё вплоть до </think> включительно, что приводит к невидимому удалению рассуждений из целевых данных для обучения.
  • Оборачивает вывод сообщения ассистента маркерами {% generation %} / {% endgeneration %} для SFT-потерь только для ассистента. Маркеры <|Assistant|> и <|tool▁outputs▁end|>, открывающие ход ассистента, остаются вне маркеров, поскольку промпт уже заканчивается ими.

deepseekv3_v2_training.jinja

Шаблон DeepSeek-R1-0528 с исправлениями. Различия по сравнению с deepseekv3_v2.jinja:

  • Использует | tojson для tool['function']['arguments'], чтобы arguments можно было передавать как dict, как в deepseekv3_training.jinja.
  • Убирает разделение по '</think>' в содержимом ассистента, чтобы блок рассуждений всегда отображался. В исходной версии удаляется всё вплоть до </think> включительно, что приводит к невидимому удалению рассуждений из целевых данных для обучения.
  • Оборачивает вывод сообщения ассистента маркерами {% generation %} / {% endgeneration %} для SFT-потерь только для ассистента. Тег <|tool▁outputs▁end|>, открывающий ход ассистента после выводов инструментов, остается вне маркеров, поскольку промпт уже заканчивается этим тегом.

deepseekv3_v3_training.jinja

Шаблон DeepSeek-V3 с исправлениями (используется в deepseek-ai/DeepSeek-V3). Тот же диф, что и в deepseek_r1_distill_training.jinja, применён к deepseekv3_v3.jinja: маркеры {% generation %} / {% endgeneration %} вокруг вывода сообщения ассистента для SFT с потерей только для ассистента, при этом <|Assistant|> и <|tool▁outputs▁end|>, открывающие ход ассистента, остаются за их пределами.

deepseekv3_v4_training.jinja

Шаблон DeepSeek-V3-0324 с исправлениями (используется в deepseek-ai/DeepSeek-V3-0324). Тот же диф, что и в deepseekv3_v2_training.jinja, применённый к deepseekv3_v4.jinja: | tojson для аргументов вызова инструмента, а также маркеры {% generation %} / {% endgeneration %} вокруг вывода ассистента.

diffusion_gemma_training.jinja

Шаблон Patched DiffusionGemma. Отличия от diffusion_gemma.jinja:

Оберните части хода модели, которые она генерирует (канал размышлений, вызовы инструментов, содержимое и закрывающий <turn|>), в {% generation %} / {% endgeneration %}, чтобы return_assistant_tokens_mask=True формировал корректные маски для SFT-потерь, рассчитываемых только по токенам ассистента. Ответы инструментов, встроенные в ход, поступают из среды и остаются вне блока генерации.

gemma_training.jinja

Шаблон Gemma с исправлениями (общий для Gemma и Gemma2, которые поставляются с идентичными шаблонами чата). Отличия от gemma.jinja:

Разделите вывод единого ассистента так, чтобы заголовок <start_of_turn>model\n (подсказка, а не сгенерированный моделью текст) находился вне блока генерации, и оберните содержимое ассистента маркерами {% generation %} / {% endgeneration %} для SFT-потерь только для ассистента.

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:

Закрывайте каждый ход ассистента внутри блока генерации маркером роли, который открывает следующий ход (<|observation|> после вызовов инструментов, в противном случае <|user|> или <|system|>). В исходном шаблоне GLM нет токена конца хода: ход завершается маркером роли следующего сообщения, и GLM объявляет <|user|> и <|observation|> как токены конца последовательности, поэтому в шаблоне обучения маркер добавляется к ходу ассистента, чтобы сохранить стоп-токен в маске потерь, а следующее сообщение больше не отображает собственный маркер.

Оберните вывод сообщения ассистента (включая блок размышлений и вызовы инструментов) маркерами {% 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-потерь, рассчитываемых только по токенам ассистента. Та часть блока размышлений, которую предзаполняет промпт генерации (<think>\n\n</think>\n\n при enable_thinking=False), остаётся за пределами маркеров, поскольку промпт уже завершается ею. Другие шаблоны обучения Qwen3 поступают аналогично с тем, что предзаполняет их собственный промпт генерации, например <think>\n.

qwen3_v2_training.jinja

Исправленный оригинальный шаблон Qwen3 (поставляемый с контрольными точками Qwen3 до мая 2025 г. и по-прежнему с базовыми контрольными точками 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

Шаблон GPT-OSS с исправлениями. Различия по сравнению с gptoss.jinja:

Оберните вывод сообщения ассистента в {% generation %} / {% endgeneration %}, чтобы return_assistant_tokens_mask=True формировал корректные маски для SFT-потерь, рассчитываемых только по токенам ассистента. Тег <|start|>assistant, открывающий ход, остаётся вне маркеров, поскольку промпт генерации уже заканчивается им.

idefics3_training.jinja

Шаблон 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

Шаблон Llava-Next с исправлениями. Отличия от llava_next.jinja:

  • Оборачивает вывод сообщения ассистента маркерами {% generation %} / {% endgeneration %} для SFT-потерь, вычисляемых только для ассистента.
  • Сохраняет пробел после </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

Шаблон Mistral Medium 3.5 с исправлениями. Различия по сравнению с 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

Шаблон Nemotron Nano с исправлениями. Отличия от nemotron_3_nano.jinja: исходный шаблон уже сохраняет префикс, поэтому изменение заключается в обёртке вывода сообщения ассистента в {% generation %} / {% endgeneration %}, чтобы return_assistant_tokens_mask=True формировал корректные маски для SFT-потерь, вычисляемых только по токенам ассистента. Та часть блока размышлений, которую промпт генерации заполняет заранее (<think>\n или <think></think> при enable_thinking=False), остаётся вне маркеров, поскольку промпт уже заканчивается ею.

nemotron_3_super_training.jinja

Исправленный шаблон Nemotron Super. Отличия от nemotron_3_super.jinja: аналогично nemotron_3_nano_training.jinja — исходный шаблон уже сохраняет префикс, поэтому изменение заключается в обёртке вывода сообщения ассистента в {% generation %} / {% endgeneration %}, чтобы return_assistant_tokens_mask=True формировал корректные маски для SFT-потерь только по сообщениям ассистента. Та часть блока размышлений, которую промпт генерации заполняет заранее (<think>\n, или <think></think> при enable_thinking=False), остаётся вне маркеров, поскольку промпт уже заканчивается ею.

nemotron_3_ultra_training.jinja

Патч шаблона Nemotron Ultra. Отличия от nemotron_3_ultra.jinja: аналогично nemotron_3_nano_training.jinja — исходный шаблон уже сохраняет префикс, поэтому изменение заключается в обёртке вывода сообщения ассистента в {% generation %} / {% endgeneration %}, чтобы return_assistant_tokens_mask=True формировал корректные маски для SFT-потерь только по сообщениям ассистента. Та часть блока размышлений, которую промпт генерации заполняет заранее (<think>\n или <think></think> при enable_thinking=False), остаётся вне маркеров, поскольку промпт уже заканчивается ею.

nemotron_3_5_lightning_training.jinja

Исправленный шаблон Nemotron 3.5 Lightning. Отличия от nemotron_3_5_lightning.jinja: аналогично nemotron_3_nano_training.jinja — исходный шаблон уже сохраняет префикс, поэтому изменение заключается в обёртке вывода сообщения ассистента в {% generation %} / {% endgeneration %}, чтобы return_assistant_tokens_mask=True формировал корректные маски для SFT-потерь только по сообщениям ассистента. Та часть блока размышлений, которую промпт генерации заполняет заранее (<think>\n, или <think></think> при enable_thinking=False), остаётся вне маркеров, поскольку промпт уже заканчивается ею.

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 (используется базовыми контрольными точками, такими как Qwen2.5-0.5B, чей шаблон отличается от 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, которые поставляются с более простой версией Qwen3 без разбора reasoning_content / <think>, отслеживания multi_step_tool или флага enable_thinking). Различия по сравнению с 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, чтобы блок размышлений всегда выводился (сохранение префикса), и обёртка вывода ассистента маркерами {% generation %} / {% endgeneration %} для расчёта функции потерь только для ответов ассистента при SFT.

qwen3_5_think_training.jinja / qwen3_5_nothink_training.jinja

Шаблон Qwen3.5 с исправлениями, использующий общую логику для обоих вариантов (они различаются только значением по умолчанию для флага enable_thinking):

  • qwen3_5_think_training.jinja по умолчанию включает режим размышлений и используется в Qwen3.5-4B и более крупных моделях.
  • qwen3_5_nothink_training.jinja по умолчанию отключает режим размышлений и используется в Qwen3.5-2B и более мелких моделях.

Diff по сравнению с 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, чтобы блок размышлений всегда выводился, а вывод ассистента обернут в {% generation %} / {% endgeneration %}).

qwen3_8_training.jinja

Шаблон Qwen3.8 с исправлениями. Отличия от qwen3_8.jinja: удалено условие preserve_thinking / loop.index0 > ns.last_query_index, чтобы блок размышлений всегда выводился — сохранение префикса теперь выполняется даже при передаче вызывающей стороной preserve_thinking=False — и вывод ассистента обернут маркерами {% generation %} / {% endgeneration %} для потери только на ассистенте при SFT, при этом та часть блока размышлений, которая предзаполняется промптом генерации, оставлена за их пределами.

smolvlm_training.jinja

Шаблон SmolVLM с исправлениями (используется также для SmolVLM2, который поставляется с идентичным побайтово шаблоном). Отличия от smolvlm.jinja:

Разделите сообщение ассистента на отдельную ветвь, чтобы маркеры {% generation %} / {% endgeneration %} обрамляли содержимое ассистента. Это позволяет return_assistant_tokens_mask=True формировать корректные маски для SFT-потерь, вычисляемых только по токенам ассистента.

Связанные утилиты

См. Chat Template Utilities для вспомогательных функций (clone_chat_template(), is_chat_template_prefix_preserving, get_training_chat_template()), которые работают с этими шаблонами.

Update on GitHub