65 pontos por xguru 2024-08-06 | 7 comentários | Compartilhar no WhatsApp
  • Ao longo do último ano, interagindo por algumas horas toda semana com modelos de linguagem de grande porte, fiquei continuamente impressionado com a capacidade deles de resolver tarefas cada vez mais difíceis
    • Como resultado, minha velocidade para escrever código em projetos de pesquisa e projetos pessoais aumentou pelo menos 50%
  • A maioria das pessoas que fala online sobre a utilidade dos LLMs é excessivamente otimista ou excessivamente pessimista
  • Em vez de debater o futuro, quero apresentar 50 exemplos de conversas do último ano em que usei LLMs para melhorar minha capacidade de pesquisa e ajudar em projetos de programação
  • Meus casos de uso de LLMs
    • Construir aplicativos web inteiros com tecnologias que eu nunca tinha usado antes
    • Aprender a usar vários frameworks sem precisar experimentá-los do zero primeiro
    • Converter dezenas de programas para C ou Rust e melhorar o desempenho em 10 a 100 vezes
    • Reduzir grandes bases de código e simplificar bastante projetos
    • Escrever o código experimental inicial de quase todos os artigos de pesquisa do último ano
    • Automatizar quase toda tarefa monótona ou script pontual
    • Quase substituir completamente pesquisas na web para configurar e ajustar novos pacotes ou projetos
    • Substituir cerca de 50% das pesquisas na web para depurar mensagens de erro
  • Se eu categorizar isso, são 2 coisas
    1. Ajuda para aprender: passar a conseguir fazer coisas que antes seriam difíceis
    2. Automatização de tarefas chatas: permitir focar no que faço melhor e resolver problemas difíceis
  • O mais importante é que estes são casos em que eu realmente usei LLMs e recebi ajuda
    • Não são para mostrar capacidades impressionantes, mas surgem da minha necessidade de lidar com trabalho real

Nuance

  • Uma coisa que a internet não lida bem é nuance. Eu não vou afirmar que os LLMs de hoje vão dominar o mundo, nem falar sobre o que os modelos do futuro poderão fazer
    • Vou discutir apenas se os modelos de hoje são úteis para mim
  • Você pode se perguntar por que estou escrevendo para justificar que modelos de linguagem são úteis. Mas parece haver muitas pessoas na academia, na engenharia de software e na mídia declarando amplamente que LLMs não contribuem em nada, que são apenas mais um ciclo de hype e que, em alguns anos, desaparecerão sem deixar qualquer impacto no mundo
    • Eu vou argumentar que elas estão erradas porque os LLMs atuais já são úteis
  • Por outro lado, também há pessoas que afirmam que os modelos de hoje podem substituir todos os programadores e que as pessoas não deveriam aprender programação
    • Não estou tentando refutar explicitamente essa afirmação
  • Eu entendo plenamente que LLMs podem causar muitos efeitos nocivos. Quero dizer desinformação, abuso, vigilância, substituição de empregos e tudo mais. Em breve pretendo escrever um texto sobre minhas ideias a respeito dos efeitos nocivos dos LLMs. Mas isso é uma questão separada de saber se modelos de linguagem podem ser úteis
  • Eu entendo muito bem por que alguém pode não querer usar LLMs, porque eles alucinam, repetem falsidades e podem falhar por falta de robustez. Mas este texto não é sobre isso
    • Acho que, apesar dessas falhas, os modelos podem ser úteis
  • A ética de treinar esses modelos é questionável. Você pode pensar no fato de terem sido treinados com dados de pessoas sem permissão, ou nas pessoas mal remuneradas para treinar explicitamente os modelos. Concordo que isso é um problema
    • Este texto não é sobre isso
  • Como já disse várias vezes, este texto vai falar apenas sobre se os modelos que existem hoje são úteis ou não

Minha história de fundo

  • Em geral, eu não sou alguém que acredita facilmente em alguma coisa. Há 10 anos, passei pelo hype de cripto na comunidade de segurança, mas evitei completamente escrever artigos sobre blockchain. Nunca tive Bitcoin. Sou cético em relação a toda afirmação
  • Quando alguém me disse pela primeira vez que essa tecnologia de IA seria muito útil e mudaria drasticamente a forma como trabalhamos no dia a dia, minha reação foi: "não vou acreditar até ver com meus próprios olhos"
  • Sou pesquisador de segurança. Nos últimos 10 anos, meu trabalho diário foi mostrar todas as formas pelas quais modelos de IA falham de maneira espetacular quando enfrentam ambientes para os quais não foram treinados. Mostrei que pequenas perturbações na entrada de modelos de machine learning podem fazer com que produzam saídas muito erradas, ou que a maioria dos modelos de machine learning memoriza exemplos específicos do conjunto de treinamento e os repete quando é usada. Entendo completamente as limitações desses sistemas
  • Ainda assim, digo que os atuais modelos de linguagem de grande porte trouxeram o maior aumento de produtividade desde a criação da internet. Se hoje eu tivesse que escolher entre acesso à internet ou acesso a um modelo de linguagem moderno para uma tarefa de programação escolhida aleatoriamente, em mais da metade dos casos eu escolheria o modelo de linguagem

[ Como eu uso LLMs ]

