Contexto Infinito: Prompts acima da Janela de Contexto de qualquer modelo de IA
Recentemente me deparei com um problema clássico ao trabalhar com LLMs (GPT, Claude, Llama): o limite de contexto. Se você tem um documento de 200 páginas, um log gigante ou um livro, você não consegue simplesmente "jogar" ele no prompt.
Para resolver isso, desenvolvi a Infinity, uma biblioteca agnóstica em Node.js que aplica o conceito de Binary Tree Reduction para sumarização.
O Problema: O gargalo do contexto
Mesmo com modelos de 128k tokens, processar volumes massivos de dados de uma vez só:
- É caro.
- É lento.
- Faz a IA se perder nos detalhes (o famoso "lost in the middle").
A Solução: Redução Hierárquica (Map-Reduce)
A lógica da biblioteca é dividir para conquistar. Em vez de uma sumarização linear, ela trabalha em camadas, como uma pirâmide:
- Camada 1 (Map): O texto é quebrado em pedaços (chunks) com sobreposição (overlap) para não perder o fio da meada nas bordas. Cada pedaço é sumarizado em paralelo.
- Camadas Subsequentes (Reduce): O sistema pega os resumos gerados e os funde de dois em dois (árvore binária). O resumo A + resumo B vira o Novo Resumo C.
- Fim: O processo se repete até que sobre apenas um único bloco de texto que respeite o tamanho máximo definido.
Por que Árvore Binária?
A grande vantagem aqui é a concorrência. Se você tem 16 chunks de texto:
- No modo sequencial, você faria 16 chamadas em fila.
- No modo de árvore, você processa os pares em paralelo. A latência cai de/para.
O Código (Agnóstico e Flexível)
Criei a biblioteca de forma que ela não dependa de uma IA específica. Você pode criar um Adapter para a OpenAI, Anthropic, ou até um modelo local rodando no Ollama.
Exemplo de uso com OpenRouter:
const Infinity = require('./infinity');
const model = new OpenRouterAdapter('SUA_API_KEY', { model: 'meta-llama/llama-3-8b' });
const summarizer = new Infinity(model, {
chunkSize: 5000,
concurrency: 5, // Processa 5 pares por vez
chunkOverlap: 500
});
const resumoMaster = await summarizer.summarize(textoMuitoLongo);
Resiliência e Concorrência
No mundo real, APIs falham. Por isso, implementei um controle de concorrência (concurrency) para não tomar Rate Limit na cara e um sistema simples de retry no adaptador.
O que vem por aí?
A ideia é evoluir para o infinity-struct, onde além de resumir, o motor consiga fazer o merge de JSONs estruturados, permitindo extrair dados complexos de documentos imensos mantendo a consistência do schema.
O código está aberto para quem quiser estudar ou contribuir. O que acham dessa abordagem de árvore para processamento de contexto?
Se alguém quiser ajudar aí, seria legal receber colaborações.