Calcul
Des ressources de calcul performantes et évolutives pour vos charges de travail critiques. Orchestrez vos applications cloud-native avec nos solutions conteneurs modernes.
Découvrez l'offre Calcul
Dedicated servers
VM Instances
Une solution de machines virtuelles à la demande, flexible et sécurisée, sur une infrastructure mutualisée.
IaaS OpenSource
Infrastructure virtualisée open source dans un environnement cloud de confiance qualifié SecNumCloud pour une souveraineté technologique complète.
IaaS VMWare
Vos machines virtuelles VMware dans un environnement cloud de confiance qualifié SecNumCloud et certifié HDS.
Containers
PaaS Openshift
La plateforme unifiée pour créer, moderniser et déployer vos applications à grande échelle dans un cloud souverain.
Managed Kubernetes
Solution d’orchestration de conteneurs managée offrant sécurité, résilience et automatisation avancée sur infrastructure souveraine.
Bare Metal
Bare Metal
Des serveurs dédiés et entièrement personnalisables pour une autonomie totale sur votre infrastructure souveraine.
Stockage
Des solutions de stockage adaptables et performantes pour tous vos besoins. Optimisez vos données avec nos solutions bloc et objet hautement disponibles.
Découvrez l'offre Stockage
Stockage
Stockage bloc
La solution de stockage en bloc adaptable pour des performances de stockage optimales dans un cloud souverain.
Stockage objet
La solution de stockage évolutive et économique pour vos données non structurées dans un cloud souverain.
Sauvegarde
Solutions de sauvegarde
Des solutions de sauvegarde différenciées, adaptées à vos enjeux et à vos environnements
Réseau
Des solutions réseau avancées pour connecter et sécuriser vos infrastructures. Déployez vos réseaux privés de manière automatisée et sécurisée.
Découvrez l'offre Réseau
Réseau
Virtual Private Cloud
Déployez et gérez vos réseaux privés de manière 100% automatisée et sécurisée.
Private Backbone
Prenez le contrôle total de votre réseau avec une connectivité de niveau 2 étendue, conçue pour les architectures hybrides et les configurations sur mesure.
Managed Firewall
Managed Firewall
Des solutions de sécurité avancées, pour une isolation complète et une protection renforcée
Hébergement Sec
Housing – Espace Dédié
Un hébergement sécurisé pour vos équipements dans un environnement dédié ou partagé, selon vos besoins.
Sécurité
Des solutions de sécurité avancées pour protéger vos infrastructures critiques. Contrôlez l'accès et défendez-vous contre les menaces en ligne.
Découvrez l'offre Sécurité
Sécurité
Anti DDoS
Le bouclier contre les attaques en ligne
Bastion
Le contrôle d’accès centralisé et transparent pour une protection robuste de vos infrastructures
Managed KMS
La gestion des clés cryptographiques souveraine, avec racine de confiance matérielle HSM, pour protéger vos données les plus sensibles sur infrastructure SecNumCloud.
Managed SIEM
Une plateforme centralisée de collecte et de corrélation de logs de sécurité, alliant l'automatisation par IA et des règles de détection avancées (MITRE ATT&CK).
IA
Des solutions d'intelligence artificielle pour transformer vos données en insights et accélérer vos processus métier.
Découvrez l'offre IA
IA
LLMaaS
Accédez à des modèles de langage de pointe sur une infrastructure souveraine, qualifiée SecNumCloud et certifiée HDS, pour des applications d’IA performantes et sécurisées.
GPU
Instances GPU NVIDIA pour accélérer vos calculs d’intelligence artificielle et de calcul haute performance dans un cloud souverain.
Data
Des solutions de données pour gérer, analyser et exploiter vos données critiques.
Découvrez l'offre Data
Bases de données
Managed MariaDB
Une base de données relationnelle MariaDB entièrement managée et sauvegarde PITR sur infrastructure souveraine SecNumCloud.
Managed PostGreSQL
La solution de base de données relationnelle entièrement managée sur infrastructure souveraine SecNumCloud
Big Data
Managed Kafka
La plateforme distribuée open-source pour la diffusion de données en continu et en temps réel
Managed File System
Un système de fichiers distribué managé, souverain et haute disponibilité, accessible en NFS et SMB sur infrastructure SecNumCloud.
Management & Gouvernance
Des services d'accompagnement et de support pour vous aider dans votre transformation cloud.
Découvrez l'offre d'accompagnement
Accompagnement
Niveaux de support
Découvrez les 3 niveaux de support pour vous accompagner au mieux selon vos enjeux.
Nos professional services
De la conception à l’optimisation, Cloud Temple vous accompagne à chaque étape de votre projet.
Gouvernance
Console – API – Provider Terraform
Une interface unique pour visualiser et gérer vos produits et services
Observability
Les métriques de votre infrastructure disponibles dans les standards du marché
Devenir partenaire
Le magazine > « Les LLM savent coder mieux que toi » : vrai ou faux ? | Episode 2
Publié le 12/07/2024 par Kevin Séjourné, ingénieur R&D senior chez Cloud Temple

