MÓDULO 1.1 GA

🪟 Janela de contexto, atenção e "lost in the middle"

A anatomia operacional da janela: o que é atenção, por que tokens no meio são esquecidos, e como isso muda decisões de engenharia.

6
Tópicos
60
Minutos
Básico
Nível
Teoria
Tipo

Engenharia de contexto começa com uma realização operacional: o modelo NÃO recebe uma 'conversa'; ele recebe uma sequência fixa de tokens — a janela de contexto. O system prompt, o histórico, o resultado de uma busca RAG, o turn atual e até as saídas anteriores, tudo é serializado nessa mesma sequência. Quem decide a ordem, a estrutura e o que entra é você.

💡 Janela de contexto: a unidade fundamental de engenharia

Pense no modelo como uma função pura: recebe uma string (a janela serializada) e devolve uma string (a saída). Tudo o que muda no comportamento mora nessa string de entrada — system prompt, exemplos, contexto recuperado, ordem. Não há 'memória' fora dela.

📊 Liu et al. (2023) — Lost in the Middle (ArXiv:2307.03172)

🎯 Heurística rápida

Antes de aumentar a janela, pergunte: o modelo precisa de TODO esse contexto, ou só de 3-5 trechos relevantes? Reranking + top-5 quase sempre bate 'jogar 50 docs'.

1

🪟 A janela é o ambiente físico do modelo

Tokens, não conversas

A janela é uma string serializada que vive na memória do servidor do provedor durante a chamada. Quando você faz client.messages.create(...), o SDK monta essa string em um formato específico do modelo (ChatML, Anthropic XML, etc.) e envia. O modelo processa tudo de uma vez no prefill, depois gera tokens um a um. Essa visão muda decisões: ordenar para maximizar cache, recuperar menos para reduzir input, ou comprimir histórico antigo deixam de ser 'truques' e passam a ser engenharia.

anatomia de uma janela serializada (Anthropic-like)
<system>
  Você é um assistente conciso. Use formato JSON.
</system>
<few_shot>
  <example><in>...</in><out>...</out></example>
</few_shot>
<context>
  <doc id=42>...trecho recuperado por RAG...</doc>
</context>
<user>Qual a janela do modelo?</user>
📑 Resumo navegável
O que é: Sequência fixa de tokens que o modelo lê em uma chamada. System prompt + histórico + contexto recuperado + user turn — tudo junto.
Por que aprender: Sem essa visão, você assume que o modelo tem 'memória da conversa'. Não tem — você reconstrói a cada chamada.
Conceitos-chave: Janela nominal, janela efetiva, ordem de seções, custo do input total.
2

🎯 Atenção causal e KV cache

O mecanismo que pesa tokens

Atenção causal significa que cada token, ao ser processado, só pode 'olhar' para tokens anteriores — não para o futuro. Isso permite paralelização do prefill (todos os tokens de input são processados juntos) e geração autoregressiva no decode. O KV cache guarda os estados key e value de cada camada para cada token já processado; se o prefixo não muda entre chamadas, o provedor reutiliza esses estados. Daí o ganho de prompt caching: ~10% do preço para tokens cacheados.

o que invalida o KV cache

  • Mudar 1 caractere no system prompt → invalida TUDO daquele ponto em diante.
  • Reordenar few-shots → invalida do primeiro deslocamento em diante.
  • Adicionar uma mensagem do usuário no fim → NÃO invalida cache (apenas adiciona).
  • Trocar o modelo (mesmo da mesma família) → invalida tudo.
📑 Resumo navegável
O que é: Cada token só 'olha' tokens anteriores. Estados intermediários (KV cache) podem ser reutilizados — base do prompt caching.
Por que aprender: Entender KV cache explica por que prefixos estáveis no início têm custo amortizado e por que mexer no system prompt invalida cache da sessão.
Conceitos-chave: Self-attention, causal mask, KV cache, attention heads, prefix prefill.
3

📍 Posição: rotary embeddings e o efeito recência

Por que tokens recentes têm vantagem

Posição não é só 'tokens 1, 2, 3...'. Modelos modernos usam RoPE (Rotary Position Embedding, Su et al. 2021), que codifica posição via rotação de pares de dimensões em cada cabeça de atenção. Resultado prático: o modelo dá peso estrutural diferente para tokens em posições diferentes — o início (prefix bias) e o fim (recency bias) recebem mais 'sinal' que o meio. Esse é o mecanismo concreto por trás do 'lost in the middle'.

atenção típica por região da janela (10k tokens)
RegiãoPosiçãoPeso relativo de atençãoComportamento
Início0–1kalto (~1.0)prefix bias — fixa contexto
Meio inferior1k–4kmoderado (~0.7)atenção decai gradualmente
Meio (zona crítica)4k–7kbaixo (~0.5)lost in the middle
Meio superior7k–9kmoderado (~0.7)começa a recuperar
Fim9k–10kalto (~1.0)recency bias — atenção máxima
📑 Resumo navegável
O que é: Modelos modernos codificam posição via Rotary Position Embeddings (RoPE). Tokens recentes têm vantagem estrutural; tokens iniciais têm vantagem de fixação.
Por que aprender: Esse é o mecanismo concreto por trás do 'lost in the middle'. Tokens no meio simplesmente não têm vantagem estrutural nenhuma.
Conceitos-chave: RoPE (Su et al. 2021), prefix bias, recency bias, position interpolation.
4

