So helfen uns LLMs beim Programmieren¶

Portrait Veit Schiele

Veit Schiele

• Gründer und Geschäftsführer der cusy GmbH, Berlin
• Autor des Python for Data Science Tutorials
• Autor des Python-Basics-Tutorial

QR-Code für die URL slides.cusy.io/ai/how-llms-help-us-with-programming.slides.html

Was dürft ihr von LLMs erwarten?¶

  • Diskussionen über die Verwendung von LLMs führen unweigerlich zu Kommentaren von Entwickler*innen, die enttäuschende Erfahrungen gemacht haben.
  • Sie fragen oft:
    • Was mache ich falsch?
    • Wie kommt es, dass andere von so großartigen Erfahrungen berichten?
  • Die Verwendung von LLMs zum Schreiben von Code ist oft schwierig und wenig intuitiv.
  • Es erfordert einigen Aufwand, die Grenzen ihrer Verwendung herauszufinden.
  • Es gibt wenig Anleitung, die den Menschen hilft, wie sie LLMs am besten anwenden können.

  • In den letzten zweieinhalb Jahren haben wir viele Erfahrungen mit LLMs gemacht.
  • Hier ist mein Versuch, einige dieser Erfahrungen an euch weiterzugeben.
  • Angemessene Erwartungen setzen
  • Der Hype dreht sich im Wesentlichen um Artificial General Intelligence.
    • Aber LLMs sagen im Wesentliche nur eine Folge von Token vorher.
    • Beim Schreiben von Code geht es jedoch hauptsächlich darum, Token in der richtigen Reihenfolge zu setzen – erst dann werden sie nützlich.
  • Ihr werdet vermutlich auch enttäuscht werden, wenn ihr ein Projekt perfekt umsetzen wollt, ohne eure eigenen Fähigkeiten einzusetzen.
    • Verwendet LLMs stattdessen, um eure Fähigkeiten zu verbessern.
    • Aktuell gefällt mir am besten, LLMs als übermütige Programmierassistenz zu betrachten:
      • blitzschnell Dinge nachschlagen
      • relevante Beispiele finden
      • mühsame Aufgaben ohne Murren ausführen
    • Überfordert die LLMs – und lernt ihre Grenzen kennen
    • Vermenschlicht die LLMs jedoch nicht:
      • Fehler, wie das Halluzinieren einer nicht vorhandenen Bibliothek, würde Menschen deutlich stärker diskreditieren
  • Berücksichtigt die Stichtage für das Training
  • Für die OpenAI-Modelle sind dies normalerweise Oktober 2023 oder Mai 2024.
    • Andere Anbieter haben möglicherweise neuere Daten.
  • Dies beeinflusst, mit welchen Bibliotheken die LLMs vertraut sein werden.
    • Wenn ihr Bibliotheken verwendet, die seit dem Knowledge cut-off große Änderung erfahren hat, wird das LLM davon nichts wissen:
      • Das betrifft for OpenAI z.B. NumPy 2, pandas 2 und uv!
  • Der Kontext ist entscheidend
  • Die entscheidende Ingenieurskunst, um gute Ergebnisse aus einem LLM zu erhalten, ist die Verwaltung des Kontexts – also die Inhalte, die Teil eurer aktuellen Konversation ist.
  • Wenn ihr eine neue Unterhaltung beginnt, habt ihr zunächst keinen Kontext.
    • Dies erlaubt euch auch bei einer bestehenden Konversation, die nicht mehr nützlich ist, einfach von vorne zu beginnen.
  • Die meisten LLM-Codierungstools gehen über die bloße Konversation hinaus:
    • Claude z.B. erlaubt euch, Kontext aus Repositories zu erstellen
    • Tools wie Cursor und VS Code Copilot enthalten automatisch den Kontext eures aktuellen Projekts und das Dateilayout
    • die @-Kommandos von Cursor erlauben euch, zusätzliche Dateien in den Kontext miteinzubeziehen

