{"id":781,"date":"2026-10-15T18:33:56","date_gmt":"2026-10-15T21:33:56","guid":{"rendered":"https:\/\/yellowkode.com\/blog\/apertus-1-5-swiss-ai-multimodalidade\/"},"modified":"2026-10-15T18:33:56","modified_gmt":"2026-10-15T21:33:56","slug":"apertus-1-5-swiss-ai-multimodalidade","status":"publish","type":"post","link":"https:\/\/yellowkode.com\/blog\/apertus-1-5-swiss-ai-multimodalidade\/","title":{"rendered":"Apertus 1.5: Como a Swiss AI Integra Imagem e \u00c1udio sem Vision Encoder"},"content":{"rendered":"<p>A novidade aqui n\u00e3o \u00e9 mais um modelo multimodal. \u00c9 <em>como<\/em> esse modelo virou multimodal. O time do Apertus trocou o caminho padr\u00e3o, acoplar um vision encoder tipo CLIP ao transformer, por algo mais radical: tratar pixel e \u00e1udio como se fossem subpalavras, no mesmo vocabul\u00e1rio do texto. Vale entender a mec\u00e2nica, porque ela decide o que o modelo consegue e o que ele nunca vai conseguir.<\/p>\n<h2>O que foi lan\u00e7ado<\/h2>\n<p>A Swiss AI Initiative lan\u00e7ou o Apertus 1.5, um pr\u00e9-treinamento continuado dos modelos de 8B e 70B par\u00e2metros do Apertus 1.0, adicionando entendimento multimodal nativo de imagem e \u00e1udio, um modo de reasoning (thinking mode), janela de contexto de 262k tokens e melhor instruction-following e uso de ferramentas. Os modelos continuam totalmente abertos: pesos abertos sob Apache 2.0, dados abertos, detalhes de treino publicados e checkpoints intermedi\u00e1rios dispon\u00edveis em pretraining, SFT, RLVR e DPO. Os pesos foram publicados no Hugging Face em 24 de julho de 2026.<\/p>\n<p>O que diferencia esta vers\u00e3o n\u00e3o \u00e9 tamanho nem benchmark, \u00e9 a abordagem arquitetural para multimodalidade. \u00c9 isso que a pr\u00f3xima se\u00e7\u00e3o explica.<\/p>\n<h2>Como funciona: multimodalidade pelo tokenizer, n\u00e3o pelo encoder<\/h2>\n<p>A rota padr\u00e3o para fazer um LLM enxergar \u00e9 anexar um vision encoder (quase sempre CLIP ou um derivado) que converte a imagem em uma sequ\u00eancia de embeddings cont\u00ednuos, e ent\u00e3o projetar esses embeddings no espa\u00e7o de embeddings do transformer. Dois subsistemas acoplados, com objetivos de treino diferentes.<\/p>\n<p>O Apertus 1.5 faz outra coisa. A multimodalidade entra em modo early-fusion: imagens e \u00e1udio chegam ao Apertus como tokens discretos, na mesma sequ\u00eancia dos tokens de texto, em vez de passar por um vision encoder separado. Imagens s\u00e3o tokenizadas com o tokenizer Emu3.5 (uma imagem de 512&#215;512 vira 1.024 tokens) e \u00e1udio com o WavTokenizer (40 tokens por segundo). O vocabul\u00e1rio \u00e9 estendido, a arquitetura fica inalterada e o treino roda na velocidade do treino s\u00f3 com texto. O modelo entende imagens e \u00e1udio, mas gera apenas texto.<\/p>\n<h3>Uma analogia que ajuda, e onde ela quebra<\/h3>\n<p>Pense num teclado estrangeiro. Se voc\u00ea quer um PC brasileiro digitando japon\u00eas, tem duas op\u00e7\u00f5es: plugar um dispositivo extra que capta kanji e envia para a CPU atrav\u00e9s de um canal pr\u00f3prio (isso \u00e9 o vision encoder), ou expandir o layout do teclado para incluir as teclas japonesas, de modo que o sistema operacional continue vendo tudo como teclas pressionadas, sem saber se s\u00e3o latinas ou kanji. O Apertus escolheu o segundo caminho: para o transformer, n\u00e3o existe diferen\u00e7a entre um token de palavra e um token de um peda\u00e7o de 16&#215;16 pixels. Tudo \u00e9 posi\u00e7\u00e3o no vocabul\u00e1rio.<\/p>\n<p>A analogia quebra num ponto importante: tokens de texto s\u00e3o linguisticamente motivados (subpalavras BPE), enquanto tokens visuais s\u00e3o c\u00f3digos de um codebook treinado para reconstruir pixel. O tokenizer adotado \u00e9 treinado s\u00f3 com objetivo de reconstru\u00e7\u00e3o de pixel, n\u00e3o com um objetivo de alinhamento sem\u00e2ntico ou de imagem-texto como o usado em vision encoders tipo CLIP. Os c\u00f3digos discretos pr\u00e9-treinados s\u00e3o usados diretamente como entrada e alvo de predi\u00e7\u00e3o para o modelo de linguagem. Ou seja, cada token visual carrega informa\u00e7\u00e3o sobre como <em>reconstruir<\/em> aquela regi\u00e3o, n\u00e3o sobre o que ela <em>significa<\/em>. O alinhamento sem\u00e2ntico \u00e9 problema do transformer, aprendido durante o pr\u00e9-treinamento continuado.<\/p>\n<h3>O que acontece com um 512&#215;512 na pr\u00e1tica<\/h3>\n<p>O tokenizer mapeia cada bloco de 16&#215;16 pixels para um c\u00f3digo vindo de um codebook de 131.072 entradas, de dimens\u00e3o 256. Faz a conta: 512 dividido por 16 d\u00e1 32, logo 32 por 32 igual a 1.024 blocos, e cada bloco vira um token. Isso bate com o n\u00famero da release.<\/p>\n<p>\u00c1udio funciona parecido. O WavTokenizer emite um c\u00f3digo por frame, ent\u00e3o \u00e1udio entra no modelo como uma \u00fanica sequ\u00eancia plana, exatamente como texto. Esse fluxo de c\u00f3digo \u00fanico \u00e9 o crit\u00e9rio decisivo, porque deixa a pilha de treino inalterada.<\/p>\n<p>Por que isso importa de verdade: adicionar um encoder separado te for\u00e7a a desenhar um loop de treino com dois ritmos, dois gradientes e dois objetivos. Estendendo s\u00f3 o vocabul\u00e1rio, o loop continua sendo um loop de next-token prediction. \u00c9 a mesma mec\u00e2nica do GPT original, apenas com um dicion\u00e1rio maior.<\/p>\n<h3>O pipeline em quatro est\u00e1gios de pr\u00e9-treino<\/h3>\n<p>O modelo n\u00e3o aprende tudo de uma vez. Dados n\u00e3o pareados introduzem as novas modalidades, dados pareados de imagem-caption e \u00e1udio-transcript alinham essas modalidades com a linguagem, um est\u00e1gio de cooldown enfatiza dados de maior qualidade em matem\u00e1tica e c\u00f3digo, e um est\u00e1gio de contexto longo expande a janela passo a passo de 8.000 para 262.000 tokens. Mais da metade dos tokens de treino permanece como texto puro para preservar a capacidade lingu\u00edstica.<\/p>\n<p>O p\u00f3s-treino tem cinco est\u00e1gios: SFT, SFT de contexto longo, RLVR (reinforcement learning com recompensas verific\u00e1veis), DPO e SDPO para alinhamento com a Charter. O detalhe interessante aqui est\u00e1 nas trajet\u00f3rias de uso de ferramenta: s\u00f3 entram no SFT trajet\u00f3rias cuja execu\u00e7\u00e3o foi verificada, o que corta drasticamente o volume de dados ruidosos de agentes.<\/p>\n<h2>O que isso significa na pr\u00e1tica<\/h2>\n<p>Para quem vai usar, tr\u00eas consequ\u00eancias pr\u00e1ticas saem direto do mecanismo:<\/p>\n<ul>\n<li><strong>Entra multimodal, sai s\u00f3 texto.<\/strong> O modelo n\u00e3o desenha, n\u00e3o gera \u00e1udio, n\u00e3o produz imagem. Se o seu caso de uso \u00e9 gera\u00e7\u00e3o visual, Apertus 1.5 n\u00e3o serve. Ele serve para interpretar documento, chart, foto, fala.<\/li>\n<li><strong>Imagem come contexto r\u00e1pido.<\/strong> 1024 tokens por 512&#215;512. Dez screenshots j\u00e1 s\u00e3o 10 mil tokens antes de o seu prompt entrar. A janela de 262k parece generosa at\u00e9 voc\u00ea meter PDFs digitalizados dentro.<\/li>\n<li><strong>\u00c1udio longo \u00e9 caro.<\/strong> 40 tokens por segundo significa que um \u00e1udio de 10 minutos custa 24 mil tokens de entrada. Transcri\u00e7\u00e3o por Whisper mais texto no Apertus pode sair mais barato que mandar o \u00e1udio direto, dependendo do caso.<\/li>\n<\/ul>\n<p>Para rodar o modelo texto, o caminho via Transformers \u00e9 o padr\u00e3o da fam\u00edlia. Baseado na model card:<\/p>\n<pre><code>from transformers import AutoModelForCausalLM, AutoTokenizer\n\nmodel_name = \"swiss-ai\/Apertus-v1.5-8B\"\ntokenizer = AutoTokenizer.from_pretrained(model_name)\nmodel = AutoModelForCausalLM.from_pretrained(model_name, device_map=\"auto\")\n\nmessages = [{\"role\": \"user\", \"content\": \"Explique recurs\u00e3o.\"}]\ntext = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)\ninputs = tokenizer([text], return_tensors=\"pt\").to(model.device)\nout = model.generate(**inputs, max_new_tokens=512)\nprint(tokenizer.decode(out[0][inputs.input_ids.shape[1]:], skip_special_tokens=True))\n<\/code><\/pre>\n<p>Para a entrada multimodal, o pipeline exige o processor do apertus-omni-tokenizer, publicado junto no reposit\u00f3rio swiss-ai. A API de imagem\/\u00e1udio deles ainda est\u00e1 mais crua que a de texto, e o Quickstart no repo \u00e9 mais confi\u00e1vel que os snippets de terceiros circulando.<\/p>\n<p>Em projetos onde j\u00e1 trabalhei com gera\u00e7\u00e3o ancorada em dado estruturado real, com valida\u00e7\u00e3o antes da publica\u00e7\u00e3o, em vez de texto solto, um modelo que entende imagem como tokens discretos tem um charme espec\u00edfico: voc\u00ea consegue debugar o que o modelo &#8220;viu&#8221; olhando o ID do token, igual voc\u00ea olha um token BPE suspeito. N\u00e3o \u00e9 interpret\u00e1vel de verdade, mas \u00e9 mais rastre\u00e1vel que um embedding de 1024 dimens\u00f5es sa\u00eddo de um CLIP.<\/p>\n<h2>Onde quebra<\/h2>\n<p>A escolha arquitetural tem pre\u00e7o, e ele \u00e9 previs\u00edvel:<\/p>\n<ul>\n<li><strong>Resolu\u00e7\u00e3o fixa engessa.<\/strong> Se o tokenizer foi treinado em 512&#215;512, mandar uma imagem muito maior exige recorte ou downscale, e detalhes finos somem. OCR de documento denso, por exemplo, tende a sofrer mais do que num modelo com encoder din\u00e2mico.<\/li>\n<li><strong>Granularidade de 16&#215;16 limita texto na imagem.<\/strong> Cada bloco de 16&#215;16 pixels vira um \u00fanico c\u00f3digo. Fonte pequena cai dentro de meia c\u00e9lula e vira ru\u00eddo. \u00c9 um limite do tokenizer, n\u00e3o da escala do modelo.<\/li>\n<li><strong>Trailing frontier.<\/strong> Os resultados de avalia\u00e7\u00e3o mostram melhorias em coding e instruction-following, performance competitiva em tradu\u00e7\u00e3o multil\u00edngue (batendo Claude Haiku 4.5 e Google Translate em um benchmark) e boa performance em tarefas jur\u00eddicas su\u00ed\u00e7as, embora os modelos ainda fiquem atr\u00e1s dos modelos de pesos abertos de fronteira em geral. Para produ\u00e7\u00e3o s\u00e9ria em ingl\u00eas gen\u00e9rico, isso \u00e9 um fator.<\/li>\n<li><strong>Thinking mode custa tokens.<\/strong> Reasoning expl\u00edcito gera tra\u00e7os intermedi\u00e1rios, que entram no custo e na lat\u00eancia. Vale para problema dif\u00edcil, n\u00e3o para chat.<\/li>\n<\/ul>\n<p>J\u00e1 perdi tempo em projeto achando que o problema estava no prompt quando estava na granularidade do tokenizer visual. \u00c9 um erro comum: a pessoa trata o modelo multimodal como uma caixa que &#8220;v\u00ea&#8221;, quando ele na verdade s\u00f3 v\u00ea o que o tokenizer deixou passar. Isso vem da experi\u00eancia que escrevi nos livros que publiquei, entre eles a s\u00e9rie IA na Pr\u00e1tica, onde insisto no mesmo ponto: voc\u00ea s\u00f3 entende um modelo depois de olhar o que entra nele em formato de token.<\/p>\n<h2>O que n\u00e3o d\u00e1 para afirmar ainda<\/h2>\n<p>Alguns pontos que a release toca mas n\u00e3o resolve:<\/p>\n<ul>\n<li>Qual a performance real em OCR de documento denso em portugu\u00eas brasileiro. Os benchmarks publicados cobrem Swiss Legal e tradu\u00e7\u00e3o, n\u00e3o documento digitalizado em escala.<\/li>\n<li>Lat\u00eancia pr\u00e1tica por token em infer\u00eancia local do 70B com 262k de contexto. A release documenta a capacidade, n\u00e3o os perfis de throughput em hardware comum.<\/li>\n<li>At\u00e9 onde a vantagem de &#8220;treino na velocidade de texto&#8221; se traduz em custo de infer\u00eancia menor comparado a modelos com encoder separado. A arquitetura de treino n\u00e3o decide sozinha a arquitetura de serving.<\/li>\n<li>Como o thinking mode se comporta em cadeias de tool use longas. A release menciona que RLVR integrou os dois, mas n\u00e3o quantifica a intera\u00e7\u00e3o.<\/li>\n<\/ul>\n<h2>Como testar isso voc\u00ea mesmo<\/h2>\n<p>Um caminho curto, uma hora de trabalho:<\/p>\n<ol>\n<li>Baixe o <code>swiss-ai\/Apertus-v1.5-8B<\/code> do Hugging Face. Em GPU de 24GB roda em bf16 sem truque.<\/li>\n<li>Teste primeiro s\u00f3 texto, com o snippet acima, e confirme que o chat template e o tokenizer est\u00e3o corretos.<\/li>\n<li>Pegue uma imagem 512&#215;512 (ou fa\u00e7a resize) de um gr\u00e1fico simples com n\u00fameros leg\u00edveis. Rode atrav\u00e9s do processor multimodal do repo <code>apertus-omni-tokenizer<\/code> e pe\u00e7a para o modelo descrever o valor mais alto. Isso testa alinhamento sem\u00e2ntico m\u00ednimo.<\/li>\n<li>Agora pegue a mesma imagem em 2048&#215;2048 com texto pequeno. Observe o que o modelo acerta e erra. Essa diferen\u00e7a \u00e9 a assinatura do tokenizer visual, n\u00e3o do modelo.<\/li>\n<li>Compare o custo de token da imagem (1024) contra uma descri\u00e7\u00e3o textual equivalente da mesma imagem. Esse ratio decide se multimodal faz sentido para o seu caso.<\/li>\n<\/ol>\n<p>Se o resultado do passo 4 te decepcionar, voc\u00ea entendeu em uma hora o que levei projetos inteiros para enxergar: multimodalidade por tokenizer discreto \u00e9 elegante arquiteturalmente e dura visualmente. Isso n\u00e3o \u00e9 defeito do Apertus, \u00e9 consequ\u00eancia do caminho que ele escolheu. Saber onde o caminho estreita \u00e9 metade do trabalho de escolher qual modelo usar.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Como o Apertus 1.5, da Swiss AI, trata imagem e \u00e1udio como tokens no mesmo stream do texto, por que isso mant\u00e9m a arquitetura intacta e onde essa escolha quebra.<\/p>\n","protected":false},"author":2,"featured_media":780,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-781","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/posts\/781","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/comments?post=781"}],"version-history":[{"count":0,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/posts\/781\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/media\/780"}],"wp:attachment":[{"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/media?parent=781"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/categories?post=781"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/tags?post=781"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}