📜 Lost in the middle (Liu et al. 2023)

A curva U de atenção

Liu et al. (2023) construíram experimento controlado: pegaram um documento com a resposta correta e o inseriram em posições variáveis dentro de janelas de 10-32k tokens preenchidas com documentos distratores. Mediram a acurácia do modelo em encontrar a resposta. O resultado é uma curva em U consistente — acurácia ~75% quando a info está no topo, cai para ~50% no meio, sobe de novo para ~70% no fim. O efeito persiste em GPT-3.5, GPT-4, Claude 2, Llama-2. Não é bug de modelo único; é arquitetural.

mitigações validadas (com evidência)

  • Reranking: top-50 retrieval → cross-encoder rerank → top-5 (Anthropic 2024 reporta -49% failure rate).
  • Recuperar menos: 5 docs bem rankeados > 50 docs concatenados.
  • Ancoragem: repetir a pergunta antes E depois do bloco de contexto.
  • Auditoria de eval: ' needle in haystack' test antes de aceitar a janela atual.
📑 Resumo navegável
O que é: Em testes controlados, acurácia de QA cai até 30% quando a informação crítica está no meio da janela. Permanece alta no início e fim.
Por que aprender: RAG ingênuo coloca 50 documentos esperando que o modelo dê peso uniforme. Não dá. Precisa rerankear ou recuperar menos.
Conceitos-chave: Curva U, U-shape attention, mitigação por reranking, ancoragem.
5

🧭 Ordem das seções: estável → variável → instrução

O padrão que casa atenção e cache

A ordem certa não é estética — é alinhada a três forças: prompt cache (estável fica no início), atenção (instrução fica no fim), e ancoragem (pergunta repetida antes/depois do contexto recuperado). O padrão mais robusto é: system → few-shot → âncora-pergunta → contexto recuperado → âncora-pergunta → user-turn. Isso maximiza cache hit rate (~70-95% típico em chats), reduz lost-in-middle e dá ao modelo um sinal claro de 'a pergunta de fato é esta'.

padrão FEC de ordem de seções (Python)
msgs = [
    Message(role=SYSTEM, content=system_prompt),       # estável (cacheável)
    Message(role=USER, content=few_shot_canonico),     # estável (cacheável)
    Message(role=USER, content=(
        f'Pergunta: {pergunta}\n\n'                  # âncora 1
        f'<contexto>\n{contexto_recuperado}\n</contexto>\n\n'
        f'Pergunta (repete): {pergunta}'                # âncora 2
    )),
]
📑 Resumo navegável
O que é: System prompt e few-shot fixos primeiro (estáveis, cacheáveis), contexto recuperado depois (variável), instrução do usuário no fim (atenção máxima).
Por que aprender: Esta ordem maximiza cache hit rate (Anthropic 2024) e coloca a instrução do usuário na posição mais 'atendida' pelo modelo.
Conceitos-chave: Prefix stability, cache breakpoints, instruction-at-the-end pattern, ancoragem.
6

📏 Janela nominal vs. efetiva

200k de marketing ≠ 200k de qualidade

Janela nominal é o que o marketing fala (200k tokens, 1M tokens). Janela efetiva é onde a qualidade não degrada. O benchmark RULER (Hsieh et al. 2024) mede isso: muitos modelos com 128k nominal degradam significativamente acima de 32-64k em tarefas que exigem múltipla recuperação. Antes de assumir que cabe E funciona, faça um needle-in-a-haystack próprio com seus dados.

exemplo de gap nominal × efetiva (valores ilustrativos do RULER)
ModeloNominalEfetiva (RULER)Gap
GPT-4 Turbo128k~64k50%
Claude 3 Opus200k~128k64%
Llama-3-8B-Instruct8k (nativo)~4k50%
Qwen2.5-7B-Instruct32k~16k50%
📑 Resumo navegável
O que é: Janela nominal é o que o modelo aceita sem erro de API. Janela efetiva é onde a qualidade se mantém. Frequentemente bem menor (RULER, Hsieh et al. 2024).
Por que aprender: Decidir 'cabe' e 'funciona bem' são duas perguntas diferentes. A segunda exige eval no harness.
Conceitos-chave: Effective context length, needle-in-a-haystack, RULER benchmark.

📑 Resumo navegável dos tópicos

