1 pontos por GN⁺ 2025-05-16 | 1 comentários | Compartilhar no WhatsApp
  • Com base na experiência de desenvolvimento do Sketch, um assistente de programação com IA, o texto destaca a implementação enxuta de uma estrutura de loop que combina LLM com uso de ferramentas
  • Com apenas 9 linhas de código de loop, modelos LLM modernos como o Claude 3.7 Sonnet conseguem resolver problemas reais rapidamente
  • Mesmo com apenas uma ferramenta genérica como o bash, já é possível automatizar boa parte de tarefas repetitivas e trabalhosas dos desenvolvedores
  • Além da resolução de problemas, conectar ferramentas adicionais pode aumentar a qualidade e a velocidade de repetição em edição de texto ou tarefas especializadas
  • Há uma tendência de adoção crescente de loops de agentes LLM personalizados na automação do dia a dia dos desenvolvedores

Introdução: experiência de desenvolvimento e o projeto Sketch

  • Philip Zelliger e seus colegas, ao desenvolverem o Sketch, uma ferramenta de assistência à programação baseada em IA, se surpreenderam com a alta eficiência de uma estrutura simples de loop de agente que combina LLM com uso de ferramentas
  • A estrutura central consiste em apenas 9 linhas de código de loop, que enviam o prompt de sistema, o histórico da conversa e a mensagem mais recente para a API do LLM
  • O LLM gera a saída e, quando necessário, retorna tool_calls (solicitações de chamada de ferramenta)

Integração entre LLM e uso de ferramentas

  • "Uso de ferramentas (tool use)" significa que o LLM retorna uma saída compatível com um esquema predefinido, e que, por meio do prompt de sistema e do prompt de descrição das ferramentas, o LLM pode acessar ferramentas genéricas como bash
  • LLMs modernos (por exemplo, o Claude 3.7 Sonnet) automatizam rapidamente vários tipos de problema mesmo com uma única ferramenta genérica, e alguns casos podem ser resolvidos até em uma única execução ("one shot")
  • Antes, era preciso procurar comandos git complexos, copiar e colar, e fazer merges manualmente; agora, basta pedir ao Sketch para resolver isso na hora
  • Vários erros de verificação de tipos surgidos após mudanças de tipo também passaram a ser tratados automaticamente pelo Sketch pela primeira vez
  • O loop de agente funciona de forma contínua e adaptativa, instalando ferramentas automaticamente quando necessário e se ajustando até mesmo a diferenças nas opções de comando
  • Durante o uso, às vezes o LLM faz sugestões inesperadas, como "pular o teste" quando um teste falha, mas, no geral, a qualidade da automação do trabalho melhorou

Diversificação e especialização das ferramentas

  • O Sketch percebeu que, além do bash, usar ferramentas adicionais (cf. ferramentas de edição de texto) melhora a qualidade do trabalho e torna o fluxo de desenvolvimento ainda mais eficiente
  • Editar texto com precisão usando sed e afins é mais complicado do que parece para o LLM, e ferramentas no estilo de editor visual se mostraram superiores

Perspectivas futuras e mudanças no fluxo de trabalho

  • A estrutura de loop de agente tende a ser usada cada vez mais em tarefas repetitivas do dia a dia dos desenvolvedores que eram difíceis de tratar com ferramentas tradicionais de automação genérica
  • Como exemplo, até tarefas incômodas e repetitivas, como analisar a correlação entre stack traces e commits no git, podem ter um processamento inicial rápido feito pelo LLM
  • No futuro, é de se esperar que mais loops de agentes LLM personalizados e de uso pontual passem a ser usados em ambientes como o diretório bin/ dos desenvolvedores
  • Os usuários podem preparar apenas o bearer token desejado e experimentar facilmente em seu próprio ambiente

Links de referência

1 comentários

 
GN⁺ 2025-05-16
Comentários do Hacker News
  • Também quero recomendar fortemente este post de blog. É uma versão que trata do mesmo ponto de forma muito mais detalhada e convincente. O autor realmente constrói um agente de programação do zero. Veja https://ampcode.com/how-to-build-an-agent. É uma experiência realmente surpreendente ver o quanto um LLM consegue lidar bem com tarefas diversas dentro de um loop em que pode chamar ferramentas. Claro, não é perfeito, e há problemas como não chegar a 100% de confiabilidade. Mesmo assim, acho que há pelo menos algo de admirável nisso. Se fizer você mesmo, dá para acompanhar em 30 minutos. É algo que permite sentir deslumbramento sem perder um ceticismo saudável sobre se a IA é eficaz para usos específicos. Essa “eficácia anormal” de colocar um LLM em um loop é o motivo de existirem tantos agentes de geração de código agora: Claude Code, Windsurf, Cursor, Cline, Copilot, Aider, Codex etc., além de muitos projetos clonando a ideia. É por isso que não existe nenhum segredo especial; 95% da mágica acaba sendo o próprio LLM e o fato de ele ter sido ajustado para fazer chamadas de ferramentas. Foi algo que o principal desenvolvedor do Claude Code admitiu com franqueza em uma entrevista recente. Claro, dá muito trabalho fazer essas ferramentas funcionarem bem, mas, no fundo, a estrutura central simples é quase a mesma
    • Eu estava procurando um texto assim há muito tempo, então a sensação é de verdadeira gratidão. Muita gente olha para Agents e reage com algo como “talvez isso realmente não resolva problemas complexos, né?”, mas, na minha visão, o ponto central dos agentes não está aí. LLMs funcionam muito bem com bastante contexto, e agentes são uma estrutura para que o LLM encontre mais contexto e melhore a qualidade da resposta à pergunta
    • Pela minha experiência, não consigo pensar em muitas tarefas que um LLM consiga fazer sozinho, em loop, por mais de algumas iterações sem instruções. Depois de algumas voltas, sempre aparece uma situação em que eu preciso intervir
    • Existe um tutorial que faz algo parecido usando uma biblioteca de abstração em grafo chamada pocketflow. Usei na prática e fiquei muito satisfeito, porque é bem simples. https://github.com/The-Pocket/PocketFlow-Tutorial-Cursor/blob/main/blog.md
    • Só agora percebi que o autor é o Thorsten Ball. Lembro de ter lido “interpreter tsukuri” e achado muito divertido. Acho que agora eu também vou tentar fazer um agente
    • Antes de abrir o link acima, fiquei pensando se eu deveria acrescentar ?utm_source=hn&utm_medium=browser
  • Hoje tentei fazer “vibe-coding” pela primeira vez, usando GPT-4o e 4.1 diretamente. O método foi inserir manualmente erros de compilação, avisos e sugestões em um loop pela interface de canvas. O arquivo era pequeno, umas 150 linhas. Comecei com o 4o, que usou pacotes desatualizados. Mesmo quando apontei isso, ele não atualizou todos os usos, então tive que corrigir manualmente. Quando sugeri uma mudança de lógica, a sintaxe quebrou completamente, e ele nunca mais conseguiu se recuperar. Mesmo eu continuando a inserir erros de compilação, ele não entendia o problema sintático e só corrigia partes aleatórias do código. Então esperei que o 4.1 fosse melhor, mas o 4.1 se recusava a usar o canvas e só explicava. Era no estilo “corrija você mesmo”. Depois de muito insistir, ele finalmente soltou código no canvas, mas aí veio uma versão truncada no meio, tipo // omitted for brevity, então não dava para usar. Desisti aí. Fico curioso se os agentes resolvem esse problema. No momento, minha impressão é que essa experiência está completamente quebrada, e me preocupa demais dar acesso a bash em um estado desses
    • O fato de “ter usado pacotes desatualizados” acontece porque o ponto de corte dos dados de treino do modelo existe. É algo com que sempre é preciso tomar cuidado ao usar LLMs. No ChatGPT, tenho mudado bastante para o o4-mini-high. Esse modelo também consegue buscar documentação atual com o recurso de busca. Se você pedir algo como “veja a versão mais recente da biblioteca X e use essa”, ele frequentemente lida bem com isso. Recentemente, tive uma tarefa de converter parte de um código JavaScript para a biblioteca recomendada mais recente pelo Google; colei o código antigo e pedi para portar para a nova biblioteca, e ele procurou a documentação e fez o porte corretamente. https://simonwillison.net/2025/Apr/21/ai-assisted-search/#lazily-porting-code-to-a-new-library-version-via-search
    • GPT 4.1 e 4o pontuam muito baixo no benchmark de programação do Aider. Pela experiência prática, precisa dar pelo menos uns 70% para o resultado sair útil. Ainda assim, coisas complexas exigem bastante apoio. Com o uso, você vai pegando o feeling do que funciona e do que não funciona. https://aider.chat/docs/leaderboards/
    • Pode ser desagradável ouvir “é problema de habilidade”, mas usar LLMs realmente é um campo que exige prática própria. Entender as vantagens e limitações de várias ferramentas, experimentar técnicas diferentes e praticar é parte essencial. Se eu desse acesso a bash, também usaria só em ambiente de contêiner (docker)
    • Isso não dá para chamar de vibe coding. Para vibe coding, você precisa usar uma ferramenta em que as mudanças de código sejam aplicadas automaticamente. Se você vai dando feedback manualmente um por um, acaba travando nos erros. O ponto central do vibe coding é poder desfazer, reexecutar e testar ou descartar soluções diferentes com facilidade. Para ter essa experiência, você precisa de tooling
    • Há pouco tempo, usei o plugin Cline com Claude no VSCode para criar um protótipo de app Android “do zero”. Comecei com o template padrão que o Android Studio fornece, e ele gerou milhares de linhas de código sem um único erro de compilação. O app funcionou como eu esperava, e os poucos bugs encontrados não eram culpa do LLM, mas sim de comportamentos bizarros da API do Android. Apontei os bugs para o LLM e forneci saída de mensagens de debug, e ele mesmo corrigiu. No começo os ajustes foram meio desajeitados, mas depois de algumas rodadas de feedback a solução ficou boa. Se você colocar um agente escritor de código e um agente revisor de código em loop, acho que isso pode ser tratado de forma mais geral também
  • Uso o Claude Code, ou seja, a interface de terminal do Sonnet 3.7, desde o dia do lançamento. Já escrevi um app CLI de porte considerável, sistemas web full-stack e muitas utilidades. Acabei assumindo desafios mais ambiciosos, parecido com quando eu liderava uma equipe de programação. Estruturalmente talvez não seja tão diferente de outras ferramentas, mas a sensação é de que a Anthropic adicionou muitos recursos extremamente úteis. Nada é perfeito, e código de boa qualidade ainda exige um esforço parecido com o de antes. Até coisas bastante complexas funcionam, mas muitas vezes fica uma situação em que a próxima funcionalidade é difícil de adicionar. Conforme fui aprendendo a lidar com a ferramenta, o processo de refatoração e ajustes diminuiu muito. Não é uma estrutura em que isso vá desaparecer por completo. Sinceramente, é difícil até imaginar o problema que o kgeist descreveu. O Claude às vezes também faz algo bobo ou diferente do que eu escolheria, mas nunca a ponto de eu querer desistir. Quase sempre produz um resultado bom, e a quantidade de trabalho mental que ele tira das minhas costas é enorme. Além disso, ele refatora muito bem. Se eu revisar o código periodicamente e pedir para o Claude explicar uma forma melhor, a complexidade cai bastante. Pedidos como “mude a estrutura de dados” ele resolve na hora. É um recurso muito legal. E, por diversão, abri um diretório de arquivo acumulado ao longo de 30 anos, cheio de coisas não relacionadas a código. Perguntas como “o que tem neste diretório?”, “leia meu currículo antigo e reescreva”, “quais são os nomes dos meus filhos?” etc. foram realmente impressionantes. Mesmo ainda estando em estágio inicial, estou muito feliz
    • Recentemente, tive uma situação em que era preciso lidar de uma vez só com definição remota de estruturas de dados, especificação de API, implementação de parsing e armazenamento, e ainda exibir isso ao usuário. O Claude gerenciou tudo isso ao mesmo tempo muito bem, permitindo ver imediatamente como pequenas mudanças nas extremidades afetavam as camadas intermediárias. Fui iterando várias ideias rapidamente até encontrar a melhor solução. Foi impressionante poder explorar várias camadas de alta complexidade com uma velocidade de iteração tão alta, aumentando a produtividade e, ao mesmo tempo, minha compreensão estrutural do sistema como um todo
    • A refatoração mencionada acima é realmente uma tarefa muito prazerosa. Recursos que antes mal dava para colocar no sprint agora terminam em 5 minutos. Parece ter sempre uma equipe preparada, só esperando minhas demandas. Se eu não gostar do resultado, posso simplesmente recusar na hora, e toda a preocupação com revisão desnecessária e agendamento parece ter desaparecido
  • Fico muito frustrado quando o LLM às vezes diz algo como “ah, esse teste não funciona... vamos só pular”. Tenho uma ideia para pensar. Seria rodar junto um LLM de imposição de política, independente e paralelo, para fazer o LLM principal seguir as instruções. Por exemplo, o LLM auxiliar poderia manipular a probabilidade de saída para que, depois de “let's just”, a palavra “skip” não pudesse aparecer. Ou seja, ao proibir “skip”, seria possível desviar o LLM de um comportamento indesejado. Funcionaria como uma espécie de modo JSON ou saída estruturada, mas com um LLM auxiliar controlando a política de forma dinâmica e em tempo real. Se isso funcionar bem, depois daria para evoluir e colocar no prompt do auxiliar todo tipo de violação de política, como apagar testes para fazê-los passar ou gerar comentários inúteis, e o LLM auxiliar ficaria monitorando e controlando em tempo real. Fico curioso sobre o que a equipe do Outlines acharia dessa arquitetura
    • Nesse contexto, fico pensando se, caso um LLM consiga checar a saída de outro LLM, um LLM “mixture of experts” poderia designar um algoritmo especializado para atuar como monitor/auditor. Ou então separar uma thread de raciocínio para verificar a própria saída e, se necessário, adicionar ainda outra thread para verificar esse verificador, tornando a estrutura mais robusta
    • Nessa mesma linha, se o LLM principal for para a direção errada, também dá para imaginar um LLM de supervisão que “rebobine” o modelo até aquele ponto. Por exemplo, se detectar “let's just skip the test”, ele faria rollback a partir de “just ” e continuaria aplicando viés para impedir certas palavras. Para fazer esse tipo de coisa, talvez você fique limitado pelo provedor do modelo usado, e a OpenAI em particular parece ter ficado hostil recentemente a esse tipo de recurso avançado para power users
  • Hoje de manhã, com o cursor, extraí uma parte complexa do loop principal de um protótipo de jogo e gerei automaticamente um conjunto de testes para essa parte. No total, 341 testes cobrem toda a matemática central e os componentes principais. Às vezes parece uma espécie de “cat herding”, mas quanto mais restrições específicas eu dou — como quais funções usar, em que lugar, arquivos-template e o que evitar — melhor o resultado vai ficando. São 3.500 linhas de código de teste que eu não precisei escrever à mão, e que posso apagar e gerar de novo a qualquer momento se surgir algum problema. Também recebo ajuda em várias outras partes, como ajuste da curva de dificuldade e variações de missão
    • Na minha experiência, geração automática de testes é um dos melhores usos possíveis de LLM. Elimina de uma vez um trabalho chato e repetitivo que tomaria horas ou dias. Também cobre automaticamente muitos edge cases que eu não teria imaginado e ainda aumenta a segurança do código. É um recurso excelente em vários sentidos
  • Ultimamente estou muito empolgado com a capacidade de LLMs de usar ferramentas. Na verdade, esse truque não é novo; conheci isso pela primeira vez no artigo ReAcT, há 2 anos. Depois foi usado em plugins do ChatGPT, MCP etc., e agora a maioria dos modelos é treinada pensando em tool calls/function calling. O ponto interessante no momento é o quanto o desempenho melhorou. O excelente desempenho de busca do o3/o4-mini também se apoia nessa capacidade de tool calling. O Qwen3 4B (Ollama 2.6GB, roda bem até no Mac) também faz isso muito bem. Ontem dei um workshop sobre criação de software com LLMs na PyCon US e, por causa disso, adicionei suporte a uso de ferramentas à minha ferramenta de linha de comando para LLMs. Veja https://building-with-llms-pycon-2025.readthedocs.io/en/latest/tools.html. Agora, com meu pacote de LLM, dá para resolver de forma confiável em um shell one-liner coisas como “contar quantos Rs existem em strawberry”
    • Gosto muito dessa combinação estranha de diversão e poder que esse recurso traz
    • Fico curioso se o workshop foi gravado
  • Fico curioso sobre qual agent usa mais tokens. O cline parece estar no topo da lista, e o roo parece usar menos que o cline. Queria saber se existe algum agent em que dê para configurar diretamente o modo de interação, e como o Claude code se compara a outros agents
  • O ponto assustador é “se a ferramenta necessária não existe, ele instala”. LLMs são obedientes demais e têm uma estrutura em que executam algo assim que alguém manda. Isso é uma preocupação de segurança ainda mais séria do que SQL injection
    • Às vezes fico pensando quando vai acontecer o primeiro desastre de verdade com agents. (Especialmente nesse clima de mercado de IA em que tudo está sendo lançado às pressas.) Tenho receio de que, com o tempo, aconteça inevitavelmente algum desastre irreversível
  • O título parece ser inspirado no artigo do Eugene Wigner, “The Unreasonable Effectiveness of Mathematics in the Natural Sciences”
    • Pode até ser a origem, mas eu vejo isso como uma expressão idiomática que já virou meme faz tempo. https://scholar.google.com/scholar?q=unreasonable+effectiveness
    • Eu achei mais que o título viesse do “Unreasonable Effectiveness of RNNs”, do Karpathy, em 2015. Claro, também dá para supor que o próprio Karpathy estava reutilizando a referência ao artigo do Wigner. https://karpathy.github.io/2015/05/21/rnn-effectiveness/
    • Toda vez que vejo uma manchete com “unreasonable effectiveness”, minha experiência é de nunca concordar fortemente com a conclusão do autor. Inclusive no caso do artigo do Wigner. Para mim, isso já virou uma espécie de lei de Betteridge
  • Nós construímos ferramentas para dar mais contexto a um chatbot de IA embutido no nosso produto. Adicionamos várias funções, como logs de atividade recentes, definição do objeto atual, busca e navegação por artigos de ajuda. Mesmo depois de alguns meses, a qualidade do chatbot continua impressionando. Se o chatbot responde algo errado, nosso processo é atualizar de forma mais específica os artigos de ajuda relevantes