Construindo aplicações completas para mim

  • No ano passado, criei um quiz para testar quão bem o GPT-4 consegue prever a habilidade de alguém em resolver um pequeno número de tarefas. O quiz ficou bastante popular e teve mais de dez milhões de visualizações de página.
  • Pedi ao GPT-4 para escrever a maior parte da versão inicial dessa aplicação. Fiz isso começando por solicitar a estrutura básica da aplicação e, por meio de uma sequência de perguntas, construindo lentamente vários recursos
  • Essa conversa totalizou 30 mil palavras e usou toda a capacidade do então mais novo modelo GPT-4
    • [Os prompts e respostas reais foram omitidos]
  • Na conversa com o GPT-4, fiz pedidos de várias formas
    • Desde mensagens em que eu descrevia em palavras o que queria e pedia ao modelo a implementação completa, até mensagens pedindo mudanças específicas ("Em vez de comparar com a pontuação média, você pode usar KDE para informar o percentil?")
    • Também inclui mensagens com perguntas completamente incompletas, colando mensagens de erro (por exemplo, "Plotting: numpy.linalg.LinAlgError: singular matrix"), ou pedidos de respostas simples e pontuais ("Como adicionar um iframe a uma página em JavaScript com conteúdo carregado a partir de uma string?")
  • Por que modelos de linguagem são eficazes
    • Essa abordagem funciona porque modelos de linguagem resolvem bem coisas que outras pessoas já resolveram antes
    • 99% desse quiz era apenas HTML básico com um backend de servidor web em Python que outra pessoa poderia escrever
  • O que tornava esse quiz interessante e fazia as pessoas gostarem dele não era a tecnologia por trás, mas o conteúdo do quiz. E, quando você automatiza todas as partes chatas, fica muito fácil criar o quiz
  • Tenho certeza de que, sem a ajuda de um modelo de linguagem, provavelmente eu não teria criado esse quiz
    • Porque eu não tinha interesse em gastar tempo escrevendo uma aplicação web inteira do zero
    • E isso vindo de alguém que sabe programar!
  • Acredito que até os modelos atuais já são suficientes para permitir que a maioria das pessoas realize tarefas significativas que antes jamais conseguiria resolver, apenas pedindo uma solução
  • Mais adiante, vou apresentar alguns outros casos em que um modelo escreveu aplicações inteiras para mim e, quando eu lançá-las, deixarei claro que foram criadas com ajuda de modelos de linguagem

Atuando como tutor para novas tecnologias

  • Antes, eu tentava acompanhar novos frameworks, mas o tempo que uma pessoa pode dedicar é limitado
  • Por causa do meu trabalho, passo a maior parte do tempo acompanhando os avanços mais recentes em pesquisa, e não a evolução dos frameworks mais novos de JavaScript.
  • Ao iniciar um novo projeto fora de uma área específica de pesquisa, normalmente há duas opções
    • a primeira é usar o que você já conhece,
    • e a segunda é aprender uma forma nova (geralmente melhor) de fazer isso
  • É aí que os modelos de linguagem ajudam. A maioria dos frameworks e ferramentas mais novos, como Docker, Flexbox e React, não é novidade para outras pessoas. No mundo todo, deve haver de dezenas de milhares a centenas de milhares de pessoas que entendem essas coisas a fundo. Os modelos de linguagem atuais também.
  • Em vez de ler um tutorial estático, feito para um leitor específico e com um objetivo específico, você pode interagir com um modelo de linguagem e aprender o que precisa para resolver a tarefa em questão.
  • No começo deste ano, ao construir um framework de avaliação de LLM, eu queria executar código gerado por LLM em um ambiente restrito
    • Docker era a ferramenta perfeita para isso, mas eu nunca tinha usado antes.
  • Usar Docker não era o objetivo do projeto; era apenas uma ferramenta necessária para atingir esse objetivo
    • Eu queria entender só 10% do Docker, apenas o suficiente para ter confiança de que estava usando-o de forma segura e da maneira mais básica possível
  • Nos anos 90, eu provavelmente teria comprado um livro sobre como usar Docker partindo dos princípios básicos, lido os primeiros capítulos e depois pulado partes até descobrir como fazer o que eu queria
    • Nos últimos 10 anos, isso melhorou para procurar e seguir tutoriais online sobre como usar Docker, e então pesquisar mensagens de erro para ver se outras pessoas tiveram o mesmo problema
  • Mas hoje basta pedir a um modelo de linguagem que ensine Docker
    • Depois de configurar e executar o Docker, percebi que havia problemas de permissão ao rodá-lo no Linux. Eu queria resolver isso, então pedi ajuda ao modelo
    • Foi assim que conheci o Podman, e pedi ao modelo para reescrever um código específico de Docker em uma versão equivalente para Podman
    • E, quando quis descobrir como passar a GPU do host para dentro de um contêiner Docker, também pedi ajuda

