Connexion
Abonnez-vous

Copilot c’est bien (à condition de conduire en ligne droite)

Et de lui mettre un peu de T@lc sur les fs

Copilot c’est bien (à condition de conduire en ligne droite)

Le 27 novembre 2024 à 11h45

Il n’y a pas si longtemps, il fallait impérativement avoir du cloud pour vendre sa solution. Ensuite ce fut le tour de la blockchain, et maintenant voilà le tour de l’intelligence artificielle, ou IA*. Github propose une aide au développement pour la somme modique de 10 euros par mois, avec le premier mois gratuit, ce dont nous allons profiter et vous en faire profiter.

Installons notre copilote

Nous aurions voulu passer les menus détails d’obligation de saisir une carte bancaire, mais quand même : première carte refusée après avoir validé la transaction d’enregistrement (une simple demande d’autorisation sans débit) sur l'appli bancaire adéquate.

Par chance, nous disposions d’une deuxième carte. Résultat : négatif. Ne nous énervons pas et contactons le support. La réponse reçue était un extrait de la FAQ sur le sujet, donc aucun intérêt. Finalement la première carte finira par marcher sans que nous comprenions pourquoi (et sans avoir rien fait). Ça commence bien.

Le contexte de notre programme

Pour évaluer correctement les possibilités de l’outil, nous sommes partis sur une idée de programme un peu complexe : réaliser un inventaire des ressources détenues sur un compte AWS, c’est-à-dire lister les instances EC2, les buckets S3 et surtout l’ensemble de ce qui est souscrit à un moment donné, dans toutes les régions, ce qui peut être utile pour mieux gérer son budget.

D’où vient la complexité du traitement ? Du multithreading pour optimiser le temps d’exécution, et de la généricité des fonctions pour ne pas réécrire de code à chaque ajout de ressource à inventorier. Cela implique l’appel de fonction avec un nom variable, des résultats aux appels d’API de structure similaires en apparence, mais différentes car tantôt en liste, en dictionnaire, en tuple, etc.

Demandons quelque chose de simple

Première tentative : nous partons d’un programme déjà bien avancé, et demandons à Copilot une petite modification. Dans notre code, il existait déjà une fonction que retournait la liste des régions AWS, et nous avons demandé à Copilot de l’ajouter dans notre fonction principale d’inventaire.

Voici sa réponse :

La réponse fut de créer une fonction à cet effet, écrite correctement, mais nous ne voulions pas simplement utiliser celle qui existait déjà. Copilot a ajouté cet appel pour incorporer cette liste dans le résultat final, mais en ajoutant une fonction en doublon avec la nôtre. Il a fallu le reprendre :

Dommage. Autre travers : il ne lit pas dans les pensées. Nous lui avions demandé, via le prompt, d’écrire la liste des régions. Dans la fonction (celle en doublon qu’il a créé), il n’a donc écrit… que la liste des noms de régions, et non l’ensemble du JSON retourné par AWS. Il n’anticipe pas le fait qu’on puisse en avoir besoin, et a donc réduit le résultat en retour en conséquence.

C’est exactement ce qui a été demandé. Pour avoir le JSON complet, il faut lui demander. Un peu trop zélé, Copilot... Un codage plus simple eût été :

On sent bien qu’il va falloir être précis dans ce qu’on va demander à notre ami.

On tourne parfois en rond

Il suffit quelques fois d’une demande a priori simple pour que notre assistant tourne en boucle. Probablement un problème de configuration de l’outil, mais cela montre bien qu’il faut être très attentif lors de l’utilisation des réponses : la sensibilité de l’outil peut rendre une réponse incohérente ou fausse, sans signe avant-coureur.

Ici, nous avons simplement demandé de déplacer des informations d’un fichier JSON vers un autre.

Pourtant, je vous rappelle qu’il s’agit de la version payante, donc on s’attendait à avoir une configuration plus adaptée et moins d’erreurs de ce genre.

Le bon et le moins bon

Il faut avouer que Copilot est bien utile dans certains cas, relativement simples malgré tout : générer la documentation (les docstrings), quelques commentaires (mais pas trop), des cas de tests, une correction ponctuelle. Dans notre cas, un JSON avait un nœud en double (en trop) mais dans un code qui commençait à être long, il l’a corrigé sans trop de souci, alors qu’une recherche avec des tests à la main eût été beaucoup plus longue.

