Comme promis une 2e partie avec un peu plus de LLM dedans.
Depuis la sortie de chatGPT, malgré les versions successives avec leurs lots d’améliorations, a chaque use case que j’expérimente mon sentiment reste le même : « C’est presque bon… mais il manque un rien pour que le résultat soit vraiment exploitable. ».
L’objectif ici : me concentrer sur un seul use case, pousser l’expérimentation plus loin et chercher à obtenir un résultat fiable et consistant.
Première tentative : l’approche naïve
Je commence simple : à partir d’une image, je demande au LLM de me générer un diagramme dans un format comme mermaid, mxGraphModel, SVG ou D2.
Résultat ? Dans le meilleur des cas (avec Claude Sonnet), j’ai un résultat utilisable 1 fois sur 5. Les autres modèles sont très loin derrière, même si Claude 3.7 et Artifacts ont amélioré la donne depuis mes premiers tests.
Approche itérative : Chain of Thought après erreur
Ma première idée d’amélioration est donc de prendre la sortie obtenue, la passer à la lib de rendu, récupérer l’erreur (si erreur il y a) et la renvoyer au modèle pour qu’il s’auto-corrige. Un genre de Chain of Thought appliqué à la correction syntaxique.
Mais plusieurs points sont bloquant :
- Les messages d’erreur ne sont pas assez explicites ou consistants
- Beaucoup de problèmes de rendu ne génèrent aucune erreur explicite
- Le coût en tokens explose en itérant sur des textes/images longs
- Et les temps de traitement deviennent trop longs avec les images
Autre point : je laisse tomber l’idée de générer directement du SVG. Trop bancal. Je n’ai trouvé aucun éditeur JS de SVG qui soit convaincant + le format SVG est très (trop) complexe : gestion de la viewbox, placement des éléments, css, …
Option fine-tuning ? Trop cher, trop risqué
Je pense un moment à fine-tuner un modèle… mais je tombe vite sur plusieurs gros murs :
- Difficile de constituer un corpus de données propre, libre de droits
- Coût énorme : chez AWS Bedrock, charger un modèle fine-tuné coûte ~5000€/mois
- OpenAI est bien moins cher de ce côté, mais pas question pour moi d’envoyer par exemple des schémas d’architecture réseau chez OpenAI ou autre plateforme grand public, suite à mon analyse des fournisseurs que vous trouverez ici. J’ai donc choisi de passer par des services destinés à des professionnels plutôt qu’au grand public ( -> AWS Bedrock, Azure OpenAiService, …)
Solution : miser sur le format JSON
L’étape d’après c’est ce point très simple : la seule grammaire que tous les LLMs respectent, c’est le JSON.
Les systèmes de tool/function calling s’appuient tous dessus. Et même les modèles sans « JSON mode » s’en sortent bien… à condition que le prompt soit bien construit. (reposez vous sur une lib pour cette partie, en Java SpringAi et Langchain4J le proposent)
J’utilise donc une structure intermédiaire en JSON pour décrire le diagramme. Ensuite, j’applique un pattern visiteur qui transforme ce JSON vers du D2Lang ou Mermaid.
Résultat : les sorties sont fiables, structurées, testables.
Deuxième étape : mieux comprendre les diagrammes



Prenons un exemple concret : un diagramme de Gantt. CI-dessus en exemple GPT 4o me sort un JSON avec une tâche « Réparer la charpente » avec une durée de 8 jours, planifiée du jeudi 8 au samedi 17.
Problème : sur le diagramme, les dates affichées vont du 9 au 21. Pourquoi ? Parce que seuls les jours ouvrés sont comptabilisés dans les 8 jours, mais les week-ends et jours fériés allongent la planification. Ce genre de subtilité, un LLM ne le comprend pas spontanément.
La clé : le bon prompting
Chaque type de diagramme a ses spécificités. Et c’est là que le prompting fait toute la différence. J’en viens donc à faire systématiquement les étapes suivantes :
- Identification du type de schéma présent sur l’image (diagramme de séquence, de classe, …)
- utilisation d’un prompt spécifique à ce type de schéma pour obtenir une description textuelle exhaustive des éléments métiers pour ce type de schéma
- A partir de la description textuelle, extraction de données structurées
- génération du code mermaid / D2Lang / …
Et pour générer le prompt du point 2, pour chaque type de schéma que je veux supporter dans mon application je passe par le workflow suivant :
- Je définis le format JSON attendu (ex. pour un Gantt :
Section,Milestone,Task, etc.) - Je précise que je veux extraire depuis une image une description textuelle complète
- J’ajoute des indications sur les points « métier » du type de diagramme qui peuvent être source d’ambiguïté / de complexité (par ex pour les tâches d’un diagramme de Gantt : « relève les dates de début et de fin des tâches », plutôt que la durée qui comme on l’a vue est plus complexe à gérer du fait de la problématique des « jours ouvrés »)
- Je demande à un LLM de me générer un prompt couvrant ce besoin
Validation : tests visuels et itérations
Pour valider les résultats, je conseil la mise en place de tests de niveaux test d’intégration :
- Pas d’assertions classiques
- Un rendu Markdown des résultats pour un contrôle visuel
- Les points spécifiques comme la cohérence des dates, la structure des objets, etc peuvent être contrôlés automatiquement pour éviter les régressions sur des points particuliers et sensibles
Ces tests ne sont pas dans la CI, je les joue lorsque je modifie des prompts ou quand j’essaye de nouveaux modèles, de nouveaux paramètres d’inférence, …
Et toujours, je n’écris aucun prompt moi-même. J’applique cette boucle :
« Voici ce que je veux améliorer / les cas qui posent problème »
+
« Voici mon prompt actuel »
→ « Proposes-moi une meilleure version »
→ « Je teste, puis j’itère »
Conclusion
Oui, le prompt engineering permet d’améliorer sensiblement les résultats.
Mais non, les résultats ne sont jamais parfaits, jamais exactement ce que j’espérais obtenir. Il y a toujours ce petit « truc en plus » qui manque, peut-être impossible à obtenir automatiquement. Bref à l’instant t, pour moi, une IA ne fait pas un boulot seule, l’UX doit toujours prévoir un moyen pour l’utilisateur de compléter les 5% restants
Et pour la route, ma recommandation : n’écrivez pas vos prompts, fournissez des exemples de résultats, décrivez vos données d’entré puis faites générer vos prompts par des LLMs. La console d’Anthropic, le « prompt management » du studio Vertex Ai de Google sont des alliés précieux pour créer les bons prompts à partir d’exemples des tâches à réaliser




