arrow arrow--cut calendar callback check chevron chevron--large cross cross--large download filter kununu linkedin magnifier mail marker media-audio media-blog media-video menu minus Flieger phone play plus quote share youtube

Vom Spielfeld zur Story

Generative KI im Sportjournalismus

Heute wollen wir gemeinsam in die Welt der generativen KI, der Cloud, des Sportjournalismus und Deutschlands beliebtester Sportart eintauchen. Die Mission: Mit Hilfe von KI aus weborientierten Beiträgen aus dem Fußball-Kosmos neue Content-Formate generieren. Dabei streben wir nach optimierten Formaten, beispielsweise für die Ausspielung auf mobilen Geräten oder individuell zugeschnitten auf unterschiedliche Zielgruppen.

Schaubild vom Web-basierten Artikel zur Mobile optimierten Story
Foto von Matthias Makulla
Matthias Makulla

Software Developer

Der Anstoß

Start unserer Reise: der Artikel. Ein Artikel setzt sich aus längeren Textabschnitten zusammen und enthält für gewöhnlich wenige Bilder, Videos oder andere Content-Elemente. Das Format eignet sich gut für größere Bildschirme oder um auf textueller Ebene viele Details zu transportieren.
Auf Smartphones funktionieren Artikel zwar auch, für ein actiongeladenes Fußballspiel sind andere Formate aber ansprechender. Formate, die nicht auf lange Textpassagen, sondern auf kurze Textschnipsel in Kombination mit visuellen Inhalten setzen, kurz: Stories.

Die Herausforderung

Stories bestehen aus einer Abfolge von Slides. Im ersten Wurf soll jede Slide aus einem Hintergrundbild und einem kurzen Text bestehen. Die Anzahl der Slides soll nicht zu klein, nicht zu groß und irgendwie am Inhalt ausgerichtet sein. Außerdem sollen Stories automatisch aus einem Artikel erzeugt werden. Klingt nach einem Job für generative KI!

Im ersten Schritt müssen wir die Textinhalte unseres Artikels auf Slides verteilen. Dafür sind generative Sprachmodelle ein sehr probates Mittel. Dann brauchen wir noch Bilder zu den Slides. Da wird es schon kniffliger: Zwar hat unser Artikel schon ein paar Bilder, wir brauchen aber mehr! Wie schaffen wir es, dass unsere generative KI zu jeder Slide ein möglichst passendes Bild findet?

Prompt Engineering

Für die Aufteilung des Artikelinhalts auf die Slides brauchen wir einen Prompt. Wir verwenden Claude V2 von Anthropic, das wir über AWS Bedrock bequem in unsere bestehende serverless Architektur integrieren können.

Schaubild Prompt Engineering

Im Prompt beschreiben wir möglichst präzise, was wir erreichen wollen: Aufteilung des Artikels auf Slides. Das Ergebnis wollen wir maschinell weiterverarbeiten, weswegen wir es in ein maschinenlesbares Format bringen müssen. Interessanterweise hat sich herausgestellt, dass Claude relativ robust XML als Antwortformat erzeugt.

Hier zeigt sich nämlich eine der Herausforderungen beim Formulieren des Prompts: Wie bekommen wir das Modell dazu, seine Antwort immer im gleichen Format zu liefern? Die Lösung: Wir geben dem Modell ein paar Beispiele für „gute Slides” im passenden XML-Format mit:

<slide>
  <title>Spannender Abstiegskampf</title>
  <content>Die Spielvereinigung Wolkendorf tritt am Sonntag im Abstiegskampf gegen Beispielhausen an. Trainerin Linda Musterfrau ist guter Dinge.</content>
  <actors>
     <actor>Linda Musterfrau</actor>
  </actors>
  <scene>stadium</scene>
</slide>

In den meisten Fällen liefert uns das Modell dann ein XML-Dokument im richtigen Format. Ein bisschen Regex-Magie, um leichte Abweichungen abzufangen, gefolgt von einer harten Validierung gegen ein Schema haben sich als robust genug herausgestellt, um brauchbare Ergebnisse zu bekommen. Neben dem Titel und dem Textinhalt einer Slide haben wir das Modell gebeten, unserem XML auch noch eine Liste von Akteuren und eine Szene hinzuzufügen. Wozu brauchen wir die?

Exkurs: Jede Menge Bilder