Dans le moins bon, il faut se rappeler que le résultat est probabiliste : il y a donc de fortes chances que ça soit bon, mais il se peut aussi que ça soit faux. Et qui peut le vérifier ? Vous-même ! Dans ce qui est irritant, c’est sa propension à répondre strictement aux questions : en lui demandant une correction d’une fonction, Copilot nous a donné un bout de code à rajouter, et quand nous lui avons demandé juste après où commençait ce code (dans le sens : où faut-il l’insérer), il a répondu logiquement... en ligne 1. Car oui, tout code commence en ligne 1. Fallait y penser, non ?

Traduction en go : bonnet blanc et blanc bonnet

Histoire de voir les capacités de calcul et de logique de la chose, nous avons demandé à Copilot de transformer notre code Python en Go Lang. Malheureusement, l’IA a fait l’impasse sur de nombreuses parties du code, en la simplifiant, comme par exemple ici :

Il saute souvent la partie la plus complexe du code, celle qui demande le plus de logique d’implémentation. Autre souci : il a tendance à simplifier. Dans getClient, il aurait fallu avoir une fonction générique pour toutes les ressources AWS, Copilot a tout simplement écrit la fonction pour deux d’entre elles : ec2 et s3. Donc c’est loin de l’esprit du code que nous voulions, et ça n’est pas faute de lui avoir répété à plusieurs reprises.

Pour comparer les performances de Codex (la version optimisée du modèle GPT utilisée par Copilot), nous avons fait le test sur ChatGPT, basé lui aussi sur OpenAI. La tendance est la même :

Le code initial permettant de répondre à la demande n’était pourtant pas des plus complexes :

Difficile alors de comprendre l’apport de Copilot par rapport à un ChatGPT standard : le modèle optimisé Codex (utilisé par Copilot) n’apporte pas de grande amélioration ou de gain de qualité. C’est légèrement mieux sans être transcendant. Sur un code plus petit et moins complexe (un résolveur de Sudoku), la conversion a été correcte dès le premier essai, mais il semble que dès que la complexité augmente un tant soit peu, les limites sont atteintes.

Pour voir un exemple de conversion réussie sur un code Python, les deux répertoires sont ici :

Le programme en Go a fonctionné du premier coup. Pour le même exercice, GPT4 bloquait sur la fonction principale.

Quelques mots

Il ne faut pas tout jeter, bien sûr, mais il faut par contre bien savoir ce que l’on fait, comme souvent, et surtout connaître les limitations de l’outil. Or ce n’est que par la pratique qu’on peut y arriver, car sa complexité rend impossible l’appréhension complète du modèle et de son comportement.

Cela nous amène à un autre point : évitez de lui demander un énorme bout de code avec plusieurs exigences fonctionnelles, car il suffit que vous formuliez une seule d’entre elle de façon trop imprécise pour que Copilot génère ce qu’il comprend et non ce que vous pensez : en gros, il n’écrit que ce que vous demandez (ce qui est normal après tout) ; or il est bien difficile d’être parfaitement logique, cohérent et juste du premier coup. Et plus vous en demanderez, plus il y aura de risque d’erreurs et donc de vérifications à faire pour s’assurer du code produit. De ce fait, les modifications demandées devront être facilement vérifiables, donc relativement limitées. C’est dommage alors qu’on pensait que le contexte était mieux géré, sans qu’on ait à repréciser à chaque fois ce qui a été fait ou ce que l’on a demandé.

Néanmoins, il faut reconnaître qu’utiliser Copilot vous évitera de longues heures de recherche pour savoir quelle bibliothèque utiliser, quelle syntaxe employer, ou pour préparer un cadre avec des formules répétitives : mettre en paramètre telle ou telle chose, sortir une structure dont les valeurs sont codées « en dur » dans un fichier, inclure une liste de données issues de documentation externe (ici la documentation de boto3 qu’il n’a même pas été besoin de mentionner), etc.

Ce qui est en gris a été ajouté automatiquement par Copilot dans l’outil de développement de Github, Codespace

