Depois de brincar com o assistente de codificação Aider, tenho usado Mentat para codificar nas últimas semanas.
Comparação com Aider
O modo como funciona é semelhante. Ele roda no terminal com uma interface de usuário textual. Até permite que você defina esquemas de cores para modo claro e escuro. As sessões de codificação envolvem adicionar arquivos relevantes para contexto. Na caixa de conversa, você faz seus desejos e ele volta com um plano de ação envolvendo alterações de código. Aprovar as alterações e elas são feitas.
A experiência como um todo é próxima à Aider, exceto que Aider faz um commit git para cada alteração (o que você pode optar por não fazer). Mentat deixa o gerenciamento de versão para você.
A qualidade de como você frase seus desejos determina a qualidade do trabalho. Você tem que ser muito verboso sobre isso. O que volta é uma função da escolha do LLM. Eu não atribuiria inteligência aos assistentes de codificação, mas eu creditaria experiência de desenvolvimento superior a eles se houver. Não importa qual deles você use, você ainda tem que conversar com eles como se fosse um estagiário inexperiente.
Limite de contexto
Fora da caixa, Mentat suporta uma lista insignificante de LLMs em comparação com Aider (isso pode ou não mudar). Eu não permiti que isso fosse um problema, eu o conectei para usar um LLM de codificação em Together.ai.
Mas não importou; eu atingi o limite de janela de contexto logo de início. Concedido, alguns dos meus arquivos são de produção, mas eu não incluí muitos deles. Eu nem sequer tive a chance de fazer algo inteligente ainda. Estava determinado a fazer isso funcionar, apenas o limite de contexto está no caminho.
A solução não é usar apenas um LLM com um limite de contexto maior. Há sempre um limite superior, você apenas terminaria atingindo isso constantemente.
Construí meu próprio RAG
Ouvi dizer que RAG é a resposta. Então, construí um middleware que fica entre Mentat e o LLM.
Isso é uma API REST OpenAI-compatível (http://localhost:<port>/chat/completions) rodando localmente, tudo acondicionado em um arquivo Python. Eu o chamo de Broken Sword para fácil referência.
Para Mentat, Broken Sword é um serviço LLM real. Dentro de Broken Sword, eu capturei as solicitações de Mentat, massageei as entradas, enviei para qualquer LLM que eu quisesse e retornei a resposta de maneira OpenAI-compatível. Ao fazer isso, eu vi as diretrizes elaboradas dadas por Mentat, que é o que a engenharia de prompts parece.
Só fazendo isso, eu habilitei Mentat a usar qualquer LLM disponível para a humanidade. Eu continuei usando Google Gemini 1.5 para alimentar Broken Sword, principalmente porque ele tem o equilíbrio certo entre qualidade e custo.
Isso não resolve o limite de janela de contexto, no entanto. Isso é mais do que um cano glorificado.
Em vez de enviar entradas de Mentat verbatim, o contexto pode ser armazenado em um banco de dados de vetores e enviado como embeddings. Se eu entendi corretamente, grandes trechos de texto se transformam em matrizes multidimensionais de números. Isso é muito menor para os LLMs usarem em vez dos textos originais.
Eu fiz tudo isso funcionar usando LangChain (ele tem a série de processos abstraídos), com um toque de Flask para API simples. Foi como trapacear quando não entendi como essa magia funciona, mas eu queria hackear coisas rapidamente. Eu sei que eles dizem que você não precisa realmente de LangChain e eu acredito neles, mas algum dia, homem, algum dia.
Isso funciona
Quando terminei, Mentat acabou funcionando como deve. Eu o fiz escrever testes unitários, ele foi escrito no estilo consistente com os existentes. Eu o fiz escrever um fluxo de trabalho do GitHub Actions, o resultado foi sensato.
Foi gratificante, quando funciona. Saber que eu fiz isso funcionar com Broken Sword é duplamente satisfatório.
O que me fez questionar, por que Mentat não usa RAG ou banco de dados de vetores como eu acabei de fazer? Pareceu quase trivial fazer isso. Eu dei uma olhada no código base de Mentat, de fato, Chroma DB é usado (o mesmo banco de dados de vetores que eu uso). Então, talvez eles estejam fazendo RAG de alguma maneira, mas não de maneira que importe para mim.
Mas é desajeitado
À medida que eu ponho Mentat para trabalhar mais e mais, a desajeitadez se torna aparente. Ele costumava crashar de vez em quando. Às vezes porque o LLM não voltou com algo que ele gostasse, mas a maioria das vezes por motivos desconhecidos para mim. Falha graciosa não é sua força.
Haveria vezes em que Mentat crashava após eu fazer um pedido. Após relançá-lo e reincluir os arquivos relevantes, eu repetia o mesmo pedido (bom que eles têm histórico de conversa para tornar isso fácil) e tudo funcionava.
Mistura de codificação manual
Uma pergunta que eu estava esperando responder nesta aventura é a mistura certa de usar assistente de codificação dessa maneira e editar arquivos diretamente ao resolver um problema. Nesse caso, se possível, deve-se fazer toda a codificação apenas do assistente de codificação?
Em meu caso, metade da tela é para Mentat, a outra metade é para emacs. Eu esperava que Mentat me desse a maioria do que eu quisesse, mas não perfeito, e eu faria ajustes menores manualmente nos mesmos arquivos em emacs.
Se o assistente de codificação do estilo Mentat tem um futuro, eu me pergunto se é assim que deve ser.
dev.to
Deep dive into Mentat coding assistant
Create attached notes ...