8 Punkte von GN⁺ 2025-01-04 | 1 Kommentare | Auf WhatsApp teilen
  • Dieser Beitrag untersucht, ob der Code wirklich besser wird, wenn man einem LLM beim Schreiben immer wieder aufträgt, „besseren Code zu schreiben“.
  • Die Ursprungsidee wurde durch ein Meme aus der ChatGPT-DALL-E-Bildfunktion inspiriert, in dem die Formulierung „mach es noch ...iger“ verwendet wurde.

Experiment mit einfachen Wiederholungs-Prompts

  • Claude 3.5 Sonnet wurde ein Python-Coding-Prompt gegeben, um ein einfaches, aber optimierbares Problem zu lösen.
  • Grundimplementierung
    • Unter einer Million zufälliger Ganzzahlen zwischen 1 und 100.000 die Differenz zwischen dem kleinsten und größten Wert mit Ziffernsumme 30 finden.
    • Die einfache Implementierung brauchte 657 ms (mit der Python-str-Konvertierung).
  • Iteration #1
    • Claude wurde gebeten, „besseren Code zu schreiben“, um die Implementierung zu verbessern.
    • Claude refaktorierte den Code in eine Python-Klassenstruktur, machte ihn objektorientiert und berechnete die Ziffernsumme für alle Zahlen vorab.
    • 2,7-mal schneller
  • Iteration #2
    • Claude optimierte den Code weiter mit Multithreading und vektorisierten numpy-Operationen.
    • 5,1-mal schneller
  • Iteration #3
    • Der Code wurde eher komplexer und führte die String-Konvertierung wieder ein.
    • 4,1-mal schneller
  • Iteration #4
    • Mit der Python-Bibliothek numba wurde der JIT-Compiler aufgerufen und mithilfe von Python asyncio Parallelisierung umgesetzt.
    • Bis zu 100-fach schneller
    • Anstelle einer „Code wird kosmisch“-Aussage wurde daraus überkonstruiert: ein „Enterprise-Grade“-Code.

Anwendung von Prompt Engineering

  • Um die Ausgabe eines LLM zu optimieren, ist Prompt Engineering nötig.
  • Claude 3.5 Sonnet besitzt starke Prompt-Folgebarkeit und liefert bei klaren Vorgaben bessere Ergebnisse.
  • Statt nur „besseren Code schreiben“ zu sagen, wurde ein System-Prompt mit feineren Anweisungen verwendet.
  • Initialer Prompt
    • Die Definition von „optimiertem Code“ wurde detailliert vorgegeben (Algorithmus, Parallelisierung, Minimierung unnötigen Codes usw.).
    • Durch die Optimierung der Ziffernsumme mit Numba in der ersten Implementierung erreichte es 59-mal schnellere Ausführung.
  • Iteration #1
    • Claude fügte Parallelisierung hinzu, führte aber eine merkwürdige Bit-Shift-Operation (für Hexadezimalzahlen) ein, was einen Fehler verursachte.
    • Die Performance fiel auf 9,1-fach und wurde eher schlechter.
  • Iteration #2
    • Claude versuchte, die Leistung mithilfe von SIMD-Operationen zu verbessern, nutzte jedoch weiterhin eine falsche Bit-Shift-Operation.
    • 65-mal schneller als die Grundimplementierung.
  • Iteration #3
    • Claude optimierte die Leistung mit einer Hash-Tabelle.
    • 100-mal schneller als die Grundimplementierung.
  • Iteration #3
    • Claude korrigierte die falsche Bit-Shift-Operation und verringerte die Leistung dabei leicht.
    • 95-mal schneller als die Grundimplementierung.

Fazit

  • Selbst mit einem vagen Prompt wie „besserer Code“ sind schrittweise Verbesserungen möglich.
  • Mit Prompt Engineering, das eine klare Richtung vorgibt (z. B. numerische Berechnung, JIT, Parallelisierung), entstehen deutlich schneller entwickelte Ergebnisse.
  • Automatisierte Optimierungsideen können als Anlass dienen, neue Werkzeuge wie numba zu entdecken, aber ein Engineer muss Bugs prüfen und sie selektiv einsetzen.
  • In produktiven Systemen der realen Welt ist es schwierig, jeden vom LLM vorgeschlagenen Code unverändert zu übernehmen; domain-spezifische Einschränkungen und Prüfungen sind dabei essenziell.
  • Dieses Experiment basiert auf Python-Code, doch auch in anderen Sprachen wie Rust und Integrationsansätzen wie PyO3 lassen sich Optimierungsideen von LLMs voraussichtlich anwenden

1 Kommentare

 
GN⁺ 2025-01-04
Hacker News Kommentar
  • In der Code-Optimierung ist es effektiv, zuerst zu prüfen, ob eine Zahl kleiner als das Minimum oder größer als das Maximum ist. Führt man das vor der Berechnung der digitalen Summe durch, kann das die Geschwindigkeit um das 5,5-fache erhöhen. Dies lässt sich auch mit NumPy erledigen, ohne Numba zu verwenden.

  • LLMs wie GPT liefern häufig nur mittelmäßige Ergebnisse am Anfang. Durch gezieltes Prompting könne man angeblich bessere Resultate erzielen.

  • LLMs sind situationsbezogene Simulationsmaschinen, die durch Textvorhersage Modelle der realen Welt simulieren. Für genaue Textvorhersagen ist ein präzises Modell der Realität erforderlich.

  • LLMs neigen dazu, Code auf Anfänger-Niveau zu schreiben, und es ist effektiv, Pakete explizit anzugeben und einfachen Code anzufordern.

  • In Android/Kotlin ist ChatGPT ineffizient und ruft häufig ungültige oder veraltete Methoden auf.

  • Beim Start einer Coding-Session ist es wichtig, statt mit „Code schreiben“ mit einer offenen Planung zu beginnen. Man sollte die Annahmen des LLM klären und den Plan vor dem Codieren anpassen.

  • Es wurde erklärt, wie man PostgreSQL in Debian vollständig entfernt und neu installiert, wobei das Datenverzeichnis erhalten bleibt, sodass bestehende Datenbanken erhalten bleiben.

  • Code-Optimierung sollte nicht zu früh durchgeführt werden; sie sollte nur dann erfolgen, wenn sie notwendig ist.

  • Das wiederholte Anfordern von „besserem Code“ kann die Leistung verschlechtern; es kann dazu führen, dass die Lösung nicht mehr funktioniert.

  • In LiveCode ist die Berechnung schneller als in Python, mit einer Erklärung, wie man eine Summe mit einer Schleife berechnet.