Plongée dans l’IA : Une série de 3 épisodes

Bonjour, je suis Kevin Séjourné, docteur en informatique et ingénieur R&D senior chez Cloud Temple. Comme vous pouvez l’imaginer, depuis 20 ans, j’ai beaucoup écrit de code. Explorateur passionné des LLM, je constate qu’ils peuvent maintenant écrire du code à ma place. Tant mieux ! Mais comme j’ai l’habitude de m’appuyer sur des observations scientifiques, j’ai décidé de tester la qualité de leur travail.

Kevin Séjourné

Retrouvez les 3 épisodes de mon étude :

Episode 2 : Aidons-nous du LLM pour corriger le code et reconstruire les algorithmes oubliés

Compilons, et compilons encore

La compilation n’est pas seulement une transformation du code humain vers du binaire interprétable par le CPU, c’est également un analyseur statique de code. La compilation est donc une partie du processus de développement, qui a lieu dès le début. Il est juste étonnant de disposer d’un programme qui a l’air complet et de ne commencer la compilation qu’à ce stade.

Premier aspect, cela ne compile pas, car le compilateur Rust n’est pas installé. Heureusement, GPT4o est généraliste et, si nous lui demandons comment installer Rust sur une KUbuntu 22.04, la réponse avec des commandes apt est précise. sudo apt install rust Précise, mais mentionne un paquet qui n’existe pas, et donc pas d’installation. Malheureusement, les réflexes de Linuxien viennent parfois trop vite, et rapidement la commande est humainement corrigée en sudo aptitude install rust-all avant même d’avoir imaginé la phrase qui viendra expliquer le problème au LLM.

C’est reparti pour `cargo build`, la commande de compilation pour Rust, mais cela ne compile toujours pas. En effet, il y a des erreurs dans le programme. À première vue, des erreurs de type de données et des erreurs de fonctions inexistantes.

Elles auraient pu être détectées plus tôt par VSCode. Une fois Rust installé, c’est VSCode qui détecte le problème et me propose d’installer l’extension Rust-analyser. Rust-analyser permet de détecter beaucoup d’erreurs de compilation directement dans l’environnement de développement et fournit également des suggestions de corrections.

Une fois l’extension installée, il faut se rendre à l’évidence : le programme généré est plein d’erreurs de types et de noms de fonctions hallucinés. Attention, nous disons “hallucinés” ici sans aucune connotation péjorative, c’est juste le terme consacré sur les LLM lorsqu’ils inventent des choses qui n’existent pas. La coloration syntaxique dans VSCode nous permet de parcourir plus facilement le code. Le programme est bien construit, les structures principales semblent présentes, des bibliothèques Rust équivalentes remplacent leurs homologues Python, il n’y a pas d’erreurs de syntaxe évidentes et, en première lecture, l’essentiel du code est présent.

Viens alors pour nous le temps d’apprendre ce langage de programmation, comment les messages d’erreurs à la compilation sont générés. Nous voulons que le LLM corrige ses propres erreurs. Nous allons lui donner les messages d’erreurs et leurs localisations pour lui donner une chance de nous donner le moyen de contournement. Nous allons également monter en compétence sur Rust en lui demandant de justifier ses choix de transformation.

Par exemple, pourquoi ne pas avoir utilisé l’héritage de classe ? Réponse : car l’héritage de classe n’existe pas en Rust, mais est remplacé par le mécanisme plus moderne de Trait.

Comment indiquer au LLM la localisation d’une erreur ? Les LLM sont mauvais avec les nombres, donner un numéro de ligne ne sert à rien. Il est préférable de donner le nom du fichier et de la fonction ou structure suivie du message d’erreur. La plupart du temps, aucune explication n’est requise. Il faut juste mettre bout à bout le nom de fichier, fonction, erreur, et une copie de la ligne en erreur dans la boîte de saisie du chat.

