1 Punkte von GN⁺ 2024-01-03 | 1 Kommentare | Auf WhatsApp teilen
  • ChatGPT und lokale LLMs sind für erfahrene Programmierer zu Werkzeugen geworden, die aufreibende Aufgaben reduzieren: Dokumentation durchsuchen, komplexe APIs erlernen oder Wegwerfprogramme schreiben – weniger das eigentliche Schreiben von Code
  • LLMs sind keine übernatürliche Intelligenz, sondern interpolieren nur begrenzt innerhalb des Raums ihrer Trainingsdaten; in Bereichen mit vielen hochwertigen Daten wie der Programmierung sind sie jedoch als „viel wissender Dummkopf“ sehr nützlich
  • Bei überprüfbaren Problemen wie PyTorch-Tensor-Transformationen, einem macOS-Objective-C-BLE-Client, der Interpretation von Ein- und Ausgaben eines ONNX-Modells oder CSV-Analyseskripten verkürzt GPT-4 die Arbeitszeit deutlich
  • Bei Aufgaben, die komplexes Schlussfolgern erfordern, etwa systemnaher Programmierung in C und Algorithmusimplementierungen, zeigten sich Grenzen beim Hash-Design für Bloom-Filter und bei der Interpretation des Q6_K-Quantisierungsformats von llama.cpp
  • Wenn ein großer Teil des Programmierens darin besteht, bestehende Muster leicht verändert zu wiederholen, werden die Fähigkeit, LLMs gut zu nutzen, und die Fähigkeit, Probleme klar zu beschreiben, wichtiger

Warum erfahrene Programmierer LLMs nutzen

  • Der Zweck des Einsatzes von LLMs beschränkt sich nicht darauf, Code einfach schneller zu schreiben
    • ungewöhnliche Dokumentation suchen
    • übermäßig komplexe APIs erlernen
    • Programme schreiben, die ein paar Stunden später weggeworfen werden
    • intellektuell wenig interessante Details erledigen
  • Da Google zu einem von Spam belasteten Suchraum geworden ist, sind LLMs zu einem alternativen Weg geworden, um benötigte Informationen schnell zu erhalten
  • Bei High-Level-Code wie Python hat die Nutzung von LLMs zugenommen, bei C-Code werden sie jedoch deutlich seltener eingesetzt
  • Der wichtige Unterschied liegt darin, zu erkennen, wann der Einsatz eines LLMs schneller macht und wann er im Gegenteil bremst
  • LLMs helfen – ähnlich wie Wikipedia oder YouTube-Vorlesungen – besonders Menschen mit Willen, Fähigkeit und Disziplin; für Zurückliegende können ihre Grenzen deutlicher sein

LLMs sind weder allwissend noch bloße Papageien

  • Die internen Abläufe neuronaler Netze und LLMs sind weiterhin ziemlich undurchsichtig
  • Einige KI-Experten unterschätzten LLMs als fortgeschrittene Markov-Ketten oder Systeme, die nur Varianten von Trainingsdaten wiedergeben; diese „Papageien“-Sicht wurde angesichts der Evidenz jedoch größtenteils zurückgenommen
  • Umgekehrt ist es ebenfalls unzutreffend, LLMs übernatürliche Fähigkeiten zuzuschreiben, die in der Realität nicht existieren
  • LLMs können innerhalb des Raums der Daten, die sie im Training gesehen haben, begrenzt interpolieren
    • Sie können auch Programme schreiben, die sie nie exakt gesehen haben
    • Sie können mehrere Ideen kombinieren, die häufig in den Trainingsdaten vorkamen
    • Wenn subtile Schlussfolgerungen nötig sind, können sie deutlich scheitern
  • Trotz dieser Grenzen können LLMs als eine der größten Errungenschaften in der Geschichte der KI gelten

Programmierassistent als „viel wissender Dummkopf“

  • LLMs können elementares und oft ungenaues Schlussfolgern, Halluzinationen und die Erzeugung nicht existierender Fakten verursachen
  • Gleichzeitig funktionieren sie in Bereichen mit vielen hochwertigen Daten, etwa der Programmierung, wie ein Savant mit enormem Wissen
  • Als Kollege fürs Pair Programming mögen sie unzureichend sein, doch in einer Struktur, in der der Nutzer Fragen stellt und Antworten überprüft, sind sie nützlich
  • Früher konnte man vieles erledigen, wenn man einige Sprachen, klassische Algorithmen und zentrale Bibliotheken kannte
  • Heute ist die Komplexität durch die Explosion von Frameworks, Sprachen und Bibliotheken stark gestiegen; in dieser Umgebung wird ein „Dummkopf, der alles weiß“ zu einem nützlichen Begleiter

