Worüber haben wir letztes Mal gesprochen?
Bis zum 19. Mai behielt der Assistent alles, nur nicht das laufende Gespräch. Ein Bildschirm, der dunkel wird, ein Netz, das wegbricht, ein Abstecher in eine andere App, und die letzten Minuten waren weg: „Ja“ bedeutete nichts mehr, und „Worüber haben wir letztes Mal gesprochen?“ bekam „Ich finde kein aktuelles Gespräch“ zur Antwort. Die Erinnerungen waren intakt. Dieser Tag hat das Kurzzeitgedächtnis repariert: ein Gespräch pro Person, das Unterbrechungen übersteht, vergangene Gespräche so gezeigt, wie sie stattfanden, und datiert, und ein Kontext, der sich nicht mehr leert, wenn eine seiner Quellen hustet.
Zwei Gedächtnisse, und nur eines hielt
Wenn bei dieser App von Gedächtnis die Rede ist, meint man das neuronale Gedächtnis: die Karten, die Verknüpfungen zwischen ihnen, das, was über Monate behalten wird. Das ist das Langzeitgedächtnis, und am 19. Mai funktionierte es gut. Eine Woche zuvor hatte die Suche sogar gelernt, den Verknüpfungen zwischen Erinnerungen zu folgen, statt sich allein auf die Ähnlichkeit der Wörter zu verlassen.
Es gibt aber ein zweites Gedächtnis, von dem niemand spricht, weil es unter Menschen selbstverständlich ist. Es ist das Gedächtnis der letzten zehn Minuten. Wer jemandem „ja“ sagt, kann davon ausgehen, dass der andere weiß, auf welche Frage. Wer „er auch“ sagt, wird verstanden. Dieses Gedächtnis liegt in keiner Karte: Es lebt im Faden des Gesprächs, auf der Serverseite, als die letzten Wortwechsel, die das Modell bei jedem Zug erneut liest.
Und dieses Kurzzeitgedächtnis ging verloren. Nicht nach einer Stunde: nach wenigen Sekunden, sobald die Verbindung zwischen Telefon und Server abriss, aus welchem Grund auch immer. Das Ergebnis war seltsam zu erleben. Der Assistent erinnerte sich an den Vornamen des Zahnarztes und an das Ablaufdatum eines Reisepasses, aber nicht an den Satz, den er gerade gesagt hatte. Er wirkte wie jemand mit enzyklopädischem Gedächtnis und versagender Aufmerksamkeit, und dieser Eindruck war schlimmer, als wenn das Langzeitgedächtnis leer gewesen wäre, weil er dem widersprach, was man gerade gehört hatte.
Früher Nachmittag: ein Dirigent pro Verbindung
Telefon und Server sprechen über eine dauerhafte Verbindung miteinander, die beim Start der App geöffnet wird. Auf der Serverseite nimmt ein Dirigent entgegen, was der Nutzer sagt, lässt das Modell laufen, führt seine Werkzeuge aus und schickt die Antwort zurück. Er ist es, der den Gesprächsverlauf hält.
Der Fehler passte in eine Zeile: Dieser Dirigent wurde für jede Verbindung neu gebaut. Eine Verbindung, ein Dirigent, ein eigener Verlauf. Solange die Verbindung lebt, ist alles gut. Aber eine Verbindung stirbt viel öfter, als man denkt. Der Bildschirm wird in der Hosentasche dunkel: Das System kappt die Verbindung, um Akku zu sparen. Man verlässt das Haus: Das WLAN fällt weg, das Mobilfunknetz übernimmt, die Verbindung wird neu aufgebaut. Man beantwortet eine Nachricht in einer anderen App und kommt zurück: Verbindung neu aufgebaut. Jedes Mal verbindet sich die App von selbst wieder, lautlos, ohne etwas zu zeigen. Und jedes Mal baute der Server einen neuen Dirigenten, mit leerem Verlauf, als wäre gerade ein Fremder hereingekommen.
Das Modell bekam dann das Langzeitgedächtnis, und sonst nichts. Ein „Ja“ nach einem dunklen Bildschirm wurde zu „Ja wozu?“. Eine Bitte in zwei Hälften, die erste vor dem Abriss, die zweite danach, hatte keine erste Hälfte mehr. Und am selben Vormittag hatte der Assistent gerade gelernt, dass man ihm sagen kann, wer spricht, wenn das Telefon an jemand anderen verliehen wird, ohne dass der Besitzer wechselt; diese Angabe lebte im selben Verlauf und verflüchtigte sich mit ihm, mit dem Risiko, das Gesagte des Gastes unter dem falschen Namen abzulegen.
Die Korrektur war eine Verschiebung. Es gibt nur noch einen einzigen Dirigenten für den ganzen Server, und er hält alle laufenden Gespräche, eines pro Person. Alles, was von der Verbindung abhing, welchem Bildschirm eine Karte zum Anzeigen geschickt wird, wie eine Erinnerung für genau dieses Telefon geplant wird, wird ihm bei jedem Zug übergeben, statt in seinen Bau eingegossen zu sein. Wird eine Verbindung neu aufgebaut, findet sie also das Gespräch wieder, das sie verlassen hatte: derselbe Verlauf, derselbe angegebene Sprecher, derselbe Faden. Die Regel ist leicht zu formulieren: Eine Wiederverbindung innerhalb einer halben Stunde nach dem letzten Wortwechsel setzt dasselbe Gespräch fort; danach wird ein neues eröffnet.
Diese Verschiebung erzwang eine zweite. Bis dahin diente das Schließen der Verbindung als Schlusssignal: In diesem Moment wurde das Gespräch zusammengefasst und im Langzeitgedächtnis archiviert. Soll das Gespräch das Schließen überleben, taugt dieses Signal nichts mehr. Der Server geht deshalb alle fünf Minuten die Gespräche durch, deren Besitzer seit mehr als einer halben Stunde schweigt, archiviert sie und nimmt sie aus seinem Arbeitsspeicher. Nichts staut sich, und ein unterwegs abgebrochenes Gespräch landet trotzdem in der Datenbank, statt beim nächsten Neustart verloren zu gehen.
Später Nachmittag: „Ich finde kein aktuelles Gespräch“
Der Faden riss nicht mehr. Eine Frage blieb, am selben Tag laut gestellt, die eine falsche Antwort bekam: „Worüber haben wir letztes Mal gesprochen?“
Das Material war vorhanden. Wird ein Gespräch archiviert, wird eine Zusammenfassung davon ins Langzeitgedächtnis geschrieben, als eine Erinnerung unter anderen. Das Problem steckte in diesem „unter anderen“. Vor jedem Zug stellt der Server für das Modell einen Überblick darüber zusammen, was das Gedächtnis weiß: die Arbeitserinnerungen, das in den letzten Tagen Erwähnte, eine Stichprobe des Rests. Die Zusammenfassungen vergangener Gespräche rutschten dort in die Liste der Fakten, ohne Etikett. Das Modell sah „Wochenende in Sizilien, Claire, Termine noch offen“ zwischen dem Torcode und Pauls Geburtstag und hatte keine Möglichkeit zu erkennen, dass diese Zeile das Gespräch von vor zwölf Minuten wiedergab und nicht einen irgendwann notierten Plan. Auf die Frage „Worüber haben wir gesprochen“ suchte es ein Gespräch, erkannte keines und antwortete, es finde kein aktuelles. Die Antwort lag vor seinen Augen, verkleidet als Fakt.
Die erste Korrektur gab diesen Zusammenfassungen einen eigenen Abschnitt, ganz oben im Überblick, mit dem, was sie von einem Fakt unterscheidet: einer relativen Zeitangabe, „vor 12 Min.“, und der Länge des Austauschs, „4 Züge“. Und eine Anweisung im selben Abschnitt: Fragt der Nutzer, worüber gesprochen wurde, ob er sich erinnert, oder sagt er, er habe vergessen, worum es ging, zuerst auf diese Zusammenfassungen stützen, vor jeder Suche in den Karten. Dieselben Zusammenfassungen wurden aus den anderen Listen entfernt, damit sie nicht zweimal unter zwei Etiketten auftauchen.
Drei Minuten später: das Gespräch selbst lesen
Der Abschnitt hielt drei Minuten, bevor er neu gemacht wurde, weil er auf einem Kompromiss beruhte, der keinen Grund hatte.
Die beim Archivieren geschriebene Zusammenfassung ist für die Suche nach Bedeutungsähnlichkeit gedacht: kurz, dicht, darauf berechnet, später aus einem Hinweis wiedergefunden zu werden. Sie ist ein Index, kein Protokoll. Die Gespräche selbst aber werden aufbewahrt, Zug für Zug, in einer Tabelle der Datenbank. Um „Worüber haben wir gesprochen“ zu beantworten, ist der Index ein Umweg: Der Stoff liegt daneben, vollständig.
Der Überblick liest diese Tabelle deshalb jetzt direkt. Er zeigt die letzten Gespräche, das jüngste zuerst, jedes mit Zusammenfassung, Alter und Anzahl der Züge. Und beim jüngsten packt er die letzten Wortwechsel aus, so wie sie stattfanden, „Du: Kannst du mir eine Liste fürs Wochenende machen“, „Ich: Bitte, ich habe das alles notiert“, lange Auszüge gekürzt. Das Modell muss nicht mehr raten, worum es in der vorigen Sitzung ging: Es hat sie vor sich, Wort für Wort, und kann mit ihrem Inhalt antworten statt mit einer Umschreibung.
In diesen drei Minuten steckt eine Lehre über Methode. Wenn die Daten in roher Form vorliegen, ist es besser, sie zu zeigen, als das daraus Abgeleitete. Die Zusammenfassung behält ihre Rolle, in Wochen über Ähnlichkeit gefunden zu werden; für die Frage von heute ist die Abschrift die richtige Antwort.
Früher Abend: eine ausfallende Quelle leert nicht mehr alles
Der letzte Fehler des Tages zeigte sich nur ab und zu, und genau das machte ihn schwer zu fassen.
Der Gedächtnisüberblick für das Modell wird aus mehreren Quellen zusammengesetzt: den jüngsten Gesprächen, den Arbeitserinnerungen, dem in den letzten Tagen Erwähnten, der Stichprobe des Rests und den persönlichen Regeln. Sie werden parallel abgefragt, damit sich ihre Wartezeiten nicht addieren. Aber sie wurden nach einer Alles-oder-nichts-Regel abgefragt: Scheiterte eine einzige der Anfragen, eine Verzögerung auf Seiten der Datenbank, eine vorübergehende Ablehnung, wurde das Ganze verworfen und das Modell bekam einen leeren Überblick. Es antwortete dann, in bestem Glauben, es erinnere sich nicht. Es hatte buchstäblich nichts.
Die Regel wurde zu „alles, was antwortet, wird behalten“. Jede Quelle wird einzeln abgewartet; die scheiternde wird im Protokoll vermerkt und durch eine leere Liste ersetzt, die anderen gehen durch. Ein Kontext, dem eine Quelle fehlt, ist besser als gar kein Kontext, und zwar bei Weitem: Ein Modell, das die jüngsten Gespräche hat, aber nicht die Stichprobe des Rests, antwortet fast wie gewohnt; eines, das nichts hat, antwortet wie ein Fremder.
Zwei Maßnahmen begleiteten diese Änderung. Die erste betrifft das Modell selbst: Es kam vor, dass der entfernte Dienst beim ersten Aufruf eines Zugs eine leere Antwort lieferte, eine Überlastung, als Erfolg verkleidet. Der Nutzer hörte dann den Notsatz, der ein technisches Problem ankündigt und eine Woche zuvor für echte Ausfälle vorgesehen worden war. Dieser erste Aufruf wird jetzt einmal wiederholt, nach einer kurzen Pause, bevor aufgegeben wird. Nur einmal, und nur der erste: Mitten in einer Kette von Werkzeugen hieße ein wiederholter Aufruf, das bereits Getane doppelt auszuführen, zwei Karten anzulegen, zwei Erinnerungen zu planen.
Die zweite Maßnahme ist eine Spur. Bei jedem Zug schreibt der Server in sein Protokoll, was er dem Modell tatsächlich übergeben hat: wie viele jüngste Gespräche, wie viele Erinnerungen aus jeder Ebene, wie viele Regeln, und die Größe des Ganzen. Vorher gab es, wenn jemand „er hat es vergessen“ meldete, keine Möglichkeit zu erkennen, ob das Modell ein volles Gedächtnis falsch gelesen oder ein leeres richtig gelesen hatte. Das sind zwei Fehler ohne Zusammenhang, die dasselbe Symptom erzeugen, und was man nicht unterscheiden kann, kann man nicht beheben.
Was der Tag gelehrt hat
Drei Fehler, die nichts gemeinsam hatten, erzeugten wochenlang ein und dieselbe Klage: „Er weiß nicht mehr, was wir gerade gesagt haben.“ Ein Verlauf, der an einer brüchigen Verbindung hing. Gesprächsprotokolle, verkleidet als Fakten. Ein Gedächtnis, das sich wegen einer verspäteten Quelle vollständig leerte. Keiner dieser Fehler berührte die Erinnerungen selbst; alle berührten die Art, wie sie dem Modell im richtigen Moment übergeben wurden.
Das macht das Kurzzeitgedächtnis so besonders. Eine Lücke im Langzeitgedächtnis bleibt oft unbemerkt: Man vermisst nicht, wonach man nicht fragt. Eine Lücke im Kurzzeitgedächtnis fällt binnen einer Sekunde auf, weil sie dem widerspricht, was man gerade erlebt hat. Wer einen Termin von vor drei Monaten vergisst, ist zerstreut; wer den vorigen Satz vergisst, hat nicht zugehört. Der Assistent erweckte den zweiten Eindruck, obwohl er den ersten Fehler hatte, und nicht einmal den richtig.
Seit dem 19. Mai ist ein Gespräch, das nach einem dunklen Bildschirm, einer Fahrt oder einem Abstecher in eine andere App wieder aufgenommen wird, dasselbe Gespräch. „Worüber haben wir letztes Mal gesprochen?“ bekommt die Antwort, mit den Worten vom letzten Mal. Und wenn etwas fehlt, lässt sich herausfinden, warum. Das Langzeitgedächtnis sorgt dafür, dass man in Monaten zurückkommen kann; das Kurzzeitgedächtnis dafür, dass man in einer Minute zurückkommen kann. Es brauchte beides, damit sich das Sprechen mit der App anfühlt wie das Sprechen mit jemandem.
