Générer du code avec l’IA

a marqué ce sujet comme résolu.

Bon, j’ai testé un peu ces outils d’IA qui génèrent des images, genre DALL-E et compagnie… Du coup, est-ce qu’on peut vraiment faire pareil avec du code ? Genre, demander une fonction en Python ou un bout de script et hop, ça sort un truc propre ? Vous en pensez quoi ?

Tiens d’ailleurs on a toujours aucune idée de la quantité d’énergie nécessaire pour que ces outils génèrent du mauvais code.

Ksass`Peuk

Ce serait intéressant comme étude en effet. Je sais que pour des langages pas trop compliqués et très utilisé (Python, TypeScript), il génère du très bon code, quand on sait bien lui expliquer, mais pour avoir testé en Ada (mon langage de presque tous les jours au taf), il est tout simplement très mauvais (et encore, je trouve que Claude.ai s’en sort mieux que les autres).

As-tu testé de ton côté @Ksass`Peuk sur du C/C++?


Pour répondre à l’auteur, @Matt839, comme le dit @SpaceFox, les LLM textuel le fond déjà, que ce soit Chat-GPT, Claude, Llama, etc.

Il y a également des outils spécialisés intégré dans les éditeurs, en voici une liste plus ou moins exhaustive :

Je n’ai, pour ma part, pas encore testé ces outils.

Un point de vigilance tout de même. Regarde bien les politiques de vie privée, etc. afin de savoir ce qu’ils font de tes données. Dans la majorité des cas, si tu bosses sur des sujets sensibles (industriel, secret défense), tu ne seras tout simplement pas autorisé à utiliser ce genre d’outils au travail, sauf exception, s’ils hébergent en interne le LLM.

Je sais que pour des langages pas trop compliqués et très utilisé (Python, TypeScript), il génère du très bon code, quand on sait bien lui expliquer, mais pour avoir testé en Ada (mon langage de presque tous les jours au taf), il est tout simplement très mauvais (et encore, je trouve que Claude.ai s’en sort mieux que les autres).

Sur TypeScript, j’ai surtout constaté que ça génère très souvent des algos en O(n²) là où on pourrait être linéaire. Si on doit passer 15 ans à devoir lui expliquer qu’il faut pas générer des machins qui passent pas à l’échelle, autant écrire directement le code.

