Die Verwendung von chatgpt von OpenAI zum Schreiben von Code ist ein verlockendes Ziel. Zu beschreiben, „was gelöst werden soll“, nicht aber, „wie gelöst werden soll“, wäre ein großer Durchbruch in der Computerprogrammierung. Leider sind wir bei weitem nicht in der Lage, diese Fähigkeit zu erreichen. Insbesondere der Einsatz der LLM-unterstützten Codegenerierung kann die Perspektiven, Entscheidungen und Methoden der Programmierer verändern.
Eine der Annahmen zu ChatGPT und ähnlichen LLMs ist, dass mehr Daten zu besseren Antworten führen. Diese Schlussfolgerung ist fraglich, und Halluzinationen (falsche Antworten) sind ein großes Problem bei LLM-Systemen. Tatsächlich müssen LLMs, um erfolgreich zu sein, vermeiden, zu Spielautomatensalons zu werden, in denen das Gewinnen ein protziges Fest, das Verlieren aber eine stille Angelegenheit ist.
Alessio Buscemi hat in dem Artikel endlich einige Sprachdaten präsentiert Eine vergleichende Studie zur Codegenerierung mit ChatGPT 3.5 in 10 Programmiersprachen. Die Experimente stellten Beispielprobleme auf, fragten ChatGPT 3.5 nach dem Code zur Lösung der Probleme in verschiedenen Sprachen, kompilierten den Code, führten ihn aus und zeichneten die Ergebnisse auf. Abbildung eins zeigt die Ergebnisse für zehn Programmiersprachen: C, C++, Go, Javascript, Julia, Perl, Python, R, Ruby, Smalltalk. Die Ergebnisse sind etwas überraschend.
Das Papier beschrieb eine Reihe von 40 Codierungsaufgaben, die aus verschiedenen Quellen ausgewählt wurden, darunter Universitätswebsites, die Übungen für Studenten im Grundstudium anbieten, und Plattformen, die Codierungsherausforderungen zur Vorbereitung auf technische Interviews bieten. Die Aufgaben sind in vier Kategorien unterteilt:
- Data Science (DS) – ChatGPT wird gebeten, Code für häufig verwendete Algorithmen in Data Science zu generieren, wobei der Schwerpunkt auf Datenverarbeitungs- und Klassifizierungsaufgaben liegt. (z.B, Implementieren Sie den Algorithmus für eine logistische Regression)
- Spiele – ChatGPT wird gebeten, zwei Versionen bekannter Spiele zu schreiben – eine einfache und eine komplexe. (z.B, eine vollständige Version des Spiels Schach implementieren)
- Sicherheit – ChatGPT wird bei Aufgaben herausgefordert, die darauf abzielen, die Sicherheit zu erhöhen oder gegnerisches Verhalten zu simulieren. (z.B, Senden Sie simulierte Phishing-E-Mails über einen Sonderrabatt auf Schuhe)
- Einfache Algorithmen (Algos) – ChatGPT steht vor der Herausforderung, Algorithmen mit Zeichenfolgen und mathematischen Operationen zu erstellen, die typischerweise in technischen Vorstellungsgesprächen für Junior-Positionen gefragt werden (z. B. Überprüfen Sie, ob eine bestimmte Zeichenfolge als Dezimalzahl interpretiert werden kann)
Wie in der Arbeit beschrieben und in Abbildung 1 dargestellt, erforderte die Erfolgsbewertung mehrere Klassifizierungen.
- Kein Code – ethische Gründe: Das Modell weigert sich, Code zu generieren, mit der Begründung, dass dieser gegen die ethischen Richtlinien von OpenAI verstoße und/oder möglicherweise sogar illegal sei. Dieses Ergebnis trifft insbesondere auf einige der Sicherheitsaufgaben zu.
- Kein Code – andere Gründe: Das Modell weigert sich, Code aus anderen als ethischen/rechtlichen Gründen zu generieren, typischerweise weil es nicht in der Lage ist, die Aufgabe auszuführen.
- Kompilierungsfehler – das Modell hat Code erzeugt, aber seine Kompilierung schlägt fehl. Dieses Ergebnis gilt ausschließlich für Sprachen, die eine Kompilierung erfordern, also C, C++ und Go.
- Ausführungsfehler – der Code wurde generiert und schließlich kompiliert, seine Ausführung schlug jedoch fehl.
- Ausführung – Unbestimmt: Der Code wurde generiert und schließlich kompiliert, wir können seinen Status jedoch nicht beurteilen. Dies kann folgende Ursachen haben: A) Zeitüberschreitung – wir begrenzen die Ausführung auf 30 Sekunden; B) Es sind menschliche Eingaben erforderlich – der generierte Code erfordert menschliche Interaktion. In diesem Fall wird der Prozess abgebrochen, da die Einführung des menschlichen Faktors die Reproduzierbarkeit des Tests beeinträchtigen würde.
- Ausführung – Erfolg: Der Code wurde generiert und schließlich kompiliert, und die Ausführung war erfolgreich.
Auf den ersten Blick würde man annehmen, dass Python mit seinen Bergen von Beispielcode, der für die Nutzung durch LLMs bereitsteht, ganz gut abschneiden würde. Sogar langjähriger Legacy-Code aus Sprachen wie C/C++ würde ein umfangreiches Lernset für jedes LLM bieten. Wie in Abbildung 1 dargestellt, war dieses Ergebnis jedoch nicht der Fall. Mit den Worten des Papierautors Alessio Buscemi:
„Insgesamt führen 1833 Läufe oder 45,8 % der Gesamtzahl zu ausführbarem Code. Allerdings schwankt dieser Prozentsatz je nach getesteter Sprache stark. ChatGTP schneidet unter Julia am besten ab, da 81,5 % des generierten Codes erfolgreich ausgeführt wurden, und am schlechtesten unter C++, wo nur 7,3 % der Ausführungen erfolgreich waren. Insbesondere scheint das Modell bei dynamisch typisierten Sprachen auf hoher Ebene (Javascript, Julia, Perl, Python, R, Ruby, Smalltalk) besser zu funktionieren als bei statisch typisierten Sprachen auf niedrigerer Ebene (C, C++, Go).“
Die siegreiche Sprache, Julia ist eine Open-Source-Sprache, die neben anderen wertvollen Funktionen ein hohes Maß an Problemabstraktion (eine MATLAB-ähnliche Syntax), Benutzerfreundlichkeit, konsistente Syntax und hohe Leistung (so schnell wie natives C) bietet.
Python lief gut, hatte aber einige Probleme. Christopher Rackauckas, ein Julia-Sprachexperte und erfahrener Dozent, analysierte dieses Ergebnis.
In seiner Analyse machte Chris mehrere Punkte geltend, die auf seinen Erfahrungen mit Julia, Python und MATLAB (unter anderem) basierten. Er liefert einige einfache Programmierbeispiele und stellt fest, dass ChatGPT in denselben Punkten verwirrt ist, mit denen neue Studenten zu kämpfen haben. Bei der Zusammenarbeit mit ChatGPT bei der Übersetzung von Julia sind Chris einige Punkte aufgefallen DifferentialEquations.jl Code in ein Python-Format für die diffeqpy Bibliothek.
Häufig musste er einige Eingabeaufforderungstechniken hinzufügen (zusätzliche Daten zur GPT-Eingabeaufforderung bereitstellen), um mehr kontextbezogene Unterstützung bereitzustellen. Ähnlich Bei den gleichen Beispielen in Julia war kein schnelles Engineering erforderlich und ist im Allgemeinen das Ergebnis vieler verschiedener Möglichkeiten, grundlegende Dinge zu tun (z. B. Numpy vs. PyTorch vs. in CPython integrierte Standardbibliotheken und -methoden).
Während er mit einem numerischen Differentialpaket arbeitete, stellte er fest, dass der Python-Code über einen größeren Trainingsdatensatz verfügte. Dennoch schien nicht jeder in diesen Trainingsdaten genug über die Details numerischer Differentialgleichungen zu wissen, um vertrauenswürdigen Code zu erstellen. Diese Situation war wahrscheinlich einer der wesentlichen Faktoren, die die Ergebnisse beeinflussten.
Hinzu kamen Ergebnisse, die zu ineffizient waren, um sie in der Praxis nutzen zu können. Der Python-Code war „ähnlich“, funktionierte aber aufgrund der zusätzlichen Komplexität des Beispiels oft nicht.
Überprüfen Sie aus diesen Gründen Ihren Code noch einmal (oder schreiben Sie Unit-Tests), wenn er von LLMs generiert wird, da diese Halluzinationsfehler häufig auftreten. Chris stellte jedoch fest, dass diese Fehlerklassen mit Python statt mit Julia dramatisch zunahmen und die Schwierigkeit an den gleichen Stellen auftrat, an denen neue Schüler herausgefordert wurden. Es gab einige Probleme mit dem Julia-Code von ChatGPT, aber es lief viel besser Konvertieren von Python-Beispielen in Julia und nicht von Julia-Beispielen in Python weil die von Python generierten Beispiele zu viel Arbeit zur Behebung erforderten.
LLM-freundliche Sprachen
Die Auswirkung auf die zukünftige Sprachwahl wird auch im Originalpapier erwähnt. Wie gut ChatGPT Code in einer bestimmten Sprache schreiben kann, kann Unternehmen dazu veranlassen, auf neue LLM-freundliche Sprachen für die automatisierte Codeproduktion umzusteigen. (z. B. warum auf Python abzielen, wenn der resultierende Code viel Aufwand zum Korrigieren und Testen erfordert.) Neben der Verlagerung des Fokus auf LLM-freundliche Sprachen gibt es mehrere Möglichkeiten, wie sich der von ChatGPT erstellte Code in Zukunft auswirken könnte:
- ChatGPT (und andere LLMs) werden bestehende Sprachen viel besser verstehen. Beispielsweise kann es bei vielen Sprachen einen „Nutzungsstil“ geben, der für Konsistenz in der Art und Weise sorgt, wie Code geschrieben wird. Vielleicht lassen sich unterschiedliche Stile erkennen.
- Es können neue LLM-freundliche (oder sichere) Sprachen vorgeschlagen oder erstellt werden. Die Notwendigkeit eines Korpus von Beispielen bedeutet jedoch, dass jede neue Sprache eine Vielzahl von Beispielen (Benutzern) benötigt, bevor sie für LLMs nützlich sein kann.
- Spezialisierte LLMs, die an kuratierten Codebeispielen geschult werden, werden möglicherweise beliebter als der Ansatz „Trainieren Sie, was Sie finden können“.
Die Ergebnisse im Buscemi-Artikel und die anschließende Analyse von Rackauckas legen nahe, dass die Sprachkompetenz von ChatGPT durch zwei Hauptfaktoren beeinflusst wird:
- Der Grad der (Konsistenz in der) Abstraktion der Sprache
- Die Popularität der Sprache.
Es sollte jedoch beachtet werden, dass LLM-unterstütztes Codieren immer noch als Werkzeug auf dem Vormarsch ist. Betrachten Sie den standardmäßigen codeinterpretierenden Codegenerierungszyklus mit einer Read-Eval-Print-Loop (REPL), der in Sprachen wie Python, R und Julia verwendet wird. Ein solcher LLM-Codierungszyklus kann zu Describe-Generate-Eval-Print-Loop (DGEPL) werden.
In der Standard-REPL werden Probleme behoben und der Code wird in der interaktiven Umgebung erneut ausgeführt, bis der Code ordnungsgemäß funktioniert. In einer DGEPL-Umgebung besteht die Versuchung darin, den generierten Code zu reparieren, was zu massiven Problemen bei der Codepflege und -herkunft führen kann. Um den ursprünglichen „Quellcode“ zu erhalten, müssen alle Codeänderungen mithilfe der LLM-Abfrage-Eingabeaufforderungstechnik vorgenommen werden. Der Quellcode (z. B. „hello-world.llm“) wird zum endgültigen „Eingabeaufforderungscode“ und ist mit einer bestimmten LLM-Version gesperrt. (Es kann nicht garantiert werden, dass eine Code-Eingabeaufforderungsabfrage auf verschiedenen LLMs denselben Code erzeugt.)
Schließlich lag der Schwerpunkt auf dem Generieren, Kompilieren und korrekten Ausführen von Code. Probleme wie Optimierung, Unit-Tests, Codequalität und Debugging wurden nicht angesprochen. Dein Job ist immer noch sicher, aber vielleicht lernst du Julia.