20. November 2023 von Lilian Do Khac
Maschinenerstellte Zusammenfassung von Texten mit Aleph Alpha Luminous über R, Teil 3
Im dritten Teil meines Blog-Beitrags werde ich anhand eines Beispiels auf High-Level-Ebene die verschiedenen Schritte in einer Transformationspipeline erläutern und die Zwischenergebnisse zeigen.
Unser Beispiel
Als Beispiel habe ich das Dokument in Abbildung 1 gewählt. Es ist ein öffentlich zugängliches Sozialgerichtsurteil. Es besteht insgesamt aus 7 Seiten.
Die folgende Tabelle vergleicht die Ergebnisse der Tokenzählung für die Seiten unseres Beispieldokuments für verschiedene Bibliotheken. Auf der linken Seite ist die Ausgabe des OpenAI-Tokenizers mit und ohne Newlines dargestellt. Auf der rechten Seite ist die Ausgabe des Tokenizers von Aleph Alpha mit und ohne Newlines dargestellt.
Vergleich Tokenizer-Output von OpenAI Tiktoken versus den von Aleph Alpha
Auffallend sind zunächst die unterschiedlichen Tokensummen (auch die Ausprägung der jeweiligen Embedding Outputs ist signifikant unterschiedlich). Bei Aleph Alpha sind sie tendenziell höher als bei OpenAI (Tiktoken). Auch ein Text-Cleansing ändert bei der OpenAI Library nicht viel, bei der Aleph Alpha Library ist es signifikant.
Dies liegt daran, dass die OpenAI Library multiple Newlines mit einem Token kodiert und nicht nach der tatsächlichen Häufigkeit. Bei der Aleph Alpha Library ist es genau umgekehrt. Daraus lässt sich zunächst nur ableiten, dass bei Aleph Alpha expliziter gearbeitet werden muss.
Datenvorverarbeitung
Im Folgenden möchte ich ganz grob durch die Datenvorverarbeitung für die automatische Zusammenfassung gehen. Wie bereits im zweiten Teil dieses Blog-Beitrags beschrieben, möchte ich den gesamten Text in einzelne Textchunks aufteilen. Zuerst werde ich den Text bereinigen (hauptsächlich Newlines entfernen, aber es könnte noch ein bisschen mehr sein) und den Text in Sätze aufteilen. Wir sehen bereits in der folgenden Abbildung, dass mein Code für das Splitten in einzelne Sätze fehleranfällig ist, da er nach jedem Punkt schneidet (siehe rote Linien rechts unten). Solche Fehler werden sich in der weiteren Datenverarbeitung ausbreiten und sollten unbedingt in einer vorherigen EDA (Explorative Data Analysis) identifiziert werden, damit Optimierungen nicht nur empfohlen, sondern explizit für bestimmte Probleme adressiert und evaluiert werden können.
Als Nächstes möchte ich die endgültigen Textchunks zusammenstellen. Dazu nehme ich in Anlehnung an Isaac Tham die Angaben in fünf „Sätzen“ mit jeweils einem Satz-Overlap, um etwas Kontext herzustellen (siehe Lines 84 und 85). Wie ich das dann im gesamten Text mache, ist in den Lines 91 ff. dargestellt (ziemlich trivial).
Für dieses Beispieldokument bekommen wir mit den vorgegebenen Parametern 16 Textchunks (siehe folgende linke Abbildung). Diese 16 Textchunks embedde ich anschließend (siehe folgende rechte Abbildung Die Embedding Size bei Aleph Alpha ist 5.120.
Clustering
Für das Clustering verwende ich relativ stumpf KNN und lasse mir kurz helfen, was am besten k mit einer Silhouettenanalyse ist. Wie man das besser macht, werde ich in einem separaten Blog-Beitrag ausführlicher behandeln. Die Silhouettenanalyse ergibt k = 2.
Anschließend werden Zusammenfassungen für jeden Textchunk erstellt, die in das Endergebnis einfließen (siehe Abbildung 6). In Abbildung 6 sehen wir die zugeordneten Cluster pro Textchunk (Spalte 2) und die Zwischenzusammenfassungen (Spalte 3). Darunter ist beispielhaft die Transformation für Zeile 5 dargestellt.
Zusammenfassung erstellen
Mit diesen Vorarbeiten können wir nun im finalen Schritt die eigentliche Zusammenfassung erstellen. Folgender Prompt steckt hinter der Ergebnisausgabe von Abbildung 9:
### Instruction: Fasse bitte in einem Satz den Input zusammen.
### Input:{{document}}
### Response:
Dies ist ein relativ einfacher, nicht optimierter Prompt, da hier der Transformationspfad im Vordergrund steht. Mit diesem Prompt erhalte ich für meine k = 2 Cluster, also Textstücke und Zwischenzusammenfassungen, dann zwei Zusammenfassungen, die in der Konsole in Abbildung 9 zu sehen sind.
Im ersten Blog-Beitrag dieser Reihe hatten wir uns mit dem Phänomen „Lost in the Middle“ beschäftigt (siehe Blog, Teil 1). Aus Interesse wollte ich dies noch einmal mit der Explain-Funktion von Aleph Alpha untersuchen (siehe folgende Abbildung). Wir sehen auch hier, dass sich die endgültige Zusammenfassung für Cluster 1 hauptsächlich aus dem ersten Teil der eingegebenen Texte speist.
In der folgenden Abbildung habe ich eine weitere Eingabeaufforderung verwendet, um eine geführte Zusammenfassung zu erstellen. Die Leitfragen und die Ergebnisse werden in Abbildung 11 ausgegeben (siehe Konsole).
Der gesamte Code kann hier heruntergeladen und ausprobiert werden: https://github.com/LilianDK/summarization
Das Beispieldokument befindet sich ebenfalls im Repo wie die verwendeten Prompts (siehe folgende Abbildung in der Mitte). Es muss nur ein eigener Token verwendet werden und schon könnt ihr selbst ein wenig herumprobieren.
Zusammenfassung und Ausblick
In dieser Blog-Reihe (übrigens keine maschinelle Zusammenfassung) habe ich versucht, den Weg der Transformation mit all den Problemen dazwischen bei einer maschinellen Zusammenfassung darzustellen. Dabei bin ich recht flach geblieben, aber wir werden die einzelnen Schritte, die wir nicht näher betrachtet haben, in den Folge-Blogs vertiefen und auch mit etwas repräsentativeren Untersuchungen diskutieren. Bis dahin empfehle ich die Lektüre von „An Empirical Survey on Long Document Summarization – Datasets, Models and Metrics!“, die 2022 von Huan Yee Koh, Jiaxin Ju, Ming Liu und Shirui Pan verfasst wurde. Diese Publikation ist meiner Meinung nach sehr sauber und umfassend. Sie stellt die richtigen Fragen und geht ihnen mit wissenschaftlicher Sorgfalt nach.