Capítulo 2.1 — Fundamentos de LLMs¶
🎯 Objetivo¶
Dar o vocabulário e o modelo mental mínimos sobre o que existe dentro de um LLM para sustentar decisões de arquitetura, custo e operação. Este capítulo não ensina a treinar um LLM; ele explica por que reduzir um prompt de 8k para 2k tokens muda mais do que a fatura, ou por que dois modelos do "mesmo tamanho" podem ter custos de inferência radicalmente diferentes.
Cada conceito é apresentado com uma definição operacional, uma consequência prática e, quando aplicável, um limite que ele impõe sobre arquitetura ou orçamento.
🧠 Tokenização¶
Um LLM moderno não enxerga texto bruto: ele opera sobre tokens, que são unidades subword aprendidas pelo tokenizer. Os esquemas mais comuns são BPE (Byte Pair Encoding) e variantes de SentencePiece (BBPE, Unigram).
Implicações práticas:
- Tokens ≠ palavras. Uma palavra pode virar 1, 2 ou mais tokens, dependendo do idioma e do vocabulário do modelo.
- Português e idiomas com morfologia rica tendem a gerar mais tokens por caractere do que inglês. O mesmo texto custa mais e ocupa mais janela de contexto em PT-BR.
- Caracteres não-ASCII, emojis, código fonte e nomes próprios geram tokenização irregular. Documentos com muito código, JSON ou XML têm contagem de tokens difícil de estimar de cabeça.
- Cada provedor tem seu tokenizer. Contar tokens com a régua do modelo A para estimar custo no modelo B é uma fonte recorrente de surpresa em FinOps.
Decisão arquitetural típica: medir o tokenizer real do modelo-alvo sobre amostras representativas do tráfego antes de fechar contrato ou estimar custo de janela.
🧠 Embeddings internos vs embeddings de retrieval¶
Há dois tipos de "embedding" no ecossistema, e confundi-los gera problemas em RAG.
- Embeddings internos do LLM. São as representações vetoriais que o modelo usa internamente, aprendidas no treino conjunto com a rede. Existem na camada de input e nas representações intermediárias. Não são exportadas como "vetor de embedding" para retrieval.
- Embeddings de retrieval. São saídas de modelos de embedding específicos (por exemplo
text-embedding-3-small,bge-large,nomic-embed-text), treinados para que similaridade vetorial reflita similaridade semântica entre trechos de texto.
Consequências práticas:
- O modelo de embedding usado em RAG é uma decisão separada do LLM de geração. Trocar o LLM gerador não invalida o índice; trocar o modelo de embedding invalida o índice e exige reembedding.
- "Embedding do GPT-4" como conceito genérico não existe da forma que pessoas frequentemente assumem. Para retrieval, use modelos de embedding declarados, com dimensão conhecida (ver Cap. 2.8).
🧠 Arquitetura Transformer (vista de produção)¶
O Transformer (Vaswani et al., 2017) é composto por blocos empilhados de:
- Self-attention. Para cada posição da sequência, o modelo calcula pesos sobre todas as outras posições e combina as representações. Custa O(n²) em compute e memória quando feito de forma ingênua, onde
né o número de tokens. - Feed-forward (MLP). Camadas densas aplicadas posição-a-posição.
- Normalização e residuals. Estabilizam o treino e a inferência.
O que isso significa para arquitetura:
- Quanto maior o prompt, mais caro o prefill. Não linearmente: parte cresce com
n²(atenção ingênua). Variantes modernas (FlashAttention, sparse attention, sliding window) reduzem o custo absoluto, mas o trade-off prompt × custo × latência continua existindo. - Modelos com mesma "contagem de parâmetros" podem ter custos de inferência muito diferentes por causa do número de camadas, número de cabeças, head dim, mixture-of-experts e estratégia de attention. "70B" não é uma medida operacional suficiente.
- Long-context (>100k tokens) é feito com técnicas como attention truncation, sparse/local attention e memory tokens. Cada técnica tem custo e qualidade próprios; janela grande não é grátis, mesmo quando o provedor não cobra explicitamente por tokens de contexto.
🧠 Context window¶
A context window é o número máximo de tokens que o modelo aceita por chamada, prompt + resposta. É um limite duro do modelo, não uma sugestão.
Consequências:
- Tudo que entra no contexto compete por janela: instruções, documentos (RAG), histórico, tool descriptions, tool results, plano interno, contrato de saída.
- Estourar a janela costuma resultar em truncamento silencioso: partes do contexto desaparecem sem aviso explícito. Em RAG, isso é fonte recorrente de "o modelo ignorou a evidência".
- "Mais janela" não substitui context engineering (Cap. 2.3). Encher contexto é frequentemente pior do que selecionar bem.
🧠 Inferência: prefill e decode¶
Inferência em LLM autoregressivo tem duas fases com economias muito diferentes:
| Fase | O que faz | Limitada por | O que dominam |
|---|---|---|---|
| Prefill | Processa o prompt inteiro em paralelo, monta o KV cache | Compute (FLOPs) | TTFT (Time To First Token), tamanho do prompt |
| Decode | Gera tokens um a um, reaproveitando o KV cache | Memory bandwidth | TPOT (Time Per Output Token), tamanho da resposta |
Por isso:
- Um prompt grande tende a aumentar TTFT (latência até o primeiro token) sem necessariamente afetar o TPOT (latência por token gerado).
- Uma resposta longa aumenta TPOT acumulado, mesmo com prompt pequeno.
- Otimização errada vai para o lugar errado. Reduzir prompt em cenário de resposta longa não cura o problema de UX percebida durante o decode.
Este capítulo serve de base para o Cap. 6.3 (sizing de AI server), que trata do raciocínio quantitativo.
🧠 KV cache¶
Durante o decode, o modelo precisa ler as chaves e valores (K/V) das camadas de atenção para todos os tokens anteriores. Recalcular isso a cada token seria proibitivo.
A solução é o KV cache: as chaves/valores são calculadas no prefill e armazenadas, e o decode só calcula o token novo.
Consequências práticas:
- O KV cache cresce com o tamanho da sequência e com o número de sequências simultâneas. Em produção, ele frequentemente é o maior consumidor de VRAM, mais até do que os próprios pesos.
- Técnicas como PagedAttention (vLLM) e continuous batching existem para gerir esse cache com eficiência. Sem isso, batching grande quebra por falta de memória ou por fragmentação.
- Sequências longas têm custo escondido em VRAM, não só em tokens cobrados. Em self-hosting, ignorar KV cache é o erro de sizing mais clássico.
🧠 Sampling, temperatura e determinismo limitado¶
A saída do LLM é uma distribuição de probabilidade sobre o próximo token. O que sai depende da estratégia de sampling:
- Greedy / temperature 0. Pega sempre o token mais provável. Menos criativo, mais previsível.
- Temperature > 0. Suaviza ou aguça a distribuição antes de amostrar.
- Top-k. Restringe a amostragem aos
ktokens mais prováveis. - Top-p (nucleus). Restringe ao menor conjunto cuja probabilidade acumulada atinge
p. - Repetition penalty, frequency/presence penalties. Ajustes para evitar repetição patológica.
Um detalhe importante e mal-entendido:
Temperatura 0 não garante determinismo. Em produção, a saída ainda varia por: ordem não-determinística de operações em GPU, batch dinâmico, mudanças de versão do modelo no provedor, diferenças de hardware, e ocasionalmente bugs de quantização.
Para reduzir variação (não eliminá-la) em produção:
- Pin de modelo + versão.
- Sempre que possível, mesmo provedor e mesma região.
- Eval contínuo para detectar deriva de comportamento.
- Não construir testes de produção que assumem strings idênticas; use semantic equivalence ou contratos sobre estrutura.
🚨 Limites reais de LLMs¶
Combinando o que apareceu acima, fica claro o que um LLM não é:
- Não é fonte de verdade. A distribuição de treino é fixa, o modelo não conhece o "agora", e mesmo no que conhece pode errar com confiança.
- Não é base de conhecimento dinâmica. Alterar conhecimento via fine-tuning é caro, frágil e demora; RAG ou tools mudam conhecimento sem retreinar.
- Não é raciocínio simbólico. LLM imita padrões; "chain-of-thought" e técnicas afins ajudam, mas não convertem o modelo num solver formal.
- Não é mecanismo de autorização. "Não faça X" no prompt é instrução, não política.
- Não é determinístico. Mesmo com temperatura 0.
- Não é estável entre versões. Provedores trocam modelos; comportamentos mudam sem aviso suficiente.
Cada um desses limites é endereçado por algum mecanismo determinístico ao redor do modelo (validação de schema, RAG, policy-as-code, IAM, eval contínuo). É essa engenharia que torna o LLM operável.
🏢 Hermes Logística - onda 1.5¶
No primeiro experimento de LLM, o time da Hermes estimou custo com tokenizer de inglês sobre tickets em PT-BR. A fatura real, no fim do primeiro mês, ficou cerca de 40% acima da projeção - sem mudança de tráfego. Diagnóstico: o tokenizer real produzia mais tokens por ticket. Correção: medir com o tokenizer do modelo-alvo sobre amostra representativa antes de fechar a próxima janela orçamentária. Lição: aritmética de tokens só vale com o tokenizer certo.
📚 Referências¶
- Vaswani et al. - Attention Is All You Need (2017): https://arxiv.org/abs/1706.03762
- Sennrich, Haddow & Birch - Neural Machine Translation of Rare Words with Subword Units (ACL 2016, BPE): https://aclanthology.org/P16-1162/
- Kudo & Richardson - SentencePiece (EMNLP 2018): https://arxiv.org/abs/1808.06226
- Dao et al. - FlashAttention (NeurIPS 2022): https://arxiv.org/abs/2205.14135
- Kwon et al. - Efficient Memory Management for LLM Serving with PagedAttention (vLLM, SOSP 2023): https://arxiv.org/abs/2309.06180
- BentoML - Prefill–decode disaggregation: https://bentoml.com/llm/inference-optimization/prefill-decode-disaggregation
- Hugging Face - Tokenizers (docs): https://huggingface.co/docs/tokenizers/en/index