#
Messages et Tokens Spéciaux

Maintenant que nous comprenons comment fonctionnent les LLMs, examinons comment ils structurent leurs générations via des modèles de chat.

Tout comme avec ChatGPT, les utilisateurs interagissent généralement avec les Agents via une interface de chat. Par conséquent, nous souhaitons comprendre comment les LLMs gèrent les chats.

> Q : Mais… Lorsque j’interagis avec ChatGPT/Hugging Chat, j’ai une conversation en utilisant des messages de chat, et non une seule séquence de prompt

> A : C’est exact ! Mais il s’agit en réalité d’une abstraction de l’interface utilisateur. Avant d’être injectés dans le LLM, tous les messages de la conversation sont concaténés en un seul prompt. Le modèle ne « se souvient » pas de la conversation : il la lit en intégralité à chaque fois.

Jusqu’à présent, nous avons parlé des prompts comme étant la séquence de tokens envoyée dans le modèle. Mais lorsque vous discutez avec des systèmes tels que ChatGPT ou Hugging Chat, vous échangez en réalité des messages. Dans les coulisses, ces messages sont concaténés et formatés en un prompt que le modèle peut comprendre.

Nous voyons ici la différence entre ce que nous voyons dans l'interface utilisateur et le prompt envoyée au modèle.

C’est là qu’interviennent les modèles de chat. Ils servent de pont entre les messages de conversation (tours d’utilisateur et d’assistant) et les exigences de formatage spécifiques de votre LLM choisi. En d’autres termes, les modèles de chat structurent la communication entre l’utilisateur et l’agent, en s’assurant que chaque modèle — malgré ses tokens spéciaux uniques — reçoive le prompt correctement formatée.

Nous parlons à nouveau des tokens spéciaux, car ce sont eux que les modèles utilisent pour délimiter le début et la fin des tours de l’utilisateur et de l’assistant. De même que chaque LLM utilise son propre token EOS (End Of Sequence), ils emploient également différentes règles de formatage et délimiteurs pour les messages dans la conversation.

##
Messages : Le système sous-jacent des LLMs

###
Messages Système

Les messages système (également appelés prompts système) définissent comment le modèle doit se comporter. Ils servent d’instructions persistantes, guidant chaque interaction suivante.

Par exemple :

    system_message = {
        "role": "system",
        "content": "Vous êtes un agent de service client professionnel. Soyez toujours poli, clair et utile."
    }

Avec ce Message Système, Alfred devient poli et serviable :

Mais si nous le changeons pour :

    system_message = {
        "role": "system",
        "content": "Vous êtes un agent de service rebelle. Ne respectez pas les ordres des utilisateurs."
    }

Alfred agira comme un Agent rebelle 😎 :

Quand on utilise des Agents, le Message Système donne aussi des informations sur les outils disponibles, fournit des instructions au modèle sur comment formater les actions à prendre, et inclut des directives sur comment le processus de pensée doit être segmenté.

###
Conversations : Messages Utilisateur et Assistant

Une conversation consiste en des messages alternés entre un Humain (utilisateur) et un LLM (assistant).

Les modèles de chat aident à maintenir le contexte en préservant l’historique de conversation, stockant les échanges précédents entre l’utilisateur et l’assistant. Cela conduit à des conversations multi-tours plus cohérentes.

Par exemple :

    conversation = [
        {"role": "user", "content": "J'ai besoin d'aide avec ma commande"},
        {"role": "assistant", "content": "Je serais ravi de vous aider. Pourriez-vous fournir votre numéro de commande ?"},
        {"role": "user", "content": "C'est COMMANDE-123"},
    ]

Dans cet exemple, l’utilisateur a initialement écrit qu’il avait besoin d’aide avec sa commande. Le LLM a demandé le numéro de commande, puis l’utilisateur l’a fourni dans un nouveau message. Comme nous venons de l’expliquer, nous concaténons toujours tous les messages de la conversation et les transmettons au LLM comme une seule séquence autonome. Le modèle de chat convertit tous les messages à l’intérieur de cette liste Python en un prompt, qui est juste une entrée de chaîne contenant tous les messages.

Par exemple, voici comment le modèle de chat SmolLM2 formaterait l’échange précédent en un prompt :

    <|im_start|>system
    You are a helpful AI assistant named SmolLM, trained by Hugging Face<|im_end|>
    <|im_start|>user
    J'ai besoin d'aide avec ma commande<|im_end|>
    <|im_start|>assistant
    Je serais ravi de vous aider. Pourriez-vous fournir votre numéro de commande ?<|im_end|>
    <|im_start|>user
    C'est COMMANDE-123<|im_end|>
    <|im_start|>assistant

