- In den letzten 12 Monaten habe ich jede Woche mehrere Stunden mit großen Sprachmodellen interagiert und war immer wieder beeindruckt, wie gut sie zunehmend schwierigere Aufgaben lösen können
- Dadurch hat sich mein Tempo beim Schreiben von Code in Forschungs- und Privatprojekten mindestens um 50 % erhöht
- Die meisten Menschen, die online über den Nutzen von LLMs sprechen, sind entweder viel zu optimistisch oder viel zu pessimistisch
- Statt über die Zukunft zu debattieren, möchte ich 50 Gesprächsbeispiele zeigen, in denen ich im vergangenen Jahr LLMs genutzt habe, um meine Forschungsfähigkeiten zu verbessern und bei Programmierprojekten Unterstützung zu erhalten
- Meine Anwendungsfälle für LLMs
- Eine komplette Web-App mit Technologien bauen, die ich zuvor nie verwendet hatte
- Lernen, wie man verschiedene Frameworks nutzt, ohne sie vorher schon einmal benutzt zu haben
- Dutzende Programme nach C oder Rust portieren und die Performance um das 10- bis 100-Fache verbessern
- Große Codebasen verkleinern und Projekte dadurch stark vereinfachen
- Den ersten Experimentier-Code für fast alle meine Forschungspapiere im letzten Jahr schreiben
- Fast jede monotone Aufgabe oder jedes Einmal-Skript automatisieren
- Websuche für das Einrichten und Konfigurieren neuer Pakete oder Projekte fast vollständig ersetzen
- Etwa 50 % der Websuchen zum Debuggen von Fehlermeldungen ersetzen
- Kategorisieren lässt sich das in zwei Punkte
- Hilfe beim Lernen: Ich kann Dinge tun, die zuvor schwierig gewesen wären
- Automatisierung langweiliger Aufgaben: Sie ermöglicht es mir, mich auf das zu konzentrieren, was ich am besten kann, und schwierige Probleme zu lösen
- Am wichtigsten ist, dass dies Beispiele dafür sind, wie mir LLMs in der Praxis tatsächlich geholfen haben
- Es geht nicht darum, beeindruckende Fähigkeiten zu demonstrieren, sondern um Bedürfnisse, die aus meiner realen Arbeit entstanden sind
Nuance
- Eine Sache, die das Internet nicht gut kann, ist Nuancierung. Ich werde heute nicht behaupten, dass die heutigen LLMs die Welt beherrschen werden, und ich werde auch nicht darüber sprechen, was künftige Modelle vielleicht können
- Ich werde nur darüber sprechen, ob die heutigen Modelle mir persönlich nützlich sind
- Man fragt sich vielleicht, warum ich überhaupt einen Text schreibe, um zu rechtfertigen, dass Sprachmodelle nützlich sind. Aber in der Wissenschaft, im Software Engineering und in den Medien gibt es offenbar viele Menschen, die lautstark verkünden, LLMs leisteten überhaupt keinen Beitrag, seien nur ein weiterer Hype-Zyklus und würden in ein paar Jahren verschwinden, ohne irgendeinen Einfluss auf die Welt gehabt zu haben
- Ich werde argumentieren, dass sie falschliegen, weil die heutigen LLMs bereits nützlich sind
- Umgekehrt gibt es auch Menschen, die behaupten, die heutigen Modelle könnten alle Programmierer ersetzen und man solle Programmieren gar nicht mehr lernen
- Ich versuche nicht ausdrücklich, diese Behauptungen zu widerlegen
- Ich verstehe vollkommen, dass LLMs viele schädliche Auswirkungen haben können. Ich meine damit alles: Desinformation, Missbrauch, Überwachung, Verdrängung von Arbeitsplätzen und mehr. Bald werde ich einen Text über meine Gedanken zu den schädlichen Auswirkungen von LLMs schreiben. Aber das ist eine andere Frage als die, ob Sprachmodelle nützlich sein können
- Ich verstehe sehr gut, warum man sie nicht verwenden möchte: Sprachmodelle halluzinieren, wiederholen Unwahrheiten und sind nicht robust genug, sodass sie scheitern können. Aber darum geht es in diesem Text nicht
- Ich denke, dass Modelle trotz dieser Fehlleistungen nützlich sein können
- Die Ethik des Trainings dieser Modelle ist fragwürdig. Man kann daran denken, dass sie mit den Daten von Menschen ohne deren Erlaubnis trainiert wurden, oder an Menschen, die schlecht bezahlt werden, um Modelle explizit zu trainieren. Ich stimme zu, dass das ein Problem ist
- Darum geht es in diesem Text nicht
- Wie ich schon mehrfach gesagt habe, wird dieser Text nur darüber sprechen, ob die heute existierenden Modelle nützlich sind
Meine Hintergrundgeschichte
- Ich bin generell niemand, der Dinge einfach glaubt. Vor 10 Jahren habe ich in der Security-Community den Krypto-Hype erlebt, aber vollständig vermieden, Paper über Blockchain zu schreiben. Ich habe nie Bitcoin besessen. Ich bin bei allen Behauptungen skeptisch
- Als mir zum ersten Mal jemand sagte, diese AI-Technologie werde sehr nützlich sein und meine tägliche Arbeitsweise stark verändern, war meine Reaktion: "Ich glaube es erst, wenn ich es selbst sehe"
- Ich bin Sicherheitsforscher. In den letzten 10 Jahren bestand ein Teil meiner täglichen Arbeit darin zu zeigen, auf welche vielen Arten AI-Modelle massiv scheitern, wenn sie auf Umgebungen treffen, für die sie nicht trainiert wurden. Ich habe gezeigt, dass schon kleine Störungen der Eingaben für Machine-Learning-Modelle dazu führen können, dass die Ausgaben gravierend falsch werden, oder dass die meisten Machine-Learning-Modelle bestimmte Beispiele aus ihren Trainingsdatensätzen speichern und diese bei der Nutzung wiederholen. Ich verstehe die Grenzen dieser Systeme vollständig
- Trotzdem sage ich, dass die heutigen großen Sprachmodelle die größte Produktivitätssteigerung seit der Erfindung des Internets gebracht haben. Wenn ich heute bei einer zufällig ausgewählten Programmieraufgabe zwischen Zugang zum Internet und Zugang zu einem modernen Sprachmodell wählen müsste, würde ich in mehr als der Hälfte der Fälle das Sprachmodell wählen
[ Wie ich LLMs nutze ]
Für mich vollständige Anwendungen bauen
- Letztes Jahr habe ich ein Quiz erstellt, um zu testen, wie gut GPT-4 vorhersagen kann, ob Menschen eine kleine Anzahl von Aufgaben lösen. Das Quiz war ziemlich populär und erreichte über 10 Millionen Page Views
- Ich ließ GPT-4 den Großteil der ersten Version dieser Anwendung schreiben. Ich begann damit, nach der Grundstruktur der Anwendung zu fragen, und arbeitete mich dann über eine Reihe von Fragen langsam zu verschiedenen Features vor
- Dieses Gespräch umfasst insgesamt 30.000 Wörter und nutzte die Fähigkeiten des damals neuesten GPT-4-Modells voll aus
- [Die tatsächlichen Prompts und Antworten lasse ich weg]
- In meinen Gesprächen mit GPT-4 habe ich auf sehr unterschiedliche Weise gefragt
- Von Nachrichten, in denen ich in Worten beschrieb, was ich wollte, und das Modell um eine vollständige Implementierung bat, bis hin zu Nachrichten mit der Bitte um konkrete Änderungen (
"Kannst du statt eines Vergleichs mit dem Durchschnitt KDE verwenden, um Perzentile anzugeben?")
- Dazu gehörten auch völlig unvollständige Fragen, bei denen ich einfach Fehlermeldungen hineinkopierte (zum Beispiel
"Plotting: numpy.linalg.LinAlgError: singular matrix"), oder Anfragen nach einfachen einmaligen Antworten ("Wie füge ich einer Seite in JavaScript ein iframe mit aus einem String geladenem Inhalt hinzu?")
- Warum Sprachmodelle dabei effektiv sind
- Dieser Ansatz funktioniert, weil Sprachmodelle gut darin sind, Dinge zu lösen, die andere Menschen zuvor bereits gelöst haben
- 99 % dieses Quiz bestanden einfach aus grundlegendem HTML mit einem Python-Webserver-Backend, das auch jede andere Person hätte schreiben können
- Warum dieses Quiz interessant war und Menschen es mochten, lag nicht an der zugrunde liegenden Technik, sondern an seinem Inhalt. Und wenn alle langweiligen Teile automatisiert sind, wird das Erstellen eines solchen Quiz sehr einfach
- Ich bin sicher, dass ich dieses Quiz ohne die Hilfe eines Sprachmodells wahrscheinlich nicht erstellt hätte
- Weil ich kein Interesse daran gehabt hätte, Zeit in das Schreiben einer kompletten Webanwendung von Grund auf zu investieren
- Und das sagt jemand, der programmieren kann!
- Ich glaube, dass schon die heutigen Modelle ausreichen, damit die meisten Menschen bedeutungsvolle Aufgaben erledigen können, die sie früher niemals hätten lösen können, indem sie einfach nach einer Lösung fragen
- Ich werde später noch einige weitere Beispiele nennen, in denen Modelle komplette Anwendungen für mich geschrieben haben, und ich werde beim Veröffentlichen klar machen, dass sie mit Hilfe von Sprachmodellen entstanden sind
Als Tutor für neue Technologien
- Früher habe ich versucht, mit neuen Frameworks Schritt zu halten, aber die Zeit, die eine einzelne Person aufbringen kann, ist begrenzt.
- Berufsbedingt verbringe ich die meiste Zeit damit, die neuesten Forschungsfortschritte zu verfolgen, nicht die neuesten Entwicklungen bei JavaScript-Frameworks.
- Wenn ich außerhalb eines bestimmten Forschungsgebiets ein neues Projekt beginne, gibt es im Allgemeinen zwei Möglichkeiten.
- Die erste ist, das zu verwenden, was ich bereits kenne,
- und die zweite ist, eine neue, meist bessere Methode zu lernen.
- Hier helfen Sprachmodelle. Die meisten neuen Frameworks oder Werkzeuge wie Docker, Flexbox oder React sind für andere Menschen nichts Neues. Weltweit gibt es Zehntausende bis Hunderttausende Menschen, die solche Dinge gründlich verstehen. Für die heutigen Sprachmodelle gilt das ebenfalls.
- Statt statische Tutorials zu lesen, die einen bestimmten Leser voraussetzen und ein bestimmtes Ziel verfolgen, kann man mit einem Sprachmodell interagieren und genau das lernen, was man braucht, um eine Aufgabe zu lösen.
- Anfang dieses Jahres wollte ich beim Aufbau eines LLM-Evaluierungs-Frameworks von LLM erzeugten Code in einer eingeschränkten Umgebung ausführen.
- Docker war dafür das perfekte Werkzeug, aber ich hatte es zuvor noch nie benutzt.
- Docker zu verwenden war nicht das Ziel des Projekts, sondern nur ein Werkzeug, das nötig war, um das Ziel zu erreichen.
- Ich wollte nur 10 % von Docker verstehen, um sicher zu sein, dass ich es auf die grundlegendste mögliche Weise sicher benutze.
- In den 90ern hätte ich vermutlich ein Buch darüber gekauft, wie man Docker von den Grundlagen an benutzt, die ersten Kapitel gelesen, dann Dinge übersprungen und herausgefunden, wie ich genau das mache, was ich wollte.
- In den letzten zehn Jahren hat sich das dahin verbessert, dass man nach Online-Tutorials zur Nutzung von Docker sucht und ihnen folgt und dann Fehlermeldungen googelt, um zu sehen, ob andere dasselbe Problem hatten.
- Heute bittet man einfach ein Sprachmodell, einem Docker beizubringen.
- Nachdem ich Docker eingerichtet und gestartet hatte, merkte ich, dass es beim Ausführen unter Linux ein Berechtigungsproblem gab. Ich wollte das beheben und bat das Modell um Hilfe.
- Dadurch erfuhr ich von Podman und bat das Modell, Docker-spezifischen Code in eine gleichwertige Podman-Version umzuschreiben.
- Und auch als ich herausfinden wollte, wie man die GPU des Hosts an einen Docker-Container durchreicht, habe ich danach gefragt.
Ein neues Projekt anfangen
- Als ich jung war, war meine erste Programmiersprache Java. Ich mochte Programmieren wirklich sehr, aber ich hasste es, auf den leeren Bildschirm eines neuen Projekts zu schauen. Besonders bei Java!
- Schon das Kompilieren eines Hello-World-Programms war schwierig, weil ich herausfinden musste, was
public static void main string args eigentlich macht, wohin die Klammern gehören, welcher Buchstabe noch einmal großgeschrieben wird und warum überall geschweifte und eckige Klammern herumstehen.
- Also tat ich das, was wohl jedes Kind getan hätte: Ich bat einfach meinen Vater, das für mich zu machen.
- Auch 20 Jahre später hasse ich es immer noch, ein neues Projekt mit einem Framework zu beginnen, mit dem ich nicht vertraut bin.
- Es dauert viel zu lange, den ganzen Boilerplate-Kram loszuwerden, und ich verstehe nicht, was ich da eigentlich tue.
- Zum Beispiel wollte ich kürzlich einmal CUDA-Code schreiben, um die Performance einer naiven Greedy-Suche auf einer GPU mit der effizienten, optimierten CPU-Implementierung von jemand anderem zu vergleichen.
- Aber ich wusste nicht, wie man ein CUDA-Programm schreibt.
- Ich weiß, wie man in C schreibt, und ich verstehe, wie GPUs funktionieren, wie Kernel funktionieren, wie Speicher-Layouts aussehen und so weiter.
- Aber ich wusste nicht, wie man tatsächlich den Code schreibt, der Arbeit an die GPU schickt.
- Also bat ich das Modell, einen ersten Entwurf eines CUDA-Programms zu schreiben.
- Ist es perfekt? Ganz sicher nicht! Aber es ist ein Anfang. Und genau das will ich.
- Man kann sehen, dass hier viel Code falsch ist.
- Tatsächlich ist das überhaupt kein Problem.
- Denn ich suche keine perfekte Lösung, sondern einen Startpunkt.
- Wenn Modelle in Zukunft besser werden, wäre das großartig.
- Aber schon mit dem, was wir jetzt haben, ist es eine enorme Hilfe.
- Ganz unabhängig davon nutze ich für ein anderes persönliches Projekt, an dem ich zu Hause arbeite, einen Raspberry Pi Pico W.
- Es war das erste Mal, dass ich ihn benutzt habe.
- Insbesondere wollte ich Netzwerkaufgaben damit erledigen.
- Natürlich könnte ich online ein gutes Tutorial finden, das erklärt, wie man das macht, was ich will.
- Aber wenn man in letzter Zeit im Internet sucht, sind die ersten fünf Treffer meist nur wertlose Content-Farmen mit fehlerhaftem Code aus dem Jahr 2008, die nur für SEO aktualisiert wurden und immer noch nicht funktionieren.
- Also bat ich stattdessen ein Sprachmodell, mir beizubringen, wie ich genau das machen kann, was ich will.
- Ich hatte schon früher mit Mikrocontrollern gearbeitet und verstehe grob, wie sie funktionieren.
- Aber mit einem Pico W hatte ich noch nie gearbeitet.
- Ich brauchte nur etwas Hilfe beim Einstieg mit all den Abhängigkeiten, den Rest konnte ich selbst herausfinden.
- Das erste „Hello World“-Programm, das ich für einen neuen Mikrocontroller immer schreibe, ist ein blinkendes LED-Programm.
- Damit kann man testen, ob man Code für das Gerät kompilieren und hochladen kann, ob alle Pins richtig konfiguriert sind und ob man im Grunde versteht, was man tut.
- Also bittet man einfach um ein Blinkprogramm. (Noch einmal: Existiert so etwas im Internet? Mit ziemlicher Sicherheit. Aber dann müsste ich es selbst suchen.)
- Sobald dieser Code läuft, weiß ich, was ich als Nächstes tun muss.
- Ich weiß, wie Python funktioniert (ob man es glaubt oder nicht!).
- Also kann ich den speziellen MicroPython-Teil abschließen und von dort direkt weitereditieren.
- Und wenn ich dann auf ein anderes Problem stoße, das spezielle Behandlung erfordert, bitte ich das Modell einfach um Hilfe.
- Hier ging es zum Beispiel damit weiter, dass ich das Modell bat, ein Skript zum Verbinden mit Wi‑Fi zu schreiben.
- Und immer wenn ich wieder feststecke, etwa weil ich mich mit einem MQTT-Server verbinden muss, bitte ich das Modell erneut um Hilfe.
- Inzwischen mache ich das ständig. Selbst das Beispiel ganz oben in diesem Abschnitt ist nicht hypothetisch.
- Ich frage gerade, wie man Flexbox benutzt, weil die neue Art, HTML-Layouts zu lernen, darin bestand, statt Tabellen
div zu verwenden.
Code vereinfachen
- Als Sicherheitsforscher bekomme ich oft neue Repositories mit Tausenden Zeilen Forschungscode von anderen Leuten und gerate in die Situation, herausfinden zu müssen, wie das alles funktioniert, um es anzugreifen.
- Wenn alle sauberen Code schreiben würden, wäre das nicht besonders schwer, aber so ist die Welt, in der wir leben, nun einmal nicht.
- Forschende haben keinen Anreiz, sauberen Code zu veröffentlichen.
- Deshalb reichen Leute oft funktionierenden Müllcode ein. (Ich auch.)
- Ich habe keine forschungsbezogenen Beispiele, die ich hier teilen könnte, aber ich kann ein Beispiel aus einem persönlichen Projekt zeigen, an dem ich arbeite.
- Ich habe eine ungesunde Obsession für Conways Spiel des Lebens.
- Kürzlich habe ich nach einer schnellen Methode gesucht, um einige Lebensmuster in Python auszuwerten.
- Dafür gibt es mit
golly ein hervorragendes C++-Tool, aber ich wollte meinen Python-Code nicht in C++ umschreiben.
golly hat ein CLI-Tool, das genau das tut, was ich brauche.
- Ich musste nur wissen, wie man es richtig aufruft.
- Der erste Schritt dafür war, C++-Code zu nehmen, der ungefähr 50 verschiedene Kommandozeilenoptionen unterstützt, und ihn so zu reduzieren, dass er genau die eine Sache macht, die ich wollte.
- Also habe ich alle 500 Zeilen C++-Code in ein LLM geworfen und um eine kürzere Datei gebeten, die dieselbe Aufgabe erfüllt.
- Und was geschah? Es funktionierte perfekt.
- Danach bat ich um einen Python-Wrapper um den C++-Code. Auch das funktionierte gut.
- Das ist eine dieser lästigen Arbeiten, die der Autor selbst vermutlich niemals gemacht hätte.
- Aber jetzt kann ich einfach darum bitten und habe dadurch etwas, das 100-mal schneller ist als der ursprüngliche Python-Code.
- Ich mache solche Dinge ziemlich oft. Es gibt noch ein weiteres Beispiel, bei dem ich in Python genau dasselbe tue.
- Keine dieser Aufgaben ist schwierig.
- Aber jedes Mal spare ich damit eine Menge Zeit.
- Und ich denke, das ist einer der Gründe, warum LLMs heute so erstaunlich sind.
- Es ist nicht glamourös, und mit „Hier ist eine langweilige Art, wie ich LLMs nutze, um mein Leben einfacher zu machen“ sammelt man im Internet nicht viele Punkte, aber genau das passiert in der Realität.
Monotone Aufgaben automatisieren
- Es gibt viele Aufgaben, die kein Nachdenken erfordern, langweilig sind, aber trotzdem erledigt werden müssen
- Einer der Hauptgründe, Arbeit aufzuschieben, ist, dass man weiß, wie unerquicklich und schmerzhaft es sein wird, sie zu Ende zu bringen
- LLMs verringern diesen Schmerz enorm, und weil man weiß, dass man nur die interessanten Probleme lösen muss, fällt es viel leichter, überhaupt anzufangen
- Hier schaue ich mir ganz alltägliche Probleme an, die ich gelöst habe, indem ich ein LLM darum gebeten habe
- Zum Beispiel musste ich kürzlich ein in Python 3.9 geschriebenes Python-Programm disassemblieren
- Die meisten Python-Disassembler funktionieren nur mit Versionen vor Python 3.7 und liefen nicht auf 3.9-Binärdateien
- Disassemblieren ist eigentlich keine besonders schwierige Aufgabe. Es geht größtenteils darum, den
gotos zu folgen, den Kontrollfluss zu rekonstruieren und dabei keine Fehler zu machen
- Anstatt Zeit damit zu verbringen, für Hunderte Zeilen Code Tausende von Op-Codes von Hand umzuwandeln, habe ich das LLM gebeten, es stattdessen zu erledigen
- Und es hat das wirklich gut gemacht! Viel, viel besser, als ich es für möglich gehalten hätte
- Ein anderes Beispiel ist, wenn ich unstrukturierte Daten nehme und sie in ein strukturiertes Format bringen muss
- Zum Beispiel brauchte ich bei einem Projekt eine Liste von Buchtiteln zusammen mit den Autorennamen
- Also habe ich die Daten online in unstrukturierter Form gefunden und das LLM gebeten, sie zu formatieren
- Oder kürzlich, als ich einen Blogbeitrag darüber schrieb, wie ich eine bestimmte Abwehr umgangen habe, wollte ich den vollständigen Diff des Codes zeigen, den ich ändern musste
- Also habe ich (1) den Diff und (2) ein früheres Beispiel dafür, wie man einen Diff in HTML umwandelt, eingefügt und das LLM gebeten, mir diesen Diff im früheren Format auszugeben
- Ein weiteres Beispiel: Als Teil meiner Arbeit muss ich oft Zitate für Ressourcen erzeugen, die ich häufig nutze
- Google Scholar macht das für wissenschaftliche Arbeiten einfach, und man kann das Zitat einfach kopieren und einfügen
- Aber eine Webseite zu zitieren ist etwas lästig
- In letzter Zeit bitte ich ein LLM oft darum, ein Zitat zu erzeugen. (Zur Klarstellung: Ich überprüfe natürlich, ob es korrekt ist!)
- Ich könnte leicht noch mindestens 100 weitere solcher Beispiele nennen. Aber ich denke, der Punkt ist klar
- Ich verstehe gut genug, dass jemand das sehen und sagen könnte: „Ist das alles??“
- Aber man sollte sich daran erinnern, dass sie noch vor 5 Jahren kaum in der Lage waren, zusammenhängende Absätze zu produzieren, geschweige denn ein ganzes Problem zu lösen
Alle Nutzer zu „Power-Usern“ machen
- Wenn man schon einmal jemandem zugesehen hat, der ein Werkzeug benutzt und dabei deutlich weniger geübt ist als man selbst, kann das ziemlich schmerzhaft sein
- Man sieht dann, wie jemand Minuten, manchmal Stunden, für Aufgaben aufwendet, die sich mit einer cleveren Art von Makro oder einer parallelen Anwendung automatisieren ließen
- Aber die nötigen Zaubersprüche dafür zu lernen kostet Zeit und ist schwierig
- Zum Beispiel wollte ich kürzlich ein Python-Programm schreiben, das Tastatureingaben von einer Apple-Lisa-Tastatur verarbeitet
- Online fand ich jemanden, der etwas geschrieben hatte, das dies in C erledigt, und darin standen viele Zeilen wie
#define KEYNAME key_code
- Ich wollte das in ein Python-Dictionary umwandeln, das diese Integer-Codes auf die jeweiligen Strings abbildet
- Ich bin Emacs-Nutzer. Ich weiß, wie man dieses Problem in Emacs löst. Es dürfte nicht allzu schwer sein. Hier ist die Hauptsequenz, die ich gerade aufgenommen habe und mit der sich dieser Effekt erzielen ließ:
C-h C-s #def [enter] M-f [delete] C-d M-f C-[space] M-f C-w C-a C-y : " M-f ", C-g C-] } C-[ {
- Für mich ist das fast schon selbstverständlich, aber bis es selbstverständlich wurde, habe ich mehr als die Hälfte meines Lebens damit verbracht, mit Emacs ausreichend vertraut zu werden. Aber was würde ich heute eingeben, wenn ein LLM mit dem Editor verbunden wäre?
C-h C-h rewrite these #defines to a dictionary of {keycode: string, ...}
- Und plötzlich wird der Text direkt vor meinen Augen neu geschrieben!
- Ich denke, in solchen Fällen ist der potenzielle Nutzen von LLMs für Nicht-Experten größer als für Experten
- Das Modell hebt den Maßstab für alle an, und wenn man früher etwas gar nicht konnte, kann man plötzlich sehr viel mehr tun
Als API-Referenz verwenden
- Ein echter Programmierer liest das Referenzhandbuch, wenn er verstehen will, wie ein Werkzeug funktioniert
- Aber ich bin ein fauler Programmierer und will mir die Antwort einfach servieren lassen
- Also frage ich jetzt ein Sprachmodell
- Wenn man solche Beispiele zeigt, reagieren manche Leute defensiv und sagen: „Ein LLM hat nichts getan, was man nicht auch mit den Werkzeugen hätte tun können, die du bereits hattest!“
- Und sie haben recht
- Aber es gibt nichts, was man mit einer Suchmaschine tun kann, was man nicht auch mit einem physischen Buch tun könnte, und nichts, was man mit einem physischen Buch tun kann, was man nicht auch durch Lesen des Quellcodes tun könnte
- Aber jede dieser Formen macht es der Reihe nach einfacher als die vorherige
- Und wenn etwas einfacher wird, macht man es häufiger und auf qualitativ andere Weise
- Beispiele mit Prompts
- Ich frage etwa: „Welches
$ liefert in Bash alle verbleibenden Argumente“, und bekomme eine Antwort. (Direkt danach folgt dann meist noch die Frage: „Wie benutzt man das?“)
- Oder wenn ich wissen will, wie man in LaTeX Text rot macht, suche ich nicht mehr oder lese die Dokumentation, sondern frage einfach das Modell
- Und genauso mache ich es, wenn ich wissen will, welche LLDB-Befehle den verschiedenen GDB-Befehlen entsprechen
- Oder wenn ich verstehen will, wie bestimmte
find-Befehle funktionieren
- Ebenso bei der Verwendung von
lpr
- Oder dabei, wie man LaTeX-Befehle neu bindet
- Tatsächlich ist das eine der Arten, wie ich LLMs am häufigsten nutze
- Der einzige Grund, warum ich nicht noch Tausende solcher Beispiele aneinanderreihen kann, ist, dass sowohl Emacs als auch die Shell eingebaute Werkzeuge haben, um LLMs abzufragen
- Daher muss ich in 90 % der Fälle nicht einmal den Editor verlassen, wenn ich eines dieser Dinge tun will
Nach Dingen suchen, die schwer zu finden sind
- Im Internet nach Inhalten zu suchen war früher eine mühsam erlernte Fähigkeit
- Welche bestimmten Wörter sollen in der Suchanfrage enthalten sein? Müssen sie im Plural stehen? Im Singular? In der Vergangenheitsform?
- Welche Wörter sollen auf der Seite nicht erscheinen? Will ich X AND Y oder X OR Y?
- Das ist nicht mehr so
- Ich kann mich nicht erinnern, wann ich zuletzt eine Suchanfrage mit OR bei Google geschrieben habe
- Ich kann mich auch nicht erinnern, wann ich zuletzt ein Minuszeichen (-) verwendet habe, um eine Teilmenge der Ergebnisse auszuschließen
= Heutzutage reicht es in den meisten Fällen, einfach aufzuschreiben, was man finden will, und die Suchmaschine findet es.
- Suchmaschinen sind aber immer noch keine 100% natürlichen Sprachabfragen
- Es fühlt sich immer noch an, als würde man Reverse Jeopardy spielen, und ich versuche Schlüsselwörter zu benutzen, die in der Antwort und nicht in der Frage vorkommen würden
- Das ist eine Fähigkeit, von der fast alle von uns vergessen haben, dass wir sie gelernt haben
- Sprachmodelle sind heute für manche einfachen Aufgaben einfach besser, und mit der Zeit für immer mehr davon
- Ich kann einfach eingeben: „Okay, also
+ entspricht add, aber was ist dann ~?“ und bekomme die Antwort inv
- Das ist etwas, wonach man mit einer normalen Suchmaschine nur sehr schwer suchen kann
- Ich weiß, dass es einen Weg gibt, die Antwort zu finden
- Vermutlich würde ich „python documentation metaclass
add“ eingeben und dann auf der Seite nach ~ suchen, um die Antwort zu bekommen
- Aber es funktioniert auch, dem LLM einfach die Frage zu stellen, die ich habe
- So etwas spart pro Fall nur ein paar Sekunden, aber wenn ich gerade ein Coding-Problem löse und ohnehin schon versuche, gleichzeitig eine Million Dinge im Kopf zu behalten, ist es erstaunlich, einfach das Problem herunterzuschreiben und eine stimmige Antwort zu bekommen
- Das heißt nicht, dass sie heute darin perfekt sind
- Sprachmodelle wissen Dinge nur dann, wenn sie online oft genug wiederholt wurden
- Was „oft genug“ bedeutet, hängt vom Modell ab, daher muss ich ein paar mentale Zyklen darauf verwenden, ob ich lieber das Modell oder das Internet fragen sollte
- Aber die Modelle werden weiter besser werden
- Oder ich kippe dem Modell einfach das hin, was ich sehe, und bitte um eine Erklärung, wann immer ein zufälliger Konflikt auftritt
- Hier habe ich „Remote wildcard transfer issue“ eingegeben und genau das getan
- Ein völlig anderes Beispiel: Letztes Jahr wollte ich beim Schreiben eines Blogposts den ersten Buchstaben des ersten Wortes groß darstellen und den restlichen Text darum herum fließen lassen
- Das nennt man ein Drop Cap. Ich wusste das aber nicht
- Ich kannte nur den gewünschten Effekt, also habe ich das Sprachmodell gefragt: „Ich will, dass es wie in einem schicken Buch aussieht, in dem der Text um ein O herumläuft“, und es hat mir genau das gegeben, was ich wollte
- Auch das fällt in die Kategorie „nur dank eines LLM gemacht“
- Ich hätte es vermutlich nicht für sinnvoll gehalten, viel Zeit damit zu verbringen, herauszufinden, wie das geht
- Aber weil ich das Modell fragen konnte, habe ich es gemacht, und es hat meinen Beitrag ein bisschen schöner gemacht
Einmalige Aufgaben lösen
- Es gibt zwei Arten von Programmen
- Erstens gibt es Programme, die ich richtig machen will. Sie werden eine Weile existieren und müssen über Jahre gepflegt werden, daher ist Sauberkeit wichtig
- Zweitens gibt es Programme, die 25 Sekunden lang existieren. Sie helfen dabei, eine Aufgabe zu erledigen, und werden danach sofort weggeworfen
- In solchen Fällen, in denen mir die Codequalität völlig egal ist und das Programm komplett eigenständig ist, schreibe ich sie inzwischen fast nur noch mit LLMs
- Warnung: Die meisten dieser Fälle sind ebenfalls Dinge, bei denen man sagen könnte: „Das war's schon?“
- Aber wie schon gesagt: Die Zeit, die man pro Tag in ein bestimmtes Projekt investieren kann, ist begrenzt
- Und wenn ich Zeit und mentale Energie sparen kann, indem ich ein Programm nicht selbst schreibe, das ich sowieso nie wieder benutzen werde, dann tue ich das
- Das häufigste Beispiel ist wahrscheinlich Hilfe beim Erzeugen von Plots, um Daten zu visualisieren, die ich als Ergebnis irgendeines Forschungsexperiments erzeugt habe
- Davon gibt es Dutzende von Beispielen. Wahrscheinlich eher 100 als 0. Sie sehen im Grunde alle gleich aus, deshalb schreibe ich hier nur eines davon auf
- Ein weiteres ähnliches Beispiel ist, wenn ich Daten in einem Format habe und sie in ein anderes Format umwandeln möchte
- Normalerweise muss ich das nur ein einziges Mal tun, und sobald es erledigt ist, werfe ich das resultierende Skript weg
- Wenn das gewünschte Skript einfach genug ist, bitte ich das LLM oft, gleich das Ganze zu schreiben
- Hier habe ich das LLM zum Beispiel gebeten, ein Skript zu schreiben, das eine wissenschaftliche Arbeit laut vorliest, damit ich prüfen kann, ob keine dummen Grammatikprobleme darin sind
- In den meisten Fällen, in denen ich noch nicht genau weiß, was ich will, beginne ich damit, das Modell nach einem ersten Stück Code zu fragen, und arbeite mich von dort iterativ weiter
- Hier ist zum Beispiel eine einmalige Aufgabe, bei der ich Daten schnell verarbeiten musste
- 2022 hätte ich wohl zwei Minuten darauf verwendet, das in Python zu schreiben, und dann gewartet, dass es stundenlang läuft, weil es ja nur einmal ausgeführt wird
- Das Optimieren hätte länger gedauert, als das Python-Programm überhaupt laufen zu lassen
- Aber jetzt? Ich bin ziemlich sicher, dass ich dieselben zwei Minuten darauf verwenden würde, um um Rust-Code zu bitten, der meine Datenverarbeitung erledigt
- Oder es gibt ein anderes Beispiel, bei dem ich das Modell bitte, einen Datensatz herunterzuladen und die erste Verarbeitung durchzuführen
- Wäre das leicht für mich? Wahrscheinlich schon
- Aber das ist keine Aufgabe, über die ich nachdenken will
- Ich will über die Forschung nachdenken, die ich mit dem Datensatz machen möchte
- Ablenkungen zu beseitigen ist weit mehr wert als nur die paar Minuten, die dadurch gespart werden
- Ein anderes Mal schrieb ich ein Programm, um ein in kleine Würfel verpixeltes Bild 3D-drucken zu können
- Dafür wollte ich PNG in eine STL-Datei umwandeln, aber das war nicht der eigentliche Punkt des Projekts
- Es war einfach etwas, das zwischendurch passieren musste. Also habe ich das LLM gebeten, das für mich zu lösen
- Ein weiteres Beispiel: Vor Kurzem wollte ich mit Docker Compose ein neues Projekt aufsetzen
- Es traten Probleme auf, und ich wollte es einfach nur zum Laufen bringen; später würde ich schon herausfinden, was falsch war
- Also lief es am Ende auf mehrere Hin-und-her-Runden hinaus, bei denen ich einfach Fehlermeldungen nacheinander kopierte, bis ich schließlich eine funktionierende Lösung hatte.
- Ich merke auch oft, dass ich damit beginne, nach einer vollständigen Lösung zu fragen, und anschließend um Hinweise bitte, wie ich sie anpassen kann
- In diesem Gespräch hier beginne ich zum Beispiel damit, nach einem Programm zum Parsen von HTML zu fragen, und bitte dann von dort aus um API-Referenzen oder Hinweise zur Verbesserung
- Ein anderes Mal wollte ich verfolgen, wie viel Speicher und CPU mein Computer im Laufe der Zeit verwendet
- Ich hätte ein paar Minuten investieren können, um die passenden Befehle herauszusuchen und sie in ein Skript zu packen, das genau das tut, was ich will, aber stattdessen habe ich einfach das Sprachmodell darum gebeten
- Vor Kurzem wollte ich außerdem ein wenig Elektronik bauen und hatte ein C-Programm, das auf einem Arduino lief, wollte es aber auf einem Raspberry Pi Pico mit MicroPython ausführen
- An diesem Konvertierungsprozess ist nichts Interessantes. Er muss einfach erledigt werden
- Also habe ich, statt selbst daran zu arbeiten, das Sprachmodell darum gebeten
- Für ein anderes Projekt musste ich einige Bilder mit einem netten ML-Modell in irgendeiner interaktiven Schleife klassifizieren
- Ich hätte es auch selbst schreiben können, aber ich konnte genauso gut einfach das Modell darum bitten
Mir etwas erklären
- Ich habe mich in letzter Zeit für Elektronik zu interessieren begonnen
- Als Kind habe ich mit Elektronik zu tun gehabt und an der Universität ein paar Kurse besucht
- Aber jetzt, wo ich tatsächlich ein reales Projekt machen will, ist es wegen tausender kleiner Dinge, die ich nicht weiß, schwer, überhaupt etwas zu tun
- Ich könnte zwar ein Buch über praktische Elektronik lesen, und so könnte ich das Thema wohl richtig verstehen, aber ich möchte meine Zeit nicht damit verbringen, als würde ich lernen
- Die Hälfte des Grundes, warum ich mich mit Elektronik beschäftige, ist, eine Pause davon zu machen, den ganzen Tag Papers zu lesen und zu schreiben
- Das Gute an LLMs ist hier, dass sie zwar nicht so belesen sind wie die sachkundigste Person der Welt, es aber tausende oder Millionen Menschen gibt, die die Antwort auf Elektronikfragen kennen, die ich haben könnte
- Daher kennt das Sprachmodell die Antwort vermutlich auch
- Und es sagt mir bereitwillig die Antwort auf jede Frage, sodass ich Spaß an dem haben kann, was ich tun will, ohne mit Details ringen zu müssen
- Und wenn ich im Internet suche, würde ich mit etwas mehr Aufwand wahrscheinlich auch eine Antwort finden, aber nach einem ganzen Tag Arbeit an komplexem Research-Code ist die Bequemlichkeit, einfach nur das Modell zu fragen, sehr angenehm
- Deshalb folgt hier eine Sammlung von Beispielen, in denen ich dem Sprachmodell grundlegende Fragen zur Funktionsweise von Elektronik gestellt habe
- Sind diese Antworten perfekt? Wer weiß
- Aber ist das besser, als gar nichts zu wissen?
- (Dieser Text wird ziemlich lang, und an diesem Punkt bin ich vermutlich vom Schreiben genauso müde, wie ihr vom Lesen seid. Also lasse ich diese Beispiele einfach ohne weitere Erklärung hier stehen.)
- Grundlegende Fragen zum PCB-Design
- Grundlegende Fragen zum Löten
- Grundlegende Fragen zu Kondensatoren
- Grundlegende Fragen zu LEDs
- Grundlegende Fragen zu Floppy Disks
- Ich könnte weitermachen, aber ich denke, der Punkt ist klar
Probleme mit bekannten Lösungen lösen
- Fast alles ist etwas, das schon einmal jemand getan hat
- Es gibt nur sehr wenig, das ich tun will und das wirklich neu ist
- Und Sprachmodelle sind sehr gut darin, Lösungen für Dinge bereitzustellen, die sie schon einmal gesehen haben
- In einem kürzlichen Projekt musste ich die Performance von etwas Python-Code verbessern
- (1) Ich bat ein LLM, ihn in C neu zu schreiben, und dann
- (2) bat ich es, ein Interface zu bauen, über das Python den C-Code aufrufen kann
- Diese Aufgaben sind nicht „schwierig“
- Die Umwandlung von Python nach C würde wahrscheinlich 1–2 Stunden dauern
- Und ich weiß nicht genau, wie die Python->C-API funktioniert, aber ich könnte es durch Lesen der Dokumentation herausfinden
- Wenn ich es jedoch selbst hätte machen müssen, hätte ich es nie getan
- Es lohnt sich einfach nicht, Zeit darauf zu verwenden, Dinge zu beschleunigen, die nicht oft laufen müssen, statt einfach zu warten und den Computer die Aufgabe lösen zu lassen, weil es nicht auf dem kritischen Pfad liegt
- Bei einfachen Programmen ist die Umwandlung von Python nach C jedoch (größtenteils) ein mechanischer Prozess, und es gibt genau eine Standard-Calling-Convention für Python->C
- Also lasse ich es einfach vom LLM machen.
- Seitdem rechne ich damit, dass das etwas ist, was ich tun kann, und immer wenn ich ein schnelles Stück Code brauche, beschreibe ich im Grunde einfach in Python, was ich will, und bitte um optimiertes C
- Zu anderen Zeiten mache ich dasselbe, bitte aber statt um C um Rust-Ausgabe, wenn ich denke, dass ich die Korrektheit von Rust-Ausgabe leichter beurteilen kann als im Vergleich zu C-Ausgabe
- Ein weiteres Beispiel: Eine Python-Funktion mit einer Multiprocessing-Bibliothek zu parallelisieren, ist nicht schwer
- Man muss etwas Boilerplate schreiben, und dann passiert es im Grunde einfach
- Aber den Code zu schreiben ist ein bisschen mühsam und lenkt von der eigentlichen Arbeit ab, die man tun will
- Jetzt bitte ich einfach jedes Mal das LLM darum, wenn ich das brauche
- Oder wenn ich irgendeine API teste, schreibe ich oft zunächst einfach einen
curl-Request, damit es erst einmal läuft
- Und sobald das funktioniert und ich die Aufgabe programmgesteuert wiederholen möchte, wandle ich es in Python um
- Früher habe ich meist etwas wirklich Hässliches gemacht und einfach
os.popen() aufgerufen und den curl-Befehl ausgeführt, was nicht gut ist
- Es wäre besser, das in die Python-
requests-Bibliothek zu übersetzen. Aber das kostet Zeit, also hätte ich es nicht gemacht
- Aber jetzt bitte ich einfach das LLM darum und bekomme schneller ein saubereres Programm
- Für ein kommendes Projekt, über das ich vermutlich irgendwann sprechen werde, musste ich wissen, wofür Leute einfache Funksender verwenden
- Ein LLM ist perfekt dafür, weil ich eigentlich die Antwort eines durchschnittlichen Menschen haben möchte!
Häufige Fehler beheben
- Vor 2022 habe ich bei einer Fehlermeldung aus einem bekannten Tool oder einer Bibliothek ungefähr folgendes Protokoll befolgt:
- Fehlermeldung kopieren
- In Google einfügen
- Auf den obersten Stack-Overflow-Link klicken
- Prüfen, ob die Frage die ist, die ich stellen wollte; wenn nicht, zurück zu 2
- Die beste Lösung auf meine Aufgabe anwenden
- Wenn es nicht funktioniert, zurück zu 2, die Suchanfrage ändern, beten und so weiter
- Ehrlich gesagt liegt das Tool, das kaputtgeht, normalerweise etwa fünf Schritte von der Aufgabe entfernt, die ich eigentlich lösen will, und es ist mir wirklich egal, wie es funktioniert — es soll einfach nur funktionieren
- Und wie sieht das heute, im Jahr 2024, aus?
- Fehlermeldung kopieren
- Das LLM fragen: „Wie behebe ich diesen Fehler? [Fehler]“
- Die vom LLM vorgeschlagene Schritt-für-Schritt-Lösung anwenden
- Wenn es nicht funktioniert, sagen: „Das hat nicht funktioniert“
- Ich habe kein Beispielprotokoll, das ich dafür zeigen könnte. (Oder ich konnte auch nach einer Stunde Suchen keines finden.) Aber es gibt dafür tatsächlich einen guten Grund: Ich habe das direkt in meinen Workflow eingebaut
- Ich bin Emacs-Nutzer
- Ich habe meine Umgebung so eingerichtet, dass jedes Mal, wenn ich ein Programm ausführe und es mit einem Nicht-Null-Statuscode beendet wird (also wenn etwas schiefgegangen ist), automatisch das neueste schnellste Spitzen-LLM aufgerufen wird, um mir die Antwort zu erklären und zugleich einen Patch vorzuschlagen, den ich direkt anwenden kann, um den Bug im Code zu beheben
- Die heutigen Modelle sind bei dieser Aufgabe in den meisten Fällen noch nicht gut genug, um den Autor zu schlagen, aber sie kommen dem immer näher
- Und gelegentlich ist es eine angenehme Überraschung, wenn das LLM einen Bug behebt, von dem ich weiß, dass er bloß ein Tippfehler irgendwo ist und ein Albtraum beim Aufspüren wäre
Zusammenfassung
- Alle oben verlinkten Unterhaltungen machen weniger als 2 % aller Gespräche aus, die ich letztes Jahr mit LLMs geführt habe
- Dass ich die anderen Gespräche nicht verlinkt habe, liegt nicht daran, dass das Modell dort gescheitert ist (obwohl es natürlich viele solche Fälle gibt), sondern daran, dass sie entweder
- (1) einfach dieselben Muster wie die bereits verlinkten Gespräche wiederholen oder
- (2) sich nicht leicht erklären lässt, was da passiert, und es nicht leicht ist, direkt zu sehen, warum es nützlich ist
- Ich erwarte, dass meine Nutzung dieser Modelle auch in Zukunft weiter zunehmen wird
- Zur Einordnung: 2024 habe ich über Webinterfaces 30 % mehr LLM-Abfragen durchgeführt als 2023, und den Anstieg bei API-Abfragen kann ich nicht genau erfassen, aber ich vermute, er lag mindestens beim Zwei- bis Dreifachen
Bewertet nicht, was ein LLM nicht kann, sondern was es kann
- Wenn man Bewerber in einem Interview beurteilt, sollte man eher darauf achten, was sie können, als darauf, was sie nicht können
- Stellt man einem LLM triviale Fragen, kann es unfähig wirken. Fragt man zum Beispiel auf Chinesisch, das von einer Milliarde Menschen genutzt wird, kann es Schwierigkeiten haben, korrekt zu antworten
- Selbst innerhalb der Informatik gibt es viele Bereiche, die ich nicht kenne, etwa wenn ich nur SQL-
SELECT-Anweisungen beherrsche
- Es fällt mir schwer zu verstehen, warum online behauptet wird, LLMs seien überbewertet, nur weil sie bestimmte Tasks nicht ausführen können
- Sie können die Anzahl der Wörter in einem Satz nicht zählen
- Sie können kein Gedicht schreiben, in dem alle Wörter mit „a“ anfangen
- Sie können keine zweistelligen Zahlen multiplizieren
- Sie können kein zufälliges Element aus einer Liste auswählen
- Allerdings ist fraglich, ob man je wirklich gedacht hat, dass ein LLM für solche Aufgaben das passende Werkzeug ist
- Genauso wie man Menschen nicht für nutzlos erklärt, nur weil sie keine 64-Bit-Integer-Division im Kopf ausführen können, ist es nicht sinnvoll, LLMs abzutun, nur weil man ein Problem konstruiert hat, das sie nicht lösen können
- Wichtig ist, ob es Tasks gibt, bei denen LLMs einen Mehrwert liefern können
- Programmierer wissen längst, dass je nach Zweck unterschiedliche Sprachen nützlich sind
- Zum Schreiben von Betriebssystemen ist C besser geeignet als Python
- Niemand sagt, Python sei wertlos, weil es Variablen nicht an 32-Byte-Grenzen ausrichten kann. Es ist einfach nur eine andere Abstraktionsebene
- Bei LLMs ist es genauso: Sie arbeiten auf einer sehr hohen Abstraktionsebene
- Für Aufgaben, die sich schon mit einem einfachen Programm lösen lassen, sind LLMs oft nicht die richtige Wahl
- Dafür kann man erwarten, dass sie andere Arten von Aufgaben lösen können
Fazit
- Zwei Beweggründe für diesen Text
- Ich möchte deutlich machen, dass LLMs mir persönlich bereits viel Wert liefern
- Und ich möchte Menschen, die die Idee von LLMs gut finden, aber nicht wissen, wie sie ihnen helfen können, konkrete Nutzungsbeispiele zeigen
- Der Wert von LLMs
- LLMs können nicht alles, aber schon die heutigen Modelle liefern erheblichen Mehrwert
- Sie können zum Beispiel CUDA-Fehler diagnostizieren und erklären, wie man Pakete neu installiert, ein Programm in C umschreiben oder etwas zu einem bestimmten Thema lehren
- Ein Studierender könnte so etwas mit ein paar Stunden Aufwand ebenfalls schaffen, aber es gibt keinen Studierenden, der jederzeit Fragen beantworten kann. Ein LLM dagegen schon
- Die Entwicklung von LLMs und die aktuelle Lage
- Vor fünf Jahren war das Beste, was LLMs konnten, halbwegs plausible englische Absätze zu schreiben, und ihr praktischer Nutzen war gleich null
- Heute steigern LLMs die Produktivität bei Programmieraufgaben jedoch um mindestens 50 % und nehmen einem langweilige Arbeiten ab
- Dank LLMs habe ich sogar mehrere Projekte fertiggestellt, die ich sonst nie begonnen hätte
- Entgegnung auf die Kritik an der Nützlichkeit von LLMs
- Ich widerspreche der Behauptung, „LLMs seien überbewertet und hätten keinen echten praktischen Wert“
- Für mich persönlich liefern LLMs großen Mehrwert
- Selbst ich mit 20 Jahren Programmiererfahrung werde durch LLMs deutlich produktiver
- Und ich denke, dass es neben mir viele weitere Menschen gibt, die von LLMs profitieren können
- Ausblick
- Schon die aktuellen Modelle liefern viel Wert
- Mit Blick auf die nächsten fünf Jahre mischen sich bei mir Erwartung und Furcht, wenn ich an die Weiterentwicklung von LLMs denke
- Im nächsten Text werde ich darauf mit einer Prognose eingehen
7 Kommentare
Ein nachvollziehbarer Beitrag. Der Autor nutzt es so gut, dass man vom Lesen fast müde wird..;
> Der einzige Grund, warum sich nicht noch Tausende solcher Beispiele verknüpfen lassen, ist, dass sowohl in Emacs als auch in der Shell Tools zum Abfragen von LLMs eingebaut sind
Ich scheine mich auch nicht aus dem Terminalfenster wegzubewegen. Ich habe den Eindruck, dass faule Entwickler das wohl alle so nutzen.
Bei einfachen Problemen öffne ich mit
copilot.vimeinfach irgendeinen Buffer und lasse durch die Autovervollständigung eine Antwort entstehen.Wenn ich mich nicht an einen Shell-Befehl erinnere, gibt es bei
copilot-cliden Befehl??, also muss ich nichts mehr nachschlagen.Code-Vervollständigungs-Tools verstehen meine Absicht und erzeugen den Code, noch bevor ich überhaupt frage.
Wie im Text gesagt: Ich weiß zwar, wie ich suchen müsste, aber LLMs sind mir lieber, weil man sie frei und ohne Förmlichkeit fragen kann.
copilot-vimbenutze ich auch! Darf ich fragen, welchescopilot-cliSie meinen?https://www.npmjs.com/package/@githubnext/github-copilot-cli
ist es!
https://docs.github.com/ko/copilot/…
Es gibt auch eine Erweiterungsversion für die GitHub CLI, aber die Verwendung ist etwas anders.
Es ist toll, auch in der Kommandozeile Hilfe von Copilot zu bekommen – danke!
Wenn ich weiß, wie man es macht, aber zu faul zum Tippen bin, lasse ich es ChatGPT erledigen.
Ich denke, man kann es nur dann gut nutzen, wenn man das Ergebnis auch prüfen kann.
Der Autor betont zwei Hauptanwendungen von LLMs: 1. Hilfe beim Lernen, 2. Automatisierung langweiliger Aufgaben.
In letzter Zeit trifft das auch genau auf mich zu. Wenn ich an die Dinge denke, die ich kürzlich gemacht habe:
Natürlich wären diese Dinge auch ohne LLM möglich, aber es ist einfach schneller, es erledigen zu lassen, daher ist es perfekt als Life Hacking geeignet.
Dem kann ich in vielem zustimmen.
Das ist ziemlich ähnlich zu dem, was ich bei der Nutzung von KI empfinde.