Wie LLMs uns beim Programmieren helfen

Veit Schiele

22. April 2025

9–11 Minuten

../_images/how-llms-help-us-with-programming.jpeg

Vor kurzem wurden wir von einem weltweit tätigen Chemieunternehmen gefragt, ob wir ihren Ingenieuren eine Einführung in die Programmierung mit Python und Large Language Models (LLM) geben könnten. Ihre Erwartungen an das, was sie in kurzer Zeit mit einem LLM erreichen wollten, waren fast grenzenlos.

Die Programmierung mit LLMs ist jedoch oft schwierig und nicht sehr intuitiv. Es erfordert in der Regel einen beträchtlichen Aufwand, um ihre Grenzen herauszufinden. Darüber hinaus gibt es kaum Anleitungen, wie man sie am besten einsetzt. Wir arbeiten nun seit zweieinhalb Jahren mit LLMs in der Programmierung. Im Folgenden versuchen wir, einige unserer Erfahrungen mit LLMs an euch weiterzugeben.

Was könnt ihr von LLMs erwarten?

Der Hype um Artificial General Intelligence (AGI) weckt Erwartungen, die LLMs nicht erfüllen können: Wenn ihr davon ausgeht, dass LLMs euer Softwareprojekt perfekt umsetzt, ohne dass ihr selbst etwas tun müsst, werdet ihr bald enttäuscht sein.

Stattdessen könnt ihre eureFähigkeiten mit Hilfe eines LLMs erweitern. Stellt euch ein LLM als einen Assistenten für die Paarprogrammierung vor, der blitzschnell nachschlagen, relevante Beispiele liefern und komplexe Aufgaben klaglos erledigen kann. Allerdings wird er mit Sicherheit kleinere oder größere Fehler machen, z.B. eine Bibliothek oder eine Methode verwechseln. Wir haben solche Beispiele notiert, damit wir uns anschließend neuere und größere LLMs ansehen können, um zu sehen, ob sie nützlichere Ergebnisse für eine Aufgabe liefern.

Vibe-Coding

Andrej Karpathy prägte im Februar 2025 den Begriff Vibe Coding:

Es gibt eine neue Art der Codierung, die ich „Vibe Coding“ nenne, bei der man sich ganz den Vibes hingibt, Exponentiale annimmt und vergisst, dass der Code überhaupt existiert … Ich frage nach den dümmsten Dingen wie „Verringere das Padding in der Seitenleiste um die Hälfte“, weil ich zu faul bin, es zu finden. Ich akzeptiere immer „Alles“, ich lese die Diffs nicht mehr. Wenn ich Fehlermeldungen erhalte, kopiere ich sie einfach kommentarlos hinein, das behebt das Problem normalerweise … Manchmal können die LLMs einen Fehler nicht beheben, also arbeite ich einfach drum herum oder bitte um zufällige Änderungen, bis er verschwindet. Für Wochenendprojekte zum Wegwerfen ist das nicht so schlimm, aber trotzdem recht amüsant. [1]

Dies ist eine gute Möglichkeit, die LLMs zu erkunden – und es macht wirklich Spaß. Ihr werdet auch ein Gefühl dafür entwickeln, was mit LLMs funktioniert und was nicht.

Für unsere professionelle Arbeit verwenden wir jedoch einen anderen Ansatz, um robusten, wartbaren Code zu erhalten.

1. Prototyping

Die meisten unserer Projekte beginnen mit offenen Fragen für einen Prototyp:

  • Ist das, was uns vorschwebt, möglich?

  • Welche Möglichkeiten gibt es, es zu realisieren?

  • Welche dieser Möglichkeiten sind die besten?

Wir verwenden also LLMs als Teil dieser ersten Forschungsphase.

Der nächste Schritt ist dann ein Prototyp, der beweist, dass die Hauptanforderungen des Projekts erfüllt werden können. Wir stellen oft fest, dass mit einem LLM ein Minimum Viable Product, ein funktionierender Prototyp, innerhalb weniger Minuten erstellt werden kann.

Berücksichtigt den Stichtag des Trainings

Ein wesentliches Merkmal eines jeden Modells ist sein Trainingsstichtag. Das ist das Datum, an dem die Daten, mit denen es trainiert wurde, nicht mehr gesammelt werden. Bei den OpenAI-Modellen ist dies der Oktober 2023; Anthropic und Gemini verfügen in der Regel über aktuellere Daten.

Die OpenAI-Modelle werden also kaum etwas über uv wissen, da die ersten Commits vom Oktober 2023 sind. Das Gleiche gilt für die umfangreichen Änderungen in Version 2 von pandas oder NumPy.

LLMs können euch immer noch helfen, mit Bibliotheken zu arbeiten, die außerhalb eurer Trainingsdaten existieren, aber ihr müsst deutlich mehr Arbeit leisten und aktuelle Beispiele dafür liefern, wie diese Bibliotheken als Teil eures Prompt verwendet werden sollten.

2. Spezifikation

Sobald der erste Prototyp erstellt ist, ändern wir den Modus drastisch. Beim Produktionscode sind wir gegenüber dem LLM viel pingeliger: Auf der Grundlage unserer detaillierten Anweisungen schreibt das LLM den Code viel schneller, als wir es selbst tun könnten. LLMs können mit solchen spezifischen Anweisungen sehr gut umgehen, und wir können uns auf das Softwaredesign konzentrieren.

