Context Engineering: prompt caching, subagents e skills
- ⬜🕸️ Multi-Agent Systems: orchestrator-worker, swarms e handoffs(Engenharia AI-Native)
Recomendamos completar os pré-requisitos antes de seguir, mas nada te impede de continuar.
Em 2026, janelas de 1M tokens são commodity — mas "enfiar tudo" continua sendo a forma mais cara e lenta de usar um LLM. Context engineering é a disciplina de gerenciar o que entra na janela: o que cachear, o que resumir, o que delegar, em que ordem posicionar, quando truncar. É onde um agent de US$5/query vira US$0.30/query sem perder qualidade.
A janela não é grátis
┌──────────────────────────────────────────────────────────┐
│ INPUT (janela) │
│ ┌────────────────────┐ │
│ │ System prompt │ ← estável, CACHEÁVEL │
│ │ Tool definitions │ ← estável, CACHEÁVEL │
│ │ Few-shot examples │ ← estável, CACHEÁVEL │
│ ├────────────────────┤ │
│ │ RAG context │ ← volátil por query │
│ │ Conversation hist. │ ← volátil, cresce │
│ │ Tool results │ ← volátil, podem ser grandes │
│ └────────────────────┘ │
└──────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────┐
│ OUTPUT (tokens gerados) │
│ + thought / tool_use / final answer │
└──────────────────────────────────────────────────────────┘
Prompt caching: o ganho de 90% que poucos usam
Anthropic, OpenAI e Google oferecem caching de prefixo. A mecânica: você marca blocos "cacheáveis" no início; o provider armazena o KV cache por ~5 min; chamadas dentro dessa janela pagam muito menos pelo prefixo.
| Provider | Como ativar | Preço cacheado vs normal |
|---|---|---|
| Anthropic | cache_control: { type: "ephemeral" } nos blocos | Write 125% / read 10% |
| OpenAI | Automático para prefixos repetidos (>1024 tok) | Read ~50% do preço normal |
| Google Gemini | cachedContent API — criar cache explícito | Read ~25% do preço + taxa de storage |
# Anthropic: marcar blocos cacheáveis
from anthropic import Anthropic
client = Anthropic()
r = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
system=[
{
"type": "text",
"text": LONG_SYSTEM_PROMPT, # 5k tokens
"cache_control": {"type": "ephemeral"},
},
],
tools=[
# tools também podem entrar no cache
*TOOL_DEFS,
],
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": LARGE_DOC, # 50k tokens, revisitado em várias queries
"cache_control": {"type": "ephemeral"},
},
{
"type": "text",
"text": user_query, # volátil, NÃO cacheado
},
],
},
],
)
# r.usage.cache_creation_input_tokens: primeira chamada, escreve o cache
# r.usage.cache_read_input_tokens: chamadas seguintes, leem o cache📋 Agent que faz 20 chamadas por sessão repetindo system prompt de 8k tokens
Sem cache: 20 × 8k = 160k tokens de input repetido. Com cache: 1 write + 19 reads ≈ 10% do custo. Economia ~90% em um item só.
Alt: Reduzir system prompt — útil, mas tem limite de quanto dá pra cortar
Alt: Mudar para Haiku — ganha preço mas perde qualidade em tarefas complexas
Compaction: resumo de conversa para janela cresce sem estourar
Conversas longas estouram janela rapidamente. A estratégia padrão é compaction: quando a janela atinge X% do limite, um LLM barato resume a conversa mais antiga em uma mensagem "system summary", e apaga as originais. O agent continua como se nada tivesse acontecido.
# Compaction simples — mantém últimas N mensagens + summary do resto
def compact_if_needed(messages: list[dict], max_tokens: int = 100_000) -> list[dict]:
total = sum(estimate_tokens(m) for m in messages)
if total < max_tokens * 0.7:
return messages # ainda cabe folgado
keep_tail = 8 # mantém últimas 8 em original
to_summarize = messages[:-keep_tail]
tail = messages[-keep_tail:]
summary_text = llm_call(
model="claude-haiku-4-5-20251001",
system="Resuma a conversa em 300 palavras, mantendo fatos, decisões e tool results relevantes para continuar.",
messages=to_summarize,
)
summary_msg = {
"role": "user",
"content": f"<conversation_summary>\n{summary_text}\n</conversation_summary>",
}
return [summary_msg] + tailSubagent delegation: manter o principal limpo
Subagents rodam em janela isolada. O principal os invoca via Task tool (Claude Code) ou sub-agent (OpenAI Agents SDK), recebe apenas o output estruturado e continua. Isso mantém a janela principal enxuta e permite paralelismo.
| Incluir no contexto principal | Delegar a subagent |
|---|---|
| Fato curto e relevante sempre | Pesquisa que exige ler 10+ arquivos |
| Instrução global do sistema | Geração de sub-relatório com contexto próprio |
| Resultado já sintetizado | Exploração cujo output é um resumo |
| Tool pequena e frequente | Tool que gera outputs grandes (grep em monorepo) |
Agent Skills: instruções carregadas sob demanda
Skills (Anthropic, 2024+) são módulos de instruções + scripts que o agent carrega quando a situação o exige. Cada skill tem uma description curta no índice; o agent decide invocar a skill completa apenas quando a task corresponder. Alternativa a enfiar todas as políticas no system prompt.
--- name: pdf-extraction description: Extrai texto e tabelas de PDFs complexos usando pdfplumber + VLM para imagens. allowed-tools: Read, Bash, Write --- # PDF Extraction Quando o usuário pedir para extrair dados de PDF: 1. Use `pdfplumber` para texto e tabelas limpas. 2. Para PDFs escaneados, rode OCR (`tesseract`) ou envie a página como imagem para Claude Vision. 3. Sempre valide que a extração preservou estrutura (tabelas não podem virar texto corrido). 4. Salve output em `extracted/` com mesmo nome do PDF + `.md`. Exemplo de script: ```bash pdfplumber dump tables input.pdf > tables.json ```
CLAUDE.md / AGENTS.md: instruções do projeto
Instruções persistentes por repo/projeto vivem em arquivos-guia: CLAUDE.md (Claude Code), AGENTS.md (Codex/OpenAI), .cursor/rules/ (Cursor). Esses arquivos entram automaticamente no contexto quando o agent abre o projeto.
| Deve entrar | Não deve entrar |
|---|---|
| Comandos de build/test/lint específicos | Documentação que o agent consegue derivar lendo código |
| Padrões de commit/PR | Histórico de decisões (vai pra ADR, não aqui) |
| Gotchas conhecidos (bugs, conflitos) | Todo o manual do projeto |
| Estrutura de pastas não-óbvia | README completo duplicado |
| Scripts de deploy, env vars importantes | Segredos, tokens |
Ordem, posição e formato
| Princípio | Por que | Consequência prática |
|---|---|---|
| Estável antes do volátil | Prompt caching exige prefixo idêntico | System → tools → few-shots → dados fixos → query |
| Crítico no início ou fim | Lost in the middle | Resposta direta no topo; confirmação no fim |
| Tags estruturadas (XML) | Claude/GPT-4+ respeitam delimitadores | <contexto>...</contexto>, <pergunta>...</pergunta> |
| Evite repetição | Cada token pago, cada token atenção | Se já está em system, não repita em user |
| Tool result compacto | Tool que retorna 50k tokens destrói contexto | Truncar, agregar ou delegar para subagent |
Perguntas típicas
❓ Contexto de 1M tokens não elimina tudo isso?
❓ Prompt caching funciona entre usuários diferentes?
❓ Como meço o impacto de context engineering?
❓ Skills vs tools — qual a diferença?
Quiz rápido
4 perguntas · Acerte tudo e ganhe o badge 🎯 Gabarito