As-tu testé de ton côté @Ksass`Peuk sur du C/C++?

Je code plus en C ou en C++. En OCaml c’est naze en tout cas. Et alors je l’ai essayé sur pour générer des specs formelles et là, même les cas d’école, il ne sait pas les reproduire.

Hello,

A ma connaissance (peu profonde, il est vrai), pour moi l’ia ne génère rien. Elle n’est pas capable d’analyser un besoin et de créer le code qui y correspond. Par contre, elle est capable de comprendre ce qu’on lui demande (à condition de savoir s’y prendre), d’aller chercher du code dans sa base de données (créée en allant vampiriser le net), et éventuellement d’en assembler (péniblement) plusieurs pour arriver à un résultat.

Quant à l’énergie consommée, cela doit être faramineux.

PS: je n’ai jamais utilisé l’ia, mais à part pour des besoins de code basique, les retours que j’en lis sont plutôt négatifs.

+0 -0

Je viens de tester ChatGPT pour la génération de C++ et c’est loin d’être génial. Pour des problèmes très simples (parmi les premiers du Project Euler), il arrive à sortir du bon code. En revanche, dès qu’on sort des sentiers battus et qu’on demande quelque chose de plus complexe, ça deviens vite n’importe quoi.

J’ai décris une situation où j’ai 2 threads: un qui calcule incrémentalement les pixels d’une image et un autre qui doit afficher cette image en continue. J’ai demandé comment faire ça de la manière la plus efficace et il n’y a aucun bon point:

  • le problème est un peu ambigu (qu’est-ce que je veux dire par "plus efficace"), et il n’a demandé aucune clarification. Mais quelque soit le critère que je voulais optimiser, la solution choisi était loin d’être la plus efficace.
  • il a essayer d’utiliser une mutex pour protéger les accès aux variables partagés et une condition variable pour que le thread de calcul puisse notifier le thread d’affichage qu’il y a un nouveau pixel à afficher. Sauf qu’au final, c’est implémenté de tel manière à ce qu’un seul pixel ne pourra être calculé par frame affiché. Et au-delà de la mauvaise implémentation, il y a moyen d’avoir une approche nettement plus efficace en utilisant des atomics.
  • la mutex est acquise à des moments où il ne faut pas (e.g. pour notify_one de la condition variable) et ne l’est pas à tout plein de moments où il lit et modifie les variables partagés.
  • il essaye d’afficher l’image partiellement (je suppose que c’était pour éviter de ré-afficher un pixel qui est déjà calculé et affiché), sauf que c’est un fail complet et il n’affichera que la toute première version de l’image et ensuite n’affichera plus rien.

Pour moi, le principal problème est le suivant : pour qu’une IA génère un code suffisamment complexe, alors le prompt devra être tout aussi complexe. D’ailleurs, à chaque fois que j’entends des phrases du type "l’IA va remplacer 75% des développeurs dans X années", je ne peux pas m’empêcher de penser à ce strip (vieux d’il y a presque 10 ans).

Actuellement, je trouve que les bénéfices d’une IA se limitent essentiellement à des tâches simples telles que l’auto-complétion, la génération de templates, de messages de commit, et d’extraits de code (par exemple dans un langage qu’on maitrise peu). J’imagine que ces bénéfices sont particulièrement intéressants pour les personnes dont la programmation n’est pas leur compétence principale.

Je ne sais pas vous, mais si je devais demander à une ia de me générer du code, je prendrais du temps à contrôler que le code fourni est correct, et qu’il prévoit toutes les exceptions (je suppose que c’est à spécifier lors de la demande). Et jamais je ne demanderais à une ia de me fournir un code dans un langage que je connais peu, puisque je ne pourrais pas vérifier le bon fonctionnement du code fourni. Alors, y a-t-il vraiment un gain de temps ?

+1 -0

Très vaste sujet celui de l’IA. Le sujet est aussi vieux que les ordinateurs puisque Turing en parlait déjà dans son article Computing Machinery and Intelligence. Le concept même de création humaine intelligente est lui plus vieux que le genre de la science-fiction (la bête de Frankenstein) !

Pour faire court et concret, pour l’instant on a un truc qui est capable de faire de l’auto-complétion de manière relativement correcte. Personnellement, j’utilise TabbyML auto-hébergé avec comme modèle DeepSeekCoder ou OpenCoder pour le code. C’est destiné à quelqu’un d’averti capable d’avoir un retour critique sur les propositions d’auto-complétion.

On a également des modèles énormes, souvent payant (et parfois chères) comme Claude, Copilote, ChatGPT, DeepSeek et Gemini. Eux sont capables d’un peu plus. Ils peuvent générer du code au cours d’une discussion, l’éditer, l’améliorer en fonction des retours, etc. Très franchement, pour des petits trucs ça peu absolument faire le taf.

  • Créer un graphique animé avec Plotly.js par exemple.
  • Créer un jeu de données d’exemple
  • Créer de toutes petites applications comme des todo-list, Pomodoro, …
  • Assister dans l’apprentissage d’un langage de programmation, …

Globalement, ces IA s’en sortent vraiment pas mal dans du code « d’entreprise », dans le sens que si elles ont accès au répertoire de travail, elles produisent du code cohérent (c’est-à-dire qui s’inscrit dans la continuité du projet, pas de nouvelle dépendance, réutilisation des fonctions déjà codées, style/norme de codage respectées, …) et souvent très bon dans ce contexte.

Pour le reste, elles s’en sortent moins bien, mais ça reste prometteur.

Pour l’instant, à part pour des petits trucs ou des trucs à usage unique (sans évolution), ça n’est pas adapté.
Notamment car il y a besoin encore d’avoir un esprit critique sur la sortie. Ce dont parle @Berdes par exemple. Même quand je dis « souvent très bon », ça veut dire aussi que parfois c’est pas très bon. Voir totalement non pertinent et ça c’est un problème. À la limite si on avait un truc qui était toujours acceptable même si pas toujours très bon ça passerait.


Bon maintenant, on peut passer à la question sous-jacente.

Jusqu’où ?

 Est-ce que si on avance dans ces technologies ça va s’améliorer ? À quel point ça doit s’améliorer pour qu’on ait remplacé un développeur ?1

Personne ne peut le savoir.

À priori, non la technologie des réseaux de neurones artificielles n’avait pour l’instant pas données de résultat vraiment intéressant. Sauf à partir du moment où on a commencé à donner BEAUCOUP de données à de relativement gros réseaux (AlexNet en 2012), puis 10 ans plus tard quand on eut la puissance de calcul pour créer des réseaux de neurones littéralement plus gros que le cerveau humain (1011 de neurones dans un cerveau humain, ~1012 paramètres dans ChatGPT).

On a commencé à voir des phénomènes de représentation de « modèles internes » qui permettent d’espérer reproduire la réflexion humaine, . Von Neumann disait qu’avec 4 paramètres il dessinait un éléphant, avec un cinquième il lui faisait bouger la queue … alors maintenant imaginez avec 1_000 milliards de paramètres.

L’idée n’est pas d’avoir un prompt qui sorte tout de suite une solution parfaite, comme ce dont parle @Olybri. L’idée c’est d'avoir une IA capable de créer un code et des spécifications et de les faire évoluer en fonction des retours utilisateurs. Encore mieux si elle est capable d’être pro-active dans l’établissement des spécifications et/ou la détermination du besoin.
À ce moment-là, on a vraiment supprimé le développeur. Quand le processus de réflexion autour du code est automatisé.

  1. Quelqu’un de non technique demande une solution technique (forcément, cette description n’est pas complète).
  2. L’IA propose un code initiale qui répond globalement à la description initiale.
  3. L’utilisateur⋅trice (ou la personne non technique) se rend compte qu’il y a des cas qui ne sont pas gérés ou auxquels il ou elle n’avait pas pensé.
  4. L’IA est capable d’adapter le code de manière cohérente et d’avoir un esprit critique sur les spécifications (incohérence manifeste par exemple).

Et là, ben on en est loin. Notamment sur la partie esprit critique et raisonnement. Et c’est, je pense, inhérent à la technologie qui est incapable de compter ou de découler un algorithme/raisonnement. Les statistiques ne sont pas vraiment adaptées à découler un raisonnement mathématique logique. Il faudrait pouvoir différencier les « idées » du raisonnement, la technique de chain-of-thought pourrait fonctionner si l’IA était un ou deux ordres de grandeur plus rapide, pour l’instant elle améliore le résultat global au prix d’un calcul plus long. Mais toujours sans garantie sur la sortie ni esprit critique à son sujet.

Je considère donc personnellement qu’on a besoin d’une évolution dans la technologie. On sait que les réseaux de neurones peuvent obtenir des performances sur-humaines dans le raisonnement (AlphaZero par exemple), mais manifestement ça ne marche pas pour les LLM. Et je pense que c’est lié au fait que le LLM ne comprend pas que 1 + 1 = 2 et On a marché sur la lune sont deux idées, mais que l’une est indéniable et l’autre extrêmement probable (on tombe sur le problème que rencontre @Ksass`Peuk sur la spécification formelle, probablement également exacerbé par le manque de données d’entraînement sur les spécifications formelles). Je manque de connaissance en IA pour bien comprendre pourquoi dans un cas ça marche et dans l’autre non, j’ai bien ma petite idée, mais c’est encore flou dans ma tête et je ne voudrais pas dire de bêtises.

