Dopo aver giocato con l'assistente di codifica Aider, ho utilizzato Mentat per codificare negli ultimi settimane.
Confronto con Aider
Il modo in cui funziona è simile. Esegue nel terminale con un'interfaccia utente testuale. Ti consente persino di impostare modalità luminosa e oscura per lo schema dei colori. Le sessioni di codifica coinvolgono l'aggiunta di file pertinenti per il contesto. Nella chatbox, esprimi i tuoi desideri e ti ritorna con un piano d'azione che coinvolge modifiche del codice. Approva le modifiche e vengono apportate.
L'esperienza nel complesso è vicina a quella di Aider, tranne che Aider fa un commit Git per ogni modifica (che puoi optare per non fare). Mentat lascia la gestione delle versioni a te.
La qualità di come formuli i tuoi desideri determina la qualità del lavoro. Devi essere abbastanza verboso al riguardo. Quello che ritorna è una funzione della tua scelta di LLM. Non attribuirei intelligenza agli assistenti di codifica, ma credo che loro abbiano una superiore esperienza di sviluppo se ne hanno una. Non importa quale tu usi, devi ancora parlare con loro come se fossi un stagista senza idea.
Limite di contesto
Fuori dalla scatola, Mentat supporta una lista di LLMs piuttosto scarsa rispetto ad Aider (che potrebbe o non potrebbe cambiare). Non ho lasciato che questo diventasse un problema, ho collegato Mentat per utilizzare un LLM di codifica in Together.ai.
Ma non ha contato; ho incontrato il limite di finestra di contesto fin dall'inizio. Ammetto che alcuni dei miei file siano di lunghezza di produzione, ma non ne ho incluso molti. Non ho nemmeno avuto la possibilità di farlo fare qualcosa di intelligente ancora. Ero determinato a far funzionare questo, solo che il limite di contesto si frapponeva.
La soluzione non è quella di utilizzare semplicemente un LLM con un limite di contesto più ampio. C'è sempre un limite superiore, finiresti solo per colpire quello costantemente.
Ho costruito il mio RAG
Ho sentito dire che RAG è la risposta. Quindi ho costruito un middleware che si colloca tra Mentat e l'LLM.
Questo è un servizio di API REST OpenAI-compatibile (http://localhost:<port>/chat/completions) in esecuzione locale, tutto contenuto in un unico file Python. Lo chiamo Broken Sword per facilitare il riferimento.
Per quanto riguarda Mentat, Broken Sword è un vero e proprio servizio LLM. All'interno di Broken Sword, catturo le richieste di Mentat, massaggio le input, le invio a qualsiasi LLM io voglia e restituisco la risposta in modo OpenAI-compatibile. Facendo ciò, ho la possibilità di vedere le direttive elaborate impartite da Mentat, che è quello che sembra il prompt engineering.
Semplicemente facendo questo, ho abilitato Mentat a utilizzare qualsiasi LLM disponibile per l'umanità. Sono poi passato a utilizzare Google Gemini 1.5 per alimentare Broken Sword, principalmente perché ha il giusto equilibrio tra qualità e costo.
Tuttavia, questo non risolve il problema del limite di finestra di contesto. Questo non è altro che una tubatura glorificata.
Invece di inviare input da Mentat in modo verbatim, la grande quantità di contesto può essere memorizzata in un database vettoriale e inviata come embeddings. Se capisco bene, grandi blocchi di testo vengono trasformati in matrici multidimensionali di numeri. Questo è molto più piccolo per gli LLM che utilizzare i testi originali.
Ho reso tutto ciò funzionante utilizzando LangChain (ha le serie di processi astratti via), con un tocco di Flask per API semplici. Mi è sembrato di barare quando non conoscevo ancora la magia dietro, ma volevo hackerare le cose velocemente. So che dicono che non si ha realmente bisogno di LangChain e credo loro, ma un giorno, uomo, un giorno.
Funziona
Quando ho finito, Mentat ha iniziato a funzionare come si suppone che faccia. L'ho fatto scrivere test unitari, è stato scritto nello stile consistente con quelli esistenti. L'ho fatto scrivere un flusso di lavoro GitHub Actions, il risultato è stato sensato.
È stato gratificante, quando funziona. Sapere che l'ho reso funzionante con Broken Sword è doppiamente soddisfacente.
Questo mi ha fatto chiedere, perché Mentat non utilizza RAG o database vettoriale come ho appena fatto? Sembra quasi banale farlo. Ho preso un'occhiata nel codice base di Mentat, in effetti utilizza Chroma DB (lo stesso database vettoriale che uso). Quindi forse stanno facendo RAG in qualche modo, ma non in modi che mi riguardano.
Ma è goffo
Mentre metto Mentat al lavoro sempre di più, la goffaggine diventa evidente. A volte si blocca. A volte perché l'LLM non torna con qualcosa che gli piace, ma la maggior parte delle volte per ragioni a me ignote. Il fallimento grazioso non è la sua forza.
Ci sarebbero volte in cui Mentat si bloccava dopo che avevo fatto una richiesta. Dopo aver riavviato e reincluso i file pertinenti, ripetevo la stessa richiesta (buona cosa che abbiano la cronologia delle chat per rendere facile) e tutto funzionava.
Miscela di codifica manuale
Una domanda che speravo di rispondere in questa avventura è la giusta miscela di utilizzo di un assistente di codifica in questo modo e di editing diretto dei file quando si risolve un problema. In tal caso, se possibile, dovrebbe essere fatto tutto il codice solo dall'assistente di codifica? O siamo destinati ad avere un editor di codice pronto nello schermo accanto?
Nel mio caso, metà dello schermo è per Mentat, l'altra metà per emacs. Mi aspettavo che Mentat mi desse la maggior parte di quello che volevo ma non perfetto, e avrei apportato piccole correzioni manuali ai file stessi in emacs.
Se l'assistente di codifica di stile Mentat ha un futuro, mi chiedo se sia il modo in cui dovrebbe essere.
dev.to
Deep dive into Mentat coding assistant
Create attached notes ...