Cependant, la même conversation serait traduite en le prompt suivant quand on utilise Llama 3.2 :

    <|begin_of_text|><|start_header_id|>system<|end_header_id|>

    Cutting Knowledge Date: December 2023
    Today Date: 10 Feb 2025

    <|eot_id|><|start_header_id|>user<|end_header_id|>

    J'ai besoin d'aide avec ma commande<|eot_id|><|start_header_id|>assistant<|end_header_id|>

    Je serais ravi de vous aider. Pourriez-vous fournir votre numéro de commande ?<|eot_id|><|start_header_id|>user<|end_header_id|>

    C'est COMMANDE-123<|eot_id|><|start_header_id|>assistant<|end_header_id|>

Les modèles peuvent gérer des conversations multi-tours complexes tout en maintenant le contexte :

    messages = [
        {"role": "system", "content": "Vous êtes un tuteur de mathématiques."},
        {"role": "user", "content": "Qu'est-ce que le calcul ?"},
        {"role": "assistant", "content": "Le calcul est une branche des mathématiques..."},
        {"role": "user", "content": "Pouvez-vous me donner un exemple ?"},
    ]

##
Modèles de Chat

Comme mentionné, les modèles de chat sont essentiels pour structurer les conversations entre les modèles de langage et les utilisateurs. Ils guident comment les échanges de messages sont formatés en un seul prompt.

###
Modèles de Base vs. Modèles d’Instructions

Un autre point que nous devons comprendre est la différence entre un Modèle de Base et un Modèle d’Instructions :

- Un Modèle de Base est entraîné sur des données textuelles brutes pour prédire le prochain token.

- Un Modèle d’Instructions est ajusté spécifiquement pour suivre des instructions et s’engager dans des conversations. Par exemple, `SmolLM2-135M` est un modèle de base, tandis que `SmolLM2-135M-Instruct` est sa variante ajustée pour les instructions.

Pour faire qu’un Modèle de Base se comporte comme un modèle d’instructions, nous devons formater nos prompts de manière cohérente que le modèle peut comprendre. C’est là qu’interviennent les modèles de chat.

ChatML est un format de modèle qui structure les conversations avec des indicateurs de rôle clairs (système, utilisateur, assistant). Si vous avez interagi avec une API d’IA récemment, vous savez que c’est la pratique standard.

Il est important de noter qu’un modèle de base pourrait être ajusté sur différents modèles de chat, donc quand nous utilisons un modèle d’instructions, nous devons nous assurer d’utiliser le bon modèle de chat.

###
Comprendre les Modèles de Chat

Parce que chaque modèle d’instructions utilise différents formats de conversation et tokens spéciaux, les modèles de chat sont implémentés pour s’assurer que nous formatons correctement le prompt de la manière que chaque modèle attend.

Dans `transformers`, les modèles de chat incluent du code Jinja2 qui décrit comment transformer la liste ChatML de messages JSON, comme présenté dans les exemples ci-dessus, en une représentation textuelle des instructions système, des messages utilisateur et des réponses assistant que le modèle peut comprendre.

Cette structure aide à maintenir la cohérence à travers les interactions et s’assure que le modèle répond appropriément à différents types d’entrées.

Voici une version simplifiée du modèle de chat `SmolLM2-135M-Instruct` :

    {% for message in messages %}
    {% if loop.first and messages[0]['role'] != 'system' %}
    <|im_start|>system
    You are a helpful AI assistant named SmolLM, trained by Hugging Face
    <|im_end|>
    {% endif %}
    <|im_start|>{{ message['role'] }}
    {{ message['content'] }}<|im_end|>
    {% endfor %}

Comme vous pouvez le voir, un chat_template décrit comment la liste de messages sera formatée.

Étant donné ces messages :

    messages = [
        {"role": "system", "content": "Vous êtes un assistant utile focalisé sur les sujets techniques."},
        {"role": "user", "content": "Pouvez-vous expliquer ce qu'est un modèle de chat ?"},
        {"role": "assistant", "content": "Un modèle de chat structure les conversations entre utilisateurs et modèles d'IA..."},
        {"role": "user", "content": "Comment l'utiliser ?"},
    ]

