Engenharia de contexto (context engineering) é a prática de decidir tudo o que um modelo de linguagem vê quando responde: não só a pergunta que você digita, mas as instruções em volta dela, os documentos e resultados de ferramentas inseridos, a memória salva sobre o usuário e a conversa até ali. Tudo isso divide uma única janela de contexto, e o modelo responde a partir desse texto e de nada mais. O termo se espalhou em 2025, conforme mais produtos de IA viraram agentes que montam a maior parte do próprio contexto de forma automática.
A engenharia de prompt trata principalmente de como redigir um pedido. A engenharia de contexto trata do que o modelo deve ter à frente em cada chamada, e em que ordem.
De um prompt a um contexto
Em um app de chat, você escreve a maior parte do contexto: o app acrescenta um prompt de sistema e o histórico, e você acrescenta o resto. Em uma aplicação, a balança se inverte. Um usuário digita uma frase, e o código em volta do modelo acrescenta instruções, um perfil do usuário, três artigos de ajuda encontrados por busca, a lista de ferramentas disponíveis e a saída da última chamada de ferramenta. A frase do usuário pode ser uma pequena fração do que o modelo lê.
Quando um sistema assim responde mal, a solução raramente está na redação. A causa comum é o modelo ter recebido o material errado: um fato que faltou, um resultado de ferramenta desatualizado, um documento irrelevante que pareceu relevante para a busca.
O que entra na janela de contexto
Uma chamada típica em uma aplicação de IA contém algumas ou todas estas partes, mais ou menos nesta ordem:
- Instruções de sistema: o papel, as regras e o formato de saída, normalmente fixos para o app inteiro. Veja prompt de sistema.
- Definições de ferramentas: nomes, descrições e parâmetros das ferramentas que o modelo pode chamar.
- Exemplos: algumas entradas e saídas de exemplo que mostram o comportamento esperado.
- Memória: fatos salvos de sessões anteriores, como o plano, o idioma ou as preferências do usuário.
- Documentos recuperados: trechos encontrados ao buscar esta pergunta em uma base de conhecimento (geração aumentada por recuperação, ou RAG).
- Histórico da conversa: as mensagens anteriores, na íntegra ou resumidas.
- Resultados de ferramentas: saídas de buscas, execuções de código ou chamadas de API feitas durante esta tarefa, como em um loop ReAct.
- A mensagem atual: o que o usuário acabou de perguntar.
O bloco abaixo é um contexto montado para um assistente de suporte. Desligue as partes uma por vez. Sem a parte de contexto, o modelo não tem como saber o plano da cliente; sem a parte de entrada, ele não tem fatos sobre o produto, e as restrições mandam que ele diga isso em vez de adivinhar.
Oi, Dana! O modo offline faz parte do plano Pro, e a sua conta está no plano Free, então no momento ele não está disponível para você. Com o Pro, as notas que você criar durante o voo são sincronizadas automaticamente quando o celular voltar a se conectar. Um limite para saber: anexos com mais de 20 MB não ficam disponíveis offline.
Repare que a resposta correta depende de juntar duas fontes: a memória (plano Free) e um documento (o modo offline é só do Pro). Nenhuma das duas basta sozinha, o que é típico. Boa parte da engenharia de contexto é garantir que as peças que dependem umas das outras cheguem juntas.
Quatro jeitos de um contexto dar errado
- Informação faltando. O modelo preenche lacunas com palpites plausíveis, que é de onde vêm muitas alucinações. Acrescente o fato ou diga ao modelo o que fazer quando um fato faltar.
- Material demais. Cada parágrafo irrelevante custa tokens e disputa a atenção. Liu et al. 2023, "Lost in the Middle: How Language Models Use Long Contexts", descobriram que os modelos testados usavam informações do começo ou do fim de uma entrada longa de forma mais confiável do que informações do meio. Os modelos mais novos lidam melhor com entradas longas, mas enviar os poucos trechos que respondem à pergunta continua mais barato, e mais fácil para o modelo usar, do que colar o manual inteiro.
- Informação desatualizada. Um resultado de ferramenta de dez passos atrás pode descrever um arquivo ou um saldo que já mudou. Se o modelo vê as duas versões, pode usar a antiga.
- Conflitos. Dois documentos discordam, ou a memória diz uma coisa e o usuário outra. Diga ao modelo qual fonte vale mais, por exemplo "a última mensagem do usuário prevalece sobre a memória salva".
Como ordenar o contexto
A ordem muda tanto os resultados quanto o custo.
- Partes estáveis primeiro. As instruções de sistema, as definições de ferramentas e o material de referência fixo raramente mudam entre chamadas. Vários fornecedores de API oferecem cache de prompt (prompt caching), que reaproveita o processamento de um início idêntico da entrada, então um prefixo que não muda deixa as chamadas repetidas mais baratas e mais rápidas.
- Material longo antes da pergunta. Para um documento longo ou um grande conjunto de trechos, coloque o material primeiro e a pergunta e as instruções finais depois. O guia de prompts da Anthropic, por exemplo, recomenda essa ordem para entradas longas, com a pergunta logo antes de o modelo começar a escrever.
- Rotule cada peça. Envolva cada fonte em tags como
<document>,<memory>ou<tool_result>, com o nome da fonte. Os rótulos permitem que o modelo separe dados de instruções e que você peça a ele que cite de onde veio uma resposta. Delimitadores e tags XML mostra os formatos.
Como enxugar um contexto longo
Cada mensagem de um chat reenvia o histórico inteiro, então sessões longas crescem até que algo precise sair. Dependendo do app, ele pode resumir ou descartar mensagens antigas, ou pedir que você abra um chat novo. Você tem resultados melhores enxugando de propósito.
- Mantenha as últimas mensagens palavra por palavra e troque as mais antigas por um resumo.
- Depois que um resultado de ferramenta foi usado, troque-o por uma nota de uma linha dizendo o que ele mostrou.
- Mantenha os identificadores exatos em todo resumo: nomes de arquivos, nomes de funções, IDs, mensagens de erro e números. Um resumo que diz "o arquivo de configuração" onde o histórico dizia
settings.prod.yamlperde justamente o detalhe que importava. - Em um app de chat, quando a conversa se desviar, comece um chat novo com uma nota de passagem. O prompt abaixo escreve uma.
Objetivo: substituir as validações escritas à mão do formulário de cadastro por um único esquema de validação compartilhado, usado pelo navegador e pelo servidor.
Decisões
- Um único arquivo de esquema,
signupSchema.ts, importado porSignupForm.tsxe porapi/signup.ts, para que os dois conjuntos de regras não se distanciem. - As mensagens de erro ficam palavra por palavra, porque a central de ajuda as cita.
Estado atual
- A validação no navegador usa o esquema, e o
SignupForm.test.tsxpassa. - O servidor ainda chama a antiga
validateSignup()emapi/signup.ts.
Detalhes exatos: as senhas precisam de pelo menos 8 caracteres e um número. Texto do erro de e-mail: "Informe um endereço de e-mail válido."
Próximo passo: trocar validateSignup() pelo esquema e rodar os testes da API.
Pergunta em aberto: um e-mail já cadastrado deve retornar 409 ou 400?
Memória entre sessões
Memória é o contexto que sobrevive a uma conversa: fatos gravados no fim de uma sessão e carregados na seguinte. Os apps de chat oferecem versões disso, como memórias salvas ou instruções de projeto acrescentadas a todo chat de um projeto. Na sua própria aplicação, a memória é uma tabela ou um arquivo de notas que o seu código lê e insere. Duas regras a mantêm útil: guarde fatos que continuam verdadeiros (plano, idioma, stack preferida), não transcrições; e carregue só o que é relevante para a tarefa atual, porque a memória disputa o mesmo espaço que todo o resto.
Montando o contexto no código
Em uma aplicação, a engenharia de contexto é código comum. Este esboço com o SDK Python da Anthropic coloca as regras fixas e a memória no prompt de sistema, mantém só o histórico recente e coloca os documentos rotulados antes da pergunta.
import anthropic
client = anthropic.Anthropic()
MODEL = "your-model-id" # e.g. from your provider's model list
def build_context(question, docs, history, memory, max_messages=6):
documents = "\n".join(
f'<document source="{d["source"]}">\n{d["text"]}\n</document>' for d in docs
)
system = (
"You are the support assistant for Acme Notes. Answer only from the documents. "
"If they do not cover the question, say so.\n"
f"<memory>\n{memory}\n</memory>"
)
# history holds complete user/assistant pairs, so an even slice starts with a user turn
recent = history[-max_messages:]
user = f"<documents>\n{documents}\n</documents>\n\n{question}"
return system, recent + [{"role": "user", "content": user}]
# question, docs, history and memory come from your application
system, messages = build_context(question, docs, history, memory)
response = client.messages.create(model=MODEL, max_tokens=1024, system=system, messages=messages)
print(response.content[0].text)
Cada decisão dessa função (quais documentos, quantas mensagens, onde fica a memória) é uma escolha de engenharia de contexto, e cada uma merece ser testada com perguntas reais, do mesmo jeito que você testaria uma mudança na redação.
Perguntas frequentes
O que é engenharia de contexto?
Engenharia de contexto é o trabalho de escolher, ordenar e enxugar tudo o que um modelo de linguagem recebe em uma chamada: as instruções de sistema, os exemplos, os documentos recuperados, as definições e os resultados de ferramentas, a memória salva, o histórico da conversa e a mensagem do usuário. O modelo responde só a partir desse texto, então o que está nele, e o que fica de fora, decide a qualidade da resposta.
Qual é a diferença entre engenharia de contexto e engenharia de prompt?
A engenharia de prompt trata principalmente da redação das instruções. A engenharia de contexto cobre a entrada inteira, e boa parte dela é montada por código, não digitada por uma pessoa: quais documentos recuperar, quais resultados de ferramentas manter, quanto histórico incluir e em que ordem. Em um chat, você mesmo escreve a maior parte do contexto; em um app ou agente, a maior parte é escolhida pelo sistema em volta do modelo.
Mais contexto é sempre melhor?
Não. Material irrelevante ou desatualizado compete com as partes que importam, custa tokens e pode contradizer o estado atual. Pesquisas com entradas longas mostraram que os modelos podem deixar passar informações que ficam no meio de um contexto longo. Inclua o que a tarefa precisa, rotule e tire o que ela não precisa mais.
Por que um chat longo vai piorando com o tempo?
A conversa inteira é reenviada a cada mensagem, então erros antigos, ideias abandonadas e código já substituído continuam no contexto e seguem influenciando as respostas. Quando o chat passa do tamanho da janela de contexto, o app precisa descartar ou resumir as mensagens antigas. Começar um chat novo com um resumo curto das decisões e do estado atual muitas vezes funciona melhor do que continuar.
O que é RAG na engenharia de contexto?
RAG (retrieval-augmented generation, ou geração aumentada por recuperação) é buscar nos seus próprios documentos os trechos relevantes para a pergunta e inseri-los no contexto antes de o modelo responder. É uma das principais ferramentas da engenharia de contexto: o modelo recebe fatos atuais e específicos que não teria como saber pelo treinamento, e você pode mandar que ele responda só a partir desses trechos.