Comment et pourquoi prompter Claude 3 en XML ?

Comment et pourquoi prompter Claude 3 en XML ? Claude 3 supporte le prompting XML, une technique qui offre une meilleure précision et une compréhension plus fine du prompt par le LLM.

L'art du prompting s'affine encore. Après le roleplay, la répétition des instructions, l'illustration par l'exemple, voici venu le XML. Depuis l'arrivée de ChatGPT en novembre 2022, la manière de prompter (donner des consignes) aux grands modèles de langage a drastiquement évolué. Avec la multiplication des modèles à plus de 100 milliards de paramètres et de plusieurs centaines de milliers de tokens de contexte, le XML commence à faire son apparition dans les prompts. La norme a commencé à véritablement se populariser avec Claude 3 qui nativement supporte les prompts structurés en XML.

Les avantages du XML dans ses prompts

Du côté humain, l'utilisation du XML permet de structurer sa pensée et d'avoir ainsi un prompt moins confus et plus réfléchi. Du côté du modèle, cette structuration apporte un cadre et défini des règles claires à respecter pour la génération de la réponse. Les réponses seront de meilleures qualité et d'avantage pertinentes. Claude 3 a été entrainé spécifiquement sur des prompts en XML. L'utilisation du langage est particulièrement recommandée avec les prompts d'un haut niveau de complexité ou utilisant des variables en entrée (dans le cas d'un usage via API par exemple). Dans ces deux cas, Claude comprendra mieux le contexte de la demande et fournira une réponse plus cohérente et ajustée à votre demande.

"Tout comme les titres et les sections rendent les documents plus faciles à suivre, les balises XML aident Claude à comprendre la hiérarchie et les relations au sein de votre prompt", détaille Anthropic. Par ailleurs, il est possible de donner comme consigne à Claude de retourner à son tour du XML pour pouvoir extraire les informations plus facilement au sein de la réponse.

Une structure simple

Le plus simple sera le plus efficace. Structurez votre prompt avec des balises claires et descriptives. Exemple pour fournir des instructions : "<instruction>vos instructions principales</instructions>". De même pour les exemples, le format attendu, ou encore les documents fournis. Le but est de découper le plus possible votre consigne pour la rendre le plus clair possible. N'hésitez pas à utiliser des balises imbriquées. Attention à ne pas dépasser plus de cinq niveaux d'imbrication, pour éviter de perdre Claude 3. N'hésitez pas à utiliser des sous-tâches sous forme d'items.

Exemple d'un bon prompt imbriqué :