Halt! Wir werden gleich Bilder brauchen, die ja irgendwo herkommen müssen. Können wir hier nicht auch auf generative KI setzen? Prinzipiell ja, aber glücklicherweise existiert in unserem Projektumfeld eine große Datenbank mit mehreren hunderttausenden Sportbildern. Allerdings sind diese Bilder weitgehend unsortiert.

Andere Sprachen und Personas

Wenn wir unsere Story in verschiedenen Sprachen veröffentlichen wollen, dann haben wir zwei Möglichkeiten: Entweder erstellen wir die Story in englischer Sprache und übersetzen anschließend das Ergebnis oder wir lassen die Story direkt in der gewünschten Sprache generieren.

Angenommen wir haben Artikel in deutscher und englischer Sprache und wollen daraus Stories in der entsprechenden Sprache erzeugen. Wir könnten versuchen den gleichen (englischen) Prompt für beide Sprachen zu verwenden. Allerdings würden wir dann den Artikel in seiner Ausgangssprache mit dem englischen Prompt verbinden, was beim Modell für einige Verwirrung sorgen kann. Teilweise bekommen wir dann englische Slides, wo wir doch deutsche wollten.

Wenn wir stattdessen den Prompt in derselben Sprache definieren, in der auch der Artikel verfasst wurde, dann sind unsere Ergebnisse deutlich besser und stabiler. Es war zu befürchten, dass gerade in deutscher Sprache die (weiterhin englischen) XML-Strukturen nicht mehr funktionieren würden. Diese Befürchtungen bewahrheiteten sich jedoch nicht: Auch mit einem Prompt in deutscher Sprache lassen sich Stories zuverlässig generieren und weiterverarbeiten.

Richtig spannend wird es, wenn wir „Personas” hinzunehmen. Wir können das Modell in unserem Prompt anweisen, die Story für die Person aus einer bestimmten Zielgruppe zu definieren. Also zum Beispiel für einen 20-jährigen Fan eines bestimmten Sportvereins, für einen neutralen Beobachtenden oder einen katzenaffinen Softwareentwickler. Somit lassen sich Inhalte individuell auf die Konsument*innen zuschneiden.

Schaubild Bildklassifikation anhand der Bildmotive

Hier können uns aber andere Machine-Learning Methoden helfen: AWS Rekognition to the rescue! Rekognition bietet zwei Services an, die uns helfen werden, unsere Bilder besser zu verstehen.

Der erste ist die Erkennung / Identifikation von Gesichtern. Hierzu befüllen wir eine Rekognition FaceCollection mit Portraitfotos aller unserer Sportler*innen. Über zwei REST-Aufrufe identifizieren wir erst die Rechtecke der Gesichter auf einem Bild und dann die zugehörigen Sportler in jedem Rechteck. Das alles verpacken wir in einer AWS StepFunction, die unsere Bilddatenbank durchiteriert. 14 Stunden (und ein paar tausend Dollar) später wissen wir, wer auf welchem Bild zu sehen ist.

Der zweite Service, den wir verwenden, sind AWS Rekognition Custom Labels. Dieser Service erlaubt uns, ohne große Machine-Learning Expertise, Modelle zur Bildklassifikation zu trainieren und zu betreiben. Wir könnten damit sogar individuelle Dinge in Bildern identifizieren – uns reicht aber eine grobe Klassifikation jedes Bildes anhand des Bildmotivs. In jedem Fall brauchen wir aber: Trainingsdaten.

Wir nehmen uns also 10.000 Bilder und versuchen sie in Klassen einzuteilen. Aber wie viele Klassen nehmen wir und welche Klassen sind überhaupt sinnvoll, sodass sie möglichst trennscharf, aber dennoch allumfassend sind? Das riecht alles nach viel Handarbeit! Auch hier können uns Machine-Learning Mechanismen helfen.

VGG16 ist ein „convolutional neural network” zur Bildklassifikation mit dem wir jedes Bild grundsätzlich klassifizieren können. Kombinieren wir das Klassifizierungsergebnis mit einem Clustering-Algorithmus, können wir unsere Trainingsbilder in Cluster zusammenfassen. Ein bisschen manuelles Kuratieren und schon haben wir unsere Trainingsbilder auf zwölf unterschiedliche Bildmotivcluster aufgeteilt. Mit diesen Bildern trainieren wir ein AWS Rekognition Custom Labels Modell und können dann den meisten Bildern ein Motiv zuordnen. Wozu brauchen wir diese Motive? Sehen wir gleich!

Akteure und Szenen

