Générer du code avec l’IA

a marqué ce sujet comme résolu.

Ceci dit dans un monde idéal, ce n’est pas non plus le développeur qui a écrit le code qui le teste

Même si on code en se disant que l’utilisateur est idiot, on ne peut pas tout prévoir.

Faudra-t-il créer une autre sort d’IA (Imbécilité Artificielle) ?

Il suffit d’écrire sur la ligne d’édition de son navigateur avec Google:

google gemini

(je mentionne google pour ne pas confondre avec autre chose, comme la mission Gemini de la NASA)

J’ai d’abord fait des tests simples tels que:

  • Trouver la somme des nombres de 1 à 100 (je connais la formule, mais le code était correct)
  • Trouver les nombres premiers de 1 à 100 avec l’algorithme du crible d’Ératosthène.

J’ai explicitement demandé d’écrire la solution en Python. Je me dis que si l’exécution prend beaucoup de temps, c’est en grande partie parce que l’algorithme n’est pas le meilleur. Je me suis ensuite attaqué au problème 93 sur le site Défi Turing que je n’avais pas encore résolu, je l’avoue.

Voici l’énoncé:

Il est possible d’écrire 10 comme une somme de nombres premiers de cinq manières exactement :

7 + 3

5 + 5

5 + 3 + 2

3 + 3 + 2 + 2

2 + 2 + 2 + 2 + 2

Quel est le plus petit entier qui peut s’écrire comme une somme de nombres premiers de plus d’un million de manières différentes ?

Gemini m’a fourni une solution qui donne la bonne réponse (le site vérifie si notre réponse est correcte). De plus, mon code s’exécute en 13 milli-secondes sur mon ordinateur. Un autre utilisateur a écrit son code en Rust et son code s’exécute en 5 milli-secondes sur son ordinateur. Je n’ai pas analysé son code. Mon expérience comparative de ces deux langages me laisse croire que le code de Gemini pourrait s’exécuter en moins de la milli-seconde en Rust sur mon ordinateur. (peut-être 500 à 700 micro-secondes).

Voici le code généré par Gemini:

(j’ai ajouté le code pour calculer le temps d’exécution)

from time import perf_counter

def nombres_premiers(n):
    """Retourne une liste de nombres premiers inférieurs ou égaux à n."""
    premiers = [True] * (n + 1)
    premiers[0] = premiers[1] = False
    for i in range(2, int(n**0.5) + 1):
        if premiers[i]:
            for j in range(i * i, n + 1, i):
                premiers[j] = False
    return [i for i, est_premier in enumerate(premiers) if est_premier]

def nombre_de_sommes_premiers(n, premiers):
    """Calcule le nombre de façons dont n peut être écrit comme une somme de nombres premiers."""
    dp = [0] * (n + 1)
    dp[0] = 1
    for premier in premiers:
        for i in range(premier, n + 1):
            dp[i] += dp[i - premier]
    return dp[n]

def trouver_entier_million_sommes():
    """Trouve le plus petit entier qui peut être écrit comme une somme de nombres premiers de plus d'un million de façons."""
    n = 2
    while True:
        premiers = nombres_premiers(n)
        if nombre_de_sommes_premiers(n, premiers) > 1000000:
            return n
        n += 1

depart = perf_counter()
resultat = trouver_entier_million_sommes()
print(round(perf_counter() - depart, 3), "secondes")
print(f"Le plus petit entier qui peut être écrit comme une somme de nombres premiers de plus d'un million de façons est : {resultat}")

De plus Gemini donne des explications sur la signification ou l’utilité des différentes fonctions. Dans les cas simples, il donne une explication soit de l’algorithme ou soit du code.

Je n’ai pas encore cherché à l’optimisé. Ce n’est pas si mauvais pour du code généré automatiquement par une IA.

+0 -0

Ce n’est pas si mauvais pour du code généré automatiquement par une IA.

Le problème, c’est qu’une fois que le code est embarqué dans une application réelle, on se fiche un peu de savoir d’où il vient et qui l’a créé : un mauvais code est un problème, qu’il soit mauvais parce que créé par un débutant, un employé incapable ou une IA.

Selon l’usage fait de l’IA ça peut ou non être un problème ; mais si on attend d’elle qu’elle produise un code utilisable directement, ça va poser des soucis à court ou moyen terme. Genre ce « vibe coder » (nouveau terme idiot pour les gens qui ne connaissent rien au développement informatique et qui codent « super vite » avec de l’IA) qui a dû se refaire toute l’histoire de la sécurité informatique en une semaine parce qu’il a poussé une application sur laquelle il n’y avait même pas d’authentification (il ne savait pas ce que c’était).

Je ne dis pas que l’IA résout tous les problèmes.

Ici, la validation était facile car on attend un seul nombre.

J’ai refait ma demande en exigeant que ce soit codé en Rust. Le code fournit ne fonctionne pas à cause d’un débordement d’indice.

De plus, le choix des noms de variables est intéressant. C’est en français pour la version Python et en anglais pour la version Rust.

Ça laisse supposer que cet IA emprunte du code d’ailleurs. Mais quel est cet ailleurs? Est-ce du code validé?

Ensuite,la version Rust n’utilise pas le crible d’Ératosthène, même si je l’ai demandé.

Il semble qu’elle ne fasse pas vraiment la conversion d’un algorithme en code. Ça ressemble plus à un assemblage de code déjà tout écrit.

+0 -0

Ça laisse supposer que cet IA emprunte du code d’ailleurs. Mais quel est cet ailleurs?

  • Les ia prennent tout ce qu’elles trouvent sur le web (github, gitlabs, blogs, forums, …)
  • Prennent aussi les codes que l’on donne dans le chat.
  • Plus problématique, elles proposent des plugins pour nos éditeurs (ex: gemini(et autres) dans vscode). Alors elles remontent tous nos fichiers édités et tout le monde peut retrouver un jour notre code comme proposition ou autocomplétion.

Est-ce du code validé?

Oui, puisque chaque IA a embauché 500 000 ingénieurs pour cela ! :) Plus sérieusement, pour le web (projets git publiques), je suppose quelle donne une super note d’office aux projets avec plus de 100 contributeurs et une note proche de zéro pour les projets avec 1 seul contributeur. Wikipedia doit aussi avoir une super note. Après, c’est nous les utilisateurs qui validons gentiment et gracieusement le code que l’ia nous propose. Il est donc normal qu’avec le temps les ia s’affinent (grâce à nous)

+0 -0

En tout cas, je trouve Gemini assez prétentieux si on peut dire. Je lui ai demandé la question suivante (pourquoi pas?):

Je ne te demande pas de me dire comment convertir un algorithme en programme. Je te demande si tu peux le faire toi-même.

Je ne donne pas sa réponse ici, c’est plutôt long.

Il prétend pouvoir déboguer son code, mais comme je l’ai mentionné plus haut, le code ne marchait pas.

Il faut bien le dire, Rust est un langage relativement nouveau. Je ne sais pas d’ailleurs s’il peut exécuter le code sur sa machine et vérifier le résultat.

Il y a des sites tels que France IOI qui peuvent détecter certains types d’erreurs.

Dans le cas de mon programme, il aurait dû être capable en principe de détecter un segmentation fault.

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