Avancé 11 minQuantization

Qwen3 GGUF : corriger tokenizer et chat template

Réponse directe

Les erreurs de tokenizer et de chat template sur les GGUF Qwen3 se manifestent par trois symptômes : balise de réflexion jamais fermée, génération qui ne s'arrête pas, ou réponses hors sujet. La cause est presque toujours le chat template mal appliqué. Ajoutez --jinja pour utiliser le template embarqué dans le GGUF, vérifiez la provenance du fichier, et en dernier recours passez un template personnalisé.

Un GGUF Qwen3 qui « répond n'importe quoi » n'est presque jamais un problème de qualité du modèle : c'est un problème de mise en forme du prompt avant qu'il n'atteigne le modèle. Ce guide traite uniquement les erreurs de tokenizer et de chat template des GGUF Qwen3 : reconnaître le symptôme, vérifier la provenance du fichier, et corriger ou remplacer le template.

Par Mohamed Meguedmi·Màj 2026-09-28·Testé sur Windows, macOS, Linux

#Les trois symptômes à reconnaître

Trois signaux indiquent un problème de tokenizer ou de chat template plutôt qu'un problème de modèle : une balise de réflexion (généralement « think ») qui s'ouvre sans jamais se refermer dans la réponse, une génération qui continue indéfiniment sans s'arrêter à la fin logique de la réponse, ou un modèle qui répond hors sujet comme s'il n'avait pas compris qu'une question lui était posée. Dans les trois cas, le modèle lui-même n'est pas en cause : c'est la structure du texte qu'il reçoit en entrée qui est mal formée.

i
Pourquoi ça arrive spécifiquement sur Qwen3
Le chat template de Qwen3 gère une structure plus complexe que la plupart des modèles précédents : bascule entre mode réflexion et mode direct, appels d'outils, et une syntaxe Jinja avec des constructions (comme le slicing de liste) qui n'étaient pas toutes prises en charge par les premières versions du moteur de template de llama.cpp.

#La cause racine : le chat template

Le kit IA Locale

Ton ChatGPT privé et gratuit sur ta machine en 1 heure — LM Studio, Ollama, Open WebUI, tes documents, sans cloud.

  • Espace en ligne à vie
  • PDF + fichiers
  • Remboursé 30 j

Un modèle de langage ne reçoit jamais directement vos messages : un chat template les met en forme (balises de tour de parole, prompt système, marqueurs de début/fin) avant de les transformer en tokens. Si ce template est absent, mal choisi ou mal interprété par le moteur d'inférence, le modèle reçoit un texte qui ne ressemble pas à ce sur quoi il a été entraîné, et produit des sorties dégradées, même si les poids du modèle et le tokenizer eux-mêmes sont corrects.

#L'option --jinja : la première chose à vérifier

La documentation officielle Qwen recommande explicitement d'ajouter --jinja au lancement d'un GGUF Qwen3 avec llama.cpp : cette option indique d'utiliser le chat template embarqué dans le fichier GGUF, présentée comme la méthode à privilégier plutôt qu'un template générique choisi par défaut par le moteur.

Commande de référence documentée par Qwen
./llama-cli -hf Qwen/Qwen3-8B-GGUF:Q8_0 --jinja --color -ngl 99 -fa -sm row --temp 0.6 --top-k 20 --top-p 0.95 --min-p 0 -c 40960 -n 32768 --no-context-shift

Si votre commande de lancement ne contient pas --jinja, c'est la première correction à essayer avant toute autre hypothèse. Beaucoup de scripts et d'interfaces construits avant la généralisation de cette option l'omettent encore, ce qui explique une bonne part des rapports de « réponses cassées » sur des GGUF Qwen3 pourtant valides.

#Un bug de parsing connu et corrigé

Une erreur spécifique a touché llama.cpp sur le chat template Qwen3 : le moteur de template échouait à analyser une syntaxe Jinja de découpage de liste (messages[::-1]), utilisée pour parcourir l'historique de conversation à l'envers dans la logique d'appel d'outils. L'erreur remontée était un échec d'analyse pointant précisément cette ligne du template.