Zurück zu unserer Story: Was wir jetzt haben, ist eine Liste von Slides. Allerdings besteht jede Slide bisher nur aus (langweiligem) Text. Wir möchten zu jeder Slide ein möglichst passendes Bild finden. Dazu haben wir das Modell gebeten uns die wesentlichen Akteure mitzuteilen, um die es auf der Slide geht.

Mit den Akteuren können wir uns an unsere Bilddatenbank wenden, um nach Bildern für diesen Akteur zu suchen – dank der Gesichtsidentifikation wissen wir jetzt schließlich, wer auf den Bildern abgebildet ist. Außerdem haben wir im Prompt eine feste Liste von Szenen mit einer Beschreibung definiert und das Modell dann angewiesen jeder Slide eine passende Szene zuzuordnen.

Schaubild Bildauswahl

Unsere Anfrage an die Bilddatenbank lautet in etwa wie folgt: „Gib mir Bilder, auf denen Linda Musterfrau zu sehen ist und deren Motiv ein Stadion zeigt”. Wir bekommen dann eine Liste von Bildern als Antwort, die diesen Kriterien entspricht – doch für welches dieser Bilder entscheiden wir uns schlussendlich? Fragen wir doch wieder das Sprachmodell! Wir formulieren also einen weiteren Prompt für jede Slide, in dem wir das Model bitten, für diese Slide aus einer Liste von Bildern das passende Bild auszuwählen. Da das Modell sich die Bilder nicht „anschauen” kann, müssen wir sie so gut es geht textualisieren. Manche Bilder haben von den Fotografierenden eine textuelle Beschreibung oder einen aussagekräftigen Titel bekommen. In jedem Fall können wir aber über das Bildmotiv und die abgebildeten Personen eine Beschreibung generieren.

Das Sprachmodell beantwortet unseren Prompt mit dem Bild, von dem es denkt, dass es am besten zu Titel und Text der Slide passt. Damit ist unsere Slide fertig.

Falsche Fährten

Mit dem bis hierhin geschilderten Vorgehen lassen sich erstaunliche gute Ergebnisse erzielen. Die größte Herausforderung war allerdings die Auswahl der zu den Slides passenden Bildern. Hier waren einige Iterationen verschiedene Ansätze nötig, die ich noch gerne näher beleuchten möchte.

Unser erster Ansatz sah vor, dass wir zu jedem Bild eine möglichst präzise natürlichsprachliche Beschreibung generieren. Anhand der Textinhalte einer Slide wollten wir dann nach geeigneten Bildern suchen. Konkret haben wir versucht, Beschreibungen für unsere Bilder zu erzeugen und diese dann an AWS Kendra zu übergeben. Dann wollten wir Kendra anhand des Texts der Slide durchsuchen, um passende Bilder zu finden.

Nur ist es schwieriger als angenommen, automatisiert eine gute Beschreibung eines jeden Bildes zu bekommen. Teilweise ähnelt sich der Großteil unsere Bilder nämlich sehr stark, sodass die generierte Beschreibung oftmals zu allgemein ausfiel – in der Art „two people engaging in sports with fans cheering in the background”. Allerdings entwickeln sich die Modelle in dem Bereich schnell weiter, zukünftig könnte dieser Ansatz also auch funktionieren.

Eine andere vielversprechende Methode sind Embeddings bzw. Retrieval Augmented Generation (RAG), das im Grunde genau für unseren Zweck gemacht ist. Allerdings ist auch hier die Herausforderung, gute Embeddings für unsere homogenen Bildmassen zu generieren. Wir wollen schließlich für eine Slide über „Linda Musterfrau” auch ein Bild von genau ihr finden, am besten ein Portrait oder eine Nahaufnahme. Da funktionieren klassische Gesichtserkennungsmodelle und präzise Datenbankabfragen für den Moment besser.

Fazit

Mit den neuen Sprachmodellen lässt sich Content auf eindrückliche Weise in neue Formate überführen. Durch kreative Ansätze lassen sich textuelle Inhalte mit weiteren, multimedialen Inhalten verbinden. Personas ermöglichen es, neue Inhalte zugeschnitten auf individuelle Zielgruppen zu erzeugen.

AI Design Sprint Icon

AI Design Sprint™

Leichtgewichtiger Einstieg in die Welt der KI gesucht? Dann ist der AI Design Sprint™ genau das Richtige! In diesem Workshop können KI-Lösungen ganz ohne Vorwissen und im Team erarbeitet werden.