Engenharia de Contexto: Como otimizar a memória e o desempenho dos seus Agents de IA

A engenharia de contexto (context engineering) é a disciplina de estruturar, priorizar e gerenciar informações fornecidas a LLMs para maximizar precisão, eficiência e confiabilidade. Neste guia, você aprenderá técnicas práticas para otimizar o contexto dos seus agents.
Por que Context Engineering importa?
Modelos de linguagem têm limites de contexto (ex.: 200K tokens no Claude 3.5 Sonnet). A forma como você estrutura e fornece informações impacta diretamente:
- Precisão: Contexto relevante melhora respostas
- Custo: Tokens desnecessários aumentam custos
- Latência: Menos contexto = respostas mais rápidas
- Confiabilidade: Contexto bem estruturado reduz alucinações
Princípios fundamentais
1. Relevância sobre volume
Não envie tudo que você tem. Priorize informações essenciais para a tarefa atual.
Ruim:
Histórico completo dos últimos 3 meses (200 mensagens)
Perfil completo do cliente
Todas as políticas da empresa
Bom:
Últimas 5 interações relevantes
Nome, preferências e status atual do cliente
Políticas específicas ao caso (ex.: política de troca)
2. Estruturação hierárquica
Organize informações do mais importante para o menos importante.
[CONTEXTO CRÍTICO]
Cliente: João Silva (VIP, cliente há 3 anos)
Situação: Pedido #1234 atrasado há 5 dias
Status atual: Transportadora reportou extravio
[CONTEXTO SECUNDÁRIO]
Histórico: 12 pedidos anteriores, sem problemas
Preferências: Prefere contato via WhatsApp
[CONTEXTO COMPLEMENTAR]
Última compra: R$ 450,00 em eletrônicos
Programa de fidelidade: Nível Gold
3. Formatação clara e consistente
Use formatação padronizada para facilitar o parsing pelo modelo.
## Dados do Cliente
- Nome: Maria Santos
- Tipo: Business
- Desde: 2022-03-15
- Tickets abertos: 0
## Ticket Atual
- ID: #5678
- Assunto: Dúvida sobre integração API
- Prioridade: Alta
- SLA: Vence em 2h30min
## Contexto Técnico
- Stack: Node.js 18, TypeScript
- Endpoint: POST /api/v2/webhooks
- Erro: 401 Unauthorized
Técnicas práticas de otimização
1. Janela deslizante (Sliding Window)
Para conversas longas, mantenha apenas as N mensagens mais recentes + resumo do histórico anterior.
interface ContextWindow {
summary: string; // Resumo das mensagens antigas
recentMessages: Message[]; // Últimas 10-20 mensagens
relevantFacts: string[]; // Fatos importantes extraídos
}
// Exemplo
const context = {
summary: "Cliente solicitou alteração de plano há 3 dias. Aprovado pela gerência ontem.",
recentMessages: [...últimas10Mensagens],
relevantFacts: [
"Cliente autorizou débito automático",
"Plano novo: Business Pro",
"Data de ativação: 2025-10-20"
]
}
2. Recuperação semântica (Semantic Retrieval)
Em vez de enviar toda a base de conhecimento, busque apenas documentos relevantes.
// RAG (Retrieval-Augmented Generation)
async function buildContext(userQuery: string) {
// 1. Buscar documentos relevantes
const relevantDocs = await vectorDB.search(userQuery, {
limit: 3,
minScore: 0.7
});
// 2. Formatar contexto
return {
query: userQuery,
knowledge: relevantDocs.map(doc => ({
title: doc.title,
content: doc.content,
source: doc.url
}))
};
}
3. Compressão inteligente
Resuma informações repetitivas ou volumosas.
Antes (3000 tokens):
Pedido #1001: Status: entregue, Data: 01/08/2025, Valor: R$ 120,00, Produtos: [Livro A, Livro B]
Pedido #1002: Status: entregue, Data: 15/08/2025, Valor: R$ 85,00, Produtos: [Livro C]
Pedido #1003: Status: entregue, Data: 02/09/2025, Valor: R$ 200,00, Produtos: [Livro D, Livro E, Livro F]
[... mais 20 pedidos ...]
Depois (200 tokens):
Histórico de pedidos (23 total, R$ 3.450,00):
- Todos entregues com sucesso
- Frequência: ~2-3 por mês
- Ticket médio: R$ 150,00
- Categoria principal: Livros (95%)
- Último pedido: #1023 em 10/10/2025
4. Contexto lazy-loaded
Carregue informações adicionais apenas quando necessário.
// Contexto inicial (mínimo)
const initialContext = {
customer: { id, name, tier },
currentIssue: { summary, category }
};
// Se o agent precisar de mais dados, ele pode usar ferramentas
const tools = [
{
name: "getFullCustomerHistory",
description: "Busca histórico completo do cliente (use apenas se necessário)",
parameters: { customerId: string }
},
{
name: "searchKnowledgeBase",
description: "Busca na base de conhecimento",
parameters: { query: string, maxResults: number }
}
];
Padrões de contexto por tipo de agent
Agent de Atendimento (SAC)
[PRIORIDADE ALTA]
- Cliente: nome, tier, tickets abertos
- Problema atual: descrição, categoria, urgência
- Histórico recente: últimas 3 interações
[PRIORIDADE MÉDIA]
- Pedidos recentes: últimos 2-3
- Preferências: canal, horário, idioma
[PRIORIDADE BAIXA]
- Estatísticas gerais: tempo como cliente, NPS
Agent de Vendas (SDR)
[PRIORIDADE ALTA]
- Lead: nome, empresa, cargo, origem
- Interesse: produto/solução específica
- Qualificação: budget, timeline, autoridade
[PRIORIDADE MÉDIA]
- Empresa: segmento, tamanho, localização
- Histórico: interações anteriores, materiais baixados
[PRIORIDADE BAIXA]
- Dados demográficos adicionais
Agent Técnico (Dev/Suporte)
[PRIORIDADE ALTA]
- Problema: erro específico, mensagem, contexto
- Ambiente: versões, configurações relevantes
- Tentativas: o que já foi testado
[PRIORIDADE MÉDIA]
- Stack: tecnologias, dependências
- Logs: últimos 50 linhas relevantes
[PRIORIDADE BAIXA]
- Documentação completa
- Histórico de issues similares
Métricas para avaliar qualidade do contexto
1. Eficiência de tokens
Token Efficiency = Tokens relevantes usados / Total de tokens enviados
Objetivo: > 70%
2. Taxa de recuperação correta
Retrieval Accuracy = Respostas corretas usando contexto / Total de respostas
Objetivo: > 90%
3. Latência por contexto
Latency per 1K tokens = Tempo de resposta / (Tokens de contexto / 1000)
Objetivo: < 500ms por 1K tokens
4. Custo por interação
Cost per interaction = (Input tokens × price_in + Output tokens × price_out)
Objetivo: definido por caso de uso
Checklist de Context Engineering
- Identificar informações essenciais: liste o mínimo necessário para cada tipo de tarefa
- Estruturar hierarquicamente: organize por prioridade/relevância
- Implementar retrieval semântico: use RAG para bases de conhecimento grandes
- Configurar janela deslizante: defina quantas mensagens manter em conversas longas
- Comprimir dados repetitivos: resuma históricos e listas extensas
- Usar lazy loading: carregue contexto adicional sob demanda
- Medir e otimizar: monitore métricas de eficiência e custo
- A/B test: compare diferentes estratégias de contexto
Ferramentas e bibliotecas úteis
Vector Databases (para RAG)
- Pinecone: gerenciado, fácil de começar
- Weaviate: open-source, rico em features
- Chroma: leve, ideal para protótipos
Processamento de contexto
// Exemplo: Limitar tokens de contexto
import { encode } from 'gpt-tokenizer';
function truncateContext(text: string, maxTokens: number): string {
const tokens = encode(text);
if (tokens.length <= maxTokens) return text;
// Truncar e decodificar
const truncated = tokens.slice(0, maxTokens);
return decode(truncated) + "... [contexto truncado]";
}
// Exemplo: Priorização de contexto
interface ContextBlock {
content: string;
priority: 'high' | 'medium' | 'low';
tokens: number;
}
function buildPrioritizedContext(
blocks: ContextBlock[],
maxTokens: number
): string {
const sorted = blocks.sort((a, b) => {
const priorities = { high: 3, medium: 2, low: 1 };
return priorities[b.priority] - priorities[a.priority];
});
let total = 0;
const selected: string[] = [];
for (const block of sorted) {
if (total + block.tokens <= maxTokens) {
selected.push(block.content);
total += block.tokens;
} else {
break;
}
}
return selected.join('\n\n');
}
Exemplo completo: Agent de suporte com contexto otimizado
interface OptimizedSupportAgent {
async handleTicket(ticketId: string) {
// 1. Carregar contexto mínimo
const ticket = await db.tickets.findById(ticketId);
const customer = await db.customers.findById(ticket.customerId, {
fields: ['id', 'name', 'tier', 'language']
});
// 2. Buscar conhecimento relevante
const relevantDocs = await vectorDB.search(ticket.description, {
limit: 3
});
// 3. Carregar histórico recente (não tudo!)
const recentHistory = await db.interactions.find({
customerId: customer.id,
limit: 5,
orderBy: 'createdAt DESC'
});
// 4. Construir contexto estruturado
const context = `
[TICKET ATUAL]
ID: ${ticket.id}
Assunto: ${ticket.subject}
Categoria: ${ticket.category}
Prioridade: ${ticket.priority}
[CLIENTE]
Nome: ${customer.name}
Tier: ${customer.tier}
Idioma: ${customer.language}
[CONHECIMENTO RELEVANTE]
${relevantDocs.map(doc => `
- ${doc.title}
${doc.content.substring(0, 200)}...
Fonte: ${doc.url}
`).join('\n')}
[HISTÓRICO RECENTE]
${recentHistory.map(h => `
- ${h.date}: ${h.summary}
`).join('\n')}
`;
// 5. Ferramentas para contexto adicional (se necessário)
const tools = [
{
name: 'getOrderDetails',
description: 'Busca detalhes de um pedido específico',
parameters: { orderId: 'string' }
},
{
name: 'searchFullHistory',
description: 'Busca no histórico completo (use com parcimônia)',
parameters: { query: 'string', limit: 'number' }
}
];
return { context, tools };
}
}
Anti-padrões comuns (evite!)
❌ Dump de dados não estruturados
Aqui está tudo sobre o cliente: {JSON.stringify(allCustomerData)}
❌ Contexto duplicado
Cliente: João
Nome do cliente: João
O cliente se chama João
❌ Informações desatualizadas
Status do pedido: em processamento
[na verdade já foi entregue há 2 dias]
❌ Contexto sem hierarquia
Tudo no mesmo nível, sem priorização clara
Conclusão
Context engineering é crucial para agents eficientes e confiáveis. Lembre-se:
- Menos é mais: priorize relevância sobre volume
- Estruture bem: hierarquia e formatação importam
- Seja dinâmico: ajuste o contexto conforme a necessidade
- Meça sempre: otimize com base em dados
Comece implementando janela deslizante e retrieval semântico nos seus agents. Os ganhos em custo, latência e qualidade serão imediatos.
Próximo post: Vamos explorar técnicas avançadas de RAG (Retrieval-Augmented Generation) e como implementar busca híbrida (keyword + semantic) para maximizar a precisão dos seus agents.