Erfolgsgeschichten bei High-Level-Code und Dateninterpretation

  • Beim Wechsel von Keras zu PyTorch half ein LLM dabei, den für den Modellaufbau nötigen Code zu schreiben, ohne die PyTorch-Dokumentation von Grund auf zu studieren
    • Der Nutzer kannte Konzepte wie Embeddings oder Residual Networks bereits
    • Effektiv war es, die benötigte Modellstruktur und die Fragen klar zu formulieren
  • GPT-4 betrachtete ein PyTorch-Modell und das Batch-Format und schrieb Code, um Tensoren passend zum Eingang des neuronalen Netzes umzuformen
    • Der Nutzer überprüfte in der Python-CLI, ob Tensor-Dimensionen und Daten-Batches passten
  • Beim Bau eines BLE-Clients für ein ESP32-basiertes Gerät wurde schnell Objective-C-Code geschrieben, um die nativen macOS-APIs zu verwenden
    • Multiplattform-Bluetooth-Bindings wurden im Wesentlichen als unbrauchbar eingeschätzt
    • Die Objective-C-BLE-API und lange nicht genutzte Objective-C-Details mussten erneut behandelt werden
    • Der finale Code befindet sich in SerialBTE.m
  • Das LLM schrieb nicht den Großteil des Codes direkt, erklärte aber Ursachen von Problemen und Lösungswege und beschleunigte die Arbeit deutlich
  • Der Nutzen dieses Hilfsprogramms im Verhältnis zum Aufwand war gering; ohne ChatGPT wäre der Versuch wahrscheinlich gar nicht unternommen worden

ONNX-Modellinterpretation und Wegwerfprogramme

  • Bei der Nutzung eines schlecht dokumentierten ONNX-Convnet-Formats interpretierte ein LLM anhand von Ein-/Ausgabe-Metadaten und Raw-Output-Werten von Testbildern die Funktionsweise
    • Anfangs waren Format und Größe des Eingabebilds unbekannt
    • Die Ausgabe war keine einfache binäre Klassifikation, sondern bestand aus Hunderten von Werten
    • ChatGPT nahm an, dass die Ausgabe normalisierte Boxen für potenzielle Defektbereiche im Bild und Defektwahrscheinlichkeiten darstellen könnte
    • Nach einigen Gesprächsrunden entstanden ein Python-Inference-Skript und Code zur Umwandlung des Eingabe-Tensors
  • Bei „Wegwerfprogrammen“ wird mitunter das gesamte Schreiben des Codes dem LLM überlassen
  • Um während des Trainings eines kleinen neuronalen Netzes die Loss Curve zu visualisieren, erzeugte GPT-4 anhand des CSV-Formats plot.py
    • Es wurde darum gebeten, mehrere CSV-Dateien über die Kommandozeile zu übergeben und die Validation-Loss-Curves der einzelnen Experimente zu vergleichen
    • Die gesamte Aufgabe dauerte 30 Sekunden
  • Auch ein pandas-Programm, das einen AirBnB-CSV-Report einliest, nach Wohnung sowie Monat und Jahr gruppiert und unter Berücksichtigung von Reinigungsgebühren und Übernachtungszahlen die durchschnittliche Monatsmiete berechnet, funktionierte beim ersten Versuch
  • Solche Programme sind in der Erstellung langweilig und wenig interessant; wenn ein LLM sie erledigt, kann sich der Nutzer auf wichtigere Aufgaben konzentrieren

Grenzen bei C und Systemprogrammierung

  • Beim Schreiben von C-Programmen wird ein LLM fast immer nur als bequemere Form von Dokumentation genutzt
  • Systemprogrammierung erfordert komplexes Schlussfolgern, und genau an diesem Punkt scheitern heutige LLMs häufig
  • Als GPT-4 um eine Bloom-Filter-Implementierung für 100.000 Elemente und eine maximale False-Positive-Probability von 5 % gebeten wurde, lieferte es keine gute Implementierung
    • Es verwendete nur zwei ähnliche Hash-Funktionen
    • Es fehlte die Abstraktion, aus demselben String K ausreichend dekorrelierte Hashes zu erzeugen
    • Wenn ausdrücklich verlangt wurde, N dekorrelierte Outputs zu erzeugen, schlug es eine bessere Hash-Funktion vor
  • GPT-4 konnte, wenn das Problem in kleinere Teilprobleme zerlegt wurde, geeignetere Hash-Funktionen schreiben, wandte diese Idee beim Gesamtdesign des Bloom-Filters aber nicht selbstständig an
  • Dieses Ergebnis lässt sich als Kombination aus schwacher Schlussfolgerungsfähigkeit, Mangel an themenspezifischem Material und Material niedriger Qualität betrachten

Unterschiede zwischen lokalen und großen Modellen

  • Bei Problemen der Systemprogrammierung ist der Unterschied zwischen kleinen und großen Modellen deutlich
  • Mixtral schlug beim selben hash_id-Problem vor, hash_id an das Ende des Hash-Ergebnisses anzuhängen; das wurde als sehr schlechte Lösung bewertet
  • Die Ergebnisse mit deepseek-coder 34B, 4-bit-quantisiert auf einem MacBook M1 Max, waren besser
    • Der Nutzer gab den Hinweis, dass die Verteilung schlechter wird, wenn hash_id am Ende angehängt wird
    • Das Modell erkannte, dass einfache Addition die Ursache des Problems sein könnte
    • Es schlug Alternativen vor, bei denen hash_id mit bitweisen Operationen wie XOR eingemischt wird
  • Dieser Fall kommt einer Art Ursachenidentifikation und Lösungsvorschlag nahe, die allein über Dokumentation oder Google-Suche schwer zu erhalten wäre
  • Dennoch liefern LLMs erfahrenen Systemprogrammierern insgesamt noch kaum zufriedenstellende Lösungen

