May 3, 2023

KI-gestützte Codegenerierung

Programmieren mit Superkräften

Im Rahmen meiner Softwareoptimierungsbemühungen zur Senkung der Cloud-Kosten musste ich eine vorhandene, ineffiziente Serversoftware durch etwas ersetzen, das robustere (wenn auch fragmentierte) Tools nutzt, die in Debian GNU/Linux verfügbar sind. Könnte das Sprachmodell GPT4 mir etwas KI-Magie liefern? Lesen Sie weiter!

Ein Teil der Cloud-Services meines Unternehmens ist der sogenannte „Lemmid Manager“, ein integriertes Content-Management-System, das Rohdaten (Text, Videos, Bilder) entgegennimmt und daraus schöne, performante statische Websites generiert. Konfrontiert mit steigenden Cloud-Kosten, schreibe ich Teile der Software um, um sie effizienter zu gestalten: weniger Rechenleistung für die gleichen Ergebnisse.

Bildrotation

Sie merken es vielleicht nicht, aber wenn Sie mit Ihrem Handy ein Foto aufnehmen, wird es immer im Querformat (oder Breitbildformat) gespeichert. Wenn Sie ein Foto im Hochformat aufnehmen, fügt Ihr Handy einfach ein paar zusätzliche Informationen hinzu, die die Haltung der Kamera speichern - damit das Foto beim Betrachten korrekt ausgerichtet erscheint. Es ist schneller, ein einzelnes Bit (zusätzlicher) Informationen zu schreiben, als die tatsächlichen Bits und Bytes des Bildes zu drehen.

Das ist alles in Ordnung, solange das Foto Ihr Handy nicht verlässt, aber wenn man das Foto auf eine Website hochladen möchte, muss es für das Web optimiert werden. Die eigentlichen Bildbits und -bytes müssen dann den tatsächlichen Inhalt des Fotos widerspiegeln. Das Bild kann dann weiter für Ladegeschwindigkeiten optimiert und verschiedene Viewports werden.

Automatische Bildrotation basierend auf EXIF

Moderne (Smartphone-)Kameras speichern die Ausrichtung in den sogenannten EXIF-Daten, die den eigentlichen Bilddaten beiliegen. Damit das Bild (Bits und Bytes) die Ausrichtung der Kamera korrekt wiedergibt, sollten die EXIF-Daten gelesen und basierend auf der Ausrichtung ein Rotationsalgorithmus auf die Bildbits und -bytes angewendet werden.

Aktuelle Implementierung

Die ursprüngliche (handgeschriebene) Implementierung verwendet NodeJS und ein Modul namens "lwip" (LightWeight ImageProcessor). Das funktioniert in den meisten Situationen gut, aber da die Bilder (aufgrund von mehr Megapixeln) größer geworden sind, ist der Speicherbedarf deutlich gestiegen. Der Nachteil, alles in einem einzigen NodeJS-Prozess zu erledigen, ist, dass das Ganze zu einem ziemlichen Speicherfresser wird - was dazu führt, dass das gesamte NodeJS-Backend leidet, wenn man es bei der Verarbeitung von Tausenden von Fotos an seine Grenzen bringt.

Eine gängige Strategie zur Optimierung von Engpässen in einem Softwareprogramm besteht darin, diese aus dem Hauptprogramm zu extrahieren. Anstatt Bilder direkt aus NodeJS zu verarbeiten, möchte ich gängige Debian GNU/Linux-Tools (die sich bewährt haben) für die automatische Bildrotation verwenden. Von NodeJS aus kann ich dann den externen 'auto_rotator' aufrufen und warten, bis er seine Aufgabe erledigt hat. Indem ein NodeJS-Prozess auf ein asynchrones Ergebnis/Callback wartet, wird er wieder für andere Anfragen verfügbar.

GPT4 als Code-Generator

Das Tolle an freier Software ist, dass es viele Bausteine gibt, die man verwenden kann, um eigene Programme zu erstellen. Ich wusste, dass Debian GNU/Linux Tools zur Verfügung stellt, die die Bildrotation basierend auf EXIF-Daten durchführen können. Die Herausforderung besteht darin, ein einzelnes Skript zu erstellen, das diese verschiedenen Tools verwendet, um die Aufgabe zu erledigen und gleichzeitig eine gewisse Robustheit bei der Behandlung von Ausnahmen bietet.

Anstatt mich selbst in alle verfügbaren Befehle und Befehlsoptionen zu vertiefen, beschloss ich, GPT4 zu bitten, ein Skript für mich zu generieren, das genau das tut, was ich wollte, unter Verwendung von Standard-Tools, die in Debian GNU/Linux verfügbar sind:

Code generieren ist so einfach wie die Eingabe einer beschreibenden Anfrage
Code generieren ist so einfach wie die Eingabe einer beschreibenden Anfrage

Innerhalb weniger Sekunden generierte OpenAIs GPT4 ein Bash-Skript, das ImageMagick (ein gängiges Grafikprogramm) verwendet, um Änderungen basierend auf den EXIF-Daten in einer bestimmten Bilddatei durchzuführen. Die KI wählte das "exiftool" aus, um die Ausrichtungsdaten zu lesen, und führte basierend auf der Ausgabe dieses Tools den Befehl "convert" von ImageMagick aus, um die richtige Drehung anzuwenden.

GPT4s generierter Ausgabecode
GPT4s generierter Ausgabecode "auto_rotate.sh" rotiert Bilder mithilfe von ImageMagick basierend auf der EXIF-Ausrichtung

Der vollständige Code (der innerhalb von Sekunden generiert wurde) ist wunderschön kommentiert und vermittelt ein gutes Gefühl dafür, was vor sich geht. Er ist strukturiert und für Menschen lesbar optimiert.

Dokumentation

Zusätzlich zum eigentlichen funktionierenden Code lieferte die KI eine Dokumentation, die erklärt, wie die neu generierte Software verwendet wird - einschließlich Installationsanweisungen. Das ist etwas, das die meisten Programmierer meiner Meinung nach übersehen (technische Dokumentation ist oft ein nachträglicher Gedanke).

Anweisungen der KI zur Verwendung des generierten Codes - die meisten echten Programmierer können von seiner Klarheit in der Kommunikation lernen
Anweisungen der KI zur Verwendung des generierten Codes - die meisten echten Programmierer können von seiner Klarheit in der Kommunikation lernen

Fazit

Innerhalb weniger Minuten hatte ich ein funktionierendes, dokumentiertes Stück Code, das mir hilft, einen Engpass in einer Cloud-Software zu lösen. Das ist einfach erstaunlich - es hat mir Zeit gespart (die ich anschließend verwendet habe, um diesen Blog-Post zu schreiben).

Man kann sich nur fragen, welche Auswirkungen große Sprachmodelle wie ChatGPT/GPT4 auf unsere Arbeitsweise haben werden. Ich begrüße KI-Tools voll und ganz - zu wissen, wie man sie benutzt, wird in naher Zukunft unerlässlich sein (denke ich)!

Ein Programmierer aus der Zukunft - wie von DALL-E von OpenAI vorgestellt
Ein Programmierer aus der Zukunft - wie von DALL-E von OpenAI vorgestellt