Comme nous l’avons vu dans l’article sur la création d’Agent LLM en Node.js, le prompt est la partie la plus importante de votre Agent.

C’est ce qui va être ingéré par le LLM afin de produire un résultat. Dans le cas d’un Agent, ce résultat doit être formaté d’une certaine manière afin de pouvoir en extraire des actions à exécuter via le code.

Cette discipline se nomme Prompt Engineering et elle ne cessera de prendre de l’importance avec la montée en puissance des IA Génératives.

Dans cet article, nous allons voir quelques techniques pour améliorer la qualité de vos prompts.

Le mécanisme d’attention

Un point fondamental dans le fonctionnement des LLM et la manière dont ils interprètent les prompt est le mécanisme d’attention. C’est le principe fondateur des IA génératives. Je vous conseille fortement de regarder ces vidéos pour mieux comprendre.

Pour résumé simplement, le but du LLM est de générer le token suivant (un token est une suite de lettres) en fonction du sens de tous les tokens du prompt (les tokens du début du prompt possèdent un poids plus faible que ceux de la fin). Le token ainsi généré est concaténé au texte du prompt puis le LLM va générer le token suivant et ainsi de suite.

Les tokens générés par le LLM sont donc aussi pris en compte pour la génération des prochains tokens. On appelle la concaténation du prompt et de la réponse en court de génération la fenêtre de contexte du LLM.

Plus il y a de tokens dans le prompt et plus le sens de chaque token est dilué donc les prochains tokens générés seront potentiellement moins pertinent.

Architecture d’un prompt

Les prompts contiennent plusieurs types de blocs:

  • bloc d’instructions: explique au LLM la tâche à résoudre et comment y parvenir
  • bloc d’informations: fournit une information du monde extérieur au LLM
  • bloc format de réponse: indications sur le format de réponse attendu

Nous allons maintenant voir quelques techniques de prompt engineering pour augmenter la qualité de ces blocs et donc la performance du LLM.

Mettre l’accent sur une instruction

La première technique consiste à mettre en valeur une instruction pour être sur que celle-ci soit respectée.

Il y a plusieurs moyens de la mettre en valeur:

  • mettre l’instruction en MAJUSCULES (e.g. « résume ce produit SANS DONNER LE NOM DE l’ENTREPRISE »): les LLM ont appris sur des textes humains et ont donc « compris » cette subtilité
  • répéter l’instruction plusieurs fois dans le prompt
  • positionner l’instruction à la fin du prompt

Délimiter les blocs d’informations

Lorsque vous insérez des blocs d’informations dans le prompt, il est utile de les délimiter afin que le LLM comprennent à quel endroit l’information se termine et les instructions reprennent.

Les blocs d’informations peuvent contenir de nombreuses phrases qui elles même peuvent s’apparenter à des instructions (on parle de prompt injection si celle-ci sont malicieuses) et donc perturber la compréhension du LLM.

Exemple de délimitation d’un bloc d’information:

Tu es un présentateur qui écrit un résumé d'un article sur une page web.
  
Résume le contenu de cette page web pour faire une vidéo courte de 30sec.
Le résumé est écrit en français. 
Le résumé doit être écrit par un présentateur externe.

# Contenu de la page web

{pageText}

# fin contenu de la page web

J’ai obtenu des résultats ~10% meilleurs en utilisant cette technique. Pour les curieux, les détails du benchmark sont sur Github.

Chaine de pensée

Une technique très efficace est celle de la Chaine de Pensée (Chain of Thought, CoT). Elle consiste à donner au LLM un exemple de ce qu’on attends de lui en terme de format de réponse.

C’est une technique assez fondamentale à utiliser le plus souvent possible.

Donne moi un adjectif et un sentiment à propose de la phrase suivante: "Les LLMs sont une innovation de rupture et seront responsable de profonds changements dans la société humaine."

Exemple:  
"Le fermier travaille dans les champs et élève ses animaux dans le respect de la nature"
Adjectif: écologique
Sentiment: admiratif

Ta réponse:

Ici le mécanisme d’attention est exacerbé par la présence de l’exemple à la fin et le LLM aura donc tendance à le respecter.

Insérer des blocs de code

En règle général, les blocs de code sont mieux compris lorsqu’ils sont introduit au format Markdown avec les triples backticks et le language utilisé.

Explique moi le code ci-dessous:

```javascript
// some code
```

Format de réponse

Le format de réponse du LLM est très important car chaque token de la réponse va également être pris en compte pour générer la suite de celle-ci.

Aussi, la réponse doit être facilement exploitable programmatiquement afin d’être utilisé dans la suite de l’application.

Les développeurs web pensent instinctivement au format JSON car ils ont l’habitude de le manipuler et se disent qu’un simple JSON.parse suffit pour le parser.
{ "action": "READ_FUNCTION", "parameters": { "filePath": "// path to the file containing the function", "functionName": "// name of the function" } }

De mon point de vu c’est une erreur:

  • format fragile à parser: virgule en trop ou saut de ligne et c’est KO
  • performances du LLM réduites: il s’éloigne trop du langage naturel

Il y a aussi le format que j’appelle Markdown qui s’apparente à toutes les tentatives de rendre du texte parsable.
# Action:READ_FUNCTION
filePath: // path to the file containing the function
functionName: // name of the function
# end

La aussi le parsing est compliqué car peu de structure et les performances du LLM ne sont pas bonnes non plus. J’imagine que le LLM n’a que peu croisé cette syntax lors de son entrainement et est donc « perdu ».

Il reste donc le bon vieux format XML qui malgré son impopularité dans le monde du web s’en tire remarquablement bien avec les LLMs.

<Action name="READ_FUNCTION">
  <Parameter name="filePath">
    // path to the file containing the function
  </Parameter>

  <Parameter name="functionName">
    // name of the function
  </Parameter>
</Action>

Le format XML est relativement robuste et se parse très facilement avec des expressions régulières (demandez à ChatGPT!), d’autre part sa proximité avec le langage naturel améliore les performances du LLM.

J’ai observé des performances jusqu’à 30% meilleures en utilisant du XML plutôt que du JSON. Les détails du benchmark entre les 3 formats sont disponibles sur Github https://github.com/Aschen/llm-experiments/tree/master/prompt-action-benchmark

Conclusion

Le LLMs sont une technologie nouvelle et leur utilisation est un champ de recherche très vaste. Comme pour le choix des mots clés lors d’une recherche Google, la création d’un prompt requière une forme d’entrainement de l’esprit à ce nouveau paradigme.

La meilleure choses à faire est d’utiliser au maximum les LLMs au quotidien afin de former son cerveau à cette nouvelle gymnastique. Le recours à ChatGPT pour de la recherche et autres tâches spécifique doit se faire le plus souvent possible.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Trending