Comment un LLM consomme du texte et fait son inférence ?

Cette annexe descend dans la mécanique d’inférence d’un LLM. Elle éclaire trois questions qu’on prend souvent pour acquises ailleurs dans le handbook : pourquoi un token coûte ce qu’il coûte, pourquoi au-delà de 70 % de fenêtre la qualité décroche, et ce que stabilise vraiment le prompt caching.

Le pipeline d’inférence se déroule en quatre temps : tokenisationembeddingstransformer (attention + feedforward) → unembedding. On les détaille dans l’ordre.

Le tokenizer

Les embeddings

Le transformer

Le rôle d’un transformer est d’enrichir les embeddings statiques en embeddings contextualisés : le vecteur de chat dans chat bleu diffère du vecteur de chat dans petit chat.

Un transformer est composé de couches empilées, chacune contenant deux sous-blocs (attention + feedforward), et correspondant à un cycle complet de contextualisation syntaxique et sémantique.

La sous-couche d’attention

Chaque couche du transformer contient plusieurs têtes d’attention qui fonctionnent en parallèle, apprises lors de l’entraînement. Chaque tête est spécialisée dans la capture de relations différentes entre les tokens, et ont appris à se focaliser sur des choses différentes (une tête gère les relations grammaticales, une autre relie les pronoms à leur sujet, une autre repère les entités nommées la grammaire, une autre le temps des verbes, etc.).

Pour chaque tête d’attention : afin d’analyser le texte “à sa façon”, chaque tête possède ses propres matrices de poids aux dimensions réduites. Ces matrices sont fixes pour une couche donnée lors de l’inférence :

L’analogie du “Catalogue” : Pour rendre le concept de Q,K,VQ, K, V plus intuitif, on utilise souvent l’analogie du système de recherche (bibliothèque ou moteur de recherche) :

Pour chaque token, dans chaque tête : la projection individuelle. Pour un token donné (représenté par son vecteur d’entrée xx, ce vecteur est celui de la couche précédente c-à-d l’embeddings initial mais déjà “chargé” du contexte accumulé dans les étapes précédentes), on utilise les matrices de la tête pour générer ses trois vecteurs spécifiques en multipliant le vecteur du token par les matrices Q,K,VQ, K, V:

Le mécanisme d’attention (~ l’interaction entre les tokens) : Pour un token donné, on compare sa requête (qq) avec les étiquettes (kk) de tous les autres tokens de la phrase via un produit scalaire. On applique ensuite une fonction softmax (qui transforme ces scores en probabilités de 0 à 1 dont la somme égale 1) pour obtenir une distribution de poids. Scores d’attention=softmax(qkT)\text{Scores d'attention} = \text{softmax}(q \cdot k^T) attention weights for the prompt "mary had a little"

On obtient un nouveau vecteur pour chaque token : V pondéré par le softmax (lissage de 0 à 1) du produit scalaire Q·K. Ce nouveau vecteur est la version contextualisée du token, sa sémantique contextualisée : il intègre les informations des autres tokens, pondérées par leur pertinence.

La sémantique contextualisée finale (La fusion multi-têtes) : Le token ne s’arrête pas là. Les vecteurs obtenus pour ce token dans toutes les têtes de la couche sont concaténés, puis projetés une dernière fois par une matrice de sortie globale (WOW_O). C’est ce vecteur final qui constitue la véritable sémantique contextualisée du token, enrichie par les expertises complémentaires de toutes les têtes (TODO décrire plus précisément cette Matrice Output et son rôle dans la fusion).

La sous-couche de feedforward

L’unembedding

Ce que la fenêtre de contexte stocke vraiment