Explore o modelo por dentro

Modo livre

Escreva um começo. Acompanhe as escolhas, um token de cada vez.

Modelo PT·No navegador

Comece com uma frase

Entrada

Use “Um passo” para observar uma única previsão.

Texto em geração

0 tokens
Tokens BPEcada caixa mostra o token e seu ID

Inicie a geração para ver como sua frase é dividida.

Percurso do token

Ver rede completa
01TokensIDs (n,)
02EmbeddingE[ids] → (n, 128)
03Blocosatenção + FFN
1Bloco 1
2Bloco 2
3Bloco 3
4Bloco 4
04Logits(V,)
05Sorteiosoftmax / T

Atenção

Contexto

Para onde o último token olhou.

camada 4 · cabeça 0

Após o primeiro passo, veja o peso de cada token do contexto.

Próximas possibilidades

Top 6

Os candidatos para continuar a frase.

softmax(logits / T)

Gere um token para comparar as seis maiores probabilidades.

Do texto ao próximo token

A rede inteira, por dentro

4 blocos · 128 dimensões · 4 cabeças Q / 2 K/V · contexto de 128 tokens

Arquitetura de geração
100%

Ative antes de gerar ou reproduzir. Cada etapa mostra a explicação e os valores reais; pause para ler no seu ritmo.

