Por um Punhado de Dólares
O Radar paga um centavo de dólar por lista que monta, e essa conta cresce com cada pessoa nova. Treinei no notebook um classificador em português que faz o mesmo trabalho no servidor do Radar, por um custo fixo.
O que o Radar de Rolês tem de mais importante é indicar shows que a pessoa ainda não conhece a partir do que ela já ouve. Para montar uma lista, ele separa uns 300 shows candidatos na agenda da cidade e faz três perguntas sobre cada um ao Jev, um classificador da TypeSafe que eu chamo por API:
- o som de quem toca combina com o gosto da pessoa? (de 0 a 3)
- é show do próprio artista, festa ou tributo?
- a pessoa provavelmente já conhece esse artista?
Contei em outro post como o Jev entrou no Radar. Cada lista sai por volta de um centavo de dólar, o que para uma pessoa não é nada. O problema é que a conta é por lista: mil listas custam dez dólares, cem mil custam mil. O custo sobe em linha reta junto com o uso.
Daí veio a pergunta: e se as notas saíssem de um classificador meu, rodando no servidor que eu já pago?
O BERTimbau
BERTimbau base110 milhões de parâmetros
NeuralMind / Unicamp
O BERT é um modelo que o Google publicou em 2018. Ele não escreve nada. Lê um texto e devolve uma lista de 768 números, chamada de vetor, que resume o sentido do texto, e textos parecidos dão vetores parecidos. Para um classificador, isso basta.
O BERTimbau é um BERT treinado em português brasileiro. Ele nasceu na dissertação de mestrado de Fábio Souza na Faculdade de Engenharia Elétrica e de Computação da Unicamp, defendida em 2020. O orientador foi Roberto Lotufo, que por coincidência foi meu professor, e o artigo que apresentou o modelo saiu assinado pelos dois e por Rodrigo Nogueira. A versão base tem 110 milhões de parâmetros, bem pouco perto de qualquer modelo de linguagem atual, e cabe num servidor sem placa de vídeo.
Como treinei
professor: DeepSeek Flashcom thinking
9.221 pares · US$ 2,95
O BERTimbau sabe português, mas não sabe nada das minhas três perguntas. Ele precisa de exemplos. Quem deu as respostas foi o DeepSeek com o raciocínio ligado, que fez o papel de professor: avaliou 9.221 pares de pessoa e show e me custou US$ 2,95. Separei 7.784 pares para o treino e guardei o resto para a prova.
O truque está em como o modelo lê. Ele lê o gosto da pessoa e o texto do show separadamente, e cada um vira um vetor. Por cima do BERTimbau fica uma rede pequena, que no jargão se chama head: ela junta os dois vetores e devolve as três respostas.
- showcombinaconhece
- Rashid · CUMULONIMBUS2,81>99%
- Jean Tassy · ACRÔNICO2,8199%
- Froid · Humor Negro2,8099%
- … mais 295 shows
- Pagode 27 + Deu Samba na Cabeça0,130%
- Bravo Tenores In Concert0,000%
O modelo nunca lê as perguntas. Ele aprendeu o que cada uma quer dizer pelos exemplos, e elas ficaram gravadas nos pesos. É isso que permite separar as leituras. O Jev precisa ler gosto e show juntos em toda chamada, porque a pergunta chega escrita a cada vez. No BERTimbau, o vetor de cada show pode ser feito de madrugada e guardado, e na hora da lista só falta ler o gosto uma vez e fazer 300 contas pequenas.
RTX 4050 · 6 GB~7 min por treino
O treino precisa de placa de vídeo. Treinar significa ajustar os 110 milhões de números do BERTimbau e os 1,6 milhão da head, passando várias vezes pelos 7.784 exemplos, e esse tipo de conta em massa é o que uma GPU faz bem. Rodei no meu notebook, que tem uma RTX 4050 de 6 GB, e levou uns 7 minutos.
2 núcleos de CPU0,14 s por lista
Para usar o modelo, a placa já não faz falta. Com dois núcleos de processador, o mesmo que o servidor do Radar tem, o modelo deu nota a 250 shows de uma pessoa em 0,14 segundo. Transformar em vetor o catálogo inteiro de São Paulo, com 1.702 shows, levou uns 3 minutos, e isso fica para a madrugada.
O que está sendo medido
Para saber se esse classificador é bom o bastante para o Radar, precisei testar as respostas dele. A comparação toda é contra outro modelo: o gabarito é o do professor, o mesmo DeepSeek que gerou os exemplos do treino, e nenhuma pessoa deu nota para nada.
A prova usa as 36 pessoas reais do experimento. Para que nenhum modelo fosse testado num gosto que já tinha visto, separei as pessoas em quatro grupos e treinei o BERTimbau quatro vezes, cada vez deixando um grupo de fora para a prova. Para cada pessoa, separei até 45 shows entre os candidatos que o Radar escolheria, e o professor deu a cada show uma nota de 0 a 3. Como esses candidatos já passaram pela peneira do Radar, muitos combinam com a pessoa, e quantos depende do gosto: o professor aprovou de 2 a 38 deles.
A medida é simples. Cada modelo ordena os shows da pessoa pela própria nota, e eu conto quantos dos 10 primeiros o professor aprovou com 2 ou 3. Sortear 10 ao acaso já dá, em média, 56%, porque boa parte dos candidatos já é boa. Esse é o piso, e os modelos só se diferenciam acima dele.
O Jev ficou com 87% e o BERTimbau com 83%. A distância entre os grupos é bem maior que a distância entre os modelos: num grupo os dois ficam perto de 70%, noutro passam de 90%. Eu tinha começado com um grupo só, de 8 pessoas, e ali o sorteio já acertava 69% e o Jev chegava a 99%. Os números absolutos dependiam de quem caiu na prova. O próprio treino também balança: treinei o BERTimbau cinco vezes nesse primeiro grupo, com os mesmos dados, e o resultado variou uns 3 pontos para cada lado.
Para saber quanto vale a diferença entre os modelos, perguntei de novo ao próprio professor. Ele concordou consigo mesmo em 84%, e o BERTimbau está nesse nível. O professor dá notas inteiras, e muitas pessoas têm dezenas de shows com nota 2 ou 3, então na segunda rodada o topo dele sai quase num sorteio entre os empatados. O Jev e o BERTimbau dão uma nota contínua e põem no topo os casos mais óbvios. Acima desse ponto, a régua passa a medir quem escolhe os shows mais óbvios, e o Jev ficar na frente do próprio professor não quer dizer que ele entende o gosto melhor.
Qwen3 0.6B~1 s por show na CPU
~4,5 min por lista
Antes do BERTimbau eu tinha seguido a receita de um paper da NVIDIA e treinado um modelo de linguagem pequeno, o Qwen3 de 600 milhões de parâmetros, com as mesmas notas do professor. Na qualidade ele ficou um pouco atrás: no primeiro grupo de 8 pessoas, o único em que o testei, ficou 11 pontos abaixo do Jev, contra 6 do BERTimbau. O que tira o Qwen do jogo é o tempo. Com os mesmos dois núcleos de processador do servidor, ele leva um segundo por show, uns 4 minutos e meio por lista, contra 0,14 segundo do BERTimbau para a lista inteira. Um modelo que escreve texto para responder uma nota de 0 a 3 faz muito mais trabalho do que a pergunta pede.
Vale lembrar que toda essa avaliação foi feita contra o gabarito de outro modelo. Para saber se pessoas de verdade preferem as listas do BERTimbau ou as do Jev, só um teste A/B, ou algo parecido, vai responder.
A conta
Falta a pergunta que decide: vale a pena? E o custo aqui não é só dinheiro. Um modelo próprio acrescenta peças a um projeto que eu quero manter simples, então a economia precisa pagar também por essa complexidade.
Com o Jev, cada lista custa por volta de US$ 0,011, e o total cresce com o uso. Com o BERTimbau, cada lista sai praticamente de graça, e o que sobra é um custo fixo. O catálogo muda toda semana, com artista novo e casa nova, então o modelo precisa de um gabarito novo e de um treino novo toda semana. Com tudo dentro da AWS, onde o Radar já roda, a conta fica assim:
| custo fixo do BERTimbau | por mês |
|---|---|
| professor dando nota aos shows novos | US$ 2 |
| treino numa GPU alugada por hora | US$ 1 |
| mais memória no servidor, se precisar | até US$ 12 |
| total | US$ 3 a 15 |
Uma GPU fora da AWS sairia um pouco mais barata, mas a diferença é de centavos por mês e não vale a pena ter mais um fornecedor para cuidar.
Hoje o Radar monta umas 150 listas por mês, e o Jev sai por menos de US$ 2, abaixo até do custo mínimo do BERTimbau. Os dois só empatam entre 260 e 1.300 listas por mês, conforme o servidor precise ou não de mais memória. Com 10 mil listas, o Jev passaria de US$ 110, e o BERTimbau continuaria na mesma faixa.
Então, por enquanto, fico com o Jev. Se o Radar crescer, a troca em si é pequena: só muda de onde vêm as notas. Os candidatos, as regras da lista e o texto dos motivos continuam iguais, e o Jev pode ficar como plano B se o modelo próprio falhar. A complexidade que entra é de rotina: treinar de novo toda semana e, a cada pergunta nova, pedir um gabarito novo ao professor e treinar outra vez. Com o Jev, uma pergunta nova é só um texto novo na chamada.
Além do Radar
A receita vale para qualquer sistema que faz a mesma pergunta estreita milhares de vezes: separar manchete boa de manchete ruim, encaminhar chamado de suporte para a fila certa, etiquetar produto num catálogo, filtrar comentário. Um modelo grande responde alguns milhares de exemplos, um classificador pequeno aprende com eles em minutos e depois roda num processador comum, por um custo que não cresce com o uso.
Duas condições precisam valer. A pergunta tem que ser estável, porque cada mudança custa um treino. E é preciso uma régua para conferir se o modelo pequeno continua acertando, porque ele congela o que viu e o mundo não para.