Dividindo um arquivo de memória em duas prateleiras com menos de 180 linhas
Nosso agente de IA disse que tinha salvado uma anotação, e semanas depois ainda nos fazia a mesma pergunta.
Por semanas, demos a ele metas, ideias e preferências que não queríamos ficar repetindo. Ele respondia com uma promessa animada de que a informação tinha sido salva. Aí começávamos uma nova sessão e nos víamos explicando tudo de novo. Certa noite, digitamos uma meta que já tínhamos dado três sessões antes. Ele disse que tinha salvado. Ficamos com a sensação incômoda de que, de manhã, ela teria sumido de novo.
Tentamos primeiro as soluções comuns. Reiniciamos as sessões. Colamos os mesmos fatos de volta. Mudamos a redação, caso tivéssemos pedido do jeito errado. Nada funcionou. O custo foi semanas repetindo as mesmas coisas e a perda lenta de paciência de quem fica se perguntando se uma instrução básica vai pegar.
A frase no topo do arquivo
A explicação estava no topo do arquivo de memória o tempo todo:
Only the first 200 lines or 25KB (Ler em inglês) of this file load each session; past that, entries silently drop.
As anotações continuavam no arquivo, como fichas de receita na gaveta da cozinha. Mas o agente só abria a primeira parte da gaveta quando uma nova sessão começava. Tudo depois das primeiras 200 linhas, ou depois de 25KB, ficava sem ser aberto.
O nome para essa quantidade fixa de espaço é orçamento de carga. Significa apenas que o sistema só consegue levar uma certa quantidade de coisas para uma nova conversa. Se as anotações ocupam mais espaço do que o limite permite, as páginas extras não vêm junto.
As memórias novas eram adicionadas no fim do arquivo. Então as coisas mais recentes que pedimos para ele lembrar eram as primeiras que ele deixava de enxergar. Do ponto de vista do agente, aquelas metas nunca tinham sido escritas.
Uma anotação salva não é o mesmo que uma anotação lida. Tratamos as duas coisas como uma promessa só porque o arquivo no disco parecia completo. E estava completo, em certo sentido. Também era inútil justamente na hora em que precisávamos que o agente usasse as anotações mais novas.
Duas prateleiras em vez de uma
Paramos de pedir a um único lugar que fizesse dois trabalhos diferentes. Algumas coisas precisam estar diante do agente o tempo todo, como as regras básicas e um pequeno número de fatos que aparecem com frequência. Outras só precisam ser encontradas quando o assunto surge.
Então a memória virou duas prateleiras. A primeira guarda as regras e os fatos mais usados. Ela fica abaixo de 180 linhas, deixando folga em relação ao limite de 200 em vez de ficar bem na beirada. A segunda prateleira é um catálogo de consulta, uma lista completa das coisas que pedimos para ele lembrar. Essa lista tem mais de 250 entradas, mas o tamanho dela não causa mais problema, porque ela não é carregada automaticamente em toda sessão. O agente pode consultá-la quando o assunto pedir.
Também adicionamos uma pequena verificação antes de a sessão começar. Ela conta as linhas e o tamanho do arquivo que fica sempre aberto. Se o arquivo estiver grande demais, a sessão não começa como se estivesse tudo bem. A verificação também procura anotações salvas que não estejam ligadas a nada no catálogo. Esse tipo de anotação solitária pode ficar ali sem ninguém notar, até que alguém precise dela.
Nenhuma janela mostrou um erro. O sistema parecia saudável, as anotações pareciam salvas, e aquilo que nos importava tinha ficado fora da parte que era lida.