Softwareentwicklung durch KI-Modelle
Raimund
21. Februar 2025 09:20
1. Potential der Softwareentwicklung mit Hilfe von KI-Modellen
Zunächst sei erneut darauf hingewiesen, dass im nachfolgenden Blog bei der Verwendung des Begriffs von „KI-Modellen“ immer textbasierte LLM (Large Language Modelle) gemeint sind, die auf der Grundlage des Transformermodells erstellt und trainiert wurden. Nachfolgend wird daher bei der Anwendung von KI immer von „LLM“ gesprochen.
In der Auseinandersetzung bei der Softwareentwicklung mit LLM hat sich herausgestellt, dass neben der Kombination von klassischer Programmierung und Schnittstellen zu LLM Modelle, die Erstellung der Software selbst mit Hilfe von LLM eines der größten Potentiale in der Nutzung von LLM gewesen ist.
Raimund
21. Februar 2025 09:21
Die Entwicklung des Programmcodes zu den in diesem Blog vorgestellten KI-Programmen erfolgte unter intensiver Nutzung von großen LLM, wie ChatGPT oder Claude (siehe Beispiele). Dabei reichte jeweils das kostenlose Angebot dieser LLM vollkommen aus, auch wenn dies bedeutete, dass der tägliche Dialog mit der LLM mengenmäßig beschränkt war.
Raimund
21. Februar 2025 09:22
Es sei an dieser Stelle kurz eingeschoben, dass neben den großen über das Internet erreichbaren LLM, auch lokal auf dem eigenen Rechner installierte LLM (wie etwa „Qwen 2.5-Coder“ aus dem Hause Alibaba) oder aber in IDE (Integrated Development Environment; z.B. Visual Studio von Microsoft) integrierte KI-Funktionen (z.B. zur Code-Optimierung, Fehlersuche) sehr nützliche Dienste im Rahmen der Softwareentwicklung leisten können.
Raimund
21. Februar 2025 09:23
Die Entwicklung der vorgestellten KI-Anwendungen hat durch den Einsatz von LLM jeweils nicht mehr als eine Woche benötigt (Ausnahme: KI-Rezepte-App benötigte 10 Tage). Einzelne Teilaufgaben der Entwicklung, für die ursprünglich mindestens 1 Tag angesetzt wurden, konnten innerhalb einer Stunde realisiert werden.
Es zeigte sich also, dass das Potential durch die Nutzung der LLM bei der Softwareentwicklung nicht in einer Zeitersparnis von wenigen Prozenten, sondern eher in ganzen Zeiteinheiten liegt. Die Effizienz in der Softwareentwicklung ließ sich in fast allen Bereichen der Anwendungsentwicklung um den Faktor 2 bis 3 erhöhen.
Raimund
21. Februar 2025 09:24
Laut einer Bitkom-Studie aus dem April 2024 werden allein in Deutschland bis zum Jahr 2040 rund 663.000 IT-Fachleute fehlen. Bereits im Jahr 2023 konnten in Deutschland 149.000 IT-Stellen nicht besetzt werden.
Auch wenn dieser Fachkräftemangel an IT-Kräften nicht nur Softwareentwickler betrifft und LLM-Modelle nicht mit einer IT-Kraft gleichzusetzen sind, so kann der Einsatz von LLM in der Softwareentwicklung einen wichtigen Beitrag leisten, um den Durchsatz/Effizienz der verfügbaren Softwareentwickler deutlich zu erhöhen.
Raimund
21. Februar 2025 09:25
2. Was macht den Einsatz von LLM in der Softwareentwicklung so nützlich?
In LLM Modellen sind Milliarden Zeilen Programmiercode als Trainingsdaten eingeflossen, so dass jedes größere LLM nicht nur eine Unzahl von etablierten Programmiersprachen, sondern für sehr viele (zum Teil immer wiederkehrende Fragestellungen) bereits diverse Lösungen (z.B. Datenbankabfragen, Bildschirmgestaltung, konkrete Funktionen zu Datenverarbeitung usw.) kennt.
Selbst wenn man ein Profi in Python ist. Wer will von sich sagen, dass er/sie alle Bibliotheken mit ihren Funktionen kennt, die für Python zur Verfügung stehen?
Selbst als erfahrener Programmierer lebt man meist in seinem eigenen Mikrokosmos an Programmiersprachen und Entwicklungstools. Wer will von sich sagen, dass er/sie mal schnell eine Anwendung außerhalb dieses Erfahrungsbereichs ohne Unterstützung umsetzen kann?
Raimund
21. Februar 2025 09:26
- Strenge Strukturierung in der Softwareentwicklung
Die Softwareentwicklung zwingt den Programmierer zu einer strengen Strukturierung der Aufgabenstellung.
Ganz allgemein gesprochen, sei es in prozeduraler oder objektorientierter Realisierung: Jede Softwareentwicklung basiert darauf, dass die Gesamtaufgabe strukturiert und in Teilbereiche untergliedert werden. Diese Teilbereiche werden wiederum in Teilaufgaben strukturiert usw.
Jede dieser Teilaufgaben wird dabei modularisiert als ein in sich abgeschlossenen Bereich (Funktion, Objekt etc.) mit bestimmten Funktionen/Methoden, bestimmten Datenelementen, bestimmten Eingabeparametern und bestimmten Ausgabeparametern aufgebaut.
Diese Notwendigkeit in der Strukturierung der Softwareentwicklung, ermöglicht aber auch eine sehr spezifische Definition der Anfragen (Prompt) an das LLM eine derartige Teilaufgabe zu lösen.
Man kann der LLM durch die Angabe der Datenstrukturen, der Eingabeparameter, der gewünschten Ausgabeparameter und der gewünschten Funktionen zu einer Teilaufgabe der gesamten Softwarelösung sehr genau beschreiben, was man eigentlich will.
Dadurch wird der Prompt an das LLM sehr genau und die Lösungsvorschläge durch die LLM werden sehr treffsicher. Häufig kann der so erstellte Programmcode 1:1 übernommen werden und muss meist nur durch Anpassung von Variablennamen etc. in die sonst bestehende Lösung eingebunden werden.
Raimund
21. Februar 2025 09:27
- Sehr begrenzter „Wortschatz“ in den Programmiersprachen
Im Vergleich zur menschlichen Sprache ist der „Wortschatz“ aller Programmiersprachen minimal. Selbst unter Einbindung sämtlicher Funktionsbibliotheken sind die Ausprägungen einer Programmiersprache (übersetzt in Token für eine LLM) sehr viel kleiner und die Notwendigkeit einer „vielseitigen“ Anwendung der vorhandenen Sprachelemente sehr niedrig. Ganz im Gegenteil in der Programmierung will man ja gerade nicht, dass bei der Generierung ein „abwechslungsreicher“ Text entsteht, sondern man will, bei einer Fragestellung immer eine möglichste gute (und immer gleiche) Lösung erhalten.
Dieser Unterschied zur Generierung menschlicher Sprache/Texte kann die Komplexität der LLM zum einen deutlich reduzieren, da relativ wenige Token eingebettet und im Transformermodell in Bezug zueinander gesetzt werden müssen.
Zum anderen muss nur eine sehr begrenzte Variabilität bei der Generierung neuer Programmiercode-Texte erzeugt werden.
Damit können auch kleine lokale LLM dem Entwickler sehr nützliche Dienste leisten.
Raimund
21. Februar 2025 09:29
Wie wir alle wissen, arbeiten LLM nicht fehlerfrei. Auch in der Programmierung kann ein Code erstellt werden, der in der Praxis nicht korrekt funktioniert. Dazu zählen sowohl syntaktische Fehler, veralteter Programmiercode (z.B. Funktionsbibliotheken, die nicht mehr unterstützt werden), logische Fehler, weil die Aufgabenstellung nicht oder falsch verstanden wurde, oder Aspekte, die nicht extra erwähnt wurden, und daher nicht berücksichtigt wurden.
Bei der Nutzung von LLM im Zusammenhang mit menschlicher Sprache/Text, z.B. in Chatbots, kann es dabei für den Anwender schwierig sein, zu überprüfen, ob die Angaben korrekt sind, oder nur teilweise korrekt sind oder das LLM komplett „halluziniert“.
Dies ist bei der Generierung von Programmiercode von Natur aus deutlich einfacher. Wenn der generierte Programmiercode übernommen und in die Anwendungsentwicklung eingebunden wird, kann er leicht getestet werden.
Einige LLM (z.B. Claude) bieten bei der Entwicklung auch gleich Anwendungsfenster an, mit denen man den erzeugten Code direkt überprüfen kann. Sehr effizient ist dies zum Beispiel bei der Entwicklung von Weboberflächen mit HTML-Code oder JavaScript.
Bei der Übernahme des Programmcodes fallen syntaktische Fehler und z.B. nicht mehr unterstützte Funktionen sofort auf. Bei logischen Fehlern ist diese Überprüfung nicht ganz so einfach. Wenn aber die Teilaufgabe klein genug ist, wird ein erfahrener Anwendungsentwickler auch logische Fehler durch systematische Funktionstests relativ schnell finden können.
Entsprechende gefundene Fehler können dem LLM inkl. Fehlermeldung dann im Dialog mitgeteilt werden. Die LLM wird dies aufnehmen und versuchen, eine Lösung für den Fehler zu erzeugen.
Raimund
21. Februar 2025 09:30
In der Nutzung der LLM für die Softwareentwicklung zeigt sich auch ein hohes Potential im Bereich der Schulung und Ausbildung für Softwareentwickler.
Das LLM erzeugt auf Basis des vorgegebenen Prompts nicht nur einen Programmiercode. Der Programmiercode wird danach durch ausführlichen Text Schritt für Schritt von der LLM erklärt.
Durch weiteren Dialog und konkrete Nachfragen, kann man so direkt den Programmiercode besser verstehen oder auch gezielt nachadjustieren lassen.
Die Erläuterungen der LLM sind dabei von einer derartigen Güte, dass sie beim Selbststudium einer neuer Programmiersprache oder bisher unbekannter Aufgabengebiete (z.B. Bildbearbeitung) sehr nützlich sein können.
Die unendliche „Geduld“ des LLM und die Möglichkeiten, sehr individuell und gezielt nachzufragen, helfen, den unterschiedlichen Wissensstand und Erfahrungsschatz eines jeden Softwareentwicklers zu berücksichtigen. So kann die LLM für jeden Programmierer nützlich sein.
Raimund
21. Februar 2025 09:31
3. Was kann den Einsatz von LLM in der Softwareentwicklung nicht leisten?
Programmierer können nicht ersetzt werden
Wenn man die Ausführungen zu Abschnitt 2 oberflächlich liest, kann man vielleicht auf den Gedanken kommen, eine komplette Softwareentwicklung durch ein LLM ersetzen zu können.
Davon ist aber aus den folgenden Gründen nicht auszugehen:
-
Um einen guten und schnell einsetzbaren Code erzeugt zu bekommen, muss man die Fragestellung sehr genau und strukturiert als Prompt eingeben. Allein dies verlangt schon das Know-How eines Programmentwicklers, da vor diesem „Prompting“ ja zunächst die strenge Strukturierung der gewünschten Anwendung in zahlreiche Teilaufgaben erfordert.
-
Der durchaus kreative Prozess eine ausführliche geschilderte Anforderung an eine IT-Anwendung, in ein Datenmodell und ein Funktionsmodell umzuwandeln, wird durch die LLM nicht selbstständig unterstützt.
Das LLM kann durchaus Hilfestellung und Lösungsvorschläge zu Teilaspekten der Aufgabenstellung geben. Aber auch hier bedarf es eines Anwendungsentwicklers, der letztlich unter Zuhilfenahme eines LLM, die eigentliche Lösung generiert.
-
Die LLM sind sehr gut darin, auf Basis eines riesigen Trainingsmaterials auf bereits vorhandene Umsetzungen von IT-Lösungen zurückzugreifen und auch zwischen ihnen zu interpolieren, wenn es darum geht, neuen Programmcode zu generieren.
Bei einer völlig neuen Fragestellung, sind die generativen Möglichkeiten begrenzt, da das Ergebnis generierter Daten außerhalb ihres Funktionsbereichs an Trainingsdaten unkalkulierbar sind.
Raimund
21. Februar 2025 09:33
Nur auf etablierte Programmiersprachen anwendbar
Die Ergebnisse von LLM basieren immer auf ihren Trainingsdaten und der errechneten „Beziehung“ zueinander.
Ohne auf den genauen Mechanismus eines Transformermodells einzugehen, bedeutet dies, dass ein LLM in der Anwendungsentwicklung nur dann einen qualitativ guten Programmiercode erzeugen wird, wenn es bei der zu verwendeten Programmiersprache, um eine etablierte Sprache handelt, zu der Millionen von Codezeilen als Trainingsdaten zu Verfügung stehen.
Je exotischer die Programmiersprache, um so schlechter wird die Qualität der Lösung durch ein LLM sein.
„Etabliert“ kann in diesem Zusammenhang auch durchaus mit „alt“ übersetzt werden. Relativ junge Sprachen oder relativ junge Anforderungen werden nur unzureichend oder nur mit genaueren Nachfragen gut beantwortet.
So ist kurioserweise ChatGPT (ohne kostenpflichtiges Abo) relativ schlecht darin, einen Python Code zu erzeugen, der die Nutzung der API-Schnittstelle zu ChatGPT erzeugen soll.
In diesem konkreten Fall wird regelmäßig zunächst eine Methodik angewendet, die von OpenAI nicht mehr unterstützt wird (aber alt ist und häufiger in den Trainingsdaten zu finden ist). Die aktuelle Methodik im Aufruf der API zu ChatGPT wird erst durch mehrmaliges Nachfragen und Hinweis auf die veraltete Lösung gefunden und generiert.
Raimund
21. Februar 2025 09:37
4. In den nachfolgenden Posts sind einige Beispiele in der Anwendung der LLM aufgeführt.
(Die Links führen direkt auf den veröffentlichten Chat-Verlauf (ChatGPT)
Raimund
21. Februar 2025 09:40
Kurzes Beispiel: ChatGPT Dialog zur Einrichtung einer HTML Seite mit Einladen, Vorschau, Reset von Fotos (HTML, JavaScript)
ChatGPT: Foto Vorschau und Reset
Raimund
21. Februar 2025 09:44
Etwas größeres Beispiel: ChatGPT Dialog zur Funktionalität auf einer Grafik mit der Maus ein Kreuz zu zeichnen bzw. zu verschieben (HTML, CSS, JavaScript)
ChatGPT: Mausposition und Kreuz zeichnen
Raimund
21. Februar 2025 09:50
Das letzte ChatGPT-Beispiel ist sehr umfangreich und demonstriert die praktische Arbeit mit einem LLM zur Entwicklung der Pflege der Kochrezepte mit einer Zutatenliste, der Erstellung einer editierbaren Einkaufsliste und dem Export der Daten in einem PDF-Dokument (siehe auch KI-Rezepte-App) (Python, Django, HTML, Bootstrap, JavaScript).
Das Beispiel zeigt
-
den qualitativ hochwertigen Programmcode der LLM,
-
wie ausführlich und „unermüdlich“ der Programmcode erläutert wird,
-
dass Entwickler und LLM öfter auch mal aneinander vorbeireden können,
-
wie simpel einfach Teile des Programmcodes wieder in den Prompt zurückübertragen werden können, um ihn zu korrigieren,
-
dass Fehlermeldungen einfach 1:1 in den Prompt übernommen werden können und von dem LLM gelöst werden
-
wie gut ein Dialog immer weitergeführt werden kann. So wurde die Fragestellung zur Erzeugung des PDF-Dokuments erst einen Tag später an den bestehenden Dialog angehängt, da er darauf aufbaute.
ChatGPT: Zutatenliste mit Bootstrap bearbeiten