Bloco 1Atenção causal → SwiGLU · duas conexões residuaisBloco 2Atenção causal → SwiGLU · duas conexões residuaisBloco 3Atenção causal → SwiGLU · duas conexões residuaisBloco 4Atenção causal → SwiGLU · duas conexões residuais X0t−1VHX1t−1VHX2t−1VHX3t−1VHz[−1] / TA mesma matriz E · pesos atreladosNovo token → atualizar contexto → próxima passagem Texto inicial Prompt stringTexto inicialPromptstringTokenizador BPE Texto → ids inteiros 1024 tokens no vocabulárioTokenizador BPETexto → ids inteiros1024 tokens no vocabulárioContexto de tokens ids + novo id Janela: até 128Contexto de tokensids + novo idJanela: até 128Embedding de tokens X₀ = E[ids] n × 128Embedding de tokensX₀ = E[ids]n × 128Pesos compartilhados · E Embedding e saída usam E 1024 × 128Pesos compartilhados · EEmbedding e saída usam E1024 × 128Uma passagem do Transformer n = tokens novos; m = chaves atuais + cache 4 blocos · d = 128 · 4 Q / 2 KV · dₖ = 32Uma passagem do Transformern = tokens novos; m = chaves atuais + cache4 blocos · d = 128 · 4 Q / 2 KV · dₖ = 32RMSNorm · atenção X̂ = X0 / √(mean(X0²) + ε) · γ₁ n × 128RMSNorm · atençãoX̂ = X0 / √(mean(X0²) + ε) · γ₁n × 128Q · consulta Q = X̂ · W_Q 4 × n × 32Q · consultaQ = X̂ · W_Q4 × n × 32K · chave K = X̂ · W_K 2 × n × 32K · chaveK = X̂ · W_K2 × n × 32V · valor V = X̂ · W_V 2 × n × 32V · valorV = X̂ · W_V2 × n × 32RoPE · Q Q′ = rotate(Q, pos) 4 × n × 32RoPE · QQ′ = rotate(Q, pos)4 × n × 32RoPE · K K′ = rotate(K, pos) 2 × n × 32RoPE · KK′ = rotate(K, pos)2 × n × 32Memória K/V · cache Anexa K′ e V aos tokens anteriores 2 × m × 32 · K / VMemória K/V · cacheAnexa K′ e V aos tokens anteriores2 × m × 32 · K / VExpandir cabeças · GQA repeat_kv(K, 2) · repeat_kv(V, 2) 2 → 4 cabeçasExpandir cabeças · GQArepeat_kv(K, 2) · repeat_kv(V, 2)2 → 4 cabeçasCompatibilidade Q × K S = Q′ · K′ᵀ / √32 4 × n × mCompatibilidade Q × KS = Q′ · K′ᵀ / √324 × n × mMáscara causal Sᵢⱼ = −∞ se j > posiçãoᵢ 4 × n × mMáscara causalSᵢⱼ = −∞ se j > posiçãoᵢ4 × n × mPesos de atenção A = softmax(S) 4 × n × mPesos de atençãoA = softmax(S)4 × n × mMisturar os valores Y_h = A · V 4 × n × 32Misturar os valoresY_h = A · V4 × n × 32Concatenar e projetar O = Concat(Y₁ … Y_H) · W_O n × 128Concatenar e projetarO = Concat(Y₁ … Y_H) · W_On × 128Somar o caminho residual H = X0 + O n × 128Somar o caminho residualH = X0 + On × 128RMSNorm · FFN Ĥ = H / √(mean(H²) + ε) · γ₂ n × 128RMSNorm · FFNĤ = H / √(mean(H²) + ε) · γ₂n × 128Projeção gate G = Ĥ · W₁ n × 341Projeção gateG = Ĥ · W₁n × 341Projeção up U = Ĥ · W₃ n × 341Projeção upU = Ĥ · W₃n × 341Ativação SwiGLU SiLU(G) ⊙ U n × 341Ativação SwiGLUSiLU(G) ⊙ Un × 341Projeção down F = (SiLU(G) ⊙ U) · W₂ n × 128Projeção downF = (SiLU(G) ⊙ U) · W₂n × 128Somar o caminho residual X1 = H + F n × 128Somar o caminho residualX1 = H + Fn × 128RMSNorm · atenção X̂ = X1 / √(mean(X1²) + ε) · γ₁ n × 128RMSNorm · atençãoX̂ = X1 / √(mean(X1²) + ε) · γ₁n × 128Q · consulta Q = X̂ · W_Q 4 × n × 32Q · consultaQ = X̂ · W_Q4 × n × 32K · chave K = X̂ · W_K 2 × n × 32K · chaveK = X̂ · W_K2 × n × 32V · valor V = X̂ · W_V 2 × n × 32V · valorV = X̂ · W_V2 × n × 32RoPE · Q Q′ = rotate(Q, pos) 4 × n × 32RoPE · QQ′ = rotate(Q, pos)4 × n × 32RoPE · K K′ = rotate(K, pos) 2 × n × 32RoPE · KK′ = rotate(K, pos)2 × n × 32Memória K/V · cache Anexa K′ e V aos tokens anteriores 2 × m × 32 · K / VMemória K/V · cacheAnexa K′ e V aos tokens anteriores2 × m × 32 · K / VExpandir cabeças · GQA repeat_kv(K, 2) · repeat_kv(V, 2) 2 → 4 cabeçasExpandir cabeças · GQArepeat_kv(K, 2) · repeat_kv(V, 2)2 → 4 cabeçasCompatibilidade Q × K S = Q′ · K′ᵀ / √32 4 × n × mCompatibilidade Q × KS = Q′ · K′ᵀ / √324 × n × mMáscara causal Sᵢⱼ = −∞ se j > posiçãoᵢ 4 × n × mMáscara causalSᵢⱼ = −∞ se j > posiçãoᵢ4 × n × mPesos de atenção A = softmax(S) 4 × n × mPesos de atençãoA = softmax(S)4 × n × mMisturar os valores Y_h = A · V 4 × n × 32Misturar os valoresY_h = A · V4 × n × 32Concatenar e projetar O = Concat(Y₁ … Y_H) · W_O n × 128Concatenar e projetarO = Concat(Y₁ … Y_H) · W_On × 128Somar o caminho residual H = X1 + O n × 128Somar o caminho residualH = X1 + On × 128RMSNorm · FFN Ĥ = H / √(mean(H²) + ε) · γ₂ n × 128RMSNorm · FFNĤ = H / √(mean(H²) + ε) · γ₂n × 128Projeção gate G = Ĥ · W₁ n × 341Projeção gateG = Ĥ · W₁n × 341Projeção up U = Ĥ · W₃ n × 341Projeção upU = Ĥ · W₃n × 341Ativação SwiGLU SiLU(G) ⊙ U n × 341Ativação SwiGLUSiLU(G) ⊙ Un × 341Projeção down F = (SiLU(G) ⊙ U) · W₂ n × 128Projeção downF = (SiLU(G) ⊙ U) · W₂n × 128Somar o caminho residual X2 = H + F n × 128Somar o caminho residualX2 = H + Fn × 128RMSNorm · atenção X̂ = X2 / √(mean(X2²) + ε) · γ₁ n × 128RMSNorm · atençãoX̂ = X2 / √(mean(X2²) + ε) · γ₁n × 128Q · consulta Q = X̂ · W_Q 4 × n × 32Q · consultaQ = X̂ · W_Q4 × n × 32K · chave K = X̂ · W_K 2 × n × 32K · chaveK = X̂ · W_K2 × n × 32V · valor V = X̂ · W_V 2 × n × 32V · valorV = X̂ · W_V2 × n × 32RoPE · Q Q′ = rotate(Q, pos) 4 × n × 32RoPE · QQ′ = rotate(Q, pos)4 × n × 32RoPE · K K′ = rotate(K, pos) 2 × n × 32RoPE · KK′ = rotate(K, pos)2 × n × 32Memória K/V · cache Anexa K′ e V aos tokens anteriores 2 × m × 32 · K / VMemória K/V · cacheAnexa K′ e V aos tokens anteriores2 × m × 32 · K / VExpandir cabeças · GQA repeat_kv(K, 2) · repeat_kv(V, 2) 2 → 4 cabeçasExpandir cabeças · GQArepeat_kv(K, 2) · repeat_kv(V, 2)2 → 4 cabeçasCompatibilidade Q × K S = Q′ · K′ᵀ / √32 4 × n × mCompatibilidade Q × KS = Q′ · K′ᵀ / √324 × n × mMáscara causal Sᵢⱼ = −∞ se j > posiçãoᵢ 4 × n × mMáscara causalSᵢⱼ = −∞ se j > posiçãoᵢ4 × n × mPesos de atenção A = softmax(S) 4 × n × mPesos de atençãoA = softmax(S)4 × n × mMisturar os valores Y_h = A · V 4 × n × 32Misturar os valoresY_h = A · V4 × n × 32Concatenar e projetar O = Concat(Y₁ … Y_H) · W_O n × 128Concatenar e projetarO = Concat(Y₁ … Y_H) · W_On × 128Somar o caminho residual H = X2 + O n × 128Somar o caminho residualH = X2 + On × 128RMSNorm · FFN Ĥ = H / √(mean(H²) + ε) · γ₂ n × 128RMSNorm · FFNĤ = H / √(mean(H²) + ε) · γ₂n × 128Projeção gate G = Ĥ · W₁ n × 341Projeção gateG = Ĥ · W₁n × 341Projeção up U = Ĥ · W₃ n × 341Projeção upU = Ĥ · W₃n × 341Ativação SwiGLU SiLU(G) ⊙ U n × 341Ativação SwiGLUSiLU(G) ⊙ Un × 341Projeção down F = (SiLU(G) ⊙ U) · W₂ n × 128Projeção downF = (SiLU(G) ⊙ U) · W₂n × 128Somar o caminho residual X3 = H + F n × 128Somar o caminho residualX3 = H + Fn × 128RMSNorm · atenção X̂ = X3 / √(mean(X3²) + ε) · γ₁ n × 128RMSNorm · atençãoX̂ = X3 / √(mean(X3²) + ε) · γ₁n × 128Q · consulta Q = X̂ · W_Q 4 × n × 32Q · consultaQ = X̂ · W_Q4 × n × 32K · chave K = X̂ · W_K 2 × n × 32K · chaveK = X̂ · W_K2 × n × 32V · valor V = X̂ · W_V 2 × n × 32V · valorV = X̂ · W_V2 × n × 32RoPE · Q Q′ = rotate(Q, pos) 4 × n × 32RoPE · QQ′ = rotate(Q, pos)4 × n × 32RoPE · K K′ = rotate(K, pos) 2 × n × 32RoPE · KK′ = rotate(K, pos)2 × n × 32Memória K/V · cache Anexa K′ e V aos tokens anteriores 2 × m × 32 · K / VMemória K/V · cacheAnexa K′ e V aos tokens anteriores2 × m × 32 · K / VExpandir cabeças · GQA repeat_kv(K, 2) · repeat_kv(V, 2) 2 → 4 cabeçasExpandir cabeças · GQArepeat_kv(K, 2) · repeat_kv(V, 2)2 → 4 cabeçasCompatibilidade Q × K S = Q′ · K′ᵀ / √32 4 × n × mCompatibilidade Q × KS = Q′ · K′ᵀ / √324 × n × mMáscara causal Sᵢⱼ = −∞ se j > posiçãoᵢ 4 × n × mMáscara causalSᵢⱼ = −∞ se j > posiçãoᵢ4 × n × mPesos de atenção A = softmax(S) 4 × n × mPesos de atençãoA = softmax(S)4 × n × mMisturar os valores Y_h = A · V 4 × n × 32Misturar os valoresY_h = A · V4 × n × 32Concatenar e projetar O = Concat(Y₁ … Y_H) · W_O n × 128Concatenar e projetarO = Concat(Y₁ … Y_H) · W_On × 128Somar o caminho residual H = X3 + O n × 128Somar o caminho residualH = X3 + On × 128RMSNorm · FFN Ĥ = H / √(mean(H²) + ε) · γ₂ n × 128RMSNorm · FFNĤ = H / √(mean(H²) + ε) · γ₂n × 128Projeção gate G = Ĥ · W₁ n × 341Projeção gateG = Ĥ · W₁n × 341Projeção up U = Ĥ · W₃ n × 341Projeção upU = Ĥ · W₃n × 341Ativação SwiGLU SiLU(G) ⊙ U n × 341Ativação SwiGLUSiLU(G) ⊙ Un × 341Projeção down F = (SiLU(G) ⊙ U) · W₂ n × 128Projeção downF = (SiLU(G) ⊙ U) · W₂n × 128Somar o caminho residual X4 = H + F n × 128Somar o caminho residualX4 = H + Fn × 128RMSNorm · final h = RMSNorm(X4) n × 128RMSNorm · finalh = RMSNorm(X4)n × 128Projetar para o vocabulário z = h · Eᵀ n × 1024Projetar para o vocabulárioz = h · Eᵀn × 1024Probabilidades do próximo token p = softmax(z[−1] / T) 1024Probabilidades do próximo tokenp = softmax(z[−1] / T)1024Escolher o próximo token Amostra ~ p ou argmax(p) 1 id → textoEscolher o próximo tokenAmostra ~ p ou argmax(p)1 id → texto
CálculosResidualCache K/VPesos EEtapa atual

Selecione um bloco para ampliar. Arraste o fundo para mover o desenho e clique nas operações para inspecionar.

Mapa completo · aguardando a primeira previsãoSlow motion desacelera a visualização dos cálculos reais registrados pelo modelo.
Como funciona o glassllm

glassllm é uma implementação didática de um Transformer. Em vez de esconder os cálculos atrás de uma API, ela deixa você acompanhar o que acontece em cada rodada de geração.

O painel livre percorre o ciclo de geração em tempo real. Você controla a temperatura e o modo de escolha, avança um token por vez e inspeciona a atenção e as probabilidades.

A trilha de capítulos com equações, código e valores está planejada para uma próxima fase.