Log in to leave a comment
No posts yet
Ferramentas como Cursor ou Devin são convenientes. No entanto, é difícil saber exatamente o que está acontecendo internamente e, às vezes, elas retalham o código de uma forma que você não deseja. Para um desenvolvedor backend, criar seu próprio agente otimizado combinando a biblioteca padrão do Python e APIs de LLM é muito mais econômico e confiável.
Para fazer com que o agente vá além de apenas escrever código e passe a executar comandos de terminal diretamente, você precisa manipular o módulo subprocess com precisão. Usar a opção shell=True sem cautela expõe você a ataques de shell injection ou a problemas onde os processos não morrem em caso de timeout, restando como "zumbis".
Ao implementar, defina shell=False na chamada de subprocess.run() e passe os comandos como uma lista. Mantenha o timeout curto, em torno de 30 segundos, e se uma exceção TimeoutExpired ocorrer, chame imediatamente process.kill() para recuperar os recursos. Ao enviar os resultados da execução para o modelo, não é necessário enviar o conteúdo completo. Se o texto exceder 1.000 caracteres, corte e retorne apenas as últimas 20 linhas. Isso é informação suficiente para o modelo identificar a causa do erro, evitando o desperdício de tokens.
À medida que a conversa se alonga, os dados acumulados na janela de contexto tornam-se uma bomba de custos. De acordo com o anúncio da Anthropic, ao utilizar o marcador cache_control no modelo Claude 3.5, o custo de leitura de dados em cache pode ser reduzido em até 90%. Isso equivale a cerca de 0,30 dólar por 1 milhão de tokens.
Para reduzir custos, separe rigorosamente as mensagens do sistema das entradas do usuário. Informações que não mudam, como a estrutura da árvore de arquivos do projeto, devem ser fixadas no topo do prompt do sistema e configuradas como pontos de cache. Quando o histórico da conversa cresce e os tokens transbordam, é bom usar uma abordagem de resumo hierárquico, calculando a quantidade com tiktoken e resumindo mensagens antigas com uma chamada de LLM separada. Ao aplicar uma janela deslizante que mantém apenas esse contexto resumido no topo e adiciona as mensagens mais recentes, você pode reduzir os custos em mais de 40% em longas sessões de desenvolvimento, mantendo a precisão do raciocínio do modelo.
Fazer o agente imprimir o arquivo inteiro novamente é ineficiente e lento. Quanto mais tokens de saída, maior a probabilidade de o modelo omitir partes do código ou gerar alucinações. A técnica conhecida como "Edit Trick" induz o modelo a alterar apenas o texto (âncora) antes e depois da parte que precisa de modificação. Essa técnica tem o efeito de reduzir a quantidade de tokens de saída em até 86% em dados reais.
Utilize o re.sub() do Python para criar uma funcionalidade que aplique apenas as modificações enviadas via tags XML específicas ou expressões regulares nos arquivos locais. Além disso, em vez de colocar toda a documentação técnica no prompt, você deve projetar o sistema para buscar apenas os fragmentos necessários conectando um banco de dados vetorial leve como o LanceDB. Com essa estrutura, a velocidade de modificação de arquivos torna-se perceptivelmente 79% mais rápida, resolvendo o problema crônico do modelo se perder ao trabalhar com arquivos grandes.
Devemos parar com o esforço de copiar e colar manualmente mensagens de depuração para o modelo. Faça com que o agente escreva o código de teste baseado em pytest antes de escrever o código funcional.
Basta construir um loop de feedback onde, se o teste falhar, o Traceback completo é enviado de volta ao modelo para que ele o corrija por conta própria. No entanto, para comandos perigosos como rm ou deploy, você deve obrigatoriamente inserir guardrails que passem pela aprovação do usuário usando a função input() do Python. Uma vez concluída essa estrutura cíclica, o desenvolvedor só precisa verificar o resumo do git diff enviado pelo agente e clicar no botão de commit.
No final das contas, o cerne da construção de um agente não está em frameworks chamativos, mas na precisão com que você refina e armazena os dados entre o terminal e o LLM. 600 linhas de código Python escritas por você refletirão suas intenções muito melhor do que uma ferramenta de caixa preta com dezenas de milhares de linhas.