Uma memória que não se repete
Uma memória que retém tudo o que dizes acaba por reter várias vezes a mesma coisa, porque nunca a dizes duas vezes com as mesmas palavras. O XNeuronal foi concebido para reconhecer uma memória já presente e reforçá-la em vez de a criar de novo. A 22 de maio, descobrimos que esse mecanismo nunca tinha disparado. O dia reparou o reconhecimento, acrescentou um segundo critério para as reformulações e trouxe dois gestos para limpar à mão: uma folha de limpeza que limpa mesmo, e uma seleção múltipla na lista da memória.
Três vezes a mesma irmã
O Rui usa a aplicação há um mês. Numa noite de março: «A minha irmã Beatriz vive em Coimbra.» Ficha criada. Duas semanas depois, a preparar um fim de semana: «No sábado vou a casa da minha irmã, em Coimbra.» Lembrete marcado, e mais uma ficha sobre a Beatriz. Depois, numa manhã, a falar de outra coisa: «A Beatriz, que é a minha irmã, trabalha num laboratório.» Nova ficha.
Três frases, uma pessoa, um facto. Na memória, três memórias distintas, cada uma com a sua data, a sua formulação e, na terceira, um pormenor que as outras duas não têm. Quando o Rui pergunta «o que sabes sobre a Beatriz?», a resposta está certa, mas soa a gaguez: a mesma coisa dita três vezes, com pequenas variações. E na lista da sua memória, três linhas parecidas, sem se saber qual é a boa.
Não é uma falha de compreensão. A aplicação percebeu bem cada frase. É uma falha de reconhecimento: não viu que a terceira frase falava da mesma coisa que a primeira.
O que a memória devia ter feito
Este caso estava previsto. Desde o início, cada memória traz uma impressão: uma longa sequência de números que resume o sentido da frase, não as suas palavras. Duas frases que dizem a mesma coisa com palavras diferentes têm impressões próximas, e a proximidade mede-se com uma pontuação entre 0 e 1.
O mecanismo é simples no papel. Quando chega uma memória nova, calcula-se a sua impressão, compara-se com as das memórias já guardadas e, se alguma estiver suficientemente próxima, não se cria nada: reforça-se a memória existente. O seu contador de menções sobe, a data da última evocação é atualizada, e é esse contador que, mais tarde, decide o que aparece primeiro quando a memória é lida por camadas. Um facto repetido três vezes devia ser um facto forte, não três factos fracos.
Na véspera, a 21 de maio, o assistente tinha passado em revista a sua própria memória, a pedido da pessoa que o usa, na conta que serve para os testes. O relatório não deixava dúvidas: grupos de fichas que repetiam a mesma identidade, uma viagem contada de uma dúzia de ângulos e uma contradição nunca resolvida sobre o destino dessa viagem. A base confirmava, e pior: nenhuma memória, nessa conta, tinha alguma vez sido reforçada. Nem uma, desde a primeira frase. O mecanismo não estava mal afinado. Nunca tinha disparado.
O bug que não fazia barulho
Três causas, empilhadas, e nenhuma produzia um erro.
A primeira estava na forma como a impressão volta da base. Aí, está guardada como uma sequência de 1536 números. Mas a camada que a devolve ao servidor entrega-a como texto: a lista de números escrita entre parênteses retos, com vírgulas. O código que comparava as impressões começava por uma verificação de bom senso: «as duas impressões têm o mesmo comprimento?». E comparava o comprimento do texto, uns trinta mil carateres, com 1536. Nunca igual. Cada candidato era posto de lado antes sequer da comparação, em silêncio, como se não existisse. Duas frases rigorosamente idênticas, palavra por palavra, coexistiam na memória só por isso.
A segunda causa só teria sido visível depois de levantada a primeira. O limiar acima do qual duas memórias são consideradas a mesma estava fixado em 0,85. É um bom limiar para uma frase copiada quase à letra. É um mau limiar para uma reformulação natural. Medido em memórias reais, «a minha irmã chama-se Beatriz» e «a Beatriz é a irmã do Rui» obtêm uma pontuação de cerca de 0,72. Mesmo conteúdo, outra construção, rejeição total. E ninguém diz a mesma coisa duas vezes da mesma maneira.
A terceira causa era uma ausência. Acontece o cálculo da impressão falhar: um serviço remoto que tosse, uma resposta que não chega. O código previa esse caso e guardava a memória na mesma, sem impressão, mas sem deixar o menor rasto nos registos. Uma parte das memórias não tinha, portanto, qualquer hipótese de ser reconhecida um dia, e ninguém podia sabê-lo.
Nada ia abaixo. A aplicação respondia, as fichas criavam-se, a memória crescia, só que depressa demais e da maneira errada, e foi preciso que o próprio assistente se admirasse para alguém ir ver.
Dois patamares para reconhecer uma memória
A reparação da primeira causa cabe em poucas linhas: antes de qualquer comparação, a impressão é relida e convertida em números, chegue como lista ou como texto. A mesma correção foi aplicada à pesquisa por sentido, a que responde a «o que sabes sobre a Beatriz?» e que sofria do mesmo defeito sem que se notasse: procurava entre zero candidatos e recorria a outros critérios.
A segunda causa exigia uma escolha. Baixar o limiar para 0,70 para toda a gente teria apanhado as reformulações, mas também falsos gémeos: dois factos diferentes que partilham vocabulário, uma pessoa com duas amigas com o mesmo nome. Manter 0,85 deixava os duplicados proliferar. A resposta foi deixar de depender de um único número.
Acima de 0,85, a memória é reconhecida diretamente: é uma paráfrase apertada ou uma quase cópia. Entre 0,70 e 0,85, só é reconhecida com duas condições: as duas memórias são do mesmo tipo e partilham pelo menos uma pessoa ou um tema. Essas pessoas e esses temas não são adivinhados no momento da comparação: são atribuídos a cada memória logo na sua criação, pelo modelo que leu a frase. Duas Beatrizes sem relação não partilharão nenhum tema. Duas formulações da mesma Beatriz partilharão pelo menos o nome dela.
Cada reforço deixa agora um rasto: por que patamar a memória foi reconhecida, e com que pontuação. Os dois limiares são apostas razoáveis, não verdades medidas, e a única forma de os afinar é reler, ao fim de algumas semanas, o que o mecanismo fundiu realmente. Quanto à terceira causa, a falha do cálculo da impressão fica agora escrita nos registos: a memória continua a ser guardada, mas sabe-se que nasceu sem impressão.
O que se fez aos duplicados que já lá estavam
Reparar o mecanismo não apaga o que ele deixou passar. Os duplicados existentes continuavam na memória, e o código reparado nunca lhes tocaria: só compara uma memória nova com o existente, não o existente consigo próprio.
Na conta dos testes, a limpeza foi feita à mão, e a forma de a fazer diz algo sobre o produto. Nenhuma memória foi apagada. Os duplicados foram silenciados: um estado que os retira de tudo o que o assistente lê e de tudo o que mostra, mas que deixa a linha no seu lugar. Em cada grupo, guardou-se uma ficha como referência, a mais completa, e as outras foram caladas. O gesto reverte-se com uma palavra.
A contradição foi tratada de outra maneira. Duas fichas disputavam o destino de uma viagem. Uma era falsa, a outra verdadeira, e a pessoa em causa decidiu. A falsa não foi apagada: passou ao estado «errada», com uma ligação para a que a corrige. É o mesmo princípio de uma correção ditada em conversa: a memória antiga fica, marcada como ultrapassada, ligada à nova. Continua a ser possível responder a «porque é que achavas que era Faro?».
Uma limpeza feita por um programador na base não é uma solução: o que faltava eram gestos, na aplicação, para que cada um fizesse o mesmo na sua própria memória.
A folha de limpeza que não limpava nada
Já existia um sítio para isso, nas definições: uma folha intitulada «Limpar o passado». Marcavam-se categorias, compromissos, lembretes, tarefas, memos, escolhia-se entre arquivar e apagar, e a aplicação varria o que ficava para trás. Era o que devia fazer. Nesse 22 de maio, experimentada a sério, respondeu «nada para limpar» quase todas as vezes.
Tinha três razões para se enganar. A lista que varria vinha da agenda, que só mostra os elementos ativos ou feitos; tudo o que já tinha sido arquivado uma primeira vez era-lhe invisível, e uma segunda passagem em modo «apagar» já não encontrava nada. Um filtro de prudência, do lado do telemóvel, afastava qualquer elemento cujo fim ainda não tivesse passado; ora, um compromisso de dia inteiro termina às 23h59, e uma tarefa feita de manhã continuava «por vir» até à noite. Por fim, as memórias silenciadas, aquelas que o assistente já tinha aceitado esquecer a pedido, não pertenciam a nenhuma das famílias que a folha sabia ver. Podia dizer-se «esquece esse lembrete» e nunca conseguir apagá-lo de verdade.
O dia refez a folha de alto a baixo. A varredura vê agora todos os estados terminais, arquivados e silenciados incluídos, e considera «passado» o que a agenda considera passado: resolvido, ou janela fechada. O modo «arquivar» desapareceu. Era um alçapão: nada na aplicação permitia ver o que tinha sido arquivado, nem trazê-lo de volta. Resta um único caminho, explícito, precedido de uma confirmação a vermelho que diz o que faz: é definitivo.
E porque uma limpeza nem sempre diz respeito ao passado, a folha ganhou uma pergunta: até onde? Ou apenas o que está passado ou resolvido, o comportamento de origem, finalmente a funcionar. Ou tudo o que pertence às categorias marcadas, independentemente da data e do estado, compromissos futuros e memos sem data incluídos. É a opção radical, para «apaga todas as minhas receitas», e traz o seu próprio aviso. A varredura faz-se agora numa única operação do lado do servidor, em vez de uma fila de pequenas eliminações. A folha chama-se «Limpar a memória»: «o passado» já não dizia a verdade.
Escolher à mão: um toque longo, caixas, dois botões
A folha de limpeza trabalha por categorias. O Rui, por seu lado, quer retirar duas das três fichas sobre a Beatriz, e nada mais. Para isso era preciso um gesto na lista da memória, aquela que mostra cada memória numa linha.
Desde 22 de maio, um toque longo numa linha faz a lista passar ao modo de seleção. Aparece uma caixa à frente de cada memória, o cabeçalho indica quantas estão marcadas e propõe escolher todas ou sair, e uma barra no fundo do ecrã oferece duas ações. Tocar numa linha marca-a ou desmarca-a, sem abrir a ficha, enquanto não se sair do modo.
As duas ações não são gémeas. «Silenciar» faz o que a limpeza à mão tinha feito na conta dos testes: a memória sai da leitura e da apresentação, mas a linha continua a existir, e pode voltar. «Esquecer definitivamente», a vermelho, apaga de vez, depois da mesma confirmação da folha de limpeza. A regra geral da aplicação é não destruir nada; este botão é a exceção assumida, quando é a própria pessoa a pedi-lo, sabendo o que faz.
O Rui marca duas linhas, carrega em «Silenciar», e a sua memória só conhece uma Beatriz. Da próxima vez que falar dela, a reconciliação far-se-á sozinha.
O que não entra na memória fica ao alcance da mão
Uma memória que não se repete é também uma memória que sabe o que não deve reter. Uma previsão do tempo, o horário de uma farmácia de serviço, o estado do trânsito: essas respostas são mostradas sem se tornarem memórias, numa página que se fecha e não deixa nada para trás. Foi a escolha da véspera, com um pequeno problema prático: uma vez fechada a página, era preciso voltar a fazer a pergunta para a rever.
Desde 21 de maio, o assistente dá um título a cada uma dessas páginas, duas ou três palavras reconhecíveis à primeira vista, «Meteo Coimbra», «Farmácia de serviço», e esse título fica por baixo da resposta, na conversa, sob a forma de uma pequena pastilha ciano. Tocar-lhe reabre a página tal como estava, a partir da memória do telemóvel, sem pedir nada ao servidor e sem criar ficha. A pastilha vive o tempo da conversa; quando a conversa recomeça do zero, desaparece com ela. No dia seguinte, o mesmo gesto foi alargado às páginas de planeamento, tarefas e memos, vistas montadas na hora que também não têm ficha por trás, e cada linha dessas páginas abre-se agora com um toque.
É a contrapartida da escolha de não guardar tudo: o que não é uma memória não atravanca a memória, mas também não se evapora no segundo em que o deixas.
O que fica em aberto
Os dois limiares, 0,85 e 0,70, esperam pelas suas primeiras semanas de rastos antes de serem afinados. Se fundirem demais, apertam-se; se deixarem passar duplicados, alargam-se.
Os duplicados nascidos antes de 22 de maio, nas contas que não a dos testes, continuam lá. O mecanismo reparado não os apanha; só impede que se criem novos. Uma passagem periódica que detetasse os pares demasiado próximos no existente e os fundisse sem que ninguém o pedisse é a continuação lógica. Não está escrita. Entretanto, a seleção múltipla faz o trabalho, linha a linha, e foi precisamente por isso que chegou no mesmo dia.
Por fim, as ações agrupadas da lista passam ainda por um pedido por memória. Em dez linhas não se nota; em duzentas, o servidor terá de aprender a tratá-las em bloco, como a folha de limpeza já faz.
Para o Rui, o balanço cabe numa frase. Pode falar da Beatriz as vezes que quiser, com as palavras que lhe vierem, e a sua memória guardará só uma, cada vez mais segura de si. E no dia em que quiser fazer a triagem ele próprio, bastam um toque longo e dois toques.
