Ensinando um modelo de 3B a escrever sobre música
Construí um pequeno app pra macOS chamado Ficino. Ele observa o Apple Music e, a cada troca de faixa, puxa as notas editoriais, créditos, paradas e dados de samples no MusicKit e no Genius, entrega tudo isso ao modelo de fundação on-device da Apple e faz deslizar um painelzinho flutuante a partir do canto da tela com um parágrafo sobre a música.
Sem chamadas de API. Sem assinatura. Sem medidor de tokens. Tudo acontece no laptop.
Essa última frase tem cara de aceno triunfal. Não é.
O que vem de graça
O macOS 26 traz um modelo de fundação embutido no sistema: cerca de três bilhões de parâmetros, treinamento ciente de quantização em dois bits, uma janela de contexto de 4.096 tokens exposta a apps de terceiros por um framework Swift chamado FoundationModels.
Você abre uma LanguageModelSession, chama respond(to:) e recebe uma string de volta. O modelo nunca sai do dispositivo.
A Apple é bem precisa sobre pra que esse modelo serve. O discurso oficial é: "sumarização, extração de entidades, compreensão de texto, diálogo curto, conteúdo criativo, classificação." E, no mesmo fôlego: "não foi projetado para conhecimento de mundo, não foi projetado para raciocínio avançado."
Essa segunda frase já contém o problema inteiro, porque escrever sobre música é, justamente, conhecimento de mundo.
O truque da paráfrase
Então eu não peço ao 3B pra saber quem é o Steely Dan. Eu conto pra ele. O MusicKit e o Genius cuidam do saber; o modelo, do falar.
O prompt fica mais ou menos assim:
Tocando agora: "Aja", do Steely Dan. Fatos conhecidos: #3 na Billboard, 1977. Grammy de Melhor Engenharia. Produção: Gary Katz. Músicos de sessão: Wayne Shorter, Steve Gadd. Usando apenas os fatos acima, escreva um comentário curto.
É retrieval-augmented generation, com toda a recuperação a cargo das APIs da Apple e um modelo de 3B no papel de estilista.
Isso funciona, no sentido de que o modelo diz coisas corretas. Falha em todos os outros sentidos.
Ele abre toda resposta com Aqui está uma breve descrição da música ou Claro! Aqui estão três frases sobre.
Alucina: diante de IRIS OUT, do Kenshi Yonezu, que é um single de duplo lado A com um lado B chamado JANE DOE, anunciou com toda a confiança uma vocalista chamada Jane Doe.
Confunde atribuições: diante de Body, de Don Toliver, do álbum OCTANE, escreveu um parágrafo sobre uma música chamada OCTANE, porque OCTANE era a palavra mais proeminente na página.
Papagueia o texto editorial palavra por palavra — todo disco vira um aguardadíssimo segundo álbum.
Não são bugs pra Apple resolver. É o que um modelo de três bilhões de parâmetros quantizado em dois bits faz quando você pede que ele se vire num domínio para o qual não foi treinado.
Tentei prompts. Escrevi quatorze versões, depois dezessete, depois dezoito. Minha melhor pontuação só com prompt, numa rubrica de LLM-como-juiz em 81 faixas, foi 13,0 de 15, ainda com oito preâmbulos, sete alucinações e duas atribuições erradas pendentes no log de falhas.
Tinha chegado num ponto em que a engenharia de prompt virou uma superfície fechada.
Por que o adaptador
LoRA — adaptação de baixo posto — é o jeito barato de puxar um modelo grande pré-treinado pra uma tarefa específica sem retreinar o modelo inteiro. Você treina um conjunto pequeno de matrizes aditivas que rodam em paralelo aos pesos originais.
O Adapter Training Toolkit da Apple gera um pacote .fmadapter de ~160 MB que o sistema operacional carrega em runtime sobre o mesmo modelo-base.
Entrei sabendo bem o que LoRA não consegue fazer. Não injeta conhecimento. Não faz o 3B saber que Body é a faixa e OCTANE é o álbum em que ela está.
Mas eu tinha uma hipótese: os preâmbulos, as alucinações e as atribuições erradas são, no fundo, a mesma falha. O modelo foi treinado pra ser prestativo, e ser prestativo significa preencher lacunas com texto que soa plausível.
Se eu conseguisse mostrar a ele três mil exemplos do oposto — pegar os fatos recebidos e parar no instante em que eles acabam — talvez o padrão pegasse. As alucinações sumiriam não porque o modelo aprendeu os fatos, mas porque aprendeu a parar de esticá-los.
Gerei então três mil exemplos sintéticos com o Claude Haiku, em cima do mesmo contexto de MusicKit e Genius que o app produz em runtime, filtrei por fidelidade e treinei um adaptador numa H100 alugada.
Duas horas. Menos de dez dólares.
O que voltou
As mesmas 81 faixas, o mesmo juiz, a mesma rubrica: 13,9 de 15.
O salto de meio ponto em relação ao melhor prompt não é o número interessante. O número interessante é o log de falhas: zero preâmbulos, zero alucinações, zero atribuições erradas em todas as respostas. A pior resposta produzida pelo adaptador pontuou mais alto que a resposta média do melhor prompt.
Em IRIS OUT, o modelo agora identifica corretamente Utada Hikaru como vocalista convidada do lado B. Body é Body. O modelo simplesmente começa a frase — sem Aqui está.
Um modelo maior teria conhecido a música. O 3B não conhece, e nenhum fine-tuning vai mudar isso. Mas no momento em que parei de pedir conhecimento e passei a pedir voz, não sobrou nada em que ele pudesse falhar.
É essa parte que eu fico revisitando. O que separa o que um adaptador conserta do que ele não conserta não é tamanho. É se a tarefa que você entregou ao modelo é a mesma que está, de fato, sendo cobrada dele.