Cada comando, cada script, cada arquivo. A apostila de referência para voltar depois — e o resumo de tudo que foi medido.
Os scripts do laboratório, o servidor do curso, a lista de dependências e as instruções de instalação estão no repositório público do curso: github.com/Rafhael-Oliveira-IA/conceitos-gpt. Quem não usa git pode baixar tudo em um arquivo .zip. Os modelos não vão no repositório, porque somam 13,2 GB: o script tools/download_models.py baixa os sete direto do Hugging Face.
# abra o PowerShell na raiz do repositório e rode, em ordem: .venv\Scripts\python.exe lab\01_tokenizer.py .venv\Scripts\python.exe lab\02_embeddings.py .venv\Scripts\python.exe lab\03_attention.py .venv\Scripts\python.exe lab\04_multihead_mask.py .venv\Scripts\python.exe lab\05_block.py .venv\Scripts\python.exe lab\06_scale.py .venv\Scripts\python.exe lab\07_decoding.py .venv\Scripts\python.exe lab\08_perplexity.py .venv\Scripts\python.exe lab\09_detector.py .venv\Scripts\python.exe lab\10_original_code.py # o lab 11 precisa do servidor. Em OUTRO terminal: .venv\Scripts\python.exe server\app.py # e então: .venv\Scripts\python.exe lab\11_api.py
Os labs 06 e 08 carregam o gpt2-xl (6 GB de RAM, ~3 min). Se estiver com pressa ou memória curta, acrescente rapido:
.venv\Scripts\python.exe lab\06_scale.py rapido
| Nº | Apostila | Script | O experimento principal |
|---|---|---|---|
| 01 | Tokenização e BPE | 01_tokenizer.py | o custo do português; três tokenizadores incompatíveis |
| 02 | Embeddings | 02_embeddings.py | vizinhos de " Brazil"; wpe aprendeu a ordem sozinho |
| 03 | Atenção | 03_attention.py | a saturação do softmax sem √ |
| 04 | Multi-head e máscara | 04_multihead_mask.py | a prova de causalidade — diferença exatamente 0,00 |
| 05 | O bloco Transformer | 05_block.py | Pre-LN vs Post-LN; o logit lens |
| 06 | Arquitetura e escala | 06_scale.py | a fórmula de parâmetros exata; in-context learning |
| 07 | Decodificação | 07_decoding.py | núcleo top-p de 1 a 5 548 tokens; 80% de repetição no greedy |
| 08 | Perplexidade | 08_perplexity.py | escala monotônica; ruído é mais fácil que texto embaralhado |
| 09 | GPT-1 → GPT-2 | 06 e 08 | PPL 46 → 21,7 com o mesmo tamanho |
| 10 | RoBERTa e MLM | 04, seção 3 | o encoder muda tudo quando você mexe no fim |
| 11 | Encoder vs decoder | 04, seção 3 | a mesma prova, lida dos dois lados |
| 12 | O detector | 09_detector.py | LLM moderno passa como humano com 99,9% |
| 13 | Código original | 10_original_code.py | as 25 primeiras fusões do BPE; JS = Python |
| 14 | Servindo modelos | 11_api.py | o ciclo gerar→detectar; a falha da busca semântica |
GPT-2\ ├── .venv\ Python 3.14 + torch 2.14 (CPU) + transformers 5 ├── models\hf\ os 7 modelos, 13,2 GB em safetensors ├── repos\ │ ├── gpt-2\ codigo original TensorFlow (para LER) │ ├── GPT-3-Encoder\ tokenizador em JS + vocab.bpe + encoder.json │ └── gpt-3\ amostras do 175B e estatisticas do corpus ├── lab\ │ ├── common.py modulo compartilhado — carrega e configura tudo │ └── 01..11_*.py os experimentos ├── server\app.py API compativel com TGI e TEI ├── tools\ │ ├── style.css tipografia das apostilas │ ├── generate_pdfs.py HTML -> PDF (Chrome headless + numeracao) │ ├── download_models.py download dos modelos │ └── verify.py teste de fumaca dos 7 modelos ├── src\conceitos_gpt-1-gpt-2\ fonte HTML das 16 apostilas (eng\ = inglês) ├── src\conceitos_antevisao\ a teoria do ELLM (experimento Antevisão) ├── pdfs\gpt-1-gpt-2\ << as apostilas prontas; pdfs\antevisao\ as do projeto └── out\ saidas dos experimentos
# conferir que os 7 modelos carregam .venv\Scripts\python.exe tools\verify.py # regerar todos os PDFs depois de editar um HTML .venv\Scripts\python.exe tools\generate_pdfs.py # regerar só um .venv\Scripts\python.exe tools\generate_pdfs.py 07
Todos os scripts usam apelidos curtos, definidos em lab/common.py:
| Apelido | Repositório Hugging Face | RAM |
|---|---|---|
gpt1 | openai-community/openai-gpt | 0,4 GB |
gpt2 | openai-community/gpt2 | 0,5 GB |
gpt2-medium | openai-community/gpt2-medium | 1,3 GB |
gpt2-large | openai-community/gpt2-large | 2,9 GB |
gpt2-xl | openai-community/gpt2-xl | 5,8 GB |
det-base | openai-community/roberta-base-openai-detector | 0,5 GB |
det-large | openai-community/roberta-large-openai-detector | 1,4 GB |
# para escrever seus proprios experimentos import common tok, mod = common.carregar_gerador("gpt2-medium") tok, mod, rot = comum.carregar_detector("det-base") tok, mod = comum.carregar_base("gpt2", atencoes=True)
O common.py aponta o cache para models\hf, liga o modo offline (nada vai à rede), força UTF-8 no console do Windows, desliga gradientes e corrige os rótulos ausentes do det-large.
| Medição | Resultado | Lab |
|---|---|---|
| Custo do português vs inglês (tokens/palavra) | 1,86 vs 1,14 — 1,63× | 01 |
Vizinhos de " Brazil" no wte | Argentina, Portugal, Chile, Bolívia | 02 |
| Entropia do softmax sem √ | 0,022 (saturado) vs 1,17 | 03 |
| Causalidade: efeito do futuro no passado | 0,00e+00 no GPT-2; ~3e−01 no RoBERTa | 04 |
| Gradiente na 1ª de 40 camadas | Pre-LN 1,5 milhão de vezes maior | 05 |
| Ganho do cache KV | 42,2 vs 25,0 tokens/s | 04 |
| Fórmula de contagem de parâmetros | erro 0,0% nos 5 modelos | 06 |
In-context learning: P(" Paris") no gpt2 | 0,032 → 0,385 com 3 exemplos | 06 |
| Núcleo top-p ( | de 1 a 5 548 tokens | 07 |
| Repetição de 4-gramas, greedy | 80% (0% nas demais estratégias) | 07 |
| Perplexidade GPT-1 → GPT-2 XL | 46,07 → 21,70 → 16,04 → 14,30 → 12,93 | 08 |
| PPL: ruído vs texto embaralhado | 469 vs 3 874 (ruído é mais fácil) | 08 |
| Detector contra GPT-2 | P(humano) = 0,0002 — funciona | 09 |
| Detector contra LLM de 2026 | P(humano) = 0,9993 — falha total | 09 |
| Detector em texto humano formal | regulamento: 0,034 — falso positivo | 09 |
| Tokenizador JS da OpenAI vs Python | IDs idênticos | 10 |
| Busca semântica com o detector | similaridades todas em +0,99 — inútil | 11 |
| Sintoma | Causa e solução |
|---|---|
UnicodeEncodeError com \u0120 | console em cp1252. Rode sempre pelos scripts do lab\ — o common.py já força UTF-8. Se escrever o seu, importe comum na primeira linha. |
| Memória estourando no lab 06 | use o modo rapido, que pula o XL. |
ConnectionRefused no lab 11 | o servidor não está de pé. Abra outro terminal e rode server\app.py. |
Aviso "pooler.dense.weight UNEXPECTED" | inofensivo. É resíduo do pré-treino do RoBERTa; a cabeça de classificação lê o <s> direto (apostila 12). |
Aviso "attn.bias UNEXPECTED" no GPT-1 | inofensivo. É a máscara causal, que o transformers recria em vez de carregar dos pesos. |
| Modelo tentando baixar algo | o common.py liga HF_HUB_OFFLINE=1. Se algo tenta ir à rede, é um modelo fora do catálogo. |
Você terminou. Quatro caminhos naturais, em ordem de esforço:
roberta-base puro, um conjunto de dados rotulados seu, e repita o processo da apostila 12. É a habilidade prática mais rentável deste curso.transformers, você entendeu de verdade. O nanoGPT, de Andrej Karpathy, é uma boa referência para esse passo — e agora você consegue lê-lo inteiro.qwen3:4b e o qwen3:8b instalados. Rode os mesmos testes de perplexidade e decodificação neles e veja o que sete anos mudaram — e o que não mudou (a arquitetura ainda é a mesma).BAAI/bge-small-en, intfloat/e5-small) e refaça a seção 4 — dessa vez funcionando.Uma linha separa as duas famílias. masked_fill(futuro, -inf). Tudo o mais — o objetivo de treino, o formato da saída, poder ou não cachear, gerar ou compreender — é consequência.
Meça distribuições, não anedotas. O gpt2-large "errou" uma pergunta e parecia pior que o medium. A perplexidade, sobre texto real, mostrou a escala se comportando de forma regular. Uma amostra de tamanho 1 não é evidência.
Um modelo só sabe o que viu. O detector funciona muito bem com texto do GPT-2 e falha com texto de 2026 — e, pior, confiante nos dois casos. Fora da distribuição de treino, a confiança de um modelo não significa nada.
As fontes primárias dos conceitos deste capítulo. Os números do texto foram medidos no laboratório; as ideias vêm daqui.
Os termos técnicos têm aqui o sentido de aprendizado de máquina. O glossário do curso mostra esse sentido ao lado dos outros que as mesmas palavras têm na TI.
Fim do curso. Os scripts continuam aí — mude os prompts, quebre coisas, meça de novo.
Foi assim que cada número destas apostilas apareceu.