← Diário
Técnica·12/05/2026

Uma imagem para cada ficha, e porque se enganava

Uma grande travessa de choucroute garnie sobre uma mesa de madeira clara, um telemóvel com o ecrã desfocado ao lado, luz quente de fim de tarde numa cozinha

Até 12 de maio, uma ficha de receita abria-se com um desenho genérico escolhido segundo o seu género. Nessa tarde recebeu uma fotografia a sério, gerada poucos segundos depois da criação e enviada para a ficha aberta sem ser preciso reabri-la. Para lá chegar foi preciso ensinar o gerador a mostrar o prato inteiro, retirar ao modelo de linguagem o direito de lançar a imagem por conta própria, e proibi-lo de pintar pessoas por todo o lado.

Um desenho que dizia «receita», não «chucrute»

Desde a véspera, cada ficha declara o seu género de ilustração nos seus campos: prato quente, prato frio, bebida, pastelaria, viagem, ideia, livro, lugar. No topo da ficha desenhava-se uma composição vetorial a partir desse género: umas formas, um degradê, uma sugestão. Dizia «isto é uma receita». Não dizia qual.

A manhã tinha sido dedicada a tornar a ficha corrigível com o dedo. À tarde quisemos que a ficha se parecesse com o que contém. Uma receita de choucroute com uma fotografia de choucroute. Uma ideia de presente com o objeto. Uma nota de viagem com a cidade.

O que se segue é o relato dessa tarde, e das quatro maneiras como a imagem se enganou antes de acertar.

Uma fotografia, dois caminhos para a obter

A primeira versão assentava em dois gatilhos.

O primeiro foi confiado ao modelo de linguagem. Depois de criar uma ficha memo visual, dispunha de mais uma ferramenta: pedir uma imagem, passando o identificador da ficha e um assunto, uma frase curta que descreve o que a fotografia deve mostrar. O guia dizia-lhe quando a usar, receitas, viagens, presentes, notas de leitura, eventos num lugar com nome, e quando se abster: lembretes, tarefas, contactos, factos, atas de reunião. Uma ata não tem fotografia.

O segundo foi dado ao utilizador. No pequeno menu no canto superior direito da ficha, ao lado de «Modificar» e «Eliminar», uma entrada nova: «Gerar uma imagem». Se a primeira fotografia falhasse, podia pedir-se outra sem voltar a passar pela conversa. Durante os poucos segundos de fabrico aparecia uma linha discreta, «Fotografia a ser gerada…», a azul e não a vermelho, porque não é um erro.

Por trás dos dois caminhos, a mesma cadeia no servidor. O assunto é embrulhado numa instrução de estilo fotográfico, enviado a um gerador de imagens, e a imagem volta sob a forma de bytes. Esses bytes são depositados num espaço de armazenamento com o nome da ficha, sobrescrevendo a eventual imagem anterior, com um número de versão no endereço para que o telemóvel não vá buscar a antiga à sua cache. Por fim, o endereço é escrito nos metadados da ficha, ao lado do modelo e da lista, sem tocar no resto. De passagem, o servidor verifica que a ficha pertence mesmo a quem a pede, com conta ligada ou em anónimo.

Se faltar a chave do serviço, o servidor di-lo no arranque e recusa a ferramenta de forma limpa em vez de cair a meio de uma conversa. Se o gerador falhar, a ficha fica com o seu desenho. A imagem é um complemento, nunca uma condição.

Chucrute sem couve

Primeiro teste real: uma choucroute para seis pessoas. A fotografia mostrava salsichas, cenouras e batatas, bem iluminadas. Nem uma folha de couve.

A causa estava no assunto transmitido. O modelo de linguagem tinha enviado algo como «Choucroute, 6 pessoas, 2 h». O gerador de imagens não conhece a choucroute como a conhece um leitor alsaciano: para ele é uma palavra entre outras numa frase curta, e agarra-se ao que sabe desenhar. Seguiram-se duas correções.

A instrução de estilo, no servidor, recebeu uma frase com peso: a imagem deve representar exatamente este assunto, com cada elemento nomeado visível. Sem ela, o gerador toma o assunto por um ambiente. Com ela, por uma encomenda.