Beispiel: Interpretation des llama.cpp-Q6_K-Formats

  • Das Projekt ggufflib ist eine Bibliothek zum Lesen und Schreiben von Dateien im GGUF-Format, das llama.cpp beim Laden quantisierter Modelle verwendet
  • Bei der Quantisierungscodierung sind die Bits jedes Quants aus Geschwindigkeitsgründen auf komplexe Weise gespeichert
  • Zunächst wurde versucht, die Codierung mit ChatGPT zu verstehen, doch direktes Reverse Engineering des llama.cpp-Codes war deutlich schneller
  • Obwohl die Funktion klein genug war, um in den Context von GPT-4 zu passen, war das Ergebnis beim Rekonstruieren einer Datenformat-Dokumentation aus Strukturdeklaration und Decoding Function unbrauchbar
  • Auch bei der Bitte, das Q6_K-Format zu erklären, konnte es nicht klar darstellen, wie lower/upper bits je nach Weight-Position in ql und qh gespeichert werden
    • Selbst bei der Bitte um eine Funktion, die eine einfachere Speicherweise erklärt, waren die Indizes falsch
    • Auch die Behandlung der Sign Extension von 6-bit auf 8-bit war falsch
  • Letztlich wurde diese Aufgabe mit Papier und Stift, Code-Lektüre und dem Nachverfolgen der vom Decoder extrahierten Bits gelöst
  • Es wird erwartet, dass auch solche Aufgaben in den Bereich fallen, der ohne Durchbruch, nur mit etwas Scaling, innerhalb weniger Monate möglich werden könnte

Charakter von Programmierarbeit und Fähigkeit zur LLM-Nutzung

  • Ein erheblicher Teil heutiger Programmierung besteht darin, dasselbe in leicht anderer Form zu wiederholen, und erfordert oft kein hohes Maß an Schlussfolgern
  • LLMs sind bei solcher repetitiver Programmierung recht stark, doch die Begrenzung der Context-Größe bleibt eine große Einschränkung
  • Es lohnt sich zu überlegen, ob es in fünf oder zehn Jahren noch eine gute Position ist, nur Programme der Art zu schreiben, die LLMs teilweise ausführen können
  • Die Schlussfolgerungsfähigkeit von LLMs ist schwach und unvollkommen, doch die beobachteten Ergebnisse lassen sich schwer erklären, wenn man sie nur als bloßes Wiedergeben von Wörtern betrachtet
  • Das Trainingsziel der Vorhersage des nächsten Tokens erzwingt den Aufbau irgendeiner Form von abstraktem Modell; dieses Modell ist schwach, lückenhaft und unvollständig

Warum jetzt LLMs nutzen?

  • Es gibt kaum Gründe, LLMs beim Programmieren nicht zu nutzen
  • Die Fähigkeit, LLMs die richtigen Fragen zu stellen, wird zu einer wichtigen Kompetenz
  • Die Fähigkeit, ein Problem klar zu erklären, ist nicht nur im Umgang mit LLMs, sondern auch in der Kommunikation mit Menschen nützlich
  • Viele Programmierer sind in bestimmten Bereichen hervorragend, können aber Defizite in der Kommunikation haben
  • Da Google schwerer nutzbar geworden ist, eignen sich LLMs auch gut als komprimierte Dokumentation
  • Der praktische Wert von LLMs liegt darin, dass man weniger „Junk Knowledge“ wie vage Kommunikationsprotokolle oder komplexe Bibliotheksdetails direkt lernen muss

