> For the complete documentation index, see [llms.txt](https://unsloth.ai/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://unsloth.ai/docs/fr/notions-de-base/chat-templates.md).

# Modèles de conversation

Découvrez les fondamentaux et les options de personnalisation des modèles de conversation, notamment les formats Conversationnel, ChatML, ShareGPT, Alpaca, et plus encore !

Sur notre GitHub, nous avons une liste de tous les modèles de chat qu'Unsloth utilise, y compris pour Llama, Mistral, Phi-4, etc. Donc si vous avez besoin d'indications sur le format ou le cas d'utilisation, vous pouvez les consulter ici : [github.com/unslothai/unsloth/blob/main/unsloth/chat\_templates.py](https://github.com/unslothai/unsloth/blob/main/unsloth/chat_templates.py)

#### Liste des notebooks de modèles de chat Colab :

* [Conversationnel](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_\(1B_and_3B\)-Conversational.ipynb)
* [ChatML](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_\(8B\)-Ollama.ipynb)
* [Ollama](https://colab.research.google.com/drive/1WZDi7APtQ9VsvOrQSSC5DDtxq159j8iZ?usp=sharing)
* [Classification de texte](https://github.com/timothelaborie/text_classification_scripts/blob/main/unsloth_classification.ipynb) par Timotheeee
* [Jeux de données multiples](https://colab.research.google.com/drive/1njCCbE1YVal9xC83hjdo2hiGItpY_D6t?usp=sharing) par Flail

### Ajout de nouveaux jetons

Unsloth a une fonction appelée `add_new_tokens` qui vous permet d'ajouter de nouveaux jetons à votre fine-tuning. Par exemple, si vous souhaitez ajouter `<CHARACTER_1>`, `<THINKING>` et `<SCRATCH_PAD>` nous pouvons faire ce qui suit :

```python
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(...)
```

{% hint style="warning" %}
Remarque - vous DEVEZ toujours appeler `add_new_tokens` avant `FastLanguageModel.get_peft_model`!
{% endhint %}

## Conversations à plusieurs tours

Un problème si vous ne l’aviez pas remarqué est que l’ensemble de données Alpaca est à tour unique, alors que rappelez-vous que l’utilisation de ChatGPT était interactive et que vous pouviez lui parler en plusieurs tours. Par exemple, la partie gauche est ce que nous voulons, mais la partie droite, qui est l’ensemble de données Alpaca, ne fournit que des conversations uniques. Nous voulons que le modèle de langage affiné apprenne en quelque sorte à faire des conversations à plusieurs tours, tout comme ChatGPT.

<figure><img src="https://550366147-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-2a65cd74ddd03a6bcbbc9827d9d034e4879a8e6a%2Fdiff.png?alt=media" alt=""><figcaption></figcaption></figure>

Nous avons donc introduit le `conversation_extension` paramètre, qui sélectionne essentiellement certaines lignes aléatoires dans votre ensemble de données à tour unique, et les fusionne en une seule conversation ! Par exemple, si vous le réglez sur 3, nous sélectionnons aléatoirement 3 lignes et les fusionnons en 1 ! Les régler trop longtemps peut rendre l’entraînement plus lent, mais cela peut améliorer considérablement votre chatbot et votre affinage final !

<figure><img src="https://550366147-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-2b1b3494b260f1102942d86143a885225c6a06f2%2Fcombine.png?alt=media" alt=""><figcaption></figcaption></figure>

Puis réglez `output_column_name` vers la colonne de prédiction / sortie. Pour le jeu de données Alpaca, ce serait la colonne de sortie.

Nous utilisons ensuite la fonction `standardize_sharegpt` pour mettre simplement l’ensemble de données dans un format correct pour l’affinage ! Appelez toujours cela !

<figure><img src="https://550366147-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-7bf83bf802191bda9e417bbe45afa181e7f24f38%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

## Modèles de chat personnalisables

Nous pouvons maintenant spécifier le modèle de chat pour l’affinage lui-même. Le très célèbre format Alpaca est ci-dessous :

<figure><img src="https://550366147-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-59737e6dcb09fed15487d5a57c69f07cb40bb8e7%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

Mais rappelez-vous que nous avons dit que c’était une mauvaise idée car les affinages de type ChatGPT ne requièrent qu’une seule invite ? Puisque nous avons fusionné avec succès toutes les colonnes de l’ensemble de données en une seule grâce à Unsloth, nous pouvons essentiellement créer le modèle de chat ci-dessous avec 1 colonne d’entrée (instruction) et 1 sortie :

<figure><img src="https://550366147-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-d54582ae98c396d51bfb85628b46c54f2517d030%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

Nous vous demandons simplement de mettre un `{INPUT}` champ pour l’instruction et un `{OUTPUT}` champ pour le champ de sortie du modèle. Nous autorisons en fait aussi un `{SYSTEM}` champ facultatif, utile pour personnaliser une invite système, tout comme dans ChatGPT. Par exemple, voici quelques exemples sympas pour lesquels vous pouvez personnaliser le modèle de chat :

<figure><img src="https://550366147-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-cc455dc380d3d44ef136e485754964159dc773d8%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

Pour le format ChatML utilisé dans les modèles OpenAI :

<figure><img src="https://550366147-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-15bfca9cfadf10d54b4d3f66e3050044317d62c5%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

Ou vous pouvez utiliser le modèle Llama-3 lui-même (qui ne fonctionne qu’en utilisant la version instruct de Llama-3) : Nous autorisons en fait aussi un `{SYSTEM}` champ facultatif, utile pour personnaliser une invite système, tout comme dans ChatGPT.

<figure><img src="https://550366147-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-80a2ed4de2ca323ac192c513cac65e9e8bf475db%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

Ou dans la tâche de prédiction Titanic où vous deviez prédire si un passager est mort ou a survécu dans ce notebook Colab qui inclut le téléversement de fichiers CSV et Excel : <https://colab.research.google.com/drive/1VYkncZMfGFkeCEgN2IzbZIKEDkyQuJAS?usp=sharing>

<figure><img src="https://550366147-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-20911ab305c1a10e85859c703157b80175141eb1%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

## Application des modèles de chat avec Unsloth

Pour les jeux de données qui suivent généralement le format chatml courant, le processus de préparation du jeu de données pour l'entraînement ou le fine-tuning consiste en quatre étapes simples :

* Vérifiez les modèles de chat actuellement pris en charge par Unsloth :\\

  ```
  from unsloth.chat_templates import CHAT_TEMPLATES
  print(list(CHAT_TEMPLATES.keys()))
  ```

  \
  Cela affichera la liste des modèles actuellement pris en charge par Unsloth. Voici un exemple de sortie :\\

  ```
  ['unsloth', 'zephyr', 'chatml', 'mistral', 'llama', 'vicuna', 'vicuna_old', 'vicuna old', 'alpaca', 'gemma', 'gemma_chatml', 'gemma2', 'gemma2_chatml', 'llama-3', 'llama3', 'phi-3', 'phi-35', 'phi-3.5', 'llama-3.1', 'llama-31', 'llama-3.2', 'llama-3.3', 'llama-32', 'llama-33', 'qwen-2.5', 'qwen-25', 'qwen25', 'qwen2.5', 'phi-4', 'gemma-3', 'gemma3']
  ```

  \\\\
* Utilisez `get_chat_template` pour appliquer le bon modèle de chat à votre tokenizer :\\

  ```
  from unsloth.chat_templates import get_chat_template

  tokenizer = get_chat_template(
      tokenizer,
      chat_template = "gemma-3", # modifiez ceci avec le bon nom de chat_template
  )
  ```

  \\\\
* Définissez votre fonction de formatage. Voici un exemple :\\

  ```
  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, }
  ```

  \
  \
  Cette fonction parcourt votre jeu de données en appliquant le modèle de chat que vous avez défini à chaque exemple.\\
* Enfin, chargeons le jeu de données et appliquons les modifications requises à notre jeu de données : \\

  ```
  # Importer et charger le jeu de données
  from datasets import load_dataset
  dataset = load_dataset("repo_name/dataset_name", split = "train")

  # Appliquez la fonction de formatage à votre jeu de données à l'aide de la méthode map
  dataset = dataset.map(formatting_prompts_func, batched = True,)
  ```

  \
  Si votre jeu de données utilise le format ShareGPT avec les clés "from"/"value" au lieu du format ChatML "role"/"content", vous pouvez utiliser la `standardize_sharegpt` fonction pour le convertir d'abord. Le code révisé ressemblera désormais à ceci :\
  \\

  ```
  # Importer le jeu de données
  from datasets import load_dataset
  dataset = load_dataset("mlabonne/FineTome-100k", split = "train")

  # Convertissez votre jeu de données au format "role"/"content" si nécessaire
  from unsloth.chat_templates import standardize_sharegpt
  dataset = standardize_sharegpt(dataset)

  # Appliquez la fonction de formatage à votre jeu de données à l'aide de la méthode map
  dataset = dataset.map(formatting_prompts_func, batched = True,)
  ```

## Plus d'informations

En supposant que votre jeu de données soit une liste de listes de dictionnaires comme ci-dessous :

```python
[
    [{'from': 'human', 'value': 'Salut !'},
     {'from': 'gpt', 'value': 'Salut, comment puis-je vous aider ?'},
     {'from': 'human', 'value': 'Combien font 2+2 ?'}],
    [{'from': 'human', 'value': 'Comment vous appelez-vous ?'},
     {'from': 'gpt', 'value': 'Je suis Daniel !'},
     {'from': 'human', 'value': 'D'accord ! Sympa !'},
     {'from': 'gpt', 'value': 'Que puis-je faire pour vous ?'},
     {'from': 'human', 'value': 'Oh rien :)'}],
]
```

Vous pouvez utiliser notre `get_chat_template` pour le formater. Sélectionnez `chat_template` pour qu'il puisse être l'un des `zephyr, chatml, mistral, llama, alpaca, vicuna, vicuna_old, unsloth`, et utiliser `mappage` pour mapper les valeurs du dictionnaire `de`, `valeur` etc. `map_eos_token` vous permet de mapper `<|im_end|>` vers EOS sans aucun entraînement.

```python
from unsloth.chat_templates import get_chat_template

tokenizer = get_chat_template(
    tokenizer,
    chat_template = "chatml", # prend en charge zephyr, chatml, mistral, llama, alpaca, vicuna, vicuna_old, unsloth
    mapping = {"role" : "from", "content" : "value", "user" : "human", "assistant" : "gpt"}, # style ShareGPT
    map_eos_token = True, # Mappe <|im_end|> vers </s> à la place
)

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, }
pass

from datasets import load_dataset
dataset = load_dataset("philschmid/guanaco-sharegpt-style", split = "train")
dataset = dataset.map(formatting_prompts_func, batched = True,)
```

Vous pouvez aussi créer vos propres modèles de chat personnalisés ! Par exemple, notre modèle de chat interne utilisé est ci-dessous. Vous devez passer un `tuple` de `(custom_template, eos_token)` où le `eos_token` doit être utilisé à l'intérieur du modèle.

```python
unsloth_template = \
    "{{ bos_token }}"\
    "{{ 'Vous êtes un assistant utile pour l'utilisateur\n' }}"\
    "</div>"\
    "<div data-gb-custom-block data-tag="for">"\
        "<div data-gb-custom-block data-tag="if" data-0='role' data-1='role' data-2='] == ' data-3='user'>"\
            "{{ '>>> Utilisateur : ' + message['content'] + '\n' }}"\
        "<div data-gb-custom-block data-tag="elif" data-0='role' data-1='role' data-2='] == ' data-3='assistant'></div>"\
            "{{ '>>> Assistant : ' + message['content'] + eos_token + '\n' }}"\
        "</div>"\
    "</div>"\
    "<div data-gb-custom-block data-tag="if">"\
        "{{ '>>> Assistant : ' }}"\
    "</div>"
unsloth_eos_token = "eos_token"

tokenizer = get_chat_template(
    tokenizer,
    chat_template = (unsloth_template, unsloth_eos_token,), # Vous devez fournir un modèle et un jeton EOS
    mapping = {"role" : "from", "content" : "value", "user" : "human", "assistant" : "gpt"}, # style ShareGPT
    map_eos_token = True, # Mappe <|im_end|> vers </s> à la place
)
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://unsloth.ai/docs/fr/notions-de-base/chat-templates.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