Ce qu’il n’a pas été possible de vérifier dans ce test, c’est la profondeur et la persistance du contexte de l’IA. Même en générant un nouveau chat, Copilot garde parfois des instructions qu’on aurait voulu qu’il oublie. En un mot, c’est une aide précieuse qui ressemble à un « stagiaire zélé mais stupide » : il est de bonne volonté, capable de faire des choses efficaces et rapidement, mais il lui manquera toujours l’habileté, la connaissance, et le contexte suffisant pour produire exactement ce qu’on souhaite.

Mais attention : il prend parfois des libertés qui lui semblent logiques, mais qui ne correspondent pas à ce qu’on a demandé. Il peut par exemple considérer qu’il doit générer un fichier de test, ou appliquer une correction, alors que ça n’est pas le cas : il ajoute des /fix ou /test dans le prompt de façon intempestive. Copilot est donc une aide, un peu mieux calibrée qu’un GPT standard, mais auquel il manque toujours une bonne et solide logique.

* Il m’est assez pénible de voir de l’IA partout au boulot, puisque j’en ai une à la maison : ma femme s’appelle… Ia. Elle est d’origine géorgienne (de l’ex-URSS) et là-bas ce doux prénom relativement courant signifie violette.

Commentaires (18)

votre avatar
Vu toute la galaxie de Copilot chez Microsoft, il aurait été bon de préciser lequel dans le titre :) Sans accès à l'article, je pense comprendre qu'il s'agit de GitHub Copilot
votre avatar
Un petit abonnement pour en savoir plus ?

ça les vaut largement, croyez moi.
votre avatar
Tiens c'est bien ce genre d'article. Parce que de mon côté, je suis dépité par la nullité de ChatGPT 4o pour le code. Tout le monde s'extasie mais je comprends difficilement. Certes, il dégueule du code mais quand je ne lui en demande pas. Mais j'ai essayé tout type de prompt et de bot : il ne sort que très rarement du code magnifique. Je ne parle pas de structure (où il est bien plus fort que moi qui ne suis pas dev) mais d'intelligence. Je suis obligé de le guider constamment, c'est fastidieux. Bref, pour moi, ça sent pas vraiment la violette :)
votre avatar
Cela nous amène à un autre point : évitez de lui demander un énorme bout de code avec plusieurs exigences fonctionnelles, car il suffit que vous formuliez une seule d’entre elle de façon trop imprécise pour que Copilot génère ce qu’il comprend et non ce que vous pensez : en gros, il n’écrit que ce que vous demandez (ce qui est normal après tout) ; or il est bien difficile d’être parfaitement logique, cohérent et juste du premier coup
Merdalors, exactement comme actuellement où le client ne sait pas exprimer son besoin et demande au dev de coder sans specs :D

Quand j'avais expérimenté GitHub Copilot + Chat l'année dernière, j'étais arrivé à la conclusion que l'outil ne sert à rien si l'utilisateur ne sait pas ce qu'il fait. J'avais volontairement utilisé un projet en Javascript (je n'y connais rien dans ce langage), l'outil pissait du code, ça marchait, mais dès qu'il fallait creuser c'était foutu.

Sur le point du contexte, mon test n'avait été fait que via VSCode. Quand je faisais un RAZ de celui-ci, Copilot Chat repartait de zéro. Et c'était très relou car il s'était mis à réécrire toutes les variables.

À l'inverse, sur un langage que je connais mieux comme Python, c'était un bon assistant parce que je savais quoi demander et je pouvais corriger ses petites erreurs.
votre avatar
Je suis amateur en codage, et je ne suis "autonome" que sur python.

Quand je me suis lancé dans le développement de mon extension en js, j'ai adoré travailler avec Copilot : un moteur de recherche rapide et circonstancié, mais sans vision globale.

Du coup je l'utilise surtout pour les grandes lignes de chaque fonction, debuguer et affiner les détails, mais pas pour l'architecture globale.

Jamais je n'aurai pu avancer autant sans ça 😳
votre avatar
On peut quand même souligner la prouesse de la conversion en Go correcte dès le premier essai pour un code de 450 lignes.
Il y a quelques années c'était impensable.

Copilot est le moins bon des assistants de programmation de mon expérience. Il sort rarement qqchose d'utile, il ne propose fréquemment aucune complétion même quand la suite est évidente (ça fait perdre du temps à attendre la complétion qui n'arrive pas) etc. En passant en mode conversation on repère vite qu'il est surtout optimisé pour réduire les couts.

J'ai de meilleurs résultats avec Gemini, même si ça n'est pas encore au niveau de ce que ça pourrait être à mon avis, même en restant avec une architecture de type LLM.

Sinon, Claude 3.5 (https://claude.ai/) de Anthropic est impressionnant, avec un niveau d'intelligence comparable à o1 (le dernier de OpenIA) mais en plus rapide. On peut facilement le configurer comme assistant dans vscode.

Claude est le seul assistant à m'avoir généré le code d'un petit jeu fonctionnel dès le premier essai à partir d'une simple description.

Les autres sortent un code vaguement crédible mais qui ne fonctionne pas du premier coup.
votre avatar
GitHub Copilot, je l'utilise sur VScode, c'est un très bon outil d'autocomplétion intelligente.

Pensant déjà à celui qui va lire mon code (CàD, le moi du futur principalement), j'a tendance à expliquer ce que je fais en commentaire. Cette façon de faire fonctionne bien avec Copilot, qui "sait" ce que je veux faire et va me proposer une première solution. Généralement, je n'ai rien à changer. Souvent il manque des trucs, j'accepte une partie du code (avec ctrl+flèche droite), je corrige, et me repropose une nouvelle suite en tenant compte des modifications. D'autre fois, mon commentaire est ambigu, et la réponse est totalement à côté de la plaque, c'est finalement une bonne idée de modifier le commentaire (le moi du futur est surement quelqu'un de très con, si Copilot n'a pas compris, il ne comprendra surement pas). Autre point, c'est que maintenant, écrire la documentation d'une fonction est vraiment utile, si c'est assez bien écrit, il va écrire un code qui sera une bonne base (et en plus, il t'aide à rédiger la doc).

Mais de manière générale, sans même avoir à écrire des commentaires sur ce que l'on veut faire, Copilot va très vite déduire ce que tu cherches à faire (si tu ne nommes pas toutes tes fonctions et variables avec des "foo", "bar" "toto", "titi", "tata"...) et va essayer de proposer les prochaines lignes de code qui ne tombent généralement pas bien loin de ce que tu allais écrire.

De plus, il est bon pour découvrir des sortes de motifs, et va vite proposer l'autocomplétion pour des codes chiants et rébarbatifs.

Il n'est pas sans défaut, et parfois il se borne à écrire ce qu'il a choisi d'écrire.
votre avatar
Je fais du dev PHP depuis un bon gros moment et suis amené à faire de petit soft en Bash pour la gestion de serveurs.
Je l'utilise avec PHPStorm (pour le PHP et pour le Bash)
Franchement je pourrais difficilement me passer de Copilot maintenant que j'y suis habitué. Je produit beaucoup plus vite.
Bien sur ce n'est pas parfait mais l’augmentation de la productivité est bien là.
En bonus il me sort parfois une méthode / fonction etc. à laquelle je n'aurai pas pensé et ça c'est vraiment chouette car du coup j'ai l'impression de m'améliorer.
J'utilise depuis peu le Chat pour lui poser des questions plus généraliste et clairement le gain de temps est également sensible par rapport à d'interminable recherche Gogole.
votre avatar
Je l'utilise beaucoup pour coder en Python, Delphi, Angular (18/19) avec un passage en cours vers Jest au lieu de Karma.

Son plus gros défaut c'est de ne pas savoir s'adapter même quand on lui donne des documentations à jour :
- Il remplace systématiquement les @if par *ngIf en expliquant que le problème est là.
- Il ne sait pas que les composants sont maintenant standalone par défaut et du coup les déclare au lieu des les importer.
- Il met des virgules à la fin des lignes même si inutile (syntaxe dégueux des dev javascript !).
- Impossible d'avoir de l'aide sur des fonctionnalités récentes comme ZoneLess, les signaux ou OnPush en Angular. Là je galère à passer à Jest car je dois le basculer en mode ESM et Copilot ne connait que les syntaxes obsolètes.
- En Python, il reste un adepte du dict alors que c'est obsolète depuis longtemps déjà.

Son second plus gros défaut c'est cette tendance à s'enfermer dans une solution fausse sans jamais sans sortir, à pondre du code 100% identique alors même qu'il dit qu'il a modifié des choses.

D'ailleurs de ce côté là, la nouvelle fonction d'écriture directe dans le code existant permet très vite de savoir s'il fait le con. Juste dommage qu'il ne puisse trouver tout seul les fichiers qui lui manque quand il en a besoin alors qu'ils sont importés dans le code, et qu'en plus, il réécrive tout le code de chaque fichier modifié au lieu de seulement là où c'est nécessaire.

Bref, il peut beaucoup aider comme parfois faire perdre un temps fou avec des envies de lui foutre des baffes !
votre avatar
Son second plus gros défaut c'est cette tendance à s'enfermer dans une solution fausse sans jamais sans sortir, à pondre du code 100% identique alors même qu'il dit qu'il a modifié des choses.
Dans ces cas-là, un RAZ de contexte ne suffit pas ?
votre avatar
Ça peut être une méthode, mais il faudra leui redonner tout le contexte, ça peut être fastidieux.
Et comme il a été dit, il semblerait que ça ne purge pas tout.
votre avatar
Comme je disais dans mon autre message, sur VSCode le clear démarrait bien un nouveau contexte. Ou alors ça a changé depuis.

Après, l'article ne donne pas les conditions du test.
votre avatar
Utilisation de Visual Code et Codespace.

Le clear démarre bien une nouvelle conversation, mais j'ai remarqué à plusieurs reprises que cela n'effaçait pas tout : Copilot reprenait parfois (rarement, soyons honnête) des consignes issues de prompts précédents qu'il a fallu que j'annule par prompt. Cette notion de contexte est très complexe à gérer ; c'est déjà difficile pour un humain, alors pour une IA... Le contexte est crucial et pourtant il est difficile à établir et à maintenir.

C'est probablement le talon (ou un des talons) d'Achille de ces systèmes, car pour être efficace il ne faut pas aller trop en profondeur, alors qu'on aimerait au contraire que ces systèmes aient suffisamment de repères pour nous être vraiment utiles.
votre avatar
Merci pour les précisions :)

L'intégration dans Visual Code et Codespace doit donc être assez différente... Après je n'ai pas utilisé GitHub Copilot depuis un bail. C'est assez surprenant, car le contexte est censé repartir du system prompt et des exemples permettant au modèle de s'orienter. Ou alors il "retrouve" le fil en faisant du RAG sur le code, c'est une possibilité je pense.

Le soucis pour aller en profondeur, c'est qu'il lui faut plus de données. Et donc traiter un plus gros contexte. Quand je vois ce que GitHub Copilot pouvait cracher comme réponse avec le code en input, c'était déjà de belles tailles. Je ne sais pas sur quel modèle il tourne aujourd'hui, probablement un GPT-4o aussi qui supporte 128k tokens en entrée et peut sortir quelques 16k en sortie de mémoire. L'autre risque avec un contexte trop riche, c'est que le modèle finisse par partir en vrille. C'était, à l'époque où j'ai suivi de plus près ces sujets, une des raisons que Microsoft avançait pour la limitation du nombre de questions/réponses sur ses outils (l'autre restant forcément financière, ça coûte). Ça reste des modèles statistique, après tout.
votre avatar
Tu peux choisir le modèle :

GPT 4o
o1-mini
o1-preview
Claude 3.5 Sonnet
votre avatar
Ah oui je m'en rappelle, effectivement :D
votre avatar
J'utilise copilot au boulot ... Il fait vraiment honneur à Ms: message qui se reformulent en Anglais (partiellement), refus de répondre, timeout, messages d'erreurs 5-6 fois par jour (et je ne suis pas collé dessus).
Une fois, il est totalement parti en boucle, il a fini par me sortir des recettes de cuisine sans fin (euh, je lui demandais de commenter du code).
Au final, j'ai un LMstudio + Llama 3B à côté, j'ai des bugs moins "dramatique" (surtout au vu du coût).
votre avatar
sous titre tout à fait excellent du T@LC sur les fs j'ai explosé de rire

Copilot c’est bien (à condition de conduire en ligne droite)

  • Installons notre copilote

  • Le contexte de notre programme

  • Demandons quelque chose de simple

  • On tourne parfois en rond

  • Le bon et le moins bon

  • Traduction en go : bonnet blanc et blanc bonnet

  • Quelques mots

Fermer