Tipp

  • Ich verwende meistens direkt die Web- oder App-Schnittstellen von Claude.
  • Ich verstehe dann leichter, was im Kontext vorgeht.
  • Mit LLM-Tools, die diesen Kontext vor mir verschleiern, bin ich weniger effektiv.

Tipp

  1. Ihr könnt die Tatsache, dass frühere Antworten auch Teil des Kontexts sind, zu eurem Vorteil nutzen
  2. Versucht, bei komplexen Programmieraufgaben, das LLM dazu zu bringen, zuerst eine einfachere Version zu schreiben
  3. Überprüft, ob sie funktioniert, und baut sie dann zu einer komplexeren Implementierung aus

Wie sieht ein typischer Projektverlauf aus¶

  1. Recherche

Die meisten meiner Projekte beginne ich mit einigen offenen Fragen:

  • Ist das, was ich versuche zu tun, möglich?
  • Welche Möglichkeiten gibt es, wie ich dies umsetzen könnte?
  • Welche dieser Optionen ist die beste?

Info

  • Neuere Bibliotheken werden euch nicht vorgeschlagen werden.
  • Normalerweise ist das in Ordnung
    • ich will nicht die neueste Bibliothek
    • sondern die stabilste, s.a. Choose Boring Technology
  1. Prototyping

Nun lasse ich mir einen Prototyp erstellen, der nachweisen soll, dass die wesentlichen Anforderungen dieses Projekts erfüllt werden können.

  1. Produktiven Code schreiben

Für die Produktionsphase verwende ich dann einen völlig anderen Modus:

  • Meine Anweisungen sind sehr viel detaillierter, z.B.

    • Schreibe eine Python-Funktion, die asyncio und httpx mit dieser Signatur verwendet:

      async def download_sqlite_database(url: str, max_size_mb: int = 100) -> pathlib.Path

    • Dabei soll der Header für die Länge des Inhalts zu Beginn der Rückübertragung der Daten ausgelesen und ein Fehler ausgegeben werden, wenn die Länge über dem angegebenen Limit liegt.

    • Wenn der Download beendet ist, wird sqlite3.connect() verwendet und dann ein PRAGMA quick_check ausgeführt, um die Gültigkeit der SQLite-Daten zu überprüfen; andernfalls soll ein Fehler ausgegeben werden.

    • Schließlich soll auch eine Fehlermeldung ausgegeben werden, wenn uns der Header eine andere Größe angibt als die Größe der heruntergeladenen Datei.


  • Zwar könnte ich diese Funktion selbst schreiben, aber ich würde deutlich länger brauchen für alle Details.
  • Ich möchte, dass das LLM mir die Zeit erspart, den Code zu schreiben, den ich bereits im Kopf habe.
  • Gute Coding-LLMs können hervorragend Lücken füllen.
    • Sie sind auch viel weniger faul als ich. Sie werden daran denken,
      • wahrscheinliche Exceptions zu erfassen
      • genaue Docstrings hinzuzufügen und
      • Code mit den relevanten Typen zu kommentieren.
  1. Manuelles Testen ist unerlässlich

LLM-Code sieht normalerweise fantastisch aus:

  • gute Variablennamen
  • überzeugende Kommentare
  • klare Anmerkungen
  • logische Struktur.

Dies kann euch schnell einlullen und ein falsches Gefühl der Sicherheit geben.

Grammatikalisch korrekte und selbstbewusste Antworten von LLMs sollten euch auch nicht verleiten, die Faktenprüfung zu überspringen.

  • Das einzige, was ihr nicht an LLMs auslagern dürft, ist das Testen, ob der Code tatsächlich funktioniert.
  • Es ist in eurer Verantwortung, funktionierende Systeme zu liefern.
  • Mit LLMs wird die Qualitätssicherung umso bedeutender. Diese Fähigkeiten müssen ausgebaut werden.
  • Weder akribische Code-Überprüfung noch umfassende automatisierte Tests werden nachweisen können, dass Code tatsächlich das Richtige tut.
  1. Verwendet Tools um den Code für euch auszuführen
  • Eine wachsende Anzahl von LLM-Codierungstools hat mittlerweile die Möglichkeit, diesen Code für euch auszuführen.
  • Ich bin bei einigen davon etwas vorsichtig, da die Möglichkeit besteht, dass der falsche Befehl echten Schaden anrichtet.
  • Also neige ich dazu, mich an diejenigen zu halten, die Code in einer sicheren Sandbox ausführen.
  • Meine Favoriten im Moment sind:

Wie sieht ein typischer Projektverlauf aus¶

  1. Verwendet Tools um den Code für euch auszuführen
ChatGPT Code Interpreter
kann ChatGPT Python-Code direkt in einer von OpenAI verwalteten Kubernetes-Sandbox-VM schreiben und dann ausführen. Nicht einmal ausgehende Netzwerkverbindungen können hergestellt werden.
Claude Artefacts
kann eine vollständige HTML+JavaScript+CSS-Webanwendung erstellen, die in einer iframe-Sandbox angezeigt wird, die stark einschränkt, was sie tun kann, aber z.B. die Exfiltration eurer privaten Claude-Daten verhindert.
ChatGPT Canvas
neuere ChatGPT-Funktion mit ähnlichen Funktionen wie Claude Artifacts.

Wie sieht ein typischer Projektverlauf aus¶

  1. Recherche
  2. Prototyping
  3. Produktiven Code schreiben
  4. Manuelles Testen ist unerlässlich
  5. Verwendet Tools um den Code für euch auszuführen
  6. Python-Dateistruktur, Tests, Logging, Docs, CI/CD-Pipelines etc. schreiben
  • Anschließend lasse ich mir die Python-Dateistruktur, Tests und Logging für diesen Code schreiben.
  • Auch hier diktiere ich meine Technologie der Wahl.

Resümee¶

  • Erwartet, dass ihr den Code selbst weiterentwickeln müsst
  • LLMs sind kein Ersatz für menschliche Intuition und Erfahrung.
  • Ich habe genug Zeit mit Python entwickelt, um zu wissen, worauf ich achten muss.
  • Nicht selten ist es für mich schneller, selbst zu übernehmen und die Konversation mit der LLM zu beenden.
  • Der größte Vorteil ist die Entwicklungsgeschwindigkeit
  • In den meisten aktuellen Projekten würde ich ohne LLM deutlich länger brauchen.
  • Manche Projekte hätte ich vermutlich gar nicht erst angefangen, wenn ich ohne LLM-Unterstützung gewesen wäre.
  • Schließlich bin ich auch in meinen Projekten ehrgeiziger geworden:
    • umfangreichere Git-Commit-Messages
    • zusätzliche CI/CD-Pipelines
    • …
  • LLMs erweitern euer Fachwissen
  • Python-Projekte realisiere ich meistens mit den vorhin beschriebenen Code-Signaturen, um möglichst schnell zum gewünschten Ergebnis zu kommen.
  • Auch für CI/CD-Pipelines gebe ich meist Implementierungsdetails an.
  • Anders sieht es hingegen aus, wenn für eine REST-API ein passendes Web-Frontend gebaut werden soll:
    • Dies ist ein Bereich, von dem ich wenig Ahnung habe.
    • Hier wäre mein Prozess ein völlig anderer.
  • LLMs können euch große Code-Basen erläutern
  • Dazu wird die gesamte Code-Basis als Kontext verwendet.
  • Und auch wenn nicht jedes Detail richtig erläutert wird, so spart die LLM doch sehr viel Zeit ein.
  • Dies ist eine großartige Möglichkeit, neue Bibliotheken zu erforschen.

Zum Weiterlesen¶

  • So helfen uns LLMs beim Programmieren
  • KI-Programmierwerkzeuge
  • DORA-Report 2024: Wie KI die Software-Entwicklung verändert
  • Entwurfsmuster für die Absicherung von LLM-Agenten