1 🪟 A janela é o ambiente físico do modelo — Tokens, não conversas
O que é: Sequência fixa de tokens que o modelo lê em uma chamada. System prompt + histórico + contexto recuperado + user turn — tudo junto.
Por que aprender: Sem essa visão, você assume que o modelo tem 'memória da conversa'. Não tem — você reconstrói a cada chamada.
Conceitos-chave: Janela nominal, janela efetiva, ordem de seções, custo do input total.
2 🎯 Atenção causal e KV cache — O mecanismo que pesa tokens
O que é: Cada token só 'olha' tokens anteriores. Estados intermediários (KV cache) podem ser reutilizados — base do prompt caching.
Por que aprender: Entender KV cache explica por que prefixos estáveis no início têm custo amortizado e por que mexer no system prompt invalida cache da sessão.
Conceitos-chave: Self-attention, causal mask, KV cache, attention heads, prefix prefill.
3 📍 Posição: rotary embeddings e o efeito recência — Por que tokens recentes têm vantagem
O que é: Modelos modernos codificam posição via Rotary Position Embeddings (RoPE). Tokens recentes têm vantagem estrutural; tokens iniciais têm vantagem de fixação.
Por que aprender: Esse é o mecanismo concreto por trás do 'lost in the middle'. Tokens no meio simplesmente não têm vantagem estrutural nenhuma.
Conceitos-chave: RoPE (Su et al. 2021), prefix bias, recency bias, position interpolation.
4 📜 Lost in the middle (Liu et al. 2023) — A curva U de atenção
O que é: Em testes controlados, acurácia de QA cai até 30% quando a informação crítica está no meio da janela. Permanece alta no início e fim.
Por que aprender: RAG ingênuo coloca 50 documentos esperando que o modelo dê peso uniforme. Não dá. Precisa rerankear ou recuperar menos.
Conceitos-chave: Curva U, U-shape attention, mitigação por reranking, ancoragem.
5 🧭 Ordem das seções: estável → variável → instrução — O padrão que casa atenção e cache
O que é: System prompt e few-shot fixos primeiro (estáveis, cacheáveis), contexto recuperado depois (variável), instrução do usuário no fim (atenção máxima).
Por que aprender: Esta ordem maximiza cache hit rate (Anthropic 2024) e coloca a instrução do usuário na posição mais 'atendida' pelo modelo.
Conceitos-chave: Prefix stability, cache breakpoints, instruction-at-the-end pattern, ancoragem.
6 📏 Janela nominal vs. efetiva — 200k de marketing ≠ 200k de qualidade
O que é: Janela nominal é o que o modelo aceita sem erro de API. Janela efetiva é onde a qualidade se mantém. Frequentemente bem menor (RULER, Hsieh et al. 2024).
Por que aprender: Decidir 'cabe' e 'funciona bem' são duas perguntas diferentes. A segunda exige eval no harness.
Conceitos-chave: Effective context length, needle-in-a-haystack, RULER benchmark.

✓ O que FAZER

  • Manter system prompt e few-shot estáveis no início (cacheáveis)
  • Rerankear documentos antes de incluir no contexto
  • Repetir a pergunta antes E depois do contexto (ancoragem)
  • Medir janela efetiva no harness (eval)

✗ O que NÃO fazer

  • Mexer no system prompt a cada turn (invalida cache)
  • Concatenar 50 docs sem ordem e esperar que o modelo encontre
  • Colocar a pergunta só no início, longe do fim atendido
  • Confiar que '200k = 200k' funciona igual

🚫 Quando NÃO usar

💻 Exemplo de código

from fec_sdk import Message, MessageRole, check_compat
from fec_sdk.adapters import get_adapter

check_compat("modulo-1-1", expected_sdk_version=">=1.0,<2.0")

client = get_adapter("mock", scripted=[("Liu", "Posição 12 (meio)")])

doc_relevante = "FATO: a janela do modelo X é 200000 tokens."
ruido = "\n".join(f"Doc {i}: lorem ipsum..." for i in range(20))

# Doc relevante NO MEIO — prejudicial
contexto = ruido + "\n" + doc_relevante + "\n" + ruido

resp = client.chat([
    Message(role=MessageRole.SYSTEM, content="Responda apenas com fatos do contexto."),
    Message(role=MessageRole.USER, content=f"{contexto}\n\nQual a janela do modelo X?"),
])
print(resp.content)

🏋️ Exercício hands-on

Em exercicios/modulo-1-1/ você recebe 5 cenários onde o doc relevante está no meio. Sua função reordenar(documentos) deve aplicar uma das mitigações ensinadas e fazer ≥4/5 casos passarem. Rode pytest exercicios/modulo-1-1/test.py.

📚 Bibliografia

🎯 Resumo do Módulo

  • Janela de contexto é a unidade operacional — sequência fixa de tokens.
  • Atenção é não-uniforme — início e fim atendem mais que o meio.
  • Lost in the middle documentado: até 30% de queda quando info está no meio.
  • Ordem importa: estável→variável→instrução maximiza cache e atenção.
  • Janela nominal ≠ efetiva — meça no harness antes de assumir.

Próximo Módulo:

Tokens, custo e limites práticos