Ich bin in den letzten Wochen mit Mentat kodiert, nachdem ich mit Aider, dem Codierassistenten, experimentiert habe.
Vergleich mit Aider
Es funktioniert ähnlich. Es läuft im Terminal mit einer textbasierten Benutzeroberfläche. Es erlaubt Ihnen sogar, ein helles und dunkles Farbschema für den Modus zu setzen. Codier-Sitzungen beinhalten das Hinzufügen relevanter Dateien für den Kontext. Im Chatfenster äußern Sie Ihre Wünsche und es kommt mit einem Aktionsplan zurück, der Codeänderungen beinhaltet. Genehmigen Sie sie und die Änderungen werden vorgenommen.
Die Erfahrung insgesamt ist Aider ähnlich, mit dem Unterschied, dass Aider für jede Änderung ein Git-Commit erstellt (was Sie auch ausschalten können). Mentat überlässt die Versionsverwaltung Ihnen.
Die Qualität, wie Sie Ihre Wünsche formulieren, bestimmt die Qualität der Arbeit. Sie müssen ziemlich ausführlich darüber sprechen. Was zurückkommt, ist eine Funktion der von Ihnen gewählten LLM. Ich werde den Codierassistenten nicht für intelligent halten, aber ich schreibe ihnen eine überlegene Entwicklungserfahrung zu, wenn auch welche. Egal welchen Sie verwenden, Sie müssen immer noch mit ihnen sprechen wie mit einem ahnungslosen Praktikanten.
Kontextbegrenzung
Von Haus aus unterstützt Mentat eine schmale Liste von LLMs im Vergleich zu Aider (was sich möglicherweise ändern könnte). Ich ließ das nicht zu einem Problem werden, ich verband es mit einem Codier-LLM in Zusammenarbeit.ai.
Aber es half nichts; Ich stieß sofort auf die Kontext-Fensterbegrenzung. Zugegeben, einige meiner Dateien sind produktionslang, aber ich schloss nicht so viele von ihnen ein. Ich bekam nicht einmal die Chance, es zu etwas Cleverem zu bringen. Ich war entschlossen, es zu schaffen, aber die Kontextbegrenzung stand im Weg.
Die Lösung ist nicht, einfach ein LLM mit größerer Kontextbegrenzung zu verwenden. Es gibt immer eine Obergrenze, Sie würden einfach ständig dagegen stoßen.
Eigenes RAG gebaut
Ich hörte, RAG sei die Antwort. Also baute ich ein Middleware, das zwischen Mentat und dem LLM sitzt.
Dies ist eine OpenAI-kompatible REST-API (http://localhost:<port>/chat/completions), die lokal läuft, alles in einer Python-Datei untergebracht. Ich nenne es Broken Sword für leichte Referenz.
Soweit Mentat betrifft, ist Broken Sword ein tatsächliches LLM-Dienstleistungsangebot. Innerhalb von Broken Sword fange ich Mentats Anfragen ab, massiere die Eingaben, schicke sie an ein beliebiges LLM und gebe die Antwort in OpenAI-kompatibler Weise zurück. Indem ich dies tue, sehe ich die aufwendigen Direktiven, die Mentat gibt, das ist, was Prompt-Engineering aussieht.
Nur dadurch habe ich Mentat ermöglicht, jedes LLM zu verwenden, das der Menschheit zur Verfügung steht. Ich ging weiter und verwendete Google Gemini 1.5, um Broken Sword zu betreiben, größtenteils weil es das richtige Gleichgewicht zwischen Qualität und Kosten bietet.
Dies löst jedoch nicht das Problem der Kontext-Fensterbegrenzung. Das ist nichts weiter als eine glorifizierte Rohrleitung.
Anstatt die Eingaben von Mentat wörtlich zu senden, kann der riesige Kontext in einem Vektordatenbank gespeichert und als Einbettungen gesendet werden. Wenn ich es richtig verstehe, werden große Textabschnitte in multidimensionale Zahlenmatrizen umgewandelt. Das ist für LLMs viel kleiner zu verarbeiten als die ursprünglichen Texte.
Ich machte all das mit LangChain (es hat die Serie von Prozessen abstrahiert), mit einem Spritzer Flask für eine einfache API. Es fühlte sich an wie Schummeln, als ich noch nicht weiß, wie dieser Zauber funktioniert, aber ich wollte Dinge schnell hacken. Ich weiß, sie sagen, man braucht LangChain nicht wirklich und ich glaube ihnen, aber irgendwann, Mann, irgendwann.
Es funktioniert
Als ich fertig war, funktionierte Mentat wie es sollte. Ich ließ es Unit-Tests schreiben, es schrieb sie im Stil, der mit den bestehenden übereinstimmt. Ich ließ es ein GitHub-Actions-Workflow schreiben, das Ergebnis war sinnvoll.
Es war befriedigend, als es funktionierte. Wissen, dass ich es mit Broken Sword zum Funktionieren gebracht habe, ist doppelt befriedigend.
Was mich aber auch fragen ließ, warum Mentat nicht RAG oder Vektordatenbank wie ich es gerade getan habe, verwendet. Es schien fast trivial, es zu tun. Ich sah mir den Quellcode von Mentat an, tatsächlich wird Chroma DB verwendet (die gleiche Vektordatenbank, die ich verwende). Vielleicht tun sie RAG auf eine Weise, die für mich nicht relevant ist.
Aber es ist klobig
Je mehr ich Mentat zum Arbeiten brachte, desto offensichtlicher wurden die Klobigkeit. Es stürzte von Zeit zu Zeit ab. Manchmal, weil das LLM nichts zurückkam, was es mochte, aber meistens aus Gründen, die mir unbekannt sind. Elegant zu scheitern ist nicht seine Stärke.
Es gab Zeiten, in denen Mentat nachdem ich eine Anfrage gestellt hatte, abstürzte. Nachdem ich es neu gestartet und die relevanten Dateien erneut hinzugefügt hatte, wiederholte ich die gleiche Anfrage (gut, dass sie ein Chatverlauf haben, um dies einfach zu machen) und alles funktionierte.
Mischung von Hand-Codierung
Eine Frage, auf die ich in dieser Abenteuerreise eine Antwort finden wollte, ist die richtige Mischung aus dem Einsatz von Codierassistenten auf diese Weise und dem direkten Bearbeiten von Dateien, wenn man ein Problem löst. D.h., wenn möglich, sollten alle Codierarbeiten einfach von dem Codierassistenten erledigt werden? Oder sollen wir immer ein Code-Editor bereit haben?
In meinem Fall ist die Hälfte meines Bildschirms für Mentat reserviert, die andere Hälfte für Emacs. Ich erwartete, dass Mentat mir die meisten Dinge gibt, die ich will, aber nicht perfekt, und ich würde kleine Anpassungen von Hand an denselben Dateien in Emacs vornehmen.
Wenn Mentat-Style-Codierassistenten eine Zukunft haben, frage ich mich, ob das die Art sein sollte, wie es sein sollte.
dev.to
Deep dive into Mentat coding assistant
Create attached notes ...