Lembro-me distintamente de ser pequeno, com 10 ou 11 anos, quando vivíamos em Ponta Delgada e chegava a casa superentusiasmado para ver os documentários do Canal História e do Discovery. Todos os dias, sem exceção, a minha cabeça memorizava milhares de pormenores: «Oh, os gregos antigos tinham máquinas que dispensavam água abençoada em troca de moedas em alguns templos!». Foram anos e anos a criar um hábito que ainda hoje tenho. Nestes últimos (quase) 36 anos, devo ter visto dezenas de milhares de documentários e vídeos de comunicação científica, história, filosofia e outros temas. E a (óbvia) verdade é que 99,9% do que ouvi, vi e li não ficou em lado nenhum na minha cabeça.

Houve factos que ficaram, por serem tão curiosos como o das máquinas dos gregos, ou porque os anotei e eventualmente li de novo, ou porque os interiorizei de tal forma que já fazem parte do meu conhecimento geral, ou porque estão associados a outras memórias marcantes, ou porque a memória ainda é fresca.

Podemos tirar daqui uma analogia interessante, embora não seja uma equivalência. Os foundation models (modelos de AI treinados com grandes volumes de dados diversificados, que podem ser adaptados a diferentes tarefas) também não têm tudo disponível a cada instante. Mas convém distinguir o conhecimento aprendido durante o treino do contexto ativo, a informação que recebem para uma determinada chamada ao modelo.

Quando são treinados, são expostos a mais dados do que algum humano conseguiria consumir na sua vida inteira. Parte desse conteúdo junta-se à amálgama do conhecimento de base do modelo. Inclusivamente, tal como os humanos, os modelos podem assimilar fake news e ideias falsas.

Na sua utilização normal do dia a dia, os modelos aliam este conhecimento de base a uma série de fontes de contexto. Se eu quero que um agente de AI automatize a filtragem e priorização da minha caixa de email, ele vai usar o conhecimento de base que traz, o conhecimento do processo (instruções) que lhe dei e os dados dos próprios emails (conhecimento da tarefa específica). Mas aí tropeçamos numa das maiores limitações desta tecnologia: os modelos têm uma janela de contexto limitada. Há modelos de fronteira com janelas na ordem de 1 milhão de tokens. Cada token corresponde, em média e como aproximação para texto em inglês, a cerca de quatro caracteres. Um milhão de tokens, portanto, equivale aproximadamente a uma vez e meia o texto dos três volumes de O Senhor dos Anéis, no original inglês.

Defino aqui um agente como um programa que usa um foundation model (FM) para tomar decisões e usar ferramentas. De cada vez que tem de receber informação e tomar uma decisão, vai chamar o modelo. A informação que não for incluída nessa chamada não estará disponível como contexto, mesmo que tenha aparecido numa chamada anterior. A indústria tem evoluído para contornar esta limitação. Ao conjunto de práticas que se usam para passar o contexto que é preciso, quando é preciso, ao agente, chamo aqui técnicas de gestão de contexto. Uma das ideias-base é a progressive disclosure of information, ou seja, a forma como se vai dando contexto ao longo do tempo, acompanhada de ferramentas para o agente ir buscar a informação de que necessita.

Figura humana composta por livros, com um volume aberto a formar o cabelo.
O Bibliotecário, atribuído a Giuseppe Arcimboldo, século XVI. Skokloster Castle, Suécia. Fotografia: Jens Mohr; reprodução disponibilizada pelo museu no Wikimedia Commons, domínio público.

Sendo toda uma área relativamente recente, não há uma solução one-size-fits-all. Existem várias heurísticas comuns na indústria, sendo que uma das mais utilizadas é a Retrieval-Augmented Generation (RAG). Com esta técnica, os documentos são normalmente divididos em segmentos, segundo diferentes critérios: tamanho fixo, contexto semântico, hierarquia do documento, entre outros. Muitas vezes, esses segmentos são convertidos em representações numéricas, a que chamamos embeddings.1 Quando há necessidade, o agente faz uma pesquisa sobre essa informação, recebe os segmentos considerados relevantes para a sua tarefa e usa-os para gerar a resposta. Tipicamente, pode fazer uma pesquisa léxica (procura termos específicos), semântica (procura segmentos com significados semelhantes ao que é pedido pela tarefa) ou híbrida (ambas). Isto é excelente quando é necessário encontrar informação específica em documentos bastante grandes, como no clássico exemplo de retirar informação relevante de um contrato de 500 páginas. No entanto, mesmo que o agente formule bem a pesquisa, pode não receber todos os segmentos necessários para responder à tarefa, ficando com contexto incompleto. Não obstante, tanto na indústria como na academia, ainda se fala bastante desta técnica, e tem sido utilizada em praticamente todos os casos de implementação que já vi.