Começando novos projetos

  • Quando eu era criança, minha primeira linguagem de programação foi Java. Eu realmente gostava de programar, mas odiava encarar uma tela em branco no começo de um projeto novo. Principalmente em Java!
    • Até compilar um programa Hello World era difícil: entender o que fazia public static void main string args, onde iam os parênteses, quais letras precisavam voltar a ser maiúsculas e por que havia chaves e colchetes espalhados por toda parte
  • Então fiz o que qualquer criança faria: pedi para o meu pai fazer isso por mim
  • Mesmo 20 anos depois, eu ainda odeio começar um projeto novo usando um framework com o qual não estou familiarizado
    • Leva tempo demais para eliminar o boilerplate, e eu nem entendo direito o que estou fazendo
  • Por exemplo, recentemente eu quis tentar escrever código em CUDA para comparar o desempenho, na GPU, de uma busca gulosa ingênua com a implementação eficiente e otimizada de CPU de outra pessoa
  • Mas eu não sabia como escrever um programa em CUDA
    • Eu sei escrever em C e entendo como GPUs funcionam, como kernels funcionam, layout de memória e assim por diante
    • Mas não sabia como escrever o código que de fato envia trabalho para a GPU
    • Então pedi ao modelo que escrevesse uma primeira versão de um programa em CUDA
    • Ficou perfeito? Claro que não! Mas foi um ponto de partida. E era exatamente isso que eu queria
  • Dá para ver que há bastante coisa errada nesse código
    • Na prática, isso não é problema nenhum
    • Porque eu não estava procurando uma solução perfeita, e sim um ponto de partida
    • Se no futuro os modelos ficarem melhores, isso vai ser incrível
    • Mas, mesmo com o que temos hoje, isso já ajuda muito.
  • Em um projeto pessoal totalmente diferente, no qual estou trabalhando em casa, estou usando um Raspberry Pi Pico W
    • Foi a primeira vez que usei um
    • Eu queria, em especial, fazer coisas de rede com ele
    • Claro, eu provavelmente conseguiria encontrar um bom tutorial online explicando como fazer o que eu queria
    • Mas, ultimamente, quando você pesquisa na internet, os cinco primeiros resultados costumam ser apenas fazendas de conteúdo lixo, com código bugado de 2008, atualizado só para SEO e que ainda assim não funciona
  • Então, em vez disso, pedi a um modelo de linguagem que me ensinasse a fazer o que eu queria
    • Eu já tinha trabalhado com microcontroladores antes, então entendia mais ou menos como eles funcionam
    • Mas nunca tinha trabalhado com o Pico W
    • Se eu só tivesse algo para me ajudar a começar com todas as dependências, eu conseguiria descobrir o resto
  • O primeiro programa de "hello world" que eu sempre escrevo para um novo microcontrolador é fazer um LED piscar
    • Isso permite testar se você consegue compilar e enviar código para o dispositivo, se todos os pinos estão configurados corretamente e, de modo geral, se o básico está funcionando
    • Então basta pedir um programa que pisque. (De novo: isso existe na internet? Quase certamente sim. Mas aí eu teria que procurar por conta própria.)
  • Depois de rodar esse código, eu já sei o que fazer a partir dali
    • Eu sei como Python funciona (acredite se quiser!)
    • Então, depois de resolver a parte específica de MicroPython, posso continuar editando dali mesmo
  • E, quando eu esbarrar em outro problema que exija algum tratamento especial, basta pedir ajuda ao modelo
    • Por exemplo, aqui a sequência foi pedir ao modelo que escrevesse um script para se conectar ao Wi‑Fi
  • E, sempre que eu travar de novo — como quando preciso me conectar a um servidor MQTT —, basta pedir ajuda ao modelo
  • Hoje em dia faço isso o tempo todo. Até o exemplo no topo desta seção não é hipotético
    • Estou perguntando como usar Flexbox porque a nova forma de aprender layout em HTML era usar div em vez de tabelas

Simplificando código

  • Como pesquisador de segurança, muitas vezes recebo um novo repositório com milhares de linhas de um projeto de pesquisa feito por outra pessoa e fico na situação de ter que descobrir como aquilo funciona para então atacar
    • Se todo mundo escrevesse código limpo, isso não seria tão difícil, mas não é assim que o mundo funciona
    • Pesquisadores não têm incentivo para publicar código limpo
    • Então, muitas vezes, as pessoas entregam código lixo que funciona. (Eu também faço isso)
  • Não tenho exemplos de pesquisa que eu possa compartilhar aqui, mas posso compartilhar um exemplo de um projeto pessoal em que estou trabalhando
    • Tenho uma obsessão nada saudável pelo Jogo da Vida de Conway
    • Recentemente, eu estava procurando uma forma rápida de avaliar alguns padrões de vida em Python
    • Existe uma ótima ferramenta em C++ para isso, o golly, mas eu não queria reescrever meu código Python em C++
  • O golly tem uma ferramenta de CLI que faz exatamente o que eu queria
    • Tudo de que eu precisava era saber como chamá-la da forma correta
    • O primeiro passo para isso foi pegar um código em C++ que suportava cerca de 50 opções diferentes de linha de comando e fazer com que ele executasse exatamente a única coisa que eu queria
    • Então joguei todas as 500 linhas de código C++ no LLM e pedi um arquivo menor que fizesse a mesma coisa
  • E o que aconteceu? Funcionou perfeitamente
    • Depois, pedi um wrapper em Python em volta do código C++. Isso também funcionou bem
  • Esse é o tipo de coisa que era tão chata que o próprio autor jamais faria
    • Mas agora, como basta pedir, acabei com algo 100 vezes mais rápido que o código original em Python
  • Eu faço esse tipo de coisa com bastante frequência. Tenho outro exemplo exatamente do mesmo tipo em Python
  • Nenhuma dessas tarefas é difícil
    • Mas, toda vez que faço isso, economizo uma quantidade significativa de tempo
    • E acho que essa é uma das razões pelas quais os LLMs de hoje são tão incríveis
    • Não é algo chamativo, e você não ganha muitos pontos na internet dizendo "aqui está uma forma entediante de usar LLMs para facilitar a minha vida", mas é isso que realmente está acontecendo