Dies bringt uns zu dem wichtigsten Punkt, den ihr bei der Arbeit mit LLMs verstehen müsst:

Der Kontext ist entscheidend

Um mit einem LLM gute Ergebnisse zu erzielen, besteht die größte Anstrengung darin, den Kontext zu verwalten, mit anderen Worten den Text, der Teil eurer aktuellen Konversation ist.

Dieser Kontext ist nicht nur auf die Eingabeaufforderung beschränkt, mit der ihr das LLM gefüttert habt, sondern auf den gesamten Gesprächsverlauf. Wenn ihr also eine neue Unterhaltung beginnt, solltet ihr diesen Kontext zurücksetzen.

Werkzeuge wie Cursor und VS Code Copilot beziehen automatisch den Kontext aus der aktuellen Editor-Sitzung und dem Dateilayout ein, und ihr könnt manchmal Mechanismen wie die @-Befehle von Cursor verwenden, um zusätzliche Dateien oder Dokumentation einzubinden. Claude Projects hingegen ermöglicht es euch, den Kontext mit einer großen Menge an Text vorzubelegen – einschließlich einer neuen Option, um Code direkt aus einem GitHub-Repository zu importieren (siehe Using the GitHub Integration).

Einer der Gründe, warum wir meist direkt mit ChatGPT und Claude arbeiten, ist, dass wir besser verstehen, was in den Kontext eingeht. LLM-Tools, die diesen Kontext vor uns verbergen, sind nicht sehr hilfreich. Wir können uns also die Tatsache zunutze machen, dass bei komplexen Programmieraufgaben auch frühere Antworten Teil des Kontexts sind:

  1. zuerst können wir eine vereinfachte Variante schreiben lassen

  2. dann können wir prüfen, ob sie funktioniert

  3. und schließlich iterativ auf die komplexere Implementierung hinarbeiten.

Oft beginnen wir einen neuen Chat, indem wir vorhandenen Code einfügen, um den Kontext zu liefern, und dann arbeiten wir die Änderungen mit dem LLM durch. Oder wir bringen mehrere vollständige Beispiele ein und bitten dann den LLM, sie als Inspiration für ein neues Projekt zu verwenden.

3. Code-Review und Refactoring

Die einzige Sache, die ihr nicht an das LLM auslagern dürft, ist das Testen und die Codeüberprüfung dessen, was das LLM geliefert hat. Unsere Aufgabe des Software-Engineering ist es, funktionierende Systeme zu liefern. Wenn wir nicht gesehen haben, wie es funktioniert, können wir uns nicht darauf verlassen, dass es überhaupt funktioniert. Diese Qualitätssicherung ist für uns Menschen reserviert.

Wenn uns nicht gefällt, was ein LLM geschrieben hat, lassen wir es einfach überarbeiten. „Verwende Vektorisierung mit NumPy für den Code“. Der Code, den ein LLM beim ersten Mal produziert, ist selten die endgültige Implementierung, aber es kann ihn dutzende Male für euch umschreiben, ohne frustriert oder gelangweilt zu werden. Wenn ein erstes Ergebnis nicht zum gewünschten Ergebnis führt, ist das kein Fehler, sondern der Beginn eines Prozesses, um den Code in die gewünschte Richtung zu bringen.

Werkzeuge für die Codeausführung

Eine wachsende Zahl von LLMs für die Programmierung bietet inzwischen auch die Möglichkeit, den Code für euch auszuführen. Bei einigen von ihnen sollte man jedoch vorsichtig sein, da ein falscher Befehl echten Schaden anrichten kann. Deshalb halten wir uns derzeit an diejenigen, die den Code in einer Sandbox ausführen:

ChatGPT Code Interpreter

ermöglicht euch, Python-Code mit ChatGPT zu schreiben und ihn dann direkt in einer von OpenAI verwalteten Kubernetes-Sandbox-VM auszuführen.

Claude Artifacts

kann eine vollständige HTML-, JavaScript- und CSS-Webanwendung erstellen, die in Claude angezeigt wird. Diese Webanwendung wird in einer iframe-Sandbox angezeigt, was die Möglichkeiten stark einschränkt, aber Probleme wie die versehentliche Offenlegung eurer privaten Claude-Daten verhindert.

ChatGPT Canvas

ist eine neuere ChatGPT-Funktion mit ähnlichen Möglichkeiten wie Claude Artifacts, die wir aber noch nicht ausreichend testen konnten.

4. Dokumentation und Tests

Schließlich kann das LLM auch die docstrings, die Sphinx-Dokumentation und die Tests für pytest schreiben. Gute LLMs für die Programmierung sind hervorragend geeignet, um mögliche Ausnahmen abzufangen, eine genaue Dokumentation hinzuzufügen und den Code mit den relevanten Typen zu kommentieren.


Verwandte Inhalte

KI-Programmierwerkzeuge
ai-programming-tools.html
Entwurfsmuster für die Absicherung von LLM-Agenten
design-patterns-for-securing-llm-agents.html
DORA Report 2024: Wie KI die Softwareentwicklung verändert
dora-report-2024.html