In the definition of “grafana_alert_route” I have there is the following error “no method named `clone` found for struct `RtmsHttpClient` ” for ” let rtms_client = rtms_client.clone();” How do I correct that ?

Les raccords de texte c’est pour faire joli.

Le LLM régénère alors soit le fichier au complet, soit une fonction, soit plusieurs fichiers qu’il faut alors mettre à jour. Il y a de nombreuses erreurs de ce type.

Donc cette phase est assez longue, 8 heures de correction de bugs.

In fine, oh joie ! Un programme compilé, à partir de code généré par un LLM !

Il est alors temps de passer aux tests

Jusqu’ici, nous ne vous avons pas dit de quoi il retourne dans ce programme. Pour des raisons de confidentialité, nous ne pouvons vous en parler, mais cela ne gêne en rien la compréhension de ce qui va suivre.

Nous initialisons l’environnement de test comme pour le programme Python précédent. Nous lançons le programme. Le programme se lance. Le programme (un serveur) se met en attente pour ses premiers appels.

Petite larme à l’œil devant un programme qui fonctionne pour la première fois.

Conformément à la procédure de test, je lance mon appel curl avec l’envoi du premier fichier de test. Le fichier est accepté. Une ligne de log INFO apparaît : 🙂 Une ligne de log ERROR apparaît : 🙁

Un appel de fonction n’a pas l’information requise pour faire l’appel. Une recherche rapide dans le code montre que la variable sensée contenir l’information en question n’est jamais initialisée. Le fichier fourni par le test, qui contient les informations (du JSON), est parsé (transformé en HashMap) mais la HashMap n’est jamais étudiée comme il faut. Le code qui étudie cette HashMap n’est que l’ombre de ce qu’il devrait être.

Debugage avec le LLM

C’est un cas typique de lost-in-the-middle. Toute la partie du code qui était standard a été convertie, les parties qui n’étaient pas standard mais courtes ont aussi été converties car nous les avons demandées explicitement lors de la conversion fichier par fichier. L’algorithme de conversion de données situé dans le fichier le plus long a induit un trop grand nombre de points auxquels le modèle devait faire attention. Ce trop grand nombre implique une simplification du code généré. Un code généré valide, des noms de fonctions valides, une structure valide, les bons commentaires… une transformation des données correcte et jamais vue car très spécifique c’était de trop. Redemander la conversion de ce fichier ne servira à rien, cette partie du code est trop compliquée. Cela fait mal de l’écrire car, d’un point de vue de développeur, ce n’est pas si compliqué. Mais c’est la partie du code qui demande de faire attention aux tenants et aboutissants de tout le reste.

Nous devons donc demander une conversion plus détaillée, morceau de code par morceau de code. Cela implique que nous soyons obligés de progresser un petit peu en Rust pour comprendre en quoi le code généré est adapté au besoin ; notamment si la transformation n’est pas correcte, la première victime est souvent le type des données.

Ici le json en entrée devient, le type dict Python “faiblement typé” puis il est converti en une HashMap<String, String> par le LLM. Ce n’est pas du tout adapté, car un JSON est fondamentalement un arbre de structure associatives. Le LLM “ne comprend pas” ce qu’il fait ; il faut focaliser son attention sur des éléments de code, puis corriger la forme. Là, il n’a pas fait attention à la partie la plus fondamentale de la fonction.

Il faut préciser au LLM le type de la donnée à utiliser pour qu’il puisse se corriger. Nous le forçons sur un serde_json : : value qui est un type fondamental d’encapsulation des JSON en Rust dans les bibliothèques choisies par le LLM. Puis, étape par étape avec GPT4o, nous procédons à la réalisation de la conversion du JSON dans les structures de données correct. Ainsi, nous complétons le code petit à petit. 8 heures pour en arriver jusqu’ici.

Bilan de mi-parcours

Lorsque nous relançons notre test initial, nous pouvons constater le bon fonctionnement du programme dans le cas normal d’utilisation. Mais un développement est composé aussi de sa méthode de déploiement, de tests plus approfondis et de tests de performances. Rendez-vous dans un prochain article.

Le magazine
Politique en matière de cookies

Nous utilisons des cookies pour vous offrir la meilleure expérience possible sur notre site mais nous ne prélevons aucune donnée à caractère personnel.

Les services de mesure d’audience, nécessaires au fonctionnement et à l’amélioration de notre site, ne permettent pas de vous identifier personnellement. Vous avez cependant la possibilité de vous opposer à leur usage.

Pour plus d’informations, consultez notre politique de confidentialité.