Utiliser l'IA générative pour écrire et exécuter du code embarqué

Ari Mahpour
|  Créé: Mai 15, 2024  |  Mise à jour: Juillet 1, 2024
Utiliser l'IA générative pour écrire et exécuter du code embarqué

Dans Comment construire une action GPT personnalisée pour communiquer avec votre matériel et Construire un assistant de laboratoire IA, nous avons appris à contrôler notre matériel en utilisant l'IA générative. En utilisant des actions GPT personnalisées au sein de ChatGPT, nous avons pu donner à ChatGPT la capacité de non seulement faire clignoter des LED sur un Raspberry Pi mais aussi de contrôler et d'acquérir des données à partir d'instruments de laboratoire. Cela signifiait que nous pouvions utiliser l'intelligence artificielle comme notre assistant de laboratoire et également traiter pour nous les données qu'elle avait acquises de nos instruments. Dans cet article, nous allons encore plus loin en permettant à l'IA générative non seulement d'écrire du code pour nous mais aussi de l'exécuter sur des cibles embarquées et de recevoir des retours dans le processus.

Contexte

Utiliser l'IA générative pour écrire du code, même pour les systèmes embarqués, n'est pas tout à fait nouveau. Il existe déjà une myriade d'outils suggérant ou écrivant complètement du code à partir de zéro. La plupart des modèles de langage de grande taille, tels que ChatGPT, Gemini et Claude, sont devenus assez bons pour écrire du code (voir Gemini vs ChatGPT : Qui écrit le meilleur code ? pour une comparaison). Cela fait plus d'un an que j'écris sur la génération de code par ChatGPT (voir Utiliser ChatGPT pour les tests automatisés) et je prêche que c'est la seule façon de développer de nos jours. Le véritable défi est d'intégrer l'IA dans le cycle de votre développement.

La génération de code vous mène jusqu'à un certain point mais être capable de valider et de s'assurer qu'il fonctionne nécessite une approche différente quand il s'agit d'IA générative. Code Interpreter avec ChatGPT fournit un environnement Python encapsulé qui peut, dans une certaine mesure, exécuter le code généré et valider qu'il fonctionne pour vous. Je voulais aller plus loin et voir si nous pouvions réaliser la même chose avec les systèmes embarqués. Il y a deux voies que l'on pourrait prendre avec le ChatGPT d'OpenAI. La voie la plus commune est de créer une application en boucle fermée qui utilise l'API OpenAI. Elle solliciterait et récupérerait le code du modèle de langage de grande taille (LLM) en utilisant l'API, le compilerait, le chargerait sur l'Arduino, et utiliserait du code personnalisé supplémentaire pour valider la fonctionnalité du code généré. J'ai décidé de prendre une approche différente en utilisant des actions GPT afin de rendre cela plus comme une "expérience de codage en binôme". Voici à quoi ressemble cette expérience :

Exemple d'action GPT

Figure 1 : Exemple d'action GPT

Bien que l'exemple puisse être trivial (c'est-à-dire faire clignoter une LED intégrée), la démonstration ci-dessus résume tout. J'ai pu donner des instructions claires à mon GPT personnalisé et il a suivi les directives exactement comme je l'attendais. J'ai également pu confirmer qu'il avait, en effet, téléchargé sur mon appareil et fait clignoter la LED à une fréquence de 1s. L'avantage d'utiliser un GPT personnalisé par rapport à un système en boucle fermée est que je peux itérer assez facilement au sein de l'invite :

Itération sur le sketch Arduino

Figure 2 : Itération sur le sketch Arduino

Maintenant que vous avez vu quelques exemples, examinons comment tout cela fonctionne.

Comment ça marche

Tout comme nous l'avons vu avec d'autres articles sur les GPT personnalisés, la configuration des Actions GPT pour ce projet est, plus ou moins, la même. Le Dockerfile, Docker Compose, les certificats SSL et la structure générale du dépôt n'ont pas beaucoup changé. Bien sûr, le code de conception lui-même et le fichier YAML OpenAPI sont significativement différents (comme on pouvait s'y attendre).

Le plus grand changement qui se produit dans ce code (par rapport aux exemples précédents) est que nous introduisons un « subprocess » en Python pour appeler un programme externe, dans ce cas l'IDE Arduino. Notre fichier YAML OpenAPI (openapi.yaml) est ce qui fournit la structure à ChatGPT sur quelles informations doivent être livrées et comment elles doivent l'être. En regardant la section « components » à la fin du fichier YAML, vous remarquerez les différentes parties de l'objet de retour que nous attendons :

  

composants :

  schemas :

    CodeSnippet :

      type : object

      properties :

        language :

          type : string

        code :

          type : string

        description :

          type : string

          nullable : true

      required :

        - language

        - code

Nous avons demandé à ChatGPT de ne pas seulement fournir le code, mais aussi le langage et, optionnellement, une description de ce code. Nous traitons ces informations dans app.py. Plus important que le simple traitement de la commande, nous retournons également des réponses HTTP significatives si quelque chose se passe mal dans le processus. Cela aide à fournir un contexte et à parler le même « langage » que le serveur web/le bot IA de ChatGPT.

L'implémentation, bien que quelque peu rudimentaire, est très simple : nous transférons le fragment de code dans un fichier INO temporaire, vérifions et/ou téléchargeons celui-ci vers l'Arduino, et supprimons le fichier INO temporaire. Il y a, évidemment, tant de choses qui peuvent mal tourner, y compris une quantité insurmontable de risques de sécurité. Il est extrêmement important, comme toujours, de limiter votre environnement de développement et, si vous l'ouvrez au monde extérieur, de mettre en œuvre toutes les mesures de sécurité nécessaires pour assurer la sécurité de votre environnement.

Juste pour le plaisir, j'ai également implémenté une commande de lecture série très basique qui donne à notre action GPT personnalisée la capacité de lire depuis le port série de l'Arduino. Cela nous permet de valider que le port série fonctionne sans vérification manuelle depuis notre machine. Un scénario d'exemple pourrait être si vous demandez à ChatGPT d'écrire et de télécharger du code sur votre Arduino depuis votre smartphone. Cela, bien sûr, peut être étendu à une mise en œuvre série de type get/set plus formelle où vous envoyez des commandes et lisez les réponses en retour via série (comme implémenté dans Configurer un projet de boucle matérielle).

Conclusion

Dans cet article, nous avons montré comment l'IA peut faire plus que simplement écrire du code - elle peut également s'assurer que le code fonctionne en l'exécutant sur des appareils réels. C'est comme avoir un développeur qui non seulement écrit votre projet pour vous, mais le teste également pour s'assurer qu'il est correct. Avec les exemples que nous avons utilisés, vous pouvez voir comment cela pourrait changer la manière dont nous créons et testons nos projets, rendant les choses plus rapides et plus faciles. Toutes les étapes et le code que nous avons utilisés sont partagés, donc toute personne intéressée peut les essayer et voir comment l'IA pourrait aider dans leur travail.

Découvrez plus sur ce projet pionnier et rejoignez l'évolution à : https://gitlab.com/ai-examples/ai-arduino-code-builder.

A propos de l'auteur

A propos de l'auteur

Ari est un ingénieur doté d'une solide expérience dans la conception, la fabrication, les tests et l'intégration de systèmes électriques, mécaniques et logiciels. Il aime collaborer avec des ingénieurs chargés de la conception, la vérification et les tests afin de favoriser les synergies.

Ressources associées

Documentation technique liée

Retournez à la Page d'Accueil
Thank you, you are now subscribed to updates.