Domínio 5 — Context Management & Reliability · Lição 1 de 5

Janela de contexto, degradação e extração de fatos

Objetivos de aprendizagem

O que consome a janela de contexto

A janela de contexto é o orçamento total de tokens que o modelo enxerga em uma chamada. Tudo entra na conta:

A API é stateless: para manter coerência conversacional, cada request subsequente precisa reenviar o histórico completo da conversa. É por isso que o crescimento do contexto é cumulativo — cada turno adiciona ao custo de todos os turnos seguintes.

Tool results dominam o consumo. Um lookup de pedido pode devolver 40+ campos (endereços, metadados de frete, histórico fiscal...) quando apenas 5 são relevantes para a tarefa — por exemplo, os campos ligados a devolução. Em sessões multi-turno, esses payloads inteiros ficam no histórico e são reenviados a cada chamada, consumindo tokens de forma desproporcional à sua relevância.

Sinais de degradação de contexto

Em sessões estendidas (exploração de codebase, atendimento longo, pesquisa multi-etapa), o contexto lotado degrada a qualidade das respostas antes mesmo de estourar o limite. Sinais clássicos que a prova cobra:

Lost in the middle

Modelos processam com confiabilidade informação no início e no fim de entradas longas, mas podem omitir achados das seções intermediárias. Em um agregado de resultados de vários subagentes, os achados "do meio" são os mais propensos a sumir da síntese.

Mitigações que a prova espera:

O padrão "case facts": fatos fora do histórico resumido

Sumarização progressiva do histórico economiza tokens, mas tem um risco conhecido: condensar valores numéricos, percentuais, datas e expectativas declaradas pelo cliente em resumos vagos ("cliente pediu reembolso de um pedido recente" — qual pedido? de quanto?).

A solução é separar duas camadas de contexto:

CamadaConteúdoTratamento
Case facts (bloco persistente)Fatos transacionais: valores, datas, números de pedido, status, expectativas declaradasExtraídos de forma estruturada e incluídos verbatim em cada prompt, fora do resumo
Histórico conversacionalO vai-e-vem da conversa, raciocínio, cortesiasPode ser resumido/comprimido com perda aceitável

Em sessões com múltiplos problemas simultâneos (multi-issue), estruture os dados de cada issue (order IDs, valores, status) nessa camada separada — assim o resumo do histórico nunca é a única fonte dos fatos críticos.

Trim antes de acumular. Filtre tool outputs verbosos para apenas os campos relevantes antes de anexá-los como tool_result ao histórico. Aparar na origem é mais barato do que resumir depois — e evita que 35 campos irrelevantes sejam reenviados a cada turno.

Exemplo: camada de fatos + trim de tool output

import json
import anthropic

client = anthropic.Anthropic()

# Campos relevantes para o fluxo de devolução (5 de 40+ retornados pela API interna)
RETURN_RELEVANT_FIELDS = ["order_id", "amount", "status", "purchase_date", "return_deadline"]

def trim_order_lookup(raw_order: dict) -> dict:
    """Apara o tool output para apenas os campos relevantes antes de entrar no contexto."""
    return {k: raw_order[k] for k in RETURN_RELEVANT_FIELDS if k in raw_order}

# Bloco "case facts": fatos transacionais persistidos FORA do historico resumido
case_facts = {
    "customer_id": "C-88231",
    "issues": [
        {"order_id": "ORD-4412", "amount": 289.90, "status": "delivered",
         "customer_expectation": "reembolso integral, prometido em ate 5 dias uteis"},
        {"order_id": "ORD-4587", "amount": 74.50, "status": "in_transit"},
    ],
}

summarized_history = "Cliente relatou dois problemas; agente verificou identidade e consultou ambos os pedidos."

response = client.messages.create(
    model="claude-opus-5",
    max_tokens=2048,
    system=(
        "Voce e um agente de suporte. Os fatos do caso abaixo sao a fonte de verdade; "
        "nunca cite valores ou datas que nao estejam neles.\n\n"
        "<case_facts>\n" + json.dumps(case_facts, ensure_ascii=False) + "\n</case_facts>"
    ),
    messages=[
        {"role": "user", "content": (
            "<historico_resumido>" + summarized_history + "</historico_resumido>\n\n"
            "O cliente pergunta: qual o valor exato do reembolso do primeiro pedido e o prazo prometido?"
        )},
    ],
)
print(response.content[0].text)

Repare: o resumo do histórico pode ser vago, mas o valor 289.90 e a expectativa "5 dias úteis" sobrevivem intactos porque vivem no bloco de fatos, não no resumo.

Pegadinhas da prova

Resumo em 5 linhas

  1. Tudo consome a janela: system, tools, histórico, tool results — e a API stateless reenvia o histórico a cada turno.
  2. Tool results acumulam desproporcionalmente: 40+ campos quando 5 importam — apare na origem, antes de entrar no contexto.
  3. Degradação se manifesta como respostas inconsistentes e "padrões típicos" no lugar das classes específicas já descobertas.
  4. Lost in the middle: informação no meio de inputs longos some — resumo no início + section headers explícitos mitigam.
  5. Fatos transacionais (valores, datas, order IDs, expectativas do cliente) vão para um bloco "case facts" persistente, fora do histórico resumido.

Documentação oficial

Questões de fixação

1. Um agente de suporte usa sumarização progressiva do histórico. Após algumas horas, ele passa a citar valores de reembolso incorretos e datas vagas. Qual é a correção mais eficaz?

2. Em uma sessão longa de exploração de codebase, o modelo começa a descrever "padrões típicos de um serviço de pagamentos" em vez das classes específicas que ele mesmo listou no início da sessão. O que esse sintoma indica?

3. Um coordenador agrega relatórios longos de 6 subagentes de pesquisa e nota que achados dos relatórios do meio são omitidos na síntese. Quais duas medidas mitigam diretamente esse efeito? (escolha duas)

4. Um agente consulta uma API interna de pedidos que retorna 43 campos por pedido; a tarefa usa 5. Em sessões multi-turno o custo por chamada cresce rápido. Qual é a melhor prática?