<prompt>

  <context>

 Vous êtes un assistant IA avancé chargé d'analyser un article et d'en faire un bref résumé. L'article traite d'un sujet complexe et technique, et le résumé doit être concis, clair et accessible à un public non expert.

  </context>

  <task>

    Analysez attentivement l'article et résumez ses points clés dans un texte de 150 à 200 mots maximum. Votre résumé doit inclure :

    <requirements>

      <item>Les principales idées et conclusions de l'article</item>

      <item>Les éléments les plus importants et pertinents</item>

      <item>Une présentation claire et structurée</item>

      <item>Un style de rédaction concis et accessible</item>

    </requirements>

  </task>

  <document>

    [Insérer le texte complet de l'article ici]

  </document>

 </prompt>

Une autre utilisation du prompting XML est lorsqu'il s'agit d'insérer des variables dans le prompt, dans le cadre d'un appel à un modèle de langage au sein d'un script. Claude 3 comprendra ainsi qu'il s'agit d'une variable changeante et non d'un texte fixe et s'adaptera en conséquence. Un exemple tiré de la documention d'Anthropic : "I will tell you the name of an animal. Please respond with the noise that animal makes. <animal>{{ANIMAL}}</animal>"

Une réponse au format XML, plus facile à récupérer

Pour les formats complexes ou pour extraire des informations précises, il peut être nécessaire de faire retourner à Claude une réponse au format XML. En parsant par la suite la réponse, il sera aisé de retrouver les bonnes informations. Exemple : pour extraire à partir d'un mail, l'expéditeur, l'objet et éventuellement la deadline mentionnée dans le corps du mail.

Please extract the key details from the following email and return them in XML tags:

- Sender name in <sender></sender> tags
- Main topic in <topic></topic> tags
- Any deadlines or dates mentioned in <deadline></deadline> tags

<email>
From: John Smith
To: Jane Doe
Subject: Project X Update

Hi Jane,

I wanted to give you a quick update on Project X. We've made good progress this week and are on track to meet the initial milestones. However, we may need some additional resources to complete the final phase by the August 15th deadline.

Can we schedule a meeting next week to discuss the budget and timeline in more detail?

Thanks,
John
</email>

Ce à quoi Claude devrait naturellement répondre :

<sender>John Smith</sender> <topic>Project X Update</topic><deadline>August 15th</deadline>

Il s'suffit ensuite d'extraire les informations contenues entre les balises, avec une fonction dédiée (SimpleXML en php par exemple) ou avec un regex (<sender>(.*?)<\/sender>).

Anthropic recommande d'utiliser des noms de tag simples et descriptifs, cohérents sur l'ensemble du prompt. Attention également à bien refermer les balises ouvertes pour éviter les incompréhensions par le LLM.

Le XML au service des longs contextes

Claude supporte des contextes très longs, jusqu'à 200 000 tokens (1 million à terme pour certaines entreprises). Une particularité qu'il est bon d'utiliser pour mutualiser les tâches complexes et éviter de découper son workflow avec plusieurs requêtes. Claude 3 comprendra plus facilement la totalité du contexte. Néanmoins, pour s'assurer de la pertinence et de la compréhension des longs documents par Claude, Anthropic recommande d'utiliser du XML pour structurer ses documents, particulièrement si le prompt fait plus de 30 000 tokens. Chaque document doit être encapsulé selon une norme propre à Claude 3. L'IA d'Anthropic a été entrainé pour respecter un format bien précis.

Voici un exemple avec un prompt reprenant plusieurs documents à adresser au LLM :

<documents>

<document index="1">

<source>

(a unique identifying source for this item - could be a URL, file name, hash, etc)

</source>

<document_content>

(the text content of the document - could be a passage, web page, article, etc)

</document_content>

</document>

<document index="2">

<source>

(a unique identifying source for this item - could be a URL, file name, hash, etc)

</source>

<document_content>

(the text  content of the document - could be a passage, web page, article, etc)

</document_content>

</document>

...

</documents>

Cette structuration permet au LLM de comprendre quelles sont les instructions, les textes, les documents ou les sources. Par ailleurs, Claude 3 performe mieux si les documents sont situés en premier dans le prompt.

Un prompt pour transformer ses prompts en XML

Pour transformer ses prompts déjà rédigés en prompt XML, Claude peut, là aussi, vous aider. Il suffit de lui demander de convertir un prompt textuel classique en prompt XML structuré. Voici un exemple de prompt prêt à l'emploi. Relisez et corrigez toutefois le prompt généré avec attention, des erreurs ou des approximations peuvent s'y glisser.

<prompt> Voici un prompt textuel que j'aimerais que tu convertisses en un prompt XML bien structuré en suivant les meilleures pratiques :

<texte_prompt>

{{prompt_textuel}}

</texte_prompt>

Pour cela :

<instructions>

Utilise des balises XML avec un nom anglais et uniquement un nom anglais pour bien séparer les différentes parties du prompt (instructions, exemples, données d'entrée, etc). Choisis des noms de balises descriptifs et cohérents.

Place le texte source et les éventuels documents longs en haut du prompt, avant les instructions détaillées et la requête utilisateur.

Si le prompt contient des données d'entrée variables, indique clairement où elles doivent être insérées avec des balises XML et des doubles accolades, comme ceci : <animal>{{ANIMAL}}</animal>

Si tu dois répondre à des questions sur des documents, demande-moi d'abord de trouver des citations pertinentes dans des balises <citations></citations>, puis de répondre dans des balises <reponse></reponse> en faisant référence aux numéros des citations sans les citer textuellement.

N'oublie pas de fermer systématiquement les balises ouvrantes, et ne les mentionne jamais seules (toujours <balise></balise>).

Tu peux imbriquer plusieurs niveaux de balises XML si besoin, mais pas plus de 5. </instructions>

Prompt textuel à convertir :

<prompt_textuel>

{{INSERER LE PROMPT ICI}}

</prompt_textuel>

</prompt>