Jetzt kann ich das Journal fragen
Eine Ferienwoche in gestohlenen Momenten: semantische Suche über Embeddings, ein Datumsfilter, ein Chat mit Links zu den Originalnotizen. Wie das Sprachjournal von innen aussieht — und warum Schluss sein muss mit dem Verbessern.

Von Georg Malahov
Wir sind über die Ferien im Dezember zu Besuch, das Haus ist voller Kinder, und arbeiten kann ich nur in gestohlenen Momenten: aus dem Auto, während meine Frau im Laden ist, abends, während alle „Kevin — Allein in New York" schauen. In einer dieser Nächte habe ich eine Notiz im Flüsterton eingesprochen, um niemanden zu wecken — und abgeschickt, ohne zu wissen, ob die Transkription auch nur ein Wort versteht. Trotzdem hat eine Woche solcher Momente aus dem Sprachjournal statt „einem Bot, der Aufnahmen ablegt" ein System gemacht, dem man Fragen stellen kann.
Die Basis ist dieselbe wie beim Start: Der Telegram-Bot nimmt die Sprachnachricht entgegen, legt die Datei in S3 ab und speichert Transkript und Metadaten in Strapi. Obendrauf gibt es jetzt eine denkbar einfache Weboberfläche: Der Bot antwortet mit einem Link zur angelegten Notiz, dahinter liegen Login und Ansicht. Die Authentifizierung habe ich schlicht gehalten; eigentlich müsste sie auf HTTP-only-Cookies umziehen, aber da wollte ich mich erst mal nicht vergraben.
Das große Neue ist die Suche nach Bedeutung. Jede Notiz wird in ein Embedding verwandelt — einen numerischen Fingerabdruck der Textbedeutung: Notizen mit ähnlicher Bedeutung landen mit ihren Fingerabdrücken nah beieinander, sodass eine Frage verwandte Notizen findet, auch wenn die Wörter darin andere sind. Die Embeddings speichere ich in Pinecone, einer Vektordatenbank in der Cloud. Eine Grenze zeigte sich schnell: Mit Daten können Embeddings wenig anfangen. Die Frage „Was war gestern?" ist semantisch nichts nah. Deshalb sitzt vor der Suche jetzt ein Filter: Stecken in der Frage Datumsangaben — „gestern", „diesen Monat" —, werden zuerst die Notizen aus dem passenden Zeitraum ausgewählt, und ihr voller Text geht an ein Sprachmodell, das die Frage beantwortet. Und für die gezielte Suche in den Notizen habe ich dem Chat einen Schnellerwähnungs-Button für notes spendiert.
An die Antworten des Chats habe ich Links zu den ursprünglichen Nachrichten gehängt: Man sieht, aus welchen Notizen eine Antwort zusammengesetzt ist, und kann hinklicken und nachprüfen. Außerdem gibt es jetzt einen Antwort-Cache im Speicher, damit identische Fragen keine überflüssigen Anfragen an die Modelle jagen — primitiv, aber vorerst reicht es. Eine eigene Serie von Korrekturen ging ans iPhone: Safari spielt die ogg-Dateien nicht ab, in denen Telegram Sprachnachrichten verschickt, also werden sie jetzt in mp3 konvertiert, und Videos bekommen Vorschaubilder. Audionotizen lassen sich endlich vom Telefon aus anhören.
Hier halte ich an. Alles Grundlegende, das ich wollte, ist umgesetzt, und die Ideen kommen weiter schneller, als ich sie bauen kann — also schreibe ich sie jetzt als Issues auf, die Aufgabenliste auf GitHub, und habe vor, eine Weile einfach mit dem zu leben, was da ist. Das Einzige, was mich nach wie vor tierisch nervt, ist die Eingabe selbst: Telefon rausholen, entsperren, Telegram öffnen, Knopf gedrückt halten. Diesen Weg will ich verkürzen.
Das Nächste ist etwas ganz anderes: ein Video davon aufnehmen, was entstanden ist, und es Freunden zeigen. Das Journal hört jetzt die dritte Woche nur mir zu — mich interessiert, was Leute von außen sagen.