nofone n of one
radar-de-roles
23 out 2026

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:

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 base
110 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 Flash
com 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.

o gosto, como textoArtistas: Kendrick Lamar, Racionais MC's, Djonga, Sabotage, Criolo.
→
BERTimbauuma vez por pessoa, na hora da lista
→
u768 números
300 shows candidatos, como textoRashid · CUMULONIMBUS. Local: Casa Natura Musical. Estilos: Rap nacional novo. Público: fãs de Emicida, Criolo.
→
BERTimbauo mesmo modelo, uma vez por noite, para cada show do catálogo
→
v300 vetores, guardados
→
headjunta u com cada v1,6 milhão de parâmetros300 vezes por lista, em microssegundos
→
  1. showcombinaconhece
  2. Rashid · CUMULONIMBUS2,81>99%
  3. Jean Tassy · ACRÔNICO2,8199%
  4. Froid · Humor Negro2,8099%
  5. … mais 295 shows
  6. Pagode 27 + Deu Samba na Cabeça0,130%
  7. Bravo Tenores In Concert0,000%
O gosto é lido uma vez, na hora da lista. Os shows foram lidos de madrugada, e seus vetores ficam guardados, iguais para todo mundo. A head roda uma vez para cada par de gosto e show e dá a nota que ordena os candidatos; em destaque, o show do exemplo. Ela também responde o tipo do evento, que ficou fora da tabela. O perfil é inventado e as cores dos vetores são ilustrativas; as notas são as que o modelo deu de verdade.

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 CPU
0,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.

sorteio 56%professor 84%
JevTypeSafe, por API
87%
BERTimbau110M, no servidor
83%
50%60%70%80%90%100%
Dos 10 shows que cada modelo põe no topo, quantos o professor aprova com nota 2 ou 3. O ponto grande é a média das 36 pessoas; os pequenos, a média de cada um dos quatro grupos, cada um testado por um BERTimbau que nunca viu aqueles gostos. O eixo começa em 50%.

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 BERTimbaupor mês
professor dando nota aos shows novosUS$ 2
treino numa GPU alugada por horaUS$ 1
mais memória no servidor, se precisaraté US$ 12
totalUS$ 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.

US$ 1 US$ 10 US$ 100 US$ 1.000 100 1.000 10.000 100.000 listas por mês custo das notas por mês BERTimbau: US$ 3 a 15 fixos Jev: US$ 0,011 por lista ~1.300 ~260 empate entre ~260 e ~1.300 hoje: ~150
Os dois eixos estão em escala logarítmica. A faixa do BERTimbau vai de US$ 3 por mês (gabarito novo e treino semanal na AWS) a US$ 15 (com o plano de 4 GB do servidor). Ficam de fora a escolha dos candidatos e o texto dos motivos, que custam o mesmo nos dois caminhos.

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.