Do que é que falávamos da última vez?
Até 19 de maio, o assistente retinha tudo, exceto a conversa em curso. Um ecrã que se apaga, uma rede que falha, um desvio por outra aplicação, e os últimos minutos desapareciam: «sim» já não queria dizer nada, e «do que é que falávamos da última vez?» recebia «não encontro nenhuma conversa recente». As memórias estavam intactas. Esse dia reparou a memória curta: uma única conversa por pessoa que sobrevive aos cortes, as trocas passadas lidas tal como foram e datadas, e um contexto que já não se esvazia quando uma das suas fontes tosse.
Duas memórias, e só uma que aguentava
Quando se fala de memória a propósito desta aplicação, pensa-se na memória neuronal: as fichas, as ligações entre elas, o que fica retido durante meses. É a memória longa, e a 19 de maio funcionava bem. Uma semana antes, a pesquisa tinha até aprendido a seguir as ligações entre as memórias em vez de confiar apenas na semelhança das palavras.
Mas existe uma segunda memória, de que ninguém fala porque entre humanos é tomada como certa. É a dos últimos dez minutos. Quando se diz «sim» a alguém, essa pessoa sabe a que pergunta. Quando se diz «e ele também», sabe de quem se trata. Essa memória não está arrumada numa ficha: vive no fio da conversa, do lado do servidor, sob a forma das últimas trocas que o modelo relê a cada turno.
E essa memória curta perdia-se. Não ao fim de uma hora: ao fim de alguns segundos, assim que a ligação entre o telemóvel e o servidor se quebrava, por qualquer razão. O resultado era estranho de viver. O assistente lembrava-se do nome do dentista e da data de renovação de um passaporte, mas não da frase que acabava de dizer. Dava a impressão de uma pessoa com memória enciclopédica e atenção falhada, e essa impressão era pior do que se a memória longa estivesse vazia, porque contradizia o que se acabava de ouvir.
Início da tarde: um maestro por ligação
O telemóvel e o servidor falam entre si através de uma ligação permanente, aberta ao arrancar da aplicação. Do lado do servidor, um maestro recebe o que o utilizador diz, faz correr o modelo, executa as suas ferramentas e devolve a resposta. É ele que guarda o histórico da conversa.
O defeito cabia numa linha: esse maestro era construído para cada ligação. Uma ligação, um maestro, um histórico só dele. Enquanto a ligação vive, tudo bem. Mas uma ligação morre muito mais vezes do que se imagina. O ecrã apaga-se no bolso: o sistema corta a ligação para poupar bateria. Sai-se de casa: o wifi cai, os dados móveis tomam o lugar, e a ligação é refeita. Responde-se a uma mensagem noutra aplicação e volta-se: ligação refeita. De cada vez, a aplicação volta a ligar-se sozinha, em silêncio, sem mostrar nada. E de cada vez, o servidor fabricava um novo maestro, com um histórico vazio, como se um desconhecido tivesse acabado de entrar.
O modelo recebia então a memória longa, e nada mais. Um «sim» dito depois de um ecrã apagado tornava-se «sim a quê?». Um pedido formulado em dois tempos, a primeira metade antes do corte e a segunda depois, já não tinha primeira metade. E nessa mesma manhã, o assistente tinha acabado de aprender que se lhe podia dizer quem fala quando o telemóvel é emprestado a outra pessoa, sem que o proprietário mude; essa declaração vivia no mesmo histórico, e evaporava-se com ele, com o risco de arrumar sob o nome errado o que a pessoa de passagem acabava de dizer.
A correção tomou a forma de uma mudança de sítio. Já só há um maestro para todo o servidor, e é ele que guarda todas as conversas em curso, uma por pessoa. Tudo o que dependia da ligação, o ecrã para onde enviar uma ficha a mostrar, a forma de programar um lembrete para aquele telemóvel em concreto, é-lhe entregue a cada turno em vez de ficar selado na sua construção. Assim, quando uma ligação é refeita, reencontra a conversa que tinha deixado: mesmo histórico, mesmo interlocutor declarado, mesmo fio. A regra é simples de enunciar: uma nova ligação na meia hora seguinte à última troca retoma a mesma conversa; para lá disso, abre-se uma nova.
Essa mudança impunha outra. Até então, o fecho da ligação servia de sinal de fim: era nesse momento que a conversa era resumida e arquivada na memória longa. Se a conversa tem de sobreviver ao fecho, esse sinal deixa de valer. O servidor passa por isso em revista, de cinco em cinco minutos, as conversas cujo proprietário está em silêncio há mais de meia hora, arquiva-as e retira-as da sua memória viva. Nada se acumula, e uma conversa abandonada a meio acaba na mesma na base de dados, em vez de se perder no arranque seguinte.
Fim de tarde: «não encontro nenhuma conversa recente»
O fio já não se quebrava. Restava uma pergunta, feita nesse mesmo dia em voz alta, que recebia uma má resposta: «do que é que falávamos da última vez?».
O material, no entanto, existia. Quando uma conversa é arquivada, é escrito um resumo dela na memória longa, como uma memória entre outras. O problema estava nesse «entre outras». Antes de cada turno, o servidor monta para o modelo um panorama do que a memória sabe: as memórias de trabalho, o que foi mencionado nos últimos dias, uma amostra do resto. Os resumos de conversas passadas escorregavam para ali, para a lista dos factos, sem etiqueta. O modelo via «fim de semana na Sicília, Claire, datas por confirmar» entre o código do portão e o aniversário do Paul, e não tinha maneira de saber que essa linha contava a conversa de há doze minutos e não um plano anotado num dia qualquer. À pergunta «do que é que falávamos», procurava uma conversa, não reconhecia nenhuma, e respondia que não encontrava nenhuma recente. A resposta estava à frente dos seus olhos, disfarçada de facto.
A primeira correção deu a esses resumos uma secção própria, no topo do panorama, com o que os distingue de um facto: uma data relativa, «há 12 min», e o comprimento da troca, «4 turnos». E uma instrução, na mesma secção: quando o utilizador pergunta do que falávamos, se se lembra, ou diz que se esqueceu do que dizíamos, apoiar-se primeiro nesses resumos, antes de qualquer pesquisa nas fichas. Os mesmos resumos foram retirados das outras listas, para não aparecerem duas vezes sob duas etiquetas.
Três minutos depois: ler a própria conversa
A secção durou três minutos antes de ser refeita, porque assentava num compromisso que não tinha razão de ser.
O resumo escrito no arquivo foi pensado para a pesquisa por semelhança de sentido: curto, denso, calculado para ser encontrado mais tarde a partir de uma pista. É um índice, não uma ata. Ora as próprias conversas são conservadas, turno a turno, numa tabela da base de dados. Para responder a «do que é que falávamos», o índice é um desvio: a matéria está ao lado, inteira.
O panorama lê por isso agora essa tabela diretamente. Apresenta as últimas conversas, da mais recente para a mais antiga, cada uma com o seu resumo, a sua idade e o seu número de turnos. E para a mais recente, desdobra as últimas trocas tal como aconteceram, «Tu: fazes-me uma lista para o fim de semana?», «Eu: pronto, anotei isso tudo», com os excertos longos encurtados. O modelo já não tem de adivinhar de que falava a sessão anterior: tem-na à frente, palavra por palavra, e pode responder com o seu conteúdo em vez de com uma paráfrase.
Há uma lição de método nesses três minutos. Quando o dado existe em bruto, mais vale mostrá-lo do que mostrar o que dele se derivou. O resumo mantém o seu papel, o de ser encontrado por semelhança daqui a semanas; para a pergunta de hoje, a transcrição é a resposta certa.
Início da noite: uma fonte que cai já não esvazia tudo
O último defeito do dia só se via de vez em quando, e era isso que o tornava difícil de apanhar.
O panorama de memória entregue ao modelo é montado a partir de várias fontes: as conversas recentes, as memórias de trabalho, o que foi mencionado nos últimos dias, a amostra do resto e as regras pessoais. São consultadas em paralelo, para não somar os seus tempos de espera. Mas eram-no com uma regra de tudo ou nada: se um só dos pedidos falhava, um atraso do lado da base de dados, uma recusa passageira, o conjunto era abandonado e o modelo recebia um panorama vazio. Respondia então, de boa-fé, que não se lembrava. Não tinha literalmente nada.
A regra passou a ser «tudo o que responde fica». Cada fonte é esperada em separado; a que falha é anotada nos registos e substituída por uma lista vazia, as outras passam. Um contexto amputado de uma fonte vale mais do que um contexto ausente, e de longe: o modelo que tem as conversas recentes mas não a amostra do resto responde quase como de costume; o que não tem nada responde como um desconhecido.
Duas medidas acompanharam esta mudança. A primeira diz respeito ao próprio modelo: acontecia o serviço remoto devolver uma resposta vazia na primeira chamada de um turno, uma sobrecarga disfarçada de sucesso. O utilizador ouvia então a frase de recurso, a que anuncia um problema técnico, prevista uma semana antes para as avarias a sério. Essa primeira chamada é agora repetida uma vez, após uma pausa curta, antes de desistir. Uma vez apenas, e apenas a primeira: a meio de uma cadeia de ferramentas, repetir uma chamada equivaleria a executar duas vezes o que já foi feito, criar duas fichas, programar dois lembretes.
A segunda medida é um rasto. A cada turno, o servidor escreve nos seus registos o que entregou realmente ao modelo: quantas conversas recentes, quantas memórias de cada camada, quantas regras, e o tamanho do conjunto. Antes, quando alguém relatava «ele esqueceu-se», não havia maneira de saber se o modelo tinha lido mal uma memória cheia ou lido bem uma memória vazia. São dois defeitos sem relação que produzem o mesmo sintoma, e não se corrige o que não se consegue distinguir.
O que o dia ensinou
Três defeitos que nada tinham em comum produziram, durante semanas, uma única e mesma queixa: «ele não se lembra do que acabámos de dizer». Um histórico preso a uma ligação frágil. Atas de conversa disfarçadas de factos. Uma memória que se esvaziava por inteiro por causa de uma fonte atrasada. Nenhum destes defeitos tocava nas memórias em si; todos tocavam na forma de as entregar ao modelo no momento certo.
É isso que torna a memória curta tão particular. Uma falha na memória longa passa muitas vezes despercebida: não se nota o que não se pergunta. Uma falha na memória curta vê-se no segundo, porque contradiz o que se acabou de viver. Uma pessoa que se esquece de um compromisso de há três meses é distraída; uma pessoa que se esquece da frase anterior não estava a ouvir. O assistente dava a segunda impressão quando tinha o primeiro defeito, e nem sequer por inteiro.
Desde 19 de maio, uma conversa retomada depois de um ecrã apagado, de um trajeto ou de um desvio por outra aplicação é a mesma conversa. «Do que é que falávamos da última vez?» recebe a resposta, com as palavras da última vez. E quando falta alguma coisa, é possível saber porquê. A memória longa faz com que se possa voltar daqui a meses; a memória curta, com que se possa voltar daqui a um minuto. Eram precisas as duas para que falar com a aplicação se parecesse com falar com alguém.