Automatizando tarefas monótonas

  • Há muitas tarefas que não exigem reflexão, são entediantes, mas precisam ser feitas
  • Um dos principais motivos para adiar um trabalho é saber que concluí-lo vai ser irritante e doloroso
    • Os LLMs reduzem enormemente esse sofrimento e, como você sabe que só precisará resolver as partes interessantes, fica muito mais fácil começar alguma coisa
    • Aqui vou ver problemas completamente cotidianos que resolvi pedindo ajuda a um LLM
  • Por exemplo, recentemente precisei fazer o disassembly de um programa Python escrito para Python 3.9
    • A maioria dos disassemblers de Python só funcionava em versões anteriores ao Python 3.7 e não rodava em binários 3.9
  • Fazer disassembly não é um trabalho realmente difícil. Em grande parte, trata-se de não cometer erros enquanto se reconstrói o fluxo de controle seguindo os gotos
    • Em vez de gastar tempo convertendo manualmente milhares de opcodes em centenas de linhas de código, pedi para um LLM fazer isso por mim
    • E ele fez isso incrivelmente bem! Muito, muito melhor do que eu achava possível
  • Outro exemplo é quando é preciso pegar dados não estruturados e formatá-los em uma estrutura organizada
    • Por exemplo, eu estava trabalhando em um projeto e precisava de uma lista de títulos de livros com o nome dos autores
    • Então encontrei os dados online em formato não estruturado e pedi para um LLM formatá-los
  • Ou, recentemente, ao escrever um post de blog sobre como eu havia contornado uma defesa, eu queria mostrar o diff completo do código que precisei alterar
    • Então colei (1) o diff e (2) um exemplo anterior de como transformar um diff em HTML, e pedi para o LLM apresentar esse diff no formato anterior
  • Outro exemplo é que, como parte do meu trabalho, muitas vezes preciso gerar citações de recursos que uso com frequência
    • O Google Scholar faz isso facilmente para artigos, e basta copiar e colar a citação
    • Mas citar páginas da web é um pouco incômodo
    • Recentemente, tenho pedido a um LLM para gerar a citação. (Para deixar claro, eu verifico se está correto!)
  • Eu poderia dar pelo menos mais 100 exemplos assim. Mas acho que você já entendeu a ideia
  • Entendo perfeitamente que alguém possa olhar para isso e dizer: "É só isso??"
    • Mas vale lembrar que, há apenas 5 anos, eles mal conseguiam encadear um parágrafo coerente, quanto mais resolver um problema inteiro

Transformar todo usuário em um "power user"

  • Se você já viu alguém muito menos habilidoso do que você usar uma ferramenta, isso pode ser um tanto doloroso
    • Dá para ver a pessoa gastando minutos, às vezes horas, em tarefas que poderiam ser automatizadas com algum tipo de macro ou uso inteligente de aplicativos em paralelo
  • Mas aprender os encantamentos necessários para fazer isso leva tempo e é difícil
  • Por exemplo, recentemente tentei escrever um programa em Python para lidar com a entrada de teclado em um teclado Apple Lisa
    • Encontrei online alguém que tinha escrito algo em C para fazer isso, e havia muitas linhas como #define KEYNAME key_code
    • Eu queria transformar isso em um dicionário Python que mapeasse os códigos inteiros para essas strings
  • Eu sou usuário de Emacs. Sei como resolver esse problema no Emacs. Não deve ser tão difícil. Aqui está a principal captura que acabei de gravar e que conseguiu produzir esse efeito:
    C-h C-s #def [enter] M-f [delete] C-d M-f C-[space] M-f C-w C-a C-y : " M-f ", C-g C-] } C-[ {
  • Para mim isso é quase natural, mas, para que se tornasse natural, passei mais da metade da minha vida ficando suficientemente familiarizado com o Emacs. Mas agora, se um LLM estiver conectado ao editor, o que eu digitaria?
    C-h C-h rewrite these #defines to a dictionary of {keycode: string, ...}
  • E então, de repente, o texto é reescrito diante dos meus olhos!
  • Em casos assim, acho que a utilidade potencial dos LLMs é maior para não especialistas do que para especialistas
    • O modelo eleva o nível de todo mundo, e, se antes você não conseguia fazer nada disso, de repente passa a conseguir fazer muito mais

Usar como referência de API

  • Programadores de verdade leem o manual de referência quando querem saber como uma ferramenta funciona
    • Mas eu sou um programador preguiçoso e só quero que me deem a resposta pronta
    • Então agora eu pergunto ao modelo de linguagem
  • Quando mostro exemplos assim, algumas pessoas reagem de forma defensiva e dizem: "O LLM não fez nada que você já não pudesse fazer com as ferramentas que tinha!"
    • E elas estão certas
    • Mas não há nada que você possa fazer com um mecanismo de busca que não pudesse fazer com um livro físico, e não há nada que você possa fazer com um livro físico que não pudesse fazer lendo o código-fonte
  • Mas cada uma dessas etapas, por sua vez, fica mais fácil do que a anterior
    • E, quando alguma coisa fica mais fácil, você a faz com mais frequência e de um jeito qualitativamente diferente.
  • Casos com prompts
    • Pergunto "no Bash, qual $ fornece todos os argumentos restantes" e obtenho a resposta. (Logo em seguida vem outra pergunta: "como eu uso isso"!)
    • Ou, quando quero saber como deixar um texto vermelho em LaTeX, em vez de pesquisar ou ler a documentação, pergunto ao modelo
    • E faço o mesmo quando quero saber quais comandos do LLDB correspondem a vários comandos do GDB
    • Ou quando quero entender como algum comando find funciona
    • Ou como usar lpr
    • Ou como fazer rebinding de comandos no LaTeX
  • Na verdade, essa é uma das formas como mais uso LLMs
    • O único motivo de eu não conseguir emendar mais milhares de exemplos assim é que tanto o Emacs quanto o shell têm ferramentas integradas para consultar um LLM
    • Então, em 90% dos casos, quando quero fazer uma dessas coisas, nem preciso sair do editor

