Suite à mon expérience avec l'assistant de codage Aider, j'ai utilisé Mentat pour coder pendant les dernières semaines.
Comparaison avec Aider
Le fonctionnement est similaire. Il s'exécute dans le terminal avec une interface utilisateur textuelle. Il permet même de définir des schémas de couleurs pour le mode clair et sombre. Les sessions de codage impliquent l'ajout de fichiers pertinents pour le contexte. Dans la boîte de dialogue, vous formulez vos souhaits et il vous propose un plan d'action impliquant des modifications de code. Approuvez-les et les modifications sont apportées.
L'expérience dans son ensemble est proche de celle d'Aider, à l'exception qu'Aider réalise un commit Git pour chaque modification (que vous pouvez opter pour ignorer). Mentat laisse la gestion des versions à vous.
La qualité de la formulation de vos souhaits détermine la qualité du travail. Vous devez être assez verbeux à ce sujet. Ce qui revient est fonction de votre choix de LLM. Je n'attribuerai pas d'intelligence à ces assistants de codage, mais je créditerais leur expérience de développement supérieure si elle en a une. Quel que soit celui que vous utilisez, vous devez encore leur parler comme à un stagiaire désorienté.
Limite de contexte
Hors de la boîte, Mentat prend en charge une liste de LLM médiocre comparée à Aider (ce qui pourrait ou pourrait ne pas changer). Je n'ai pas laissé cela être un problème, j'ai connecté Mentat pour utiliser un LLM de codage dans Together.ai.
Mais cela n'a pas compté ; j'ai rencontré la limite de contexte dès le départ. Certes, certains de mes fichiers sont de longueur de production, mais je n'en ai pas inclus beaucoup. Je n'ai même pas eu la chance de le faire quelque chose de malin encore. J'étais déterminé à faire que cela fonctionne, seul le context-limit est en train de se mettre en travers.
La solution n'est pas d'utiliser simplement un LLM avec une limite de contexte plus élevée. Il y a toujours une limite supérieure, vous finiriez par la frapper constamment.
Construit mon propre RAG
J'ai entendu dire que RAG est la solution. Alors j'ai construit un middleware qui se situe entre Mentat et le LLM.
Ceci est une API REST compatible OpenAI (http://localhost:<port>/chat/completions) exécutant localement, tout contenu dans un seul fichier Python. J'appelle cela Broken Sword pour faciliter la référence.
Du point de vue de Mentat, Broken Sword est un service LLM réel. À l'intérieur de Broken Sword, je capture les requêtes de Mentat, je massage les entrées, je les envoie à n'importe quel LLM que je veux, et je retourne la réponse de manière compatible avec OpenAI. En faisant cela, je vois les directives élaborées données par Mentat, c'est ce que ressemble à l'ingénierie de prompt.
Juste en faisant cela, j'ai permis à Mentat d'utiliser n'importe quel LLM disponible sur terre. J'ai poursuivi en utilisant Google Gemini 1.5 pour alimenter Broken Sword, principalement parce qu'il a le bon équilibre entre qualité et coût.
Cela seul ne résout pas la limite de contexte cependant. C'est juste une pipe glorifiée.
Au lieu d'envoyer les entrées de Mentat telles quelles, la grande quantité de contexte peut être stockée dans une base de données vectorielle et envoyée en tant qu'embeddings. Si j'ai bien compris, de grands morceaux de textes se transforment en matrices multidimensionnelles de nombres. C'est beaucoup plus petit pour les LLM que les textes originaux.
J'ai rendu tout cela fonctionnel en utilisant LangChain (il a la série de processus abstraits), avec un peu de Flask pour une API simple. Cela m'a semblé tricher quand je n'ai pas encore compris comment ce magic fonctionne, mais j'ai voulu hacker les choses vite. Je sais qu'ils disent que vous n'avez pas vraiment besoin de LangChain et je les crois, mais un jour, mec, un jour.
Ça marche
Quand j'ai fini, Mentat a fonctionné comme il le devait. J'ai fait écrire des tests unitaires, ils ont été écrits dans le style consistant avec les existants. J'ai fait écrire un workflow GitHub Actions, le résultat était sensé.
C'était gratifiant, quand cela fonctionnait. Savoir que j'ai rendu cela fonctionnel avec Broken Sword est doublement satisfaisant.
Ce qui m'a fait me demander, pourquoi Mentat n'utilise-t-il pas RAG ou une base de données vectorielle comme je viens de le faire ? Cela m'a semblé presque trivial de le faire. J'ai pris un tour dans le codebase de Mentat, en réalité, Chroma DB est utilisé (la même base de données vectorielle que j'utilise). Alors peut-être qu'ils font RAG d'une manière qui n'a pas d'importance pour moi.
Mais c'est lourd
Au fur et à mesure que j'ai mis Mentat au travail de plus en plus, la lourdeur est apparue. Il se crashait de temps en temps. Parfois parce que le LLM n'est pas revenu avec quelque chose qu'il aime, mais la plupart du temps pour des raisons inconnues de moi. La panne gracieuse n'est pas sa force.
Il y aurait des moments où Mentat se crasherait après que j'ai fait une demande. En le relançant et en ré-incluant les fichiers pertinents, j'ai répété la même demande (bonne chose qu'ils aient l'historique des conversations pour faciliter cela) et tout se passait bien.
Mélange de codage manuel
Une question que j'espérais répondre dans cette aventure est le bon mélange d'utilisation de l'assistant de codage de cette manière et d'édition directe des fichiers lors de la résolution d'un problème. Dans ce cas, si possible, devrait-on faire tout le codage à partir de l'assistant de codage ? Ou sommes-nous censés avoir un éditeur de code prêt à l'écran suivant ?
Dans mon cas, la moitié de l'écran est pour Mentat, l'autre moitié pour emacs. J'attendais que Mentat me donne la plupart de ce que je veux mais pas parfait, et que je fasse des ajustements mineurs à la main sur les mêmes fichiers dans emacs.
Si l'assistant de codage de type Mentat a un avenir, je me demande si c'est la façon dont cela devrait être.
dev.to
Deep dive into Mentat coding assistant
Create attached notes ...