!
Message d'erreur à reconnaître
« Expected value expression at row 18, column 30 » suivi d'une ligne contenant messages[::-1] dans le template : c'est la signature exacte de ce bug de parsing. Il a été corrigé par une pull request ultérieure dans le dépôt llama.cpp ; si vous le rencontrez encore, la première chose à vérifier est la version de votre binaire llama.cpp, probablement antérieure au correctif.
  1. 01
    Identifier la version de llama.cpp utilisée
    Une version ancienne peut ne pas inclure le correctif de parsing pour la syntaxe de slicing utilisée par le template Qwen3.
  2. 02
    Mettre à jour vers une version récente
    Recompiler ou retélécharger un binaire llama.cpp à jour résout ce cas précis, sans avoir besoin de modifier le GGUF lui-même.
  3. 03
    Si la mise à jour n'est pas possible
    Passer un template personnalisé simplifié via --chat-template-file, en évitant la construction Jinja incriminée.

#llama-server et llama-cli ne se comportent pas pareil

Un comportement signalé dans le dépôt llama.cpp : activer --jinja avec llama-server peut faire disparaître le bloc de réflexion (le contenu entre les balises de pensée) de la réponse, alors que ce même bloc reste visible en utilisant llama-cli avec la même option et le même modèle. Si votre intégration dépend de la présence du contenu de réflexion dans la sortie (pour de l'observabilité ou du débogage), ce n'est pas un problème de tokenizer mais une différence de traitement entre les deux binaires — vérifier lequel des deux vous utilisez avant de chercher plus loin.

#Désactiver le mode réflexion de force

Qwen3 propose un mécanisme de bascule entre mode réflexion et mode direct au niveau du chat template. La documentation officielle Qwen indique cependant que ce mécanisme de désactivation forcée (hard switch) n'est pas exposé nativement dans llama.cpp : passer enable_thinking à false via les options de ligne de commande peut être ignoré selon la version, comme le montrent plusieurs signalements récents sur des variantes Qwen3.5.

Le contournement documenté par Qwen consiste à fournir un template personnalisé via --chat-template-file, dans lequel enable_thinking est fixé explicitement à false au niveau du template lui-même plutôt que transmis comme paramètre au moment de la requête. C'est plus fiable qu'un paramètre d'exécution qui dépend du support exact de votre version de llama.cpp.

#Vérifier la provenance d'un GGUF tiers

Une part des problèmes de tokenizer sur les GGUF Qwen3 ne vient pas de llama.cpp mais du fichier GGUF lui-même : une conversion faite avec une version ancienne des outils de conversion, ou un fichier dont le tokenizer a été mal exporté, produit des symptômes similaires (fin de génération absente, tokens spéciaux mal reconnus). Avant de chercher un bug côté moteur d'inférence, comparer la taille et la date de publication de votre fichier GGUF avec un dépôt reconnu (Qwen officiel, ou des re-quantifications documentées) permet d'écarter cette hypothèse.

→
Réflexe utile
Si un GGUF téléchargé récemment présente des erreurs de tokenizer qu'un GGUF plus ancien du même modèle ne présentait pas, retélécharger le fichier depuis sa source d'origine avant de suspecter un bug de llama.cpp : un téléchargement corrompu ou une conversion mal terminée sont des causes fréquentes et faciles à écarter.
Questions fréquentes
Pourquoi mon GGUF Qwen3 ne ferme jamais la balise « think » ?+
C'est le symptôme le plus courant d'un chat template mal appliqué. Vérifiez d'abord que votre commande inclut --jinja pour utiliser le template embarqué dans le GGUF plutôt qu'un template générique.
L'option --jinja règle-t-elle tous les problèmes de template Qwen3 ?+
Elle règle la majorité des cas, mais pas tous : un bug de parsing sur la syntaxe de slicing de liste a affecté certaines versions de llama.cpp, et le comportement diffère parfois entre llama-server et llama-cli sur l'affichage du bloc de réflexion.
Comment désactiver définitivement le mode réflexion de Qwen3 avec llama.cpp ?+
Le paramètre enable_thinking passé en ligne de commande peut être ignoré selon la version. La méthode documentée par Qwen consiste à fournir un template personnalisé via --chat-template-file où enable_thinking est fixé à false directement dans le template.
Un GGUF Qwen3 téléchargé récemment se comporte différemment d'un ancien : pourquoi ?+
Vérifiez d'abord la provenance et l'intégrité du fichier (retéléchargement depuis la source officielle) avant de suspecter un bug de llama.cpp : une conversion GGUF mal terminée produit des symptômes de tokenizer très proches d'un bug de template.
Ce guide vous a aidé ?

Un retour, une erreur, une précision ? Faites-nous signe, ça améliore le guide pour tout le monde.