Mas não é a única forma de o fazer. Um dos nomes mais referenciados neste mundo da AI generativa, Andrej Karpathy, propôs a LLM Wiki.2 Esta abordagem utiliza ficheiros Markdown (.md), que são apenas ficheiros de texto com uma formatação específica, para manter um índice e páginas interligadas de conhecimento sintetizado a partir das fontes. O agente pode consultar as páginas relevantes, na íntegra, quando necessita. É o equivalente a quando eu vou consultar o manual de utilização de um objeto novo e leio, escolhendo com base no índice, apenas as referências relevantes para mim. Tem sido a minha abordagem preferida para vários casos de uso, pela consistência e pela facilidade de manutenção ou ajuste manual. Pode é criar, em casos de uso complexos, um encargo de manutenção maior do que, por exemplo, gerar os embeddings de uma nova versão de um documento e atualizar o índice. Podemos criar pipelines de destilação de informação (refiro-me a reduzir a quantidade de texto, mantendo a densidade de informação) para fazer a manutenção de uma LLM Wiki. Aliás, é isso que Karpathy propõe. Da minha experiência, no entanto, esta destilação de informação ainda é bastante falível por parte dos modelos, aos quais escapam frequentemente nuances da informação original e a visão de conjunto do objetivo do documento. E o esforço de curadoria rapidamente se torna pesado.

Por fim, como o texto já vai longo e não quero desanimar quem até aqui o leu, gostava de passar brevemente pela abordagem GraphRAG, ou Graph Retrieval-Augmented Generation. Se calhar começamos pelo que é um grafo: uma estrutura matemática ou computacional formada por um conjunto de vértices (nós) ligados por arestas (ou ligações)... pausa para respirar. Simplificando, é uma maneira de representar informação e as relações entre os dados, como abaixo. Um bom exemplo é uma rede social, em que pode haver nomes de várias pessoas ligadas entre si, mas as ligações têm uma direção: a Joaquina segue o Manuel, que segue o Ramiro, que, por sua vez, segue a Joaquina. Isso não significa que o Manuel siga a Joaquina, nem que a Joaquina siga o Ramiro. As pessoas são nós; as ligações são os follows. É possível ter uma direção na informação, e as relações são explícitas.

Uma rede de relações com direçãoJoaquina segue Manuel, Manuel segue Ramiro e Ramiro segue Joaquina. As setas não implicam relações no sentido inverso.JoaquinaManuelRamirosegueseguesegue
Uma rede de relações com direçãoJoaquina segue Manuel, Manuel segue Ramiro e Ramiro segue Joaquina. As setas não implicam relações no sentido inverso.JoaquinaManuelRamirosegueseguesegue

Uma seta de A para B significa «A segue B». A relação inversa não está implícita.

GraphRAG usa um grafo de conhecimento, com entidades (conceitos, objetos, pessoas) e relações entre elas, para criar uma teia que pode ser consultada. Torna mais simples, para um agente, seguir um percurso de pesquisa através dessas relações à procura de informação para completar uma tarefa. A informação encontrada é depois passada ao modelo como contexto para produzir a resposta. Esta capacidade pode ser especialmente útil quando é preciso cruzar informação de vários documentos. Como nas outras abordagens, tem de haver curadoria da informação e das relações, em particular quando são produzidas de forma autónoma pelo agente. Por exemplo, se as relações estiverem erradas, incompletas ou desatualizadas, o agente pode deixar informação importante de fora ou apoiar a resposta em ligações que já não fazem sentido. Já me aconteceu aplicar esta abordagem e ficar com uma rede tão complexa que nem eu nem o agente (shoutout ao Sr. Alfredo) percebíamos o que estava lá.

Estas três abordagens não são mutuamente exclusivas, e um projeto de implementação empresarial relativamente complexo e com uma abordagem madura poderá, no limite, utilizar as três, consoante o caso. Uma wiki pode ser pesquisada por RAG, e o próprio GraphRAG é uma forma de apoiar a geração com informação recuperada. Aqui vai o resumo do meu modelo mental sobre quando usar cada uma:

Técnica Definição Quando devo utilizar Principais limitações
RAG documental Recupera passagens relevantes de documentos e passa-as ao modelo como contexto. Quando preciso de localizar informação específica numa coleção extensa ou que muda frequentemente, como cláusulas de contratos ou documentação técnica. Pode não recuperar uma passagem decisiva ou separar uma regra da sua exceção. Exige atenção à divisão dos documentos, à pesquisa e à atualização do índice.
LLM Wiki Mantém páginas interligadas que sintetizam conhecimento de várias fontes para consulta e reutilização. Quando acumulo conhecimento sobre um tema ou projeto e quero reutilizar explicações, decisões e ligações já trabalhadas. A síntese pode perder nuances ou perpetuar erros. Atualizações e contradições exigem curadoria, e consultar a wiki continua a depender de encontrar as páginas certas.
GraphRAG Usa relações explícitas entre entidades para encontrar e organizar informação que apoia a resposta. Quando a pergunta depende de ligações entre pessoas, conceitos, decisões ou componentes, muitas vezes distribuídas por vários documentos. Relações erradas ou em falta afetam a pesquisa. Construir e manter o grafo pode ser complexo; ter mais ligações não garante melhor contexto.

Mas o tema da gestão de contexto não se esgota aqui. Este é apenas o primeiro artigo de uma série em que vou abordar esta temática. Futuramente, vamos falar de caching, compaction, context pruning e isolamento de contexto com subagentes. Vemo-nos em breve.


  1. LLM significa large language model, ou modelo de linguagem de grande escala. As duas designações sobrepõem-se, mas não são sinónimas: LLM descreve um modelo centrado na linguagem; FM destaca a sua utilização como base adaptável a várias tarefas. Muitos dos LLMs de uso geral são foundation models, mas também há foundation models de imagem, áudio e outras modalidades. Ver a definição do Stanford CRFM. ↩