Etter å ha spilt med Aider-kodinghjelper, har jeg brukt Mentat til koding de siste ukene.
Sammenligning med Aider
Måten det fungerer på er lik. Det kjører på terminalen med et tekstbasert brukergrensesnitt. Det lar deg også sette lys og mørk modus-farge. Kodingssessioner involverer å legge til relevante filer for kontekst. I chatboksen, uttrykker du dine ønsker og det kommer tilbake med en handlingsplan som involverer kodeendringer. Godkjenn dem og endringene blir gjort.
Hele opplevelsen er nær Aider, bortsett fra at Aider lager en git-commit for hver endring (som du kan velge bort). Mentat overlater versjonsstyringen til deg.
Kvaliteten på hvordan du formulerer dine ønsker bestemmer kvaliteten på arbeidet. Du må være ganske verbos om det. Hva som kommer tilbake er en funksjon av valget ditt av LLM. Jeg vil ikke tilskrive smartness til kodinghjelperne, men jeg ville kreditere overlegen utviklings erfaring til dem hvis noen. Uansett hvilken en du bruker, må du fortsatt snakke med dem som en klosset intern.
Kontekstgrense
Utenfor esken støtter Mentat en minimalistisk liste over LLM'er sammenlignet med Aider (det kan eller kan ikke endre seg). Jeg lot ikke det være et problem, jeg koblet det til å bruke en koding LLM i Together.ai.
Men det var ikke viktig; Jeg traff kontekstvinduets grense rett fra starten. Jeg inkluderte ikke engang mange av dem. Jeg fikk ikke engang muligheten til å la det gjøre noe smart ennå. Jeg var fast bestemt på å få dette til å fungere, bare kontekstgrensen som stoppet meg.
Løsningen er ikke å bare bruke en LLM med større kontekstgrense. Det er alltid en øvre grense, du ville bare ende opp med å treffe den konstant.
Bygget min egen RAG
Jeg hørte at RAG er svaret. Så bygget jeg en mellomvare som sitter mellom Mentat og LLM.
Dette er en OpenAI-kompatibel REST-API (http://localhost:<port>/chat/completions) som kjører lokalt, alt huset i en Python-fil. Jeg kaller det Broken Sword for enkel referanse.
Så langt Mentat er bekymret, er Broken Sword en virkelig LLM-tjeneste. Innad i Broken Sword fanger jeg Mentats forespørsler, masserer inputene, sender dem til hvilken som helst LLM jeg vil, og returnerer svaret på en OpenAI-kompatibel måte. Når jeg gjør dette, får jeg se de intrikate direktivene gitt av Mentat, det er hva prompt-engineering ligner.
Bare ved å gjøre dette har jeg aktiveret Mentat til å bruke hvilken som helst LLM som er tilgjengelig for menneskeheten. Jeg fortsatte å bruke Google Gemini 1.5 til å drive Broken Sword, mest fordi det har rett balanse mellom kvalitet og kostnad.
Dette alene løser ikke kontekstvinduets grense imidlertid. Dette er ikke mer enn en glorifisert rør.
I stedet for å sende input fra Mentat ordrett, kan den enorme mengden kontekst lagres i en vektor database og sendes over som embeddings i stedet. Hvis jeg forstår det rett, blir store blokker av tekster omdannet til multidimensionale matriser av tall. Dette er mye mindre for LLM'er å bruke enn de originale tekstene.
Jeg fikk alt dette til å fungere ved hjelp av LangChain (det har serien av prosesser abstrahert bort), med en dash for Flask for enkel API. Det føltes som å svindle når jeg ikke ennå vet hvordan denne magien fungerer, men jeg ønsket å hacke ting fort. Jeg vet de sier at du ikke virkelig trenger LangChain og jeg tror dem, men en dag mann, en dag.
Det fungerer
Når jeg er ferdig, sluttet Mentat med å fungere som det skal. Jeg fikk det til å skrive enhetstester, det ble skrevet i en stil som er konsistent med eksisterende. Jeg fikk det til å skrive en GitHub Actions-workflow, resultatet var fornuftig.
Det var morsomt, når det fungerer. Å vite at jeg har fått det til å fungere med Broken Sword er dobbelt morsomt.
Hvilket fikk meg til å undre, hvorfor Mentat ikke bruker RAG eller vektor database som jeg nettopp har gjort? Det føltes nesten trivielt å gjøre det. Jeg tok en titt i Mentat-kodebasen, og det er faktisk Chroma DB som brukes (samme vektor-db jeg bruker). Så kanskje de gjør RAG på en eller annen måte, men ikke på måter som betyr noe for meg.
Men det er klønete
Etter å ha satt Mentat i arbeid mer og mer, blir klønetheten åpenbar. Det ville kræsje fra tid til annen. Noen ganger fordi LLM ikke kom tilbake med noe det liker, men mest for årsaker ukjent for meg. Grasiøs feilhåndtering er ikke sin styrke.
Det ville være ganger hvor Mentat ville kræsje etter at jeg hadde lagt inn en forespørsel. Når jeg startet igjen og inkluderte de relevante filene på nytt, gjentok jeg samme forespørselen (godt at de har chat-historikk for å gjøre dette lett) og alt fungerte.
Blanding av håndkoding
En spørsmål jeg håpet å svare på i denne eventyren er den rette blandingen av å bruke kodinghjelper på denne måten og direkte redigere filer når man løser et problem. Hvis det er mulig, skal all koding gjøres bare fra kodinghjelperen? Eller forventes det at vi har en kodeeditor klar i neste skjerm?
I mitt tilfelle er halve skjermen for Mentat, den andre halvparten for emacs. Jeg forventet at Mentat skulle gi meg det meste av det jeg ville, men ikke perfekt, og jeg ville gjøre mindre justeringer for hånd til de samme filene i emacs.
Hvis Mentat-stil kodinghjelper har en fremtid, undrer jeg meg på om det er måten det skal være.
dev.to
Deep dive into Mentat coding assistant
Create attached notes ...