1 Kommentare

 
GN⁺ 2024-01-03
Meinungen auf Hacker News
  • Der Kern ist dieser Teil: „Hätte ich es auch ohne ChatGPT geschafft? Natürlich wäre das möglich gewesen, aber dass es länger gedauert hätte, ist nicht das Interessanteste. Tatsächlich hätte ich es gar nicht erst versucht, weil es sich nicht gelohnt hätte.“
    Das eigentliche Potenzial von LLMs bei Code-Assistenz liegt darin, die Einstiegshürde für neue Aufgaben zu senken und einen dazu zu bringen, Dinge tatsächlich anzugehen und fertigzustellen, die sonst auf unbestimmte Zeit im Stapel künftiger Projekte geblieben wären.
    Das Internet und Open Source hatten einen ähnlichen Effekt: Auch bei Projekten, an denen man interessiert war, die man aber nicht selbst umgesetzt hat, hatten mit der Zeit genug andere Menschen ähnliche Probleme gelöst, sodass man sie wiederverwenden oder abwandeln konnte; dadurch explodierte die Zahl nützlicher Apps und Libraries.
    Ich stimme dem Autor zu: LLMs sind für sich genommen nicht besonders fähig, aber für Menschen mit grundlegenden Fähigkeiten und Motivation werden sie zu einem Verstärker.

    • Auch jenseits der „Einstiegshürde“ gibt es vieles, das ich mit ChatGPT erkunde, ohne anfangs wirklich die Absicht zu haben, es umzusetzen – ich war einfach neugierig.
      Dann merkt man, dass es mit viel weniger Aufwand geht als erwartet.
      Einen ähnlichen Effekt kann man erzielen, wenn man sich mit der richtigen Person über Ideen austauscht, aber es steht eben nicht rund um die Uhr mit einem Klick jemand bereit, der zwar das Problemfeld nicht vollständig kennen muss, aber genug sinnvollen Input geben kann.
    • Ich habe das Gefühl, von diesem LLM-Hype ziemlich abgehängt zu sein.
      Bei ein paar Dingen war es hilfreich, aber meistens weiß das Modell an dem Punkt, an dem ich nicht mehr weiß, was ich tue, auch nicht besser Bescheid als ich.
      Abgesehen davon fällt es mir schwer, Prompts schneller zu formulieren, als einfach selbst Code zu schreiben.
      Ich frage mich, ob ich diese Tools einfach nicht richtig benutzen kann.
    • Vielleicht ist es aber auch so, dass der Spaßfaktor, eine neue und angesagte Technologie wie LLMs zu verwenden, die Startenergie liefert, die man für eigentlich langweilige Aufgaben braucht.
    • Ich habe kürzlich an einem Projekt gearbeitet, bei dem ich einen fortgeschrittenen Java-Classfile-Analyzer gebaut habe.
      Die ow2-asm-Library kannte ich ziemlich gut, aber sie hat mir viel Zeit erspart, die ich sonst damit verbracht hätte, das genaue Descriptor-Format nachzuschlagen.
      Außerdem half sie mir zu verstehen, warum andere statische Analyse-Libraries wegen ihrer Art, mit Zustand umzugehen, für mich nicht ausreichend waren.
      Für mich erledigt ChatGPT zwei Dinge: Es reduziert triviale StackOverflow-Suchen und das Durchforsten von Library-Code, um konkrete Fragen zu beantworten, und es hilft mir in der Recherchephase vor Projektbeginn einzuschätzen, ob der von mir geplante Ansatz realisierbar ist.
    • Ich habe gehört, dass viele Menschen mit ADHS sagen, LLMs hätten ihr Leben deutlich stärker verändert als das neurotypischer Menschen.
      Bei schwerem ADHS sind die einfachen Dinge am schwierigsten; selbst den Müll rauszubringen oder die Post zu öffnen kann nahezu unmöglich sein.
      Der innere Monolog schreit einen stundenlang an, diese Sache einfach zu tun, aber der Körper hört nicht darauf.
      Man nennt das eine Störung der exekutiven Funktionen, aber in meinem Leben ist es ein ständiges Problem.
      Allein dass ein LLM einen dazu bringt, damit anzufangen, ist schon enorm.
  • Beim Programmieren stimme ich vollkommen zu.
    Der Sweet Spot beim Einsatz von LLMs liegt dort, wo man bereits genug über das Thema weiß, um das Ergebnis zu überprüfen, und wo man genau genug – idealerweise knapp und auf den Punkt – erklären kann, was man möchte.
    Sie machen einen schneller, bringen einen dazu, Dinge zu tun, die man sonst nicht getan hätte, und helfen enorm dabei, kleine, aber wertvolle Programme zu schreiben, die man auch wieder wegwerfen kann.
    Ein weiterer sehr nützlicher Bereich war für mich die Erkundung völlig neuer Themen, egal ob Programmierung oder nicht.
    Man kann sagen, dass man sich nicht gut auskennt, dass die Details nicht zwingend nötig sind, man aber über dieses Thema sprechen und beim Sortieren der Gedanken Hilfe möchte.
    Besonders nützlich ist das für Menschen, die bereit sind, auf Basis des Gehörten weiter zu recherchieren oder weitere Fragen zu stellen.
    Der Einstieg in viele Fachgebiete besteht darin, die Grundbegriffe zu verstehen, zu hören, welche Unterscheidungen Menschen treffen und warum, und zu wissen, wer in diesem Thema als Autorität gilt.

    • Umgekehrt ist es für Junior-Entwickler genauso stark, aber in genau die entgegengesetzte Richtung, schädlich.
      Es entsteht die Situation, dass sie so lange herumstochern, bis sie ein Monster erzeugt haben, das sie nicht verstehen, und es lediglich zum Bauen bringen.
      Lernende brauchen Hilfe, aber die Hilfe, die ein LLM in Form von Copilot gibt, ist nicht die richtige Art.
      Interessant wäre es, ein Copilot-Modell zu trainieren, das als Partner konzipiert ist, der klärende Fragen stellt und gemeinsam eine Lösung erarbeitet, statt aus den vagen oder falsch spezifizierten Fragen eines Juniors irgendwie Code zu generieren.
    • Im letzten Monat habe ich LLMs für Dinge ausprobiert, die ich nicht wusste und auch nicht leicht finden konnte.
      Jedes Mal lieferte es subtil falsche oder komplett halluzinierte Prämissen, und ich verschwendete Zeit, bis ich merkte, dass sie falsch waren.
      Ohne die unverdiente Selbstsicherheit bei falschen Antworten könnte man sagen, dass es nicht viel schlechter ist, als Dinge zusammenzusetzen, die ich bereits weiß; im Moment taugt es aber eher als Ersatz für Rubber Ducking oder Autocomplete.
    • Was ich mir wirklich oft wünsche, ist ein maßgeschneidertes LLM wie GPT, aber trainiert für eine bestimmte Sprache, ein bestimmtes Framework oder Thema.
      Es wäre schön, auf die Website einer neuen Sprache zu gehen und dort ein LLM zu haben, mit dem man über die Dokumentation sprechen und Fragen stellen kann, um sie besser zu verstehen.
      Noch besser wäre es, wenn es mit echten Codebeispielen dieser Sprache oder dieses Frameworks trainiert wäre und einem direkt vor Ort beim Schreiben neuer Programme oder Funktionen helfen würde.
      Wenn es mit einem Online-REPL verbunden wäre und inline helfen könnte, wäre das ein noch größerer Vorteil.
    • One Pager und Six Pager, die auf Basis lockerer Vorgaben erstellt werden, helfen dabei, die Kriterien zu schärfen, und machen in manchen Fällen auch Ansätze sichtbar, die sonst nicht aufgefallen wären.
  • Der am meisten unterschätzte Aspekt von LLMs ist meiner Meinung nach die Rolle eines Entwicklers, der alles weiß – etwas, das im Artikel zwar gestreift, aber nicht direkt behandelt wurde.
    Selbst sehr erfahrene Programmierer stoßen irgendwann auf Technologien, von denen sie fast nichts wissen.
    Jeder ist in irgendeinem Bereich Junior.
    Selbst ein Gott von Win32, C++ und COM kann beim Paketieren von Software an kryptischen NSIS-Skripten hängen bleiben.
    Man kann 25 Jahre lang Web-Apps gebaut haben und im PHP-Sprachkomitee sitzen, aber wenn man eine obskure ISO-Norm implementieren soll, die mit Kreditkartennetzwerken kommuniziert, hat man vielleicht noch nie auf diesem Niveau mit Kreditkartennetzwerken kommuniziert.
    Man kann seit dem ersten iPhone iOS-Apps gebaut haben, davor Mac-Apps, ein paar Jahre bei Apple gearbeitet haben und die meisten iOS-APIs auswendig kennen und sogar selbst entworfen haben – und trotzdem nicht einmal wissen, was CalDAV ist, wenn man CalDAV-Support in eine App einbauen soll.
    In solchen Situationen kann ein LLM helfen, und auch wenn es nicht den gesamten Code schreiben kann, kann es einen zumindest in die richtige Richtung führen.

    • Es geht sogar noch schlimmer.
      Nachdem man den Kopf mit anderen Technologien gefüllt hat, kommt der Moment, in dem man sich an Dinge erinnern und sie auffrischen muss, die man früher gelernt, aber wegen neuer Technologien beiseitegeschoben hat.
      Das ist ein seltsames Gefühl.
      Man folgt ganz natürlich dem Median dessen, womit sich die Firma beschäftigt, bei der man arbeitet, und plötzlich ist man in der Situation, dass es „schon eine Weile her“ ist, seit man CSS angefasst hat.
      Vielleicht braucht man Wochenendlernen, um wieder ein Gefühl für Python-dataclass zu bekommen.
    • Das Wesen von GPT ist: der beste Googler der Welt.
      Wenn etwas bei Google zu finden ist, ist die Chance groß, dass ein LLM es schneller und besser findet und aufbereitet.
    • Auch wenn es das heute noch nicht kann, wird es das morgen ganz sicher können, und dann ist es Zeit, sich einen anderen Beruf zu suchen.
      Zum Glück bin ich bis dahin wahrscheinlich schon im Ruhestand.
  • Der Trend „Der Code wurde größtenteils per Copy-and-paste aus ChatGPT geschrieben“ ist erstaunlich.
    Ich bin immer wieder schockiert, wie viele Menschen so einen schmerzhaften Workflow ertragen.
    Der Autor des Originaltexts ist eindeutig kein Anfänger, der mit GPT über sein eigenes Wissen hinaus codet, sondern ein erfahrener Engineer.
    Normalerweise wäre das jemand, dem Usability und Effizienz von Coding-Workflows und Tools wichtig sind – und trotzdem ertragen viele, ständig Code zwischen GPT und lokalen Dateien hin- und herzukopieren.
    Dieser frustrierende Workflow war ursprünglich der Anlass, aider zu bauen.
    aider teilt ein lokales Git-Repository mit GPT, sodass neuer Code und Änderungen direkt auf Dateien angewendet werden.
    Auch der relevante Code-Kontext wird mit GPT geteilt, damit es Code schreiben kann, der sich ins Projekt integriert.
    Dadurch werden nicht nur isolierte Code-Schnipsel möglich, die sich leicht kopieren und einfügen lassen, sondern auch anspruchsvollere Beiträge.
    Am Ende entsteht ein reibungsloser Pair-Programming-Workflow, bei dem ich und GPT im Gespräch gemeinsam Dateien bearbeiten.
    https://github.com/paul-gauthier/aider

    • Ich mag aider.
      Aber gibt es eine Möglichkeit, es einfach zum Reden über Code zu verwenden?
      Ich nutze LLMs, um Vor- und Nachteile verschiedener Ansätze zu besprechen oder Probleme im Rubber-Duck-Stil durchzugehen.
      Dafür muss ich Code kopieren, und weil aider auf das Anwenden von Änderungen fokussiert ist, passte es für diesen Zweck nicht gut.
      Meist entscheide ich erst nach mehreren Hin-und-her-Runden über den richtigen Ansatz, ob ich eine Änderung überhaupt anwenden will.
    • „Der Autor des Originaltexts ist eindeutig ein erfahrener Engineer“?
      Er ist der Schöpfer von Redis.
    • Das Webinterface von ChatGPT ist für viel mehr nützlich als nur Programmierung.
      Wenn man das Abo ohnehin schon bezahlt, ergibt es Sinn, zu kopieren und einzufügen, statt zusätzlich für die API zu bezahlen.
      Außerdem hat jeder andere Maßstäbe dafür, ob der Effizienzgewinn es wert ist, von einem Projekt einer anderen Person abhängig zu sein; solche Projekte können kostenpflichtig werden oder verwaisen.
    • Die Idee von aider gefällt mir wirklich, aber als ich es ausprobiert habe, funktionierte es nicht.
      Der erste Versuch mit einer echten Datei war zu groß und ist geplatzt, und die zweite echte Datei war immer noch zu groß.
      Ich fand es überraschend, dass aider große Dateien offenbar nicht so aufteilen kann, dass sie ins Token-Limit passen.
      Das Token-Limit von GPT kann gar nicht so große Quelldateien aufnehmen.
      Wenn ich die zu bearbeitenden Dateien auswählen und sogar noch daran herumschnippeln muss, damit GPT nicht daran erstickt, weiß ich nicht, ob das gegenüber Copilot in der IDE wirklich Zeit spart.
      Anfangs dachte ich, aiders zentraler Beitrag sei der Umgang mit dem Problem „Codegröße ≫ Token-Limit“, aber das scheint es nicht gewesen zu sein.
      Ich würde es gern noch einmal versuchen, aber aider fällt für mich in die ungünstige Kategorie „man muss ein Problem und eine Codebasis finden, die einfach genug sind, dass aider damit klarkommt“.
      Copilot und ChatGPT dagegen kommen jeden Tag genau dorthin, wo ich tatsächlich arbeite, und helfen mir mit echten Codebasen im echten Job, einschließlich ihrer Macken.
    • Ich möchte sagen: Danke, dass du Aider gebaut hast.
      Ich finde, es deckt mit seinen aktuellen Funktionen die Chat- und Review-Anwendungsfälle hervorragend ab.
      Die Kommentare hier spiegeln möglicherweise nicht die hohe Zufriedenheit der meisten Softwarenutzer wider.
      Aider hilft dabei, den von antirez im Artikel beschriebenen Anwendungsfall tatsächlich umzusetzen.
      Besonders dann, wenn man – wie antirez sagt – besser darin wird, LLMs die richtigen Fragen zu stellen.
  • In den letzten Tagen habe ich versucht, einen Bug in einer Closed-Source-Mac-App zu beheben.
    Ich mag diese App, aber dieser Bug hat mich seit Jahren wahnsinnig gemacht.
    Ich war ziemlich sicher, welche Objective-C-Methode den Bug ungefähr verursacht, wusste aber nicht, was diese Methode tut, und die dekompilierte Version war ein völlig unsinniges Chaos.
    Ich hatte das Gefühl, gegen eine Wand zu laufen.
    Dann habe ich den Lärm, den der Decompiler ausgespuckt hat, in GPT-4 gesteckt und es gebeten, daraus eine saubere Version zu machen.
    Das Ergebnis war nicht perfekt, aber ich konnte es aufräumen, und nachdem ich dieses Ergebnis in die App geswizzelt hatte, scheint der Bug verschwunden zu sein.
    Ich habe nie Reproduktionsschritte gefunden, aber normalerweise wäre das Problem inzwischen aufgetreten.
    Ohne GPT-4 hätte ich das nie geschafft.

    • Das klingt ziemlich ähnlich wie ein Junior- oder schlechter Entwickler, der die Reihenfolge von Funktionen in einer Quelldatei ändert und damit einen Bug zumindest vorläufig verschwinden lässt.
      Wenn man ein Codestück komplett neu schreibt, ist es natürlich unwahrscheinlich, dass es denselben Bug wie die ursprüngliche Implementierung hat – selbst wenn man nicht versteht, was es tut, und ein LLM verwendet.
      Allerdings können dabei andere Bugs entstehen, und ich hoffe, dass niemand so mit Code umgeht, bei dem die Folgen eines Bugs wichtig sind, etwa Systemausfälle oder Kosten für Kunden.
  • Dieser Beitrag ist für mich völlig schockierend
    Salvatore ist einer der fähigsten Software Engineers, die heute aktiv sind
    Er kann klar erkennen, dass dieses sogenannte Tool in seinem Fachgebiet völlig nutzlos ist
    Und trotzdem übernimmt er die Prämisse der Befürworter, man müsse irgendwie einen Nutzen dafür finden, statt es wie einen unpassenden, verbogenen Schraubendreher wegzuwerfen
    Wie man in einer Einführungsvorlesung zur Makroökonomie lernt: Wenn eine Insel bei der Produktion von Widget A überlegen ist, entsteht Spezialisierung, bei der Insel A Insel B einsetzt, egal wie schlecht deren Fähigkeit zur Produktion von B ist
    Daher ist es nur natürlich, dass antirez’ relative Fähigkeit in der Systemprogrammierung das LLM in andere Programmieraufgaben verdrängt
    Aber wir existieren nicht isoliert
    Um uns herum gibt es zahlreiche Menschen, die technische Herausforderungen und etwas zu essen wollen
    Viele von ihnen haben oder können Fähigkeiten erwerben, die unsere ergänzen
    Wenn wir zusammenarbeiten, kann das Ergebnis der Kooperation mehr sein als die Summe der Teile
    Vielleicht kann ein LLM PyTorch-Code besser schreiben als antirez
    Aber nur weil in der Garage ein alter, verbogener Schraubendreher liegt, heißt das nicht, dass man ihn benutzen muss
    Vielleicht ist es besser, heute in den Baumarkt zu gehen

    • Wenn ein LLM Torch-Code besser schreibt als ich, ist es eine gute Idee, meine Modelldefinition vom LLM schreiben zu lassen
      Denn die exakte Syntax oder das Umformen von Tensoren ist für mich nicht besonders wichtig
      Wenn es um einen privaten Zweck geht, etwa ein ConvNet für meine Bilder zu bauen und zu trainieren, muss ich keinen Torch-Experten belästigen
      Wenn ich das ConvNet selbst ausreichend verstehe und nur die Torch-Syntax oder -Methoden nicht gut genug kenne, kann ich das selbst machen
      Die Alternative wäre, die Details des Torch-Handbuchs zu studieren, und das Ergebnis wäre dasselbe
      Entscheidend bei dieser Aufgabe ist nicht die Kontrolle über die Details von MLX, Keras oder PyTorch, sondern über die Machine-Learning-Konzepte
    • Das Interessante an LLMs ist, dass man ihre Einführung nicht überstürzen muss
      Im Moment sind sie bis zu einem gewissen Grad nützlich, aber schwerlich wirklich überzeugend, und man „fällt“ auch nicht „zurück“, wenn man sie nicht nutzt
      Alle Beteiligten tun ihr Bestes, um sie leistungsfähiger zu machen; wenn dieser Tag kommt, kann man prompten, was man will
      Es gibt keinen Grund, sich jetzt zu beeilen, um aus der aktuellen Generation zwanghaft etwas herauszupressen; derzeit senken sie oft eher die Produktivität, als sie zu erhöhen
    • Ich glaube, du legst diesen Beitrag übermäßig negativ aus
      Ich frage mich fast, ob wir denselben Text gelesen haben
      Er sieht sich ein neues Tool an, das andere interessant finden, findet für sich nützliche Anwendungsweisen und erkennt zugleich an, wo es nutzlos ist
      Die Beispiele, in denen es nicht nutzlos war, untermauert er ebenfalls ausreichend
      Für Entwickler ist das keine besonders revolutionäre Erkenntnis
      Wir verwenden ständig verschiedene Tools wie Programmiersprachen, und jedes Tool hat Stärken und Schwächen
      Ich weiß nicht, warum LLMs da so anders sein sollten
      Zu behaupten, sie hätten überhaupt keine Stärken, wirkt töricht
    • Heißt das, ich soll statt ein LLM zu fragen meine Zeit darauf verwenden, auf Fiverr oder Upwork jemanden zu finden, dem ich beliebige Coding-Aufgaben außerhalb meines Fachgebiets geben kann?
      Geht das für unter 20 Dollar im Monat?
    • Ich weiß nicht, welcher Teil daran schockierend sein soll
  • Wenn man ein neues Projekt startet, gibt es ein Impedanzproblem
    Anfangs ist die Arbeit zu 0 % erledigt, und man muss irgendwo anfangen, sei es mit Hello World, einer CMakeLists-Datei oder einem Python-Skript, und das ist schwer
    Vor ChatGPT/LLMs musste ich diese Anstrengung aus mir selbst bis in die Fingerspitzen ziehen
    Jetzt kann ich sie ChatGPT überlassen
    In der Praxis ist das weniger effizient und weniger mächtig, als wenn ich mich „hinsetzen und es selbst machen“ würde, aber es beseitigt die Kosten dafür, mich „dafür zu entscheiden, mich hinzusetzen und es selbst zu machen“
    Trotzdem kopiert man weiterhin Schnipsel aus GitHub Code Search, StackOverflow, zufälligen Blogposts, Dokumentation, Discord usw. und knetet sie zusammen
    Nach ein paar Versuchen und Neuversuchen hat man einen 5-%-Startpunkt für das Projekt, und sobald es endlich Form annimmt, kann man wirklich daran arbeiten
    Am Ende baue ich schnell, indem ich die oberflächlichen Proof-of-Concept-Müllstücke, die ChatGPT ausspuckt, kopiere und einfüge, und wechsle dann, sobald genug Momentum da ist, dazu, selbst tief einzusteigen
    Es ist also langsamer und ineffizienter, und ChatGPT ist darin nicht besser als ich, aber es ist leichter und ich muss mich nicht tief hineingraben
    Letztlich kann ich dadurch in der Mitte und am Ende, also bei den wirklich wichtigen Teilen des Projekts, viel länger durchhalten und brenne am Anfang nicht aus

    • Habe ich früher vielleicht zu tief gegraben?
      Habe ich von Anfang an die richtigen Fragen gestellt, und falls nicht: Kann man diese Arbeit effektiv retten?
      Die versunkenen Kosten verschwinden in den 20-Dollar-Abo-Gebühren
  • Ich denke, die zentrale Einsicht ist die Stelle: „Ich habe ein Problem, und wenn das LLM Unsinn erzählt, muss ich schnell wissen, was ich verifizieren kann. In solchen Fällen nutze ich ein LLM, um schneller an das nötige Wissen zu kommen“
    Einer der Gründe, warum Programmierung besonders gut zu LLMs passt, ist, dass die Überprüfung der richtigen Antwort meist trivial ist
    Ich probiere gerade ein Konzept aus, um zu bewerten, ob ein LLM das passende Tool für eine Aufgabe ist
    Etwa indem man „wie wichtig es ist, dass die Ausgabe korrekt ist“ und „wie leicht sich überprüfen lässt, ob die Ausgabe korrekt ist“ in ein Diagramm einträgt
    Eine Liste von Songs zu erstellen, an denen Künstlerinnen beteiligt waren, die mit ChatGPT einen Emmy gewonnen haben, kostet Zeit bei der Genauigkeitsprüfung, aber die Wichtigkeit ist niedrig, und ein paar Fehler sind in Ordnung

    • Heißt das, Programmierung passe gut zu LLMs, weil die Überprüfung der richtigen Antwort meist trivial ist?
      Gibt es deshalb in Software überhaupt keine Bugs?
    • Ja, genau das ist es
      Es sind Probleme, bei denen es schwer ist, eine Lösung zu finden, aber leicht, eine mögliche Lösung zu verifizieren
      Und wir alle wissen, wie diese Problemklasse genannt wird
    • Wenn etwas lange dauert, nicht besonders wichtig ist und Genauigkeit egal ist, könnte die richtige Antwort sein, es gar nicht zu tun
      Die Welt ist bereits voller irrelevanter und ungenauer Textfetzen, und wir sollten deren Produktion eher verringern als beschleunigen
      Das bezieht sich nicht auf das konkrete Beispiel, sondern auf die gesamte Idee
  • Ich nutze ChatGPT als Denkpartner beim Schreiben von Code
    Ich rede den ganzen Tag über damit und bekomme so meine Arbeit fertig
    Das Unternehmen hat Copilot genehmigt, aber die Copilot-Autovervollständigung war eine schreckliche Erfahrung
    Das Unternehmen hat Copilot Chat, das ich brauche, nicht genehmigt
    Trotzdem fände ich ein ähnliches Tool gut, das auf meinem Laptop für meinen Code Unit-Tests oder Codekommentare usw. generiert
    Natürlich auf Basis meiner Eingaben und Anleitung

    • Mit der Copilot-Autovervollständigung habe ich dieselbe Erfahrung gemacht
      Kollegen haben sie sehr gelobt, sodass ich mich fragte, ob ich der Seltsame bin, aber sie war extrem ablenkend, und nach ein paar Tagen habe ich sie abgeschaltet
      Es fühlte sich an, als würde jemand versuchen, meine Sätze zu beenden, während ich noch rede
      Selbst wenn es richtig war, war es nervig und hat meinen Flow unterbrochen, und sehr oft lag es falsch
    • Wenn man VS Code oder eine JetBrains-IDE nutzt, funktioniert Continue gut mit Ollama und ist wirklich einfach einzurichten
      [0] https://continue.dev/
      [1] https://ollama.ai/
    • Zur Einordnung: Inzwischen gibt es auch lokale Modelle, die im Code-Chat an 3.5-turbo heranreichen
      Vor ein paar Tagen habe ich Codeninja ausprobiert
      Soweit ich mich erinnere, ist es keinesfalls auf dem Niveau von 4, das wohl das Copilot-Backend antreibt, aber für sensible Daten, die nicht nach außen gelangen dürfen, ist es praktisch die einzige Option
      Alternativ könnte man sich bei OpenAI eine dedizierte Instanz holen
  • Das könnte die wichtigste Passage in diesem Text sein, und angesichts dessen, was 2024 bevorsteht, kann man sie kaum oft genug wiederholen
    „Haben LLMs also ein gewisses Maß an Schlussfolgerungsfähigkeit, oder ist das alles nur Bluff? Es könnte sein, dass sie manchmal so wirken, als würden sie schlussfolgern, weil der ‚Signifikant‘, wie Semiotiker sagen, den Eindruck einer Bedeutung vermittelt, die in Wirklichkeit gar nicht existiert. Wer jedoch genug mit LLMs gearbeitet hat, weiß trotz der Akzeptanz ihrer Grenzen, dass sich damit allein nicht alles erklären lässt. Die Fähigkeit, bereits Gesehenes neu zu kombinieren, geht weit über das zufällige Wiedergeben von Wörtern hinaus. Auch wenn der Großteil des Trainings während des Pretrainings darin bestand, das nächste Token vorherzusagen, zwingt dieses Ziel das Modell dazu, irgendeine Form eines abstrakten Modells zu bilden. Dieses Modell ist schwach, lückenhaft und unvollständig, aber wenn wir beobachten, was wir beobachten, muss es existieren. Wenn mathematische Gewissheit zweifelhaft ist und selbst führende Experten oft gegensätzliche Positionen vertreten, scheint es klug, den eigenen Augen zu trauen.“