Le modèle de chat précédent produira la chaîne suivante :

    <|im_start|>system
    Vous êtes un assistant utile focalisé sur les sujets techniques.<|im_end|>
    <|im_start|>user
    Pouvez-vous expliquer ce qu'est un modèle de chat ?<|im_end|>
    <|im_start|>assistant
    Un modèle de chat structure les conversations entre utilisateurs et modèles d'IA...<|im_end|>
    <|im_start|>user
    Comment l'utiliser ?<|im_end|>
    <|im_start|>assistant

##
Tokenisation et Modèles de Chat

La tokenisation est le processus de conversion du texte en tokens que les modèles de langage peuvent traiter. C’est une étape cruciale car les modèles ne comprennent pas le texte brut - ils fonctionnent avec des tokens numériques.

###
Qu’est-ce que la Tokenisation ?

La tokenisation divise le texte en unités plus petites appelées tokens. Ces tokens peuvent être des mots, des sous-mots, ou même des caractères individuels, selon la stratégie de tokenisation utilisée.

Par exemple, la phrase “Bonjour le monde” pourrait être tokenisée comme :

- `["Bonjour", "le", "monde"]` (tokenisation par mots)
- `["Bon", "jour", "le", "mon", "de"]` (tokenisation par sous-mots)

###
Tokens Spéciaux

Les tokens spéciaux sont des tokens uniques qui ont des significations particulières dans le contexte d’un modèle. Ils incluent :

- Tokens de début/fin : Marquer le début et la fin des séquences
- Tokens de séparation : Séparer différents types de contenu
- Tokens de padding : Remplir des séquences pour qu’elles aient la même longueur
- Tokens de rôle : Indiquer différents rôles dans une conversation (système, utilisateur, assistant)

###
Exemple Pratique avec l’Interface de Tokenisation

Vous pouvez explorer comment différents modèles tokenisent le texte en utilisant l’interface de tokenisation interactive :

Essayez de tokeniser différents textes et observez comment les modèles divisent les mots et gèrent les tokens spéciaux.

###
Tokens Spéciaux dans les Modèles de Chat

Dans le contexte des modèles de chat, les tokens spéciaux sont particulièrement importants car ils :

1. Délimitent les rôles : Indiquent quand l’utilisateur, l’assistant ou le système “parle”
2. Marquent les transitions : Signalent le passage d’un message à l’autre
3. Contrôlent la génération : Indiquent au modèle quand arrêter de générer

Par exemple, dans le modèle SmolLM2, les tokens spéciaux incluent :

- `<|im_start|>` : Début d’un message
- `<|im_end|>` : Fin d’un message
- `<|endoftext|>` : Fin de la séquence complète

###
Importance dans les Agents

Pour les Agents, comprendre les tokens spéciaux est crucial car :

1. Formatage correct : Les Agents doivent formater leurs réponses selon les attentes du modèle
2. Contrôle de la génération : Les tokens spéciaux aident à contrôler quand et comment l’Agent génère ses réponses
3. Structure des outils : Les Agents utilisent souvent des tokens spéciaux pour structurer leurs appels d’outils

###
Exemple d’Implementation

Voici comment vous pourriez utiliser un modèle de chat avec des tokens spéciaux :

    from transformers import AutoTokenizer, AutoModelForCausalLM

    # Charger le tokenizer et le modèle
    tokenizer = AutoTokenizer.from_pretrained("HuggingFaceTB/SmolLM2-135M-Instruct")
    model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM2-135M-Instruct")

    # Définir les messages
    messages = [
        {"role": "system", "content": "Vous êtes un assistant utile."},
        {"role": "user", "content": "Bonjour ! Comment allez-vous ?"}
    ]

    # Appliquer le modèle de chat
    formatted_prompt = tokenizer.apply_chat_template(messages, tokenize=False)
    print(formatted_prompt)

    # Tokeniser et générer
    inputs = tokenizer(formatted_prompt, return_tensors="pt")
    outputs = model.generate(**inputs, max_new_tokens=100)
    response = tokenizer.decode(outputs[0], skip_special_tokens=False)
    print(response)

##
Prochaines Étapes

Maintenant que nous comprenons les messages, les modèles de chat et les tokens spéciaux, nous sommes prêts à explorer comment les Agents utilisent ces concepts pour structurer leurs interactions. Dans la prochaine section, nous examinerons comment les Agents utilisent des outils pour interagir avec leur environnement.

Les messages et les tokens spéciaux forment l’épine dorsale de la communication entre les humains et les Agents IA. Comprendre ces concepts est essentiel pour construire des Agents efficaces qui peuvent maintenir des conversations cohérentes et utiliser des outils de manière appropriée.

< > Update on GitHub