Quarto de cinco posts sobre gateway de IA. Antes: por que existe, como montar e quanto custa em latência. Depois: o SLM destilado que custou 36× menos.
Resumo
- Modelo local é a única opção que transforma "combinei por contrato que o meu dado não é retido" em "o meu dado não sai".
- SLM é modelo de 1 a 10 bilhões de parâmetros treinado para um domínio. Entrega perto do mesmo resultado em tarefa estreita, por uma fração do custo.
- A conta de VRAM está na seção 3. O ponto de equilíbrio genérico que circula por aí é enganoso, e a seção 3.2 diz por quê.
- O erro é tratar isso como decisão binária. Não é "local ou API". É qual rota vai para onde — e é por isso que essa decisão mora no gateway.
- As cinco perguntas que decidem se isso fica de pé em produção — latência, concorrência, capacidade, o que fazer quando ela acaba, e infraestrutura — estão na seção 5.
1. O que só o modelo local resolve
Existem três formas de reduzir o risco de mandar dado para um modelo, e elas não são equivalentes.
Anonimização na fronteira remove identificador antes da chamada sair. Funciona bem para dado pessoal — CPF, e-mail, telefone — e é obrigatória se houver dado de cliente no fluxo. Não resolve segredo industrial, porque não existe como anonimizar a lógica de um algoritmo proprietário sem destruir a pergunta.
Contrato com o provedor — retenção zero, cláusula de não-treinamento, região de processamento. Reduz risco de verdade e depende de confiança contratual. O dado sai; você combinou o que acontece com ele.
Modelo local — o dado não sai. É a única das três que transforma a garantia de contratual em técnica.
Essa diferença parece filosófica até você estar numa auditoria. "Temos cláusula de retenção zero" e "o tráfego nunca deixou a nossa rede" são afirmações de natureza diferente, e a segunda não depende do comportamento de terceiro.
Sobre quais restrições tornam isso obrigatório escrevi em Sua política de uso de IA não impede o vazamento.
2. O que é um SLM, e por que ele mudou a conta
SLM é modelo de linguagem pequeno — na prática, de 1 a 10 bilhões de parâmetros, treinado ou ajustado para um domínio específico em vez de competir em generalismo.
O que mudou não foi a existência deles, foi a qualidade. Um modelo de 7 a 14 bilhões de parâmetros hoje resolve tarefa estreita e bem definida num nível que há dois anos exigia modelo de fronteira. E três propriedades vêm junto:
- Custo de inferência muito menor. Estimativas públicas falam em reduções de até 90% em cenário de alta carga.
- Latência menor. Arquitetura compacta, resposta mais rápida — o que importa em fluxo interativo.
- Roda onde você quiser. Laptop, servidor da empresa, edge. É isso que fecha o problema da seção 1.
A ressalva honesta: modelo de 7 a 14 bilhões não entrega a qualidade de um modelo de fronteira em tarefa aberta. Ele empata em tarefa estreita e perde em tarefa que exige raciocínio longo, código complexo ou síntese sobre muito contexto.
Por isso a pergunta certa não é "modelo pequeno é bom o suficiente". É qual das minhas tarefas cabe nele.
3. A conta
3.1 VRAM
Regra prática: cerca de 0,5 GB de VRAM por bilhão de parâmetros em quantização de 4 bits.
Um modelo de 8 bilhões roda em torno de 4 a 5 GB. Um de 14 bilhões, em torno de 7 a 8 GB. Isso cabe numa GPU de consumo, e é a razão pela qual isso deixou de ser assunto de empresa grande.
3.2 A conta não é só custo por token
Circula uma versão simplificada dessa conta que é enganosa:
consumo mensal de tokens × preço do provedor vs custo fixo da máquina
Ela dá um número, e o número quase sempre está errado — porque quatro variáveis mudam o resultado mais que o preço do token.
Perfil da carga. Rajada e carga contínua têm contas opostas. Um pipeline que processa lotes ocupa a GPU por algumas horas no mês; um chat interativo precisa dela ligada o tempo todo. A mesma máquina, no mesmo preço, é barata num caso e cara no outro. Foi o que decidiu o resultado que eu medi em Troquei um LLM proprietário por um modelo aberto de 9B.
Throughput e concorrência. Preço por token pressupõe que você extrai do hardware o throughput nominal. Na prática isso depende de batching, de quantas requisições simultâneas você tem e de quanto contexto cada uma carrega. GPU ociosa esperando requisição custa igual a GPU trabalhando.
Disponibilidade. A API tem redundância embutida no preço. Local, você paga por ela: segunda máquina, ou aceitar que a funcionalidade cai quando a GPU cai. Se a resposta for "aceito que caia", ótimo — mas isso é uma decisão de produto, e precisa ser tomada por quem responde pelo produto.
Localidade e operação. Onde a máquina fica, quem faz a manutenção, quem atualiza driver e modelo, quem é chamado às três da manhã. Isso não aparece em nenhuma planilha de comparação e é custo real.
A conclusão prática: não use ponto de equilíbrio genérico para decidir. Meça o seu perfil de carga primeiro — as horas de GPU que você realmente consome, não as que a fórmula sugere. E se o número não fechar, o modelo local ainda pode ser a decisão certa: só que aí é decisão de conformidade, não de economia, e precisa ser aprovada como tal. O erro é vender internamente como redução de custo algo que é decisão de risco, porque aí o projeto é cobrado por um resultado que ele nunca ia entregar.
3.3 Ollama ou vLLM
- Ollama para prototipar e para carga baixa. Sobe em um comando, e é onde você descobre quais tarefas cabem.
- vLLM para produção. O PagedAttention entrega throughput muito superior sob concorrência, que é exatamente onde o Ollama para de servir.
O caminho normal é começar no Ollama para responder a pergunta da seção 4, e migrar para vLLM quando a resposta for "cabem várias".
4. Quais tarefas cabem
Depois de rodar isso em alguns times, o padrão é consistente. Cabem bem:
- Classificação — roteamento de ticket, análise de sentimento, triagem
- Extração de campo — pegar CNPJ, valor e vencimento de um documento
- Reescrita com formato fixo — normalizar descrição, padronizar nomenclatura
- Embedding e busca semântica — aqui o modelo pequeno é o padrão, não a exceção
- Redação de rascunho curto com estrutura definida
Não cabem:
- Código em base grande, com contexto de múltiplos arquivos
- Raciocínio de várias etapas com ferramentas
- Síntese sobre muito contexto — relatório longo, análise comparativa
- Qualquer coisa aberta, onde a qualidade da resposta é o produto
Repare que a lista que cabe é, na maioria das empresas, a lista de maior volume. Classificação e extração rodam milhares de vezes por dia; raciocínio complexo roda dezenas. É por isso que a economia aparece mesmo quando o modelo pequeno cobre só uma parte das tarefas.
5. As cinco perguntas operacionais
Escolher o modelo é a parte fácil. Estas cinco decidem se ele fica de pé em produção, e nenhuma delas se responde com benchmark publicado.
5.1 Qual latência você precisa entregar, e medida como?
Dois números diferentes, e confundir os dois é o erro mais comum.
Time to first token é o que o usuário sente em fluxo interativo. Throughput em tokens por segundo é o que decide quanto tempo leva uma resposta longa ou um lote.
Um modelo de 8B numa GPU dedicada responde o primeiro token rápido com uma requisição só. Com trinta simultâneas, o mesmo modelo na mesma GPU entrega o primeiro token muito mais devagar, porque a requisição entra em fila.
Meça o que importa para o seu caso: se é chat, TTFT sob a concorrência que você espera no pico. Se é lote, tokens por segundo agregados. Número de requisição única não prevê nenhum dos dois.
5.2 Quantas requisições simultâneas, e o que limita
Aqui está a variável que quase ninguém dimensiona: o limite não são os pesos, é o cache de KV.
Os pesos ocupam um valor fixo — a conta de VRAM da seção 3.1. O cache de KV cresce com concorrência × tamanho do contexto, e com frequência passa dos pesos. Um modelo de 8B em 4 bits ocupa cerca de 5 GB; trinta sessões simultâneas com contexto longo somam vários gigabytes em cima disso.
Quando o cache enche, as requisições não ficam lentas — elas entram em fila. A latência não degrada suavemente, ela salta.
É por isso que o vLLM ganha do Ollama em produção: o PagedAttention é, na prática, um gerenciador de memória de cache de KV. Não é preferência de marca.
Dimensione pela concorrência de pico, não pelo tamanho do modelo.
5.3 Qual é a capacidade real da máquina
O número que você precisa não está em tabela nenhuma: tokens por segundo na sua concorrência alvo, com o seu tamanho de contexto.
Levanta em uma tarde: suba o modelo, dispare carga sintética no formato das suas requisições reais, e aumente a concorrência até a latência sair do aceitável. O ponto onde ela sai é a sua capacidade.
Faça isso antes de prometer SLA, não depois.
5.4 O que acontece quando a capacidade acaba
Essa é a pergunta que separa protótipo de produção, e ela tem três respostas legítimas — a escolha depende do que a rota faz.
Enfileirar. Cabe em processamento de lote, onde ninguém está esperando. Não cabe em fluxo interativo.
Promover para modelo remoto. A requisição que não cabe na GPU vai para a API. Resolve o pico sem provisionar hardware para ele — e só é válido se aquela rota puder sair da rede. Se o modelo local existe por conformidade, promover é vazamento, não elasticidade. Deixe isso explícito na configuração e no code review.
Recusar. Devolver erro é melhor que responder errado ou que violar a política de dado. Em rota regulada, é a única resposta certa.
O gateway é onde essa escolha vira configuração em vez de decisão de código — e por isso ela fica revisável em pull request.
5.5 Que infraestrutura isso exige de verdade
A GPU é o item mais visível e o menos trabalhoso. O que costuma faltar no plano:
- Onde a máquina fica. Nuvem com GPU, colocation ou servidor próprio. Cada uma tem uma conta e um contrato diferentes.
- Cold start. O Ollama descarrega o modelo após um tempo ocioso e a primeira requisição depois disso paga segundos de carregamento do disco. O vLLM mantém residente. Quem demonstra com Ollama e reporta latência baixa se surpreende na segunda-feira de manhã.
- Atualização de modelo.
qwen3:8bé uma tag móvel. Fixe o digest e rode a sua bateria de avaliação a cada atualização, senão você troca o modelo em produção sem saber. - Quem opera. Driver, versão de runtime, disco, monitoramento de VRAM, e quem é chamado quando a GPU cai às três da manhã. É custo recorrente e raramente entra na comparação com a API.
Nada disso inviabiliza modelo local. Mas se a justificativa foi economia e essas linhas não estavam na conta, a economia era menor do que parecia.
6. Como isso entra no roteamento
E aqui as quatro partes da série se encontram.
A decisão "esta tarefa vai para o modelo local, aquela vai para o de fronteira" não deve morar dentro de cada aplicação. Se morar, você tem a mesma dispersão de antes, agora com mais provedores.
Ela mora no gateway, como alias de tarefa:
- model_name: rapido # alto volume, tarefa estreita
litellm_params:
model: openai/gpt-5-mini
api_key: os.environ/OPENAI_API_KEY
- model_name: local # o que não pode sair da infraestrutura
litellm_params:
model: ollama/qwen3:8b
api_base: http://host.docker.internal:11434
- model_name: profundo # raciocínio, código, tarefa aberta
litellm_params:
model: anthropic/claude-sonnet-5
api_key: os.environ/ANTHROPIC_API_KEY
A aplicação pede local e não sabe qual modelo está atrás. Trocar o Qwen por um Llama ajustado no seu domínio é uma linha de YAML, sem tocar em aplicação nenhuma.
E a régua de conformidade fica versionada: qual rota pode sair da empresa e qual não pode vira revisão de pull request, em vez de decisão espalhada em código.
E o aviso que vale mais que tudo nesta seção: o alias local não pode ter fallback. Se ele existe porque o dado não pode sair da rede, um fallback que o socorra numa falha não é resposta degradada — é violação de conformidade, silenciosa, no exato momento em que o sistema estava com problema. A config que eu publico não põe fallback no local de propósito. Se você adicionar um fallback global depois, confira que ele não pega essa rota.
6.1 O detalhe de latência que quase ninguém antecipa
Aqui é onde o overhead do gateway deixa de ser irrelevante.
Contra uma chamada de API que leva 2 segundos, os ~10 ms da camada são 0,5% — ruído. Contra um modelo local que responde em 80 ms, os mesmos 10 ms são 12%.
Não é motivo para tirar o gateway do caminho. É motivo para saber disso antes de prometer latência, e para considerar um gateway em Go se o seu volume local for alto.
7. Por onde começar
Se você não tem restrição contratual ou regulatória sobre onde o código roda, não monte infraestrutura local. Contrato com retenção zero e configuração versionada resolvem a maior parte do risco, e você economiza o custo operacional.
Se você tem volume alto numa tarefa estreita, faça a conta da seção 3.2 antes de qualquer coisa. Se o volume não passa do ponto de equilíbrio, a decisão é de conformidade e precisa ser aprovada como tal.
Se o requisito é que o dado não saia, aí é modelo local, e o trabalho vira mapear quais tarefas cabem — o que se faz em uma semana com Ollama e um conjunto de casos reais.
Em qualquer um dos três, o passo anterior é o mesmo: saber quantas aplicações chamam modelo hoje e o que cada uma faz. Tem um script que responde isso em minutos.
Como ajudamos times a adotar IA
Trabalhamos com times de engenharia que buscam incorporar IA ao dia a dia de desenvolvimento — não como experimento, mas como parte real do fluxo de trabalho.
Isso passa por escolher as ferramentas certas para o contexto do time, configurá-las de forma que façam sentido para a política de dados da empresa e garantir que os desenvolvedores saibam usá-las de um jeito que realmente aumente a produtividade, em vez de gerar mais fricção.
Se você tem um time de desenvolvimento e está tentando colocar IA para trabalhar de forma séria, fale com a gente.

