XML Output
Un XML output est une sortie de LLM formatée en XML (Extensible Markup Language), utilisant des balises ouvrantes et fermantes pour structurer l’information de manière hiérarchique et sémantiquement explicite.
- Catégorie
- Format de sortie / Prompt Engineering
- Support natif API
- Aucun mode « XML natif » chez les principaux providers (pas d’équivalent du JSON mode)
- Obtenu via
- Instructions dans le prompt + exemples. Pas de contrainte côté serveur.
- Modèles performants
- Les modèles Claude (Anthropic) sont particulièrement efficaces avec le XML grâce à leur entraînement sur ce format
- Avantage principal
- Balises sémantiques, extraction facile par regex ou parser, naturel pour le contenu mixte texte/structure
- Verdict
- Format sous-estimé, excellent pour l’extraction de contenu et les prompts complexes. Pas de garantie côté serveur comme le JSON, mais très fiable en pratique avec les bons modèles.
Pourquoi utiliser du XML comme sortie de LLM
Dans un écosystème dominé par le JSON, le XML peut sembler anachronique. Pourtant, pour certains cas d’usage, c’est le format le plus adapté comme sortie de LLM. Voici les situations où le XML surpasse le JSON :
Le contenu mixte texte/structure. Le XML excelle quand la sortie combine du texte libre et des annotations structurées. Exemple : un paragraphe de texte avec des entités balisées (<entity type="person">Marie Curie</entity>), des passages importants surlignés (<highlight>...</highlight>), ou des sections thématiques (<section topic="methodology">...</section>). En JSON, encapsuler du texte libre avec des annotations inline est nettement plus complexe.
La hiérarchie sémantique. Les balises XML portent un sens sémantique immédiat. <thinking>...</thinking> est plus lisible et plus facile à extraire que {"thinking": "..."}. Les modèles Claude d’Anthropic utilisent d’ailleurs nativement des balises XML dans leur format de raisonnement interne et dans les prompts recommandés.
L’extraction par regex. Extraire du contenu d’une sortie XML avec une regex est trivial : re.findall(r'<answer>(.*?)</answer>', output). C’est plus simple et plus robuste que parser un objet JSON complet quand vous n’avez besoin que d’un champ spécifique.
Les prompts structurés. Le XML est le format recommandé par Anthropic pour structurer les prompts complexes envoyés à Claude. Les balises <role>, <constraints>, <context>, <output_format> dans le system prompt sont mieux interprétées par Claude que leurs équivalents en Markdown ou en texte brut. Par symétrie, demander une sortie XML produit des résultats très cohérents.
XML output vs JSON output
| Critère | XML Output | JSON Output |
|---|---|---|
| Mode natif API | Non (aucun provider) | Oui (OpenAI, Mistral, Groq, Gemini) |
| Garantie de validité | Aucune (dépend du prompt) | Garantie en JSON mode / structured outputs |
| Contenu mixte | Excellent (texte + balises inline) | Complexe (nécessite des structures imbriquées) |
| Lisibilité humaine | Bonne (balises sémantiques) | Moyenne (notation technique) |
| Extraction partielle | Facile (regex sur balises) | Nécessite un parsing complet |
| Verbosité | Élevée (balises ouvrantes + fermantes) | Modérée (clés + valeurs) |
| Typage | Non typé nativement | Typé (string, number, boolean) |
| Écosystème de validation | XSD, DTD (peu utilisés avec les LLM) | JSON Schema (largement supporté) |
| Coût en tokens | Plus élevé (balises doublées) | Inférieur |
<name>Marie</name> (5 tokens environ) vs "name": "Marie" (4 tokens environ). Sur des sorties volumineuses, la différence s’additionne. Si le coût en tokens est un critère important et que vous n’avez pas besoin de contenu mixte, le JSON est plus économique.
Comment obtenir une sortie XML d’un LLM
Via le prompt
La méthode la plus directe : demandez au modèle de répondre en XML dans le system prompt ou le user prompt, et fournissez un exemple du format attendu.
Analysez le texte suivant et retournez votre analyse dans ce format XML exact :
<analysis>
<sentiment>positif|négatif|neutre</sentiment>
<confidence>0.0 à 1.0</confidence>
<key_topics>
<topic>sujet identifié</topic>
</key_topics>
<summary>résumé en une phrase</summary>
</analysis>
Ne produisez rien d'autre que le XML. Pas de texte avant ou après.
Avec les modèles Claude, cette approche est très fiable. Anthropic a spécifiquement entraîné ses modèles à bien gérer les entrées et sorties XML, et les résultats sont généralement conformes au format demandé dès le premier essai.
Via le prefilling
Chez Anthropic, vous pouvez utiliser le prefilling de l’assistant message pour commencer la réponse par la balise ouvrante :
{
"model": "claude-opus-4-6",
"messages": [
{"role": "user", "content": "Analyse le sentiment de ce texte : 'Service déplorable'"},
{"role": "assistant", "content": "<analysis>n <sentiment>"}
]
}
Le modèle continuera à partir de <sentiment>, produisant naturellement le reste du XML. Cette technique est l’équivalent XML du prefilling JSON avec {, et elle est tout aussi efficace pour contraindre le format de sortie.
Extraction programmatique
Une fois la sortie XML obtenue, l’extraction est directe :
import re
from xml.etree import ElementTree as ET
# Méthode 1 : Regex simple (rapide, adapté aux cas simples)
sentiment = re.search(r'<sentiment>(.*?)</sentiment>', xml_output).group(1)
# Méthode 2 : Parser XML complet (robuste, adapté aux structures complexes)
root = ET.fromstring(xml_output)
sentiment = root.find('sentiment').text
topics = [t.text for t in root.findall('.//topic')]
xml.etree.ElementTree en Python, DOMParser en JavaScript). Le parser échouera si le XML est invalide, ce qui est en fait un avantage : vous détectez les erreurs immédiatement.
Cas d’usage où le XML excelle
Annotation de texte
Le XML est le format naturel pour les tâches d’annotation en ligne. Le modèle peut retourner le texte original avec des balises d’annotation insérées aux endroits pertinents :
<annotated_text> <entity type="person">Marie Curie</entity> a reçu le <entity type="award">prix Nobel de physique</entity> en <entity type="date">1903</entity> pour ses travaux sur <entity type="topic">la radioactivité</entity>. </annotated_text>
En JSON, représenter cette annotation inline nécessiterait une structure d’offsets beaucoup plus complexe et moins lisible.
Génération de contenu structuré
Pour la génération de documents avec une structure éditoriale (articles, rapports, fiches produit), le XML permet de séparer clairement le contenu des métadonnées tout en gardant le texte lisible. Le modèle peut produire un article balisé avec <title>, <introduction>, <section>, <conclusion> que votre pipeline transforme ensuite en HTML, PDF ou DOCX.
Chain-of-Thought structuré
Le XML est le format recommandé par Anthropic pour structurer les différentes étapes d’un raisonnement dans le prompt :
<thinking> L'utilisateur demande une comparaison entre deux approches. Je dois considérer les critères de coût, performance et facilité. </thinking> <answer> L'approche A est recommandée pour votre cas d'usage parce que... </answer>
Ce format permet au développeur d’extraire facilement le raisonnement (<thinking>) séparément de la réponse finale (<answer>), sans parser un objet JSON complet. C’est la technique utilisée dans de nombreux systèmes d’évaluation et de monitoring de la qualité des réponses.
Prompts d’entrée structurés
Le XML n’est pas uniquement un format de sortie. C’est aussi le format recommandé par Anthropic pour structurer les prompts d’entrée complexes. Encapsuler le contexte dans des balises <context>, les instructions dans <instructions>, et les exemples dans <examples> améliore la capacité du modèle à distinguer les différentes parties du prompt et à suivre les instructions. La cohérence entre le format d’entrée et de sortie (XML dans les deux cas) produit les meilleurs résultats avec les modèles Claude.
Fiabilité du XML output
Sans mode natif côté API, la fiabilité du XML output dépend entièrement de la qualité du prompt et du modèle. En pratique, les résultats varient significativement :
Claude (Anthropic) : excellente fiabilité. Les modèles Claude sont entraînés pour produire du XML bien formé. Avec un prompt clair et un exemple, le taux de conformité est proche de 100 % sur des structures simples à moyennes. Les cas d’échec surviennent surtout sur des structures très complexes avec des imbrications profondes.
GPT-5.4 (OpenAI) : bonne fiabilité. Le modèle produit généralement du XML correct, mais peut occasionnellement ajouter du texte avant ou après le bloc XML, ou oublier une balise fermante sur les structures longues. Le prefilling n’est pas disponible côté OpenAI, ce qui rend la contrainte moins forte que chez Anthropic.
Modèles open source : fiabilité variable selon la taille et l’entraînement du modèle. Les modèles 70B+ (Llama 3, Qwen 2.5) gèrent bien le XML simple. Les modèles plus petits (7B, 14B) ont tendance à produire du XML malformé sur les structures complexes.
XML dans les systèmes agentiques
Le XML joue un rôle croissant dans les architectures agentiques, notamment chez Anthropic. Le format est utilisé à plusieurs niveaux. Les prompts système des agents IA utilisent des balises XML pour séparer clairement les sections (rôle, outils, contraintes, exemples). Les résultats intermédiaires d’un agent multi-étapes peuvent être structurés en XML pour faciliter l’extraction par les étapes suivantes. Les citations et références dans les réponses Claude utilisent un format basé sur des balises (<cite>) qui s’apparente à du XML.
L’avantage du XML dans ce contexte est sa capacité à encapsuler du contenu riche (texte, données structurées, métadonnées) dans un format que le modèle comprend nativement. Là où le JSON force une séparation rigide entre texte et données, le XML permet de les entremêler naturellement, ce qui correspond mieux au flux de travail d’un agent qui produit à la fois du raisonnement textuel et des données structurées.
XML comme format d’entrée
L’une des utilisations les plus efficaces du XML avec les LLM n’est pas en sortie mais en entrée. Anthropic recommande explicitement l’utilisation de balises XML pour structurer les prompts envoyés à Claude. Voici un exemple de prompt structuré en XML :
<instructions> Vous êtes un analyste de données. Analysez le dataset fourni et identifiez les tendances principales. </instructions> <data> Mois,Ventes,Croissance Janvier,45000,+12% Février,48000,+6.7% Mars,42000,-12.5% </data> <output_format> Retournez votre analyse en XML avec les balises : <trends>, <trend>, <recommendation> </output_format>
Cette structure est plus facile à interpréter pour le modèle qu’un prompt en texte brut. Les balises agissent comme des délimiteurs sémantiques qui réduisent l’ambiguïté et améliorent le suivi des instructions. C’est particulièrement efficace quand le prompt contient du contenu hétérogène (instructions + données + exemples + contraintes) qui doit être clairement différencié.
L’utilisation cohérente de XML en entrée ET en sortie crée une boucle de formatage que les modèles Claude gèrent avec une fiabilité remarquable. Le modèle « apprend » le dialecte XML de votre application et le maintient avec cohérence à travers les échanges.
Bonnes pratiques pour le XML output
Fournissez toujours un exemple complet du format XML attendu dans votre prompt. Les modèles suivent les exemples bien mieux que les descriptions abstraites. Utilisez des noms de balises courts mais explicites (<sentiment> plutôt que <sentiment_analysis_result>) pour réduire la consommation de tokens. Demandez au modèle de ne produire que le XML, sans texte avant ou après, pour faciliter le parsing. Avec les modèles Claude, utilisez le prefilling pour commencer la réponse par la balise racine. Ajoutez un attribut type aux balises qui ont des valeurs contrôlées (<sentiment type="enum">positif</sentiment>) pour guider le modèle. Enfin, combinez le XML en sortie avec le XML en entrée pour maximiser la cohérence et la fiabilité du format.
Limites du XML output
L’absence de mode natif est la principale limite. Contrairement au JSON mode ou aux structured outputs, aucun provider ne garantit côté serveur que la sortie sera du XML valide. Vous dépendez de la qualité du prompt et de la « bonne volonté » du modèle. En production, ajoutez un try/except autour du parsing XML pour gérer les cas d’échec.
Le XML est plus verbeux que le JSON ou le Markdown, ce qui augmente le coût en tokens de sortie. Chaque donnée est encadrée par une balise ouvrante et une balise fermante, doublant le « bruit » structurel par rapport au JSON. Sur des sorties volumineuses à fort volume, cela représente un surcoût non négligeable.
L’écosystème de validation XML (XSD, DTD, RelaxNG) est peu intégré dans les workflows LLM modernes. La plupart des développeurs qui utilisent le XML output se contentent d’un parsing simple sans validation formelle du schéma. Si vous avez besoin de validation stricte, le JSON avec structured outputs est plus adapté.
Verdict
Le XML output est un format sous-estimé qui brille dans les cas où le JSON est inadapté : annotation de texte, contenu mixte texte/structure, raisonnement structuré, et prompts complexes. Les modèles Claude sont particulièrement performants avec le XML, ce qui en fait un choix naturel pour les applications Anthropic. Toutefois, l’absence de mode natif côté API signifie que vous ne bénéficiez d’aucune garantie de conformité côté serveur. Pour les pipelines automatisés où la fiabilité du format est critique, les structured outputs JSON restent la solution la plus robuste. Le XML est un excellent complément au JSON, pas un remplaçant.
FAQ
Qu’est-ce qu’un XML output dans le contexte des LLM ?
C’est une sortie de modèle formatée en XML, utilisant des balises ouvrantes et fermantes pour structurer l’information. Contrairement au JSON mode, aucun provider ne propose de « XML mode » natif : le format est obtenu via des instructions dans le prompt. Les modèles Claude d’Anthropic sont particulièrement efficaces avec le XML grâce à leur entraînement spécifique sur ce format.
Pourquoi utiliser du XML plutôt que du JSON comme sortie de LLM ?
Le XML excelle pour le contenu mixte texte/structure (annotations inline dans un texte), la hiérarchie sémantique (balises parlantes), et l’extraction partielle par regex. Il est aussi le format recommandé par Anthropic pour structurer les prompts complexes. En revanche, le JSON est préférable pour les intégrations programmatiques, grâce aux structured outputs qui garantissent la conformité au schéma côté serveur.
Le XML output est-il fiable avec les LLM ?
Avec les modèles Claude, oui : la fiabilité est proche de 100 % sur les structures simples à moyennes. Avec GPT-5.4, le XML est généralement correct mais le modèle peut ajouter du texte parasite. Sans mode natif côté API, aucun provider ne garantit la validité XML. Ajoutez toujours un try/except autour du parsing et un mécanisme de retry pour gérer les cas d’échec.
Comment extraire des données d’une sortie XML de LLM ?
Deux approches : (1) regex simple pour extraire un ou deux champs (re.findall(r'<tag>(.*?)</tag>', output)), efficace et tolérante aux XML légèrement malformés. (2) Parser XML complet (xml.etree.ElementTree en Python) pour les structures complexes, plus robuste mais qui échoue si le XML est invalide. Choisissez la regex pour les cas simples et le parser pour les structures imbriquées.
Le XML output coûte-t-il plus cher en tokens que le JSON ?
Oui. Les balises XML sont doublées (ouvrante + fermante), ce qui augmente la consommation de tokens par rapport au JSON. Exemple : <name>Marie</name> consomme plus de tokens que "name": "Marie". Sur des sorties volumineuses à fort volume, cette différence est significative. Si le coût en tokens est prioritaire et que vous n’avez pas besoin de contenu mixte, préférez le JSON.