E a descrição da ferramenta, do lado do modelo de linguagem, foi reescrita com exemplos de assuntos falhados e de assuntos conseguidos. «Choucroute» dá uma couve. «Choucroute garnie numa grande travessa de grés, couve branca fermentada em monte no centro, salsichas fumadas, joelho de porco e toucinho às fatias, batatas a vapor, mesa de madeira clara, luz quente» dá uma choucroute. A regra cabe numa pergunta: se se retirar o nome do prato da frase, ela ainda descreve a mesma imagem? Se sim, é demasiado vaga. É preciso o prato, três a cinco elementos visíveis que o distingam, e o contexto de serviço, travessa, prato ou tábua. Vinte a quarenta palavras, sem verbos, sem citações.

A linha em itálico que repetia a pergunta

O mesmo teste revelou um defeito sem relação com a imagem, corrigido de imediato porque vivia no mesmo sítio.

Por baixo do título da ficha, uma linha em itálico repetia a frase original: «Gostava de fazer uma choucroute este fim de semana, podes…». Lida na ficha uma semana depois, essa frase é ruído. Sabe-se que se pediu, não se quer reler como.

Essa linha mudou de natureza. Tornou-se um lead editorial, uma ou duas frases que apresentam a ficha como a introdução de um artigo de revista: «Um prato alsaciano generoso para um domingo de inverno: couve fermentada, carnes fumadas e batatas a vapor.» O campo mantém o nome, mostra-se no mesmo sítio, só o sentido do seu conteúdo mudou. No editor da ficha, o texto de ajuda passou de «frase original» a «resumo editorial».

Esse lead teve um efeito secundário feliz. O botão «Gerar uma imagem» da ficha não tem um modelo de linguagem à mão para redigir um assunto. Junta o que a ficha já contém, o título e as etiquetas. Com o lead a mais, dispõe finalmente de elementos visuais, couve, carnes fumadas, batatas, onde a frase original não trazia nenhum.

O identificador que ainda não existia

O segundo defeito não se via na fotografia. Estava no registo.

O modelo de linguagem, a quem se pedia que chamasse a geração «imediatamente depois» da criação da ficha, tomou a instrução à letra: chamava as duas ferramentas ao mesmo tempo, na mesma vez. Ora, o identificador da ficha só existe quando a criação termina. Em vez de esperar, o modelo inventava um, plausível, do género «ficha-tartiflette-receita». A geração partia para uma ficha fantasma, falhava, e a ficha verdadeira ficava com o seu desenho.

Pode reformular-se a instrução dez vezes. Também se pode retirar ao modelo uma responsabilidade para a qual não foi feito: a ordem das operações. Foi o que fizemos.

A partir daí, decide o servidor. Quando uma criação resulta numa ficha memo cujo género de ilustração é visual, prato quente, prato frio, bebida, pastelaria, viagem, ideia, livro, lugar, lança ele próprio a geração, com o identificador verdadeiro, já que acabou de o escrever. Não espera pelo resultado: a resposta volta logo para o modelo, e a imagem fabrica-se em segundo plano. O assunto é construído a partir do título, do lead editorial e das etiquetas da ficha, os mesmos sinais que o botão manual, para que os dois caminhos deem fotografias da mesma natureza. As fichas reforçadas, aquelas em que um pedido reencontrou uma memória existente em vez de criar uma, não disparam nada: já têm a sua imagem, ou nunca quiseram uma.

Faltava fazer chegar a imagem à ficha que o utilizador está a ver, sem lhe pedir que a feche e volte a abrir. Quando a geração corre bem, o servidor envia uma mensagem em tempo real a todos os aparelhos do proprietário: este identificador, este endereço de imagem. No telemóvel, essa mensagem vai parar a um quadro de avisos minúsculo, indexado por identificador de ficha. Uma ficha aberta subscreve aí o seu próprio identificador, e troca o desenho pela fotografia assim que o aviso passa, cerca de três segundos depois da criação. O quadro guarda também o último endereço anunciado, para a ficha que se abrisse depois da mensagem e não antes: encontra-o ao chegar.

A ferramenta de geração ficou com o modelo de linguagem para um único uso: um pedido explícito do utilizador, «refaz a fotografia da tartiflette», «substitui a imagem pelo prato servido». Nunca encadeada com uma criação.

Duas fotografias para uma só ficha

O terceiro defeito chegou por duas queixas que não tinham nada em comum.

A primeira: na lista de fichas, a miniatura continuava a mostrar o desenho, mesmo quando a ficha tinha a sua fotografia. A lista construía a miniatura sem lhe transmitir o endereço da imagem. Uma linha para o passar, e a ficha mostra a mesma imagem fora e dentro.

A segunda era mais interessante: algumas fichas recebiam duas fotografias seguidas, uma medíocre e depois uma melhor. Apesar da instrução reescrita, o modelo continuava por vezes a chamar a geração depois da criação, em concorrência com o disparo automático do servidor que já fazia o mesmo trabalho. Duas gerações para uma ficha, e a última a chegar ganhava.

Deixámos de negociar. A ferramenta foi retirada da lista que o modelo vê. A função continua a existir no servidor, para a rota que o botão da ficha chama, mas o modelo já não a pode disparar. E para o caso de a rota ser chamada duas vezes seguidas, a partir de dois telemóveis por exemplo, o servidor mantém uma tabela das gerações em curso, por ficha: um segundo pedido para a mesma ficha agarra-se à promessa já em andamento em vez de recomeçar do zero. Cinto e suspensórios, mas o cinto era a verdadeira correção.

A noite: duas fichas que piscam, e gente por todo o lado

Ao fim do dia, um último teste fez aparecer dois defeitos de uma vez, mais uma vez sem ligação entre si.

«Lembra-me amanhã às 8 de ir à loja de bricolage comprar cimento e cintas.» No ecrã apareceu uma ficha, vazia, um compromisso nu, e depois foi substituída por uma segunda, com a lista. Um piscar desagradável, e um duplicado na lista de fichas.

O registo mostrava a sequência: uma criação do tipo evento, depois uma chamada para programar o lembrete, depois uma segunda criação do tipo tarefa com a lista. O modelo tinha partido um pedido em duas memórias. Cada criação abre automaticamente a sua ficha, e o anti-ressalto que devia absorver esse género de rajada estava regulado para trezentos milissegundos: o suficiente para duas criações coladas, não para duas criações separadas por outra chamada.

Duas correções. No guia do modelo, um bloco à cabeça da parte dos memos: um pedido, um neurónio principal. Um compromisso com uma lista é uma tarefa datada que traz a sua lista, não um evento mais uma tarefa. Em caso de dúvida entre os dois, é uma tarefa assim que há coisas para assinalar, um evento só quando não há nada para assinalar. E o anti-ressalto passou para dois segundos: a ficha abre-se dois segundos depois da última criação, de modo que, se o modelo voltar a partir, só a última ficha chega ao ecrã. Num pedido simples esses dois segundos passam despercebidos, porque a resposta falada se prepara ao mesmo tempo.

O segundo defeito dizia respeito às imagens dessas listas de compras: mostravam mulheres. Uma mulher num corredor de ferragens, uma mulher diante de sacos de cimento. Ninguém tinha pedido uma personagem.

A causa estava nas primeiras palavras da instrução de estilo: «fotografia editorial, qualidade de revista». Para um gerador criado a revistas, essas palavras querem dizer moda, e moda quer dizer manequins. O assunto vinha depois, tarde demais para mudar a cena.

A instrução foi reancorada: fotografia de natureza-morta e de cena de objetos, com cláusulas explícitas, sem pessoas, sem rostos, sem silhuetas, sem retratos. O gerador toma essas proibições à letra, exatamente como tomava «revista» à letra. Os corredores de ferragens voltaram a ser corredores.

O que a tarde ensinou

Quatro vezes a imagem se enganou, e quatro vezes por uma razão diferente. Um assunto demasiado magro. Um identificador inventado. Uma corrida entre dois gatilhos. Duas palavras de estilo que pesavam mais do que o assunto.

Ficaram duas lições. A primeira: um gerador de imagens não interpreta, executa. Não sabe o que uma choucroute deve conter, não sabe que uma lista de compras não precisa de figurantes. Tudo o que não se lhe diz, inventa, e tudo o que se lhe diz primeiro pesa mais do que o resto.

A segunda vale para lá das imagens. Quando uma operação depende da ordem das coisas, o identificador depois da criação, uma única geração por ficha, não cabe ao modelo de linguagem manter essa ordem. Deixamos-lhe o que faz bem, perceber o que o utilizador quer, e o servidor guarda o que tem de ser exato. A memória continua a ser a fonte, a conversa o meio, e a fotografia, a partir de agora, parece-se com o prato.

Para ler a seguir
O XNeuronal já está disponível para AndroidUma memória que deduz está a chegar