Après, il y a toute la question de l'éthique d’une telle IA et de l'éthique du processus d’entraînement et sur l'implication de l’existence d’une telle IA (qui a les mêmes problèmes que le nucléaire ou que l’ordinateur quantique). Et bien-sûr, le développement de l’IA entre totalement en contradiction avec la nécessité climatique de sobriété énergétique, ce qui accentue les problèmes éthiques initiaux.


  1. Il y a deux méthodes pour remplacer un développeur. Soit on améliore la productivité d’un développeur et dans un travail où il y en avait besoin de plusieurs alors, mécaniquement, le travail en nécessite moins. Soit on remplace totalement un développeur et c’est ça dont je parle ici. Vous noterez que pour l’instant même la partie augmentation de la productivité reste à prouver au sujet des IA comme Copilot ou Claude.
+6 -0

Je manque de connaissance en IA pour bien comprendre pourquoi dans un cas ça marche et dans l’autre non, j’ai bien ma petite idée, mais c’est encore flou dans ma tête et je ne voudrais pas dire de bêtises.

Car tout simplement les deux ne sont pas comparables ?

Faire une IA experte dans un jeu assez cloisonné comme le Go ou les échecs c’est gourmand en calcul mais tu as moyen de converger vers de bons résultats car les possibilités restent limités par les règles du jeu qui sont faciles à faire respecter et parce que tu peux simuler quasiment n’importe quelle partie. Avec du calcul un peu bourrin et sans doute un peu d’optimisation maline tu as moyen d’avoir en effet de bons résultats en faisant analyser des parties passées + faisant jouer l’IA contre plein de joueurs et lui même.

Ici on fait ingurgiter une quantité astronomique de données en entrée sans que la signification profonde soit réellement explicité à la machine et on espère que l’IA va pouvoir recracher statistiquement le résultat attendu. C’est compliqué car ces situations sont potentiellement infinies, rien n’est borné car il n’y a pas de règles dans l’absolu, les données de qualité peuvent aussi manquer dans de nombreux contexte, il peut être difficile de s’assurer que dans toutes ces situations l’IA ne soit pas trop biaisé ni fasse de sur apprentissage, etc.

C’est pourquoi les LLM malgré le fait qu’ils sont bluffants sur certains aspects ne parviennent pas à réellement remplacer l’humain pour la plupart des tâches alors que pour d’autres tâches très spécifiques une IA surpasse l’humain si elle a été conçue dans un cadre très délimité permettant de simplifier l’entrainement et d’éviter des effets de bords car les possibilités de sorties sont aussi limitées.

Globalement, ces IA s’en sortent vraiment pas mal dans du code « d’entreprise », dans le sens que si elles ont accès au répertoire de travail, elles produisent du code cohérent (c’est-à-dire qui s’inscrit dans la continuité du projet, pas de nouvelle dépendance, réutilisation des fonctions déjà codées, style/norme de codage respectées, …) et souvent très bon dans ce contexte.

Après on peut se poser la question de la confidentialité de tout cela dans un contexte professionnel justement. D’autant plus si les données envoyées servent à l’apprentissage aujourd’hui comme dans le futur. Car les données d’entrainement peuvent facilement finir dans les sorties…

Notamment car il y a besoin encore d’avoir un esprit critique sur la sortie. Ce dont parle @Berdes par exemple. Même quand je dis « souvent très bon », ça veut dire aussi que parfois c’est pas très bon. Voir totalement non pertinent et ça c’est un problème. À la limite si on avait un truc qui était toujours acceptable même si pas toujours très bon ça passerait.

D’ailleurs j’ai eu le retour d’expérience d’un gars qui a voulu refaire un vieux jeu flash de mon enfance avec des technos web modernes qui était un sorte de Candy crush like (donc un style de jeu assez populaire et assez simple). Le gars n’est pas développeur (mais a l’habitude de jouer avec des IA pour tout et n’importe quoi), le code source et les assets étaient dispos et s’en est servi.

Il a passé pas mal d’heures pour produire un résultat convenable, proche du jeu d’origine mais avec quelques bugs ou divergences tout de même. Il y a du code parfois inutilement complexe pour pas grand chose, ou du code inutile (on réinitialise une variable qui n’existe pas).

Pour corriger ces soucis ça a été laborieux car il ne parvenait pas à décrire exactement le soucis à l’IA (en même temps, c’est difficile). Alors que je ne suis pas développeur web de métier, j’ai pu pointer les divergences avec le code d’origine bien plus vite qu’il n’a pu résoudre cela dans son coin. Car en lisant le code on identifie quand même assez nettement s’il y a une divergence entre l’intention et son implémentation.

Puis encore là on parle d’un prototype, après se poserait la question de son déploiement, si on voulait aller plus loin avec un système de login, des paiements ou autres ça pourrait vite devenir assez délicat à bien tester et s’assurer que tout aille bien. Savoir relire le code me semble nécessaire, surtout qu’il peut halluciner vraiment n’importe quoi.

L’idée c’est d’avoir une IA capable de créer un code et des spécifications et de les faire évoluer en fonction des retours utilisateurs. Encore mieux si elle est capable d’être pro-active dans l’établissement des spécifications et/ou la détermination du besoin. À ce moment-là, on a vraiment supprimé le développeur. Quand le processus de réflexion autour du code est automatisé.

Et encore.

D’expérience, je n’ai jamais eu de specs vraiment clairs dans ma vie en point d’entrée dans un projet. C’était souvent flou, très haut niveau, alors parfois il y avait quand même assez de ressources pour bien commencer mais très souvent ça tenait sur un post it. Ma femme (pourtant pas dans le milieu) m’a déjà soumis une spec pour un petit programme eprso bien mieux foutus que mes clients pros. :D

Quand j’étais junior j’allais un peu tête baissée en demandant naïvement de clarifier certains trucs. Avec l’expérience, j’ai appris à prendre du recul par rapport au contexte, à me mettre à la place de l’utilisateur pour comprendre ce qu’on veut obtenir pour ensuite proposer des solutions adaptées en plus de demander de clarifier. Car quand je demandais au début de juste clarifier pour mieux retravailler, très souvent on tombait dans des solutions assez boiteuses car finalement il manquait de vision ou de réflexion sur ce qui était voulu et l’objectif est vraiment d’améliorer cela. Je pense que c’est une valeur ajoutée pour le développeur d’agir ainsi et que les IA actuels sont bien loin de pouvoir fournir. Car il ne s’agit pas de juste raisonner autour du code, il faut raisonner sur le produit lui même aussi. Et plus on est de cerveaux et si possible de spécialités et d’expérience différentes dessus, plus on a de chances d’avoir de nouvelles idées pour faire mieux que si c’est le manager qui décide tout dans son coin dans sa tour d’ivoire. D’ailleurs je constate aussi le cas de pas mal de responsables produits qui ne consultent même pas les utilisateurs potentiels ou réels de leur produit avant de prendre des décisions…

De même pour la résolution de bogues. Je ne sais pas vous, mais les techniciens qui utilisent notre produit décrivent rarement très bien les problèmes qu’ils rencontrent. Il manque plein d’infos de base (version utilisée, config employée, actions précises effectuées pour reproduire le soucis). D’ailleurs la moitié du temps c’est plus un problème de formation et de documentation que des bogues réels. Il y a donc très souvent un jeu de questions / réponses et de devinette pour mettre le doigt sur le problème, et bon entre le problème et là où se situe le bogue dans le code il y a souvent un monde.

Avec en plus les IA qui ont tendance à faire du béni oui oui (tu dis qu’il est dans l’erreur, il essaye de se corriger quitte à faire pire que mieux ou à tenter l’impossible), je ne suis pas sûr qu’ils soient bien armés pour résoudre cela, en tout cas avec les technos actuelles.

Et pour revenir à l’expérience du non développeur qui refait un petit jeu avec ces outils, cela est cool car en effet des petits trucs simples peuvent être expérimentés par des non codeurs. Des scientifiques ou particuliers pourraient en effet faire quelques scripts ou petits programmes pour leur besoin comme ça, il y a quelques années sans un pro ou amateur pour le faire c’était souvent impossible pour eux. Mais tout n’est pas code (question du déploiement ou de l’intégration par exemple), tout n’est pas encore soluble avec ça (donc savoir lire le code en sortie est un vrai plus) et la culture reste essentielle. C’est difficile de formuler à la machine la logique d’un code quand tu ne sais pas coder, ni comment tu sais comment ça marche, si tu n’as pas les termes techniques dans certains cas qui restent indispensables, etc. Par exemple concernant le jeu développé ainsi, quelqu’un souhaitait l’intégrer à son système de login et d’enregistrement des scores, se pose la question de l’API à utiliser pour communiquer entre les deux projets. Bah quand tu ne sais pas ce qu’est une API ou en quoi ça consiste, ce n’est pas évident à mettre en place. D’où l’importance de la culture et des à côtés aussi.

Il y a de beaux pas à franchir encore donc.

Après j’ajouterais d’autres éléments malgré tout non négligeables que je trouve souvent passé sous le tapis.

Imaginons, on a une IA relativement fiable mais qui hallucine encore des conneries. L’IA fait une connerie et les conséquences pour celui qui s’en est servi pour développer avec sont importantes. Qui est responsable des dégâts et qui doit payer ? Ce n’est pas évident à répondre et cela préjugera de la confiance qu’on doit avoir dans la qualité de la sortie et donc de l’IA elle même.

Imaginons que l’IA pour s’améliorer récupère les données de tous les utilisateurs pour s’améliorer, comment s’assurer qu’aucun secret industriel ou données personnelles suite à ces ingestions ne ressortiront pas dans la nature ailleurs ?

Si l’IA a des capacités très importantes, pouvant gérer le code d’un projet, son déploiement, etc. Comment s’assurer que personne à l’extérieur ne peut attaquer l’IA pour altérer ce code, introduire du code malveillant ou autre ? Plus l’IA sera autonome, plus des attaques pourront aller loin, et on a pu le voir avec la question des prompts bien conçus ou des données d’entrainement empoisonnés permettaient facilement de contourner les protections mises en place, cela sera difficile d’ajouter des protections qui couvrent tous ces cas de figure. En particulier si l’IA utilise dans son entrainement des données non certifiées, soit en piochant sur Internet soit dans les données de ses utilisateurs.

Encore des questions à répondre et qui ne me semblent pas triviales à ce jour.

+5 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte