In Wie man eine benutzerdefinierte GPT-Aktion erstellt, um mit Ihrer Hardware zu kommunizieren und Aufbau eines KI-Laborassistenten haben wir gelernt, wie wir unsere Hardware mit generativer KI steuern können. Durch die Verwendung von benutzerdefinierten GPT-Aktionen innerhalb von ChatGPT konnten wir ChatGPT die Fähigkeit geben, nicht nur LEDs an einem Raspberry Pi blinken zu lassen, sondern auch Labormessgeräte zu steuern und Daten von ihnen zu erfassen. Das bedeutete, dass wir künstliche Intelligenz als unseren Laborassistenten nutzen und auch Daten für uns verarbeiten lassen konnten, die sie von unseren Instrumenten erfasst hat. In diesem Artikel gehen wir einen Schritt weiter, indem wir generative KI nicht nur Code für uns schreiben lassen, sondern diesen auch auf eingebetteten Zielsystemen ausführen und im Prozess Rückmeldungen erhalten.
Die Verwendung von generativer KI zum Schreiben von Code, auch für eingebettete Systeme, ist nicht brandneu. Es gibt bereits eine Vielzahl von Tools, die entweder Code vorschlagen oder komplett von Grund auf neu schreiben. Die meisten populären großen Sprachmodelle, wie ChatGPT, Gemini und Claude, sind mittlerweile ziemlich gut darin, Code zu schreiben (siehe Gemini vs. ChatGPT: Wer schreibt besseren Code? für einen Vergleich). Ich schreibe seit über einem Jahr darüber, dass ChatGPT Code generiert (siehe Verwendung von ChatGPT für automatisierte Tests) und predige, dass es heutzutage der einzige Weg zur Entwicklung ist. Die wirkliche Herausforderung besteht darin, KI in den Entwicklungsprozess einzubinden.
Die Generierung von Code bringt einen nur so weit, aber um sicherzustellen, dass er funktioniert, ist ein anderer Ansatz erforderlich, wenn es um generative KI geht. Code Interpreter mit ChatGPT bietet eine gekapselte Python-Umgebung, die in gewissem Umfang generierten Code ausführen und validieren kann, dass er für Sie funktioniert. Ich wollte einen Schritt weiter gehen und sehen, ob wir dasselbe mit eingebetteten Systemen erreichen könnten. Es gibt zwei Wege, die man mit OpenAIs ChatGPT einschlagen könnte. Der häufigste Weg ist die Erstellung einer geschlossenen Anwendung, die die OpenAI-API verwendet. Sie würde den Code vom großen Sprachmodell (LLM) mit der API abrufen, ihn kompilieren, auf das Arduino laden und zusätzlichen benutzerdefinierten Code verwenden, um die Funktionalität des generierten Codes zu validieren. Ich entschied mich für einen anderen Ansatz mit GPT-Aktionen, um es mehr zu einem „Code-Pairing-Erlebnis“ zu machen. So sieht dieses Erlebnis aus:
Abbildung 1: Beispiel einer GPT-Aktion
Obwohl das Beispiel trivial sein mag (d.h. das Blinken einer Onboard-LED), fasst die obige Demonstration alles zusammen. Ich konnte meinem benutzerdefinierten GPT klare Anweisungen geben, und es hat die Anweisungen genau so befolgt, wie ich es erwartet hatte. Ich konnte auch bestätigen, dass es tatsächlich auf mein Gerät hochgeladen wurde und die LED mit einer Rate von 1s blinkte. Das Schöne an der Verwendung eines benutzerdefinierten GPT im Vergleich zu einem geschlossenen System ist, dass ich innerhalb der Aufforderung ziemlich einfach iterieren kann:
Abbildung 2: Iterieren am Arduino-Sketch
Nachdem Sie nun einige Beispiele gesehen haben, werfen wir einen Blick darauf, wie das alles funktioniert.
Wie wir es bereits bei anderen benutzerdefinierten GPT-Artikeln gesehen haben, ist die Einrichtung der GPT-Aktionen für dieses Projekt mehr oder weniger dieselbe. Die Dockerfile, Docker Compose, SSL-Zertifikate und die allgemeine Struktur des Repositories haben sich nicht viel geändert. Natürlich sind der Designcode selbst und die OpenAPI YAML-Datei deutlich unterschiedlich (wie zu erwarten war).
Die größte Änderung, die in diesem Code (im Vergleich zu vorherigen Beispielen) stattfindet, ist, dass wir einen „Subprozess“ in Python einführen, um ein externes Programm aufzurufen, in diesem Fall die Arduino IDE. Unsere OpenAPI YAML-Datei (openapi.yaml) ist es, die die Struktur für ChatGPT vorgibt, welche Informationen geliefert werden sollen und wie sie geliefert werden sollen. Wenn Sie sich den Abschnitt „components“ am Ende der YAML-Datei ansehen, werden Sie die verschiedenen Teile des Rückgabeobjekts bemerken, die wir erwarten:
components:
schemas:
CodeSnippet:
type: object
properties:
language:
type: string
code:
type: string
description:
type: string
nullable: true
required:
- language
- code
Wir haben ChatGPT nicht nur gebeten, den Code zu liefern, sondern auch die Sprache und optional eine Beschreibung dieses Codes. Wir verarbeiten diese Daten in app.py. Wichtiger als nur die Befehlsverarbeitung ist, dass wir auch aussagekräftige HTTP-Antworten zurückgeben, falls im Prozess etwas schiefgeht. Dies hilft, Kontext zu bieten und spricht die gleiche „Sprache“ wie der Webserver/AI-Bot von ChatGPT.
Die Implementierung, obwohl etwas grob, ist sehr einfach: Wir speichern den Codeschnipsel in einer temporären INO-Datei, verifizieren und/oder laden ihn auf das Arduino hoch und löschen die temporäre INO-Datei. Es gibt offensichtlich so viele Dinge, die schiefgehen können, einschließlich einer unüberwindbaren Menge an Sicherheitsrisiken. Es ist extrem wichtig, wie immer, Ihre Entwicklungs-Umgebung zu begrenzen und, falls Sie sie für die Außenwelt öffnen, alle notwendigen Sicherheitsmaßnahmen zu implementieren, um sicherzustellen, dass Ihre Umgebung sicher ist.
Nur zum Spaß habe ich auch einen sehr grundlegenden Befehl zum seriellen Lesen implementiert, der unserer benutzerdefinierten GPT-Aktion die Möglichkeit gibt, vom seriellen Port des Arduino zu lesen. Dies ermöglicht es uns zu validieren, dass der serielle Port funktioniert, ohne manuell von unserem Gerät zu prüfen. Ein Beispiel-Szenario könnte sein, wenn Sie ChatGPT bitten, Code für Ihr Arduino von Ihrem Smartphone zu schreiben und hochzuladen. Dies kann natürlich zu einer formelleren get/set-Art der seriellen Implementierung erweitert werden, bei der Sie Befehle senden und Antworten über seriell lesen (wie in Konfigurieren eines Hardware-in-the-Loop-Projekts implementiert).
In diesem Artikel haben wir gezeigt, wie KI mehr tun kann, als nur Code zu schreiben - sie kann auch sicherstellen, dass der Code funktioniert, indem sie ihn auf tatsächlichen Geräten ausführt. Das ist so, als hätte man einen Entwickler, der nicht nur Ihr Projekt für Sie schreibt, sondern es auch testet, um sicherzustellen, dass es richtig ist. Mit den Beispielen, die wir verwendet haben, können Sie sehen, wie dies die Art und Weise, wie wir unsere Projekte erstellen und testen, verändern könnte, was die Dinge schneller und einfacher macht. Alle Schritte und der Code, den wir verwendet haben, werden geteilt, sodass jeder Interessierte es ausprobieren und sehen kann, wie KI in ihrer Arbeit helfen könnte.
Entdecken Sie mehr über dieses bahnbrechende Projekt und treten Sie der Evolution bei: https://gitlab.com/ai-examples/ai-arduino-code-builder.