Procurar coisas difíceis de encontrar

  • Buscar conteúdo na internet antigamente era uma habilidade difícil de aprender
    • Quais palavras específicas eu queria incluir na consulta? Elas deveriam estar no plural? No singular? No passado?
    • Quais palavras eu não queria que aparecessem na página? Eu queria X AND Y, ou X OR Y?
  • Isso não é mais assim
    • Nem me lembro da última vez em que escrevi uma consulta com OR no Google
    • Também não me lembro da última vez em que usei um sinal de menos (-) para remover um subconjunto dos resultados
    • Hoje, na maioria dos casos, basta escrever o que você quer encontrar e o mecanismo de busca encontra.
  • Mas mecanismos de busca ainda não são consultas 100% em linguagem natural
    • Ainda parece que estou jogando Reverse-Jeopardy, tentando usar palavras-chave que entrariam na resposta, e não na pergunta
    • Isso é uma habilidade que quase todos nós aprendemos e depois esquecemos que aprendemos
  • Modelos de linguagem hoje simplesmente são melhores para algumas tarefas simples (e cada vez mais, com o passar do tempo)
    • Basta digitar algo como “então + corresponde a add, mas o que é ~?” e ele responde que é inv
  • Isso é muito difícil de procurar em um mecanismo de busca tradicional
    • Eu sei que existe uma forma de encontrar a resposta
    • Provavelmente eu digitaria algo como “python documentation metaclass add” e depois procuraria ~ na página para achar a resposta
    • Mas também funciona simplesmente fazer a pergunta que eu tenho para um LLM
  • Fazer isso economiza apenas alguns segundos por vez, mas quando você está tentando resolver alguma tarefa de programação e já está lidando com um milhão de coisas ao mesmo tempo, é incrível poder simplesmente despejar o que está tentando resolver e obter uma resposta coerente
  • Isso não significa que eles sejam perfeitos nisso hoje
    • Modelos de linguagem só sabem sobre coisas online quando elas foram repetidas com frequência suficiente
    • O que “com frequência suficiente” significa varia de modelo para modelo, então ainda preciso gastar alguns ciclos mentais pensando se devo perguntar ao modelo ou à internet
    • Mas os modelos vão continuar melhorando
  • Ou então, sempre que acontece alguma falha aleatória, eu despejo para o modelo o que estou vendo e peço uma explicação
    • Aqui, por exemplo, eu digitei “Remote wildcard transfer issue” para fazer isso
  • Em um exemplo totalmente diferente, no ano passado eu estava escrevendo um post no blog e queria aumentar a primeira letra da primeira palavra e fazer o restante do texto contorná-la
    • Isso se chama capitular. Mas eu não sabia disso
    • Eu só sabia o efeito que queria, então perguntei ao modelo de linguagem algo como “quero que isso pareça um livro elegante, com o texto contornando um O”, e ele me deu exatamente o que eu queria
    • Essa também entra na categoria de coisas que eu “só fiz por causa do LLM”
    • Eu provavelmente não teria achado que valia a pena gastar muito tempo descobrindo como fazer isso
    • Mas, como eu podia perguntar ao modelo, eu fiz, e isso deixou meu post um pouco mais bonito

Resolver tarefas pontuais

  • Existem dois tipos de programas
    • Primeiro, há os programas que eu quero fazer direito. Eles vão existir por um tempo e vou ter que mantê-los por anos, então organização importa
    • Segundo, há os programas que vão existir por 25 segundos. Eles ajudam a concluir alguma tarefa e são descartados imediatamente
  • Quando o programa é totalmente independente e eu não me importo nem um pouco com a qualidade do código, hoje em dia eu quase sempre uso LLMs para escrevê-lo
  • Aviso: na maior parte desses casos, também são coisas do tipo “é só isso?”
    • Mas, como eu disse antes, o tempo disponível em um dia para investir em um projeto é limitado
    • E, se eu puder economizar tempo e energia mental ao escrever um programa que nunca mais vou usar, eu vou fazer isso
  • O exemplo mais comum provavelmente é pedir ajuda para gerar um gráfico que visualize dados produzidos como resultado de algum experimento de pesquisa
    • Tenho dezenas de exemplos assim. Talvez mais perto de 100 do que de 0. Todos parecem basicamente iguais, então vou colocar só um aqui
  • Outro exemplo parecido é quando eu tenho dados em um formato e quero convertê-los para outro formato
    • Normalmente isso é algo que eu só preciso fazer uma vez e, quando termina, jogo o script fora
  • Se o script que eu quero é simples o bastante, muitas vezes peço ao LLM para escrever tudo
    • Por exemplo, aqui eu pedi a um LLM que escrevesse um script para ler um artigo em voz alta, de modo que eu pudesse verificar se não havia problemas gramaticais idiotas
  • Na maioria das vezes, quando eu não sei muito bem o que quero, começo pedindo ao modelo um código inicial e vou iterando a partir daí
    • Por exemplo, aqui há uma tarefa pontual em que eu precisava processar dados rapidamente
    • Em 2022, eu teria gasto 2 minutos escrevendo isso em Python e depois esperado horas para executar, já que só precisaria rodar uma vez
    • Levaria mais tempo otimizar do que deixar o programa em Python rodar
    • Mas agora? Tenho certeza de que gastaria os mesmos 2 minutos pedindo código em Rust para processar meus dados
  • Ou há outro exemplo em que pedi ao modelo para baixar um conjunto de dados e fazer um processamento inicial
    • Isso seria fácil para mim? Provavelmente sim
    • Mas não é esse o tipo de trabalho em que eu quero pensar
    • Eu quero pensar na pesquisa que vou fazer com o conjunto de dados
    • Remover distrações vale muito mais do que os poucos minutos economizados
  • Em outra ocasião, eu estava escrevendo um programa para poder imprimir em 3D uma imagem pixelada em pequenos cubos
    • Para isso, eu queria converter um PNG em um arquivo STL, mas esse não era o ponto do projeto
    • Era só algo que precisava acontecer no meio do caminho. Então pedi ao LLM para resolver isso
  • Em outro caso, recentemente eu queria configurar um projeto novo usando Docker Compose
    • Eu estava tendo problemas e só queria que funcionasse de qualquer jeito; descobriria depois o que estava errado
    • Então acabei fazendo várias rodadas, apenas copiando as mensagens de erro uma por uma, até conseguir uma solução que funcionasse.
  • Também, em muitos casos, percebo que começo pedindo uma solução completa e depois peço dicas sobre como modificá-la
    • Nesta conversa aqui, começo pedindo um programa para fazer parsing de HTML e, a partir daí, peço referências de API ou dicas de como melhorá-lo
  • Em outra ocasião, eu queria acompanhar quanta memória e CPU meu computador usava ao longo do tempo
    • Eu poderia ter passado alguns minutos descobrindo os comandos certos e juntando-os em um script que fizesse o que eu queria, mas simplesmente pedi ao modelo de linguagem para fazer isso por mim
  • Recentemente eu estava tentando montar um pequeno projeto de eletrônica, tinha um programa em C que rodava em Arduino, mas queria executá-lo em um Raspberry Pi Pico com MicroPython
    • Não há nada de interessante nesse processo de conversão. Só precisava ser feito
    • Então, em vez de fazer eu mesmo, pedi ao modelo de linguagem para fazer por mim
  • Em outro projeto, eu precisava classificar algumas imagens com algum modelo de ML legal dentro de um loop interativo
    • Eu poderia ter escrito isso sozinho, mas também podia simplesmente pedir ao modelo para fazer isso por mim

Me explicar alguma coisa

  • Recentemente comecei a me interessar por eletrônica
    • Quando era mais novo, mexia com eletrônicos e fiz algumas disciplinas na universidade
    • Mas agora que estou tentando fazer projetos de verdade, é difícil fazer qualquer coisa por causa de milhares de pequenos detalhes que eu não sei
  • Eu até poderia ler um livro de eletrônica prática, e talvez assim passasse a entender o assunto direito, mas não quero gastar meu tempo como se estivesse estudando
    • Metade do motivo de eu mexer com eletrônica é para fazer uma pausa de passar o dia inteiro lendo e escrevendo artigos
  • O bom dos LLMs aqui é que, embora eles não sejam tão eruditos quanto a pessoa mais conhecedora do mundo, existem milhares, milhões de pessoas que sabem responder às perguntas sobre eletrônica que eu poderia ter
    • Então o modelo de linguagem provavelmente também vai saber a resposta
    • E ele está sempre disposto a me dizer a resposta para qualquer pergunta, então eu consigo ter a diversão que quero sem ficar brigando com os detalhes
    • E, embora eu pudesse encontrar a resposta pesquisando na internet com um pouco mais de esforço, depois de passar o dia inteiro trabalhando com código de pesquisa complicado, a conveniência de só pedir ao modelo é muito reconfortante
  • Então aqui vai uma coleção de exemplos em que fiz perguntas básicas a um modelo de linguagem sobre como a eletrônica funciona
    • Essas respostas são perfeitas? Quem sabe
    • Mas isso é melhor do que não saber nada?
  • (Este texto já está ficando bem longo, e a esta altura você provavelmente está tão cansado de ler quanto eu de escrever. Então vou simplesmente deixar esses exemplos aqui, sem nenhuma explicação.)
    • Perguntas básicas sobre design de PCB
    • Perguntas básicas sobre soldagem
    • Perguntas básicas sobre capacitores
    • Perguntas básicas sobre LEDs
    • Perguntas básicas sobre disquetes
  • Eu poderia continuar, mas acho que você já entendeu a ideia

Resolver tarefas com soluções já conhecidas

  • Quase tudo já foi feito por alguém
    • Quase nada do que você quer fazer é realmente novo
    • E os modelos de linguagem são muito bons em fornecer soluções para coisas que já viram antes
  • Num projeto recente, eu precisava melhorar o desempenho de um pedaço de código Python
    • (1) Pedi ao LLM para reescrevê-lo em C, e depois
    • (2) pedi para ele criar uma interface que permitisse chamar o código C a partir de Python
  • Essas tarefas não são “difíceis”
    • Converter de Python para C provavelmente levaria 1 ou 2 horas
    • E eu não sei exatamente como funciona a API de Python->C, mas poderia descobrir lendo a documentação
    • Só que eu nunca teria feito isso por conta própria
    • Simplesmente porque isso não está no caminho crítico; em vez de gastar tempo tornando mais rápidas coisas que não preciso executar com frequência, é melhor esperar e deixar o computador resolver o trabalho
  • Mas, no caso de programas simples, converter de Python para C é (na maior parte) um processo mecânico, e existe exatamente uma convenção padrão de chamada Python->C
    • Então eu simplesmente peço ao LLM para fazer isso por mim.
  • Desde então, passei a esperar que isso seja algo que eu posso fazer, e basicamente sempre que preciso de um trecho de código rápido, eu apenas descrevo em Python o que quero e peço um C otimizado
  • Em outras ocasiões, faço a mesma coisa, mas peço saída em Rust em vez de C, quando acho que será mais fácil julgar a correção do resultado em Rust comparando com a saída em C
  • Outro exemplo: paralelizar uma função Python usando uma biblioteca de multiprocessamento não é difícil
    • É preciso escrever um pouco de boilerplate e basicamente isso simplesmente acontece
    • Mas escrever esse código é meio incômodo e atrapalha o trabalho que eu realmente quero fazer
    • Agora, sempre que preciso disso, eu simplesmente peço ao LLM para fazer por mim
  • Ou então, muitas vezes, ao testar alguma API, no começo eu só escrevo uma requisição curl para fazer a coisa funcionar pela primeira vez
    • E, quando isso já está funcionando e eu quero repetir a tarefa programaticamente, eu converto para Python
    • Antes, eu normalmente fazia alguma gambiarra bem feia e simplesmente chamava os.popen() para executar o comando curl, o que não é bom
    • Seria melhor converter para a biblioteca requests do Python. Mas isso leva tempo, então eu não faria
    • Só que agora eu simplesmente peço ao LLM para fazer isso por mim e consigo um programa mais limpo mais rápido
  • Num projeto futuro sobre o qual provavelmente vou falar aqui, eu precisava saber que tipos de coisas as pessoas usam com transmissores sem fio simples
    • Como o que eu realmente quero é uma resposta de uma pessoa mediana, o LLM é a escolha perfeita!

Corrigir erros comuns

  • Antes de 2022, quando eu recebia uma mensagem de erro de alguma ferramenta ou biblioteca conhecida, eu seguia um protocolo mais ou menos assim:
    1. Copiar a mensagem de erro
    2. Colar no Google
    3. Clicar no primeiro link do Stack Overflow
    4. Verificar se a pergunta é a que eu queria fazer; se não for, voltar ao passo 2
    5. Aplicar a principal solução ao meu problema
    6. Se não funcionar, voltar ao passo 2, mudar os termos de busca, rezar etc.
  • Sinceramente, a ferramenta que quebra geralmente está, no fim das contas, a uns 5 passos da tarefa que eu realmente estou tentando resolver, e eu não me importo muito com como ela funciona; só preciso que funcione
  • E em 2024, como isso fica?
    1. Copiar a mensagem de erro
    2. Perguntar ao LLM: “como eu corrijo este erro? [erro]”
    3. Aplicar a solução passo a passo sugerida pelo LLM
    4. Se não funcionar, dizer: “não funcionou”
  • Não tenho nenhuma cópia para mostrar como exemplo disso. (Ou pelo menos não consegui encontrar uma, mesmo procurando por uma hora.) Mas existe um bom motivo para isso: eu incorporei isso diretamente ao meu fluxo de trabalho
    • Eu uso Emacs
    • Configurei meu ambiente para que, toda vez que um programa é executado e termina com um código de status diferente de zero (ou seja, quando deu algum problema), ele chame automaticamente o LLM mais rápido e mais avançado disponível para pedir uma explicação da resposta e, ao mesmo tempo, solicitar um patch que eu possa aplicar diretamente para corrigir o bug no código
    • Os modelos de hoje ainda não são bons o suficiente para superar o autor nessa tarefa na maioria dos casos, mas estão chegando perto
    • E, de vez em quando, quando há um bug causado por algum erro de digitação escondido em algum lugar e que eu sei que seria um pesadelo rastrear, é uma surpresa agradável quando o LLM resolve isso por mim

Resumo

  • Todas as conversas linkadas acima representam menos de 2% de todas as conversas que tive com LLMs no último ano
  • O motivo de eu não ter linkado as outras conversas não é que sejam casos em que o modelo falhou (embora, claro, existam muitos desses)
    • (1) e sim porque repetem o mesmo padrão das conversas que já linkei, ou
    • (2) porque não é fácil explicar o que está acontecendo nem verificar diretamente por que aquilo é útil
  • Espero continuar aumentando meu uso desses modelos no futuro
  • Como referência, em 2024 fiz 30% mais consultas a LLMs via interface web do que em 2023, e não consigo agregar o aumento das consultas via API, mas imagino que tenha sido pelo menos de 2 a 3 vezes

Avaliar não o que os LLMs não conseguem fazer, mas o que conseguem fazer

  • Ao avaliar um candidato em uma entrevista, deve-se prestar atenção não no que ele não consegue fazer, mas no que consegue
  • Se você fizer perguntas triviais a um LLM, ele pode parecer incompetente. Por exemplo, se fizer uma pergunta em chinês, usado por 1 bilhão de pessoas, ele pode ter dificuldade para responder direito
  • Mesmo dentro da ciência da computação, há muitas áreas que desconheço, como saber apenas algo no nível de uma instrução SELECT de SQL
  • É difícil entender quando, online, dizem que os LLMs são superestimados só porque não conseguem executar uma determinada task
    • Não conseguem contar o número de palavras em uma frase
    • Não conseguem escrever um poema em que todas as palavras comecem com a
    • Não conseguem multiplicar números de dois dígitos
    • Não conseguem escolher um elemento aleatório de uma lista
  • No entanto, fica a dúvida se alguém realmente já pensou que um LLM fosse a ferramenta adequada para fazer esse tipo de coisa
  • Assim como não dizemos que um ser humano é inútil por não conseguir fazer divisão de inteiros de 64 bits de cabeça, não faz sentido descartar os LLMs só porque se construiu um problema que eles não conseguem resolver
  • O importante é se existem tasks nas quais os LLMs podem oferecer valor
  • Programadores já sabem muito bem que linguagens diferentes são úteis para objetivos diferentes
    • Para escrever um sistema operacional, C é mais adequado que Python
    • Ninguém diz que Python é ruim porque não consegue alinhar variáveis em limites de 32 bytes. É apenas um nível de abstração diferente
  • Com os LLMs acontece o mesmo: eles operam em um nível de abstração muito alto
    • É difícil esperar que um LLM seja a melhor opção para tarefas que até um programa simples consegue resolver
    • Mas é razoável esperar que ele consiga resolver outros tipos de tarefa

Conclusão

  • Duas motivações para escrever este texto
    • Defender que os LLMs já estão oferecendo muito valor para mim pessoalmente
    • Mostrar exemplos de uso para pessoas que acham a ideia dos LLMs boa, mas não sabem como isso poderia ajudá-las
  • O valor dos LLMs
    • Os LLMs não conseguem fazer tudo, mas mesmo os modelos atuais já oferecem valor considerável
    • Por exemplo, podem diagnosticar erros de CUDA e explicar como reinstalar pacotes, reescrever um programa em C ou ensinar sobre um tema específico
    • Essas são coisas que até um universitário conseguiria fazer com algumas horas de esforço, mas não existe um universitário sempre disponível para responder perguntas. Um LLM, por outro lado, consegue estar
  • A evolução dos LLMs e a situação atual
    • Há apenas 5 anos, o melhor que os LLMs conseguiam fazer era escrever parágrafos plausíveis em inglês, e a utilidade prática era nula
    • Hoje, porém, os LLMs aumentam a produtividade em tarefas de programação em pelo menos 50% e eliminam trabalhos tediosos
    • Graças aos LLMs, concluí vários projetos que eu nem teria tentado antes
  • Contestação à ideia de que os LLMs são úteis
    • Discordo da afirmação de que "LLMs são superestimados e não têm valor real"
    • Pessoalmente, os LLMs estão me trazendo grande valor
    • Mesmo eu, com 20 anos de experiência em programação, tive um grande aumento de produtividade com os LLMs
    • Acho que há muitas outras pessoas além de mim que também podem se beneficiar dos LLMs
  • Perspectivas para o futuro
    • Mesmo os modelos atuais já oferecem muito valor
    • Nos próximos 5 anos, minhas expectativas e meus receios sobre como os LLMs vão evoluir se misturam
    • Pretendo tratar dessas previsões no próximo texto

7 comentários

 
edunga1 2024-08-06

É um texto com o qual dá para se identificar. O autor usa isso tão bem que até cansa de ler..;

> O único motivo pelo qual não dá para conectar mais alguns milhares de exemplos como esse é que tanto o Emacs quanto o shell já têm ferramentas integradas para consultar LLMs

Eu também parece que não saio da janela do terminal. Acho que todo desenvolvedor preguiçoso acaba usando assim, não é?
Se for um problema simples, uso o copilot.vim, abro qualquer buffer e vou induzindo a resposta com o autocompletar.
Se eu não lembrar um comando de shell, existe o comando ?? do copilot-cli, então nem preciso pesquisar.
As ferramentas de completamento de código entendem a intenção e geram o código antes mesmo de eu perguntar.

Como o texto principal diz, eu sei como pesquisar, mas gosto mais do LLM porque posso perguntar livremente, sem precisar ser formal.

 
galadbran 2024-08-06

Eu também uso o copilot-vim! Gostaria de perguntar a qual copilot-cli você está se referindo.

 
edunga1 2024-08-06

https://www.npmjs.com/package/@githubnext/github-copilot-cli
É isso!

https://docs.github.com/ko/copilot/…
Também existe uma versão de extensão do GitHub CLI, mas a forma de usar é um pouco diferente.

 
galadbran 2024-08-08

É bom poder contar com a ajuda do Copilot até na linha de comando, obrigado!

 
wedding 2024-08-06

Quando sei como fazer, mas bate preguiça de digitar, peço para o ChatGPT fazer.
Acho que, para usar bem, é preciso saber avaliar o resultado.

 
xguru 2024-08-06

O autor enfatiza dois usos principais dos LLMs: 1. ajuda no aprendizado 2. automação de tarefas tediosas.
Ultimamente, para mim, é exatamente isso. Pensando nas coisas que fiz recentemente:

  1. Criar o design de um organizador de jogo de tabuleiro com código OpenSCAD
  • Em vez de fazer no Fusion, pedir para gerar código OpenSCAD facilita a reutilização depois.
  • Quando peço para lidar com parâmetros, ele também transforma bem em funções, então dá para usar em vários contextos.
  1. Escrever um script em Python para automatizar a extração de imagens de um PDF escaneado de cartas e ajustá-las do jeito que eu quero
  • Uso isso em várias etapas para escanear e traduzir para coreano jogos de tabuleiro que provavelmente não terão versão coreana.
  1. Escrever JavaScript para copiar carrinhos de compras de lojas online
  • Estou automatizando o preenchimento no serviço de redirecionamento de encomendas com compras feitas em várias lojas estrangeiras de jogos de tabuleiro.

Claro que são coisas que também dariam para fazer sem LLM, mas simplesmente mandar fazer é mais rápido, então é perfeito como ferramenta de life hacking.

 
helloppfm 2024-08-06

Concordo com muita coisa.
Parece bem com o que eu sinto ao usar IA.