CTA - Eine Initiative für den österreichischen Tourismus
Raum voller Anwälte die im Chaos versinken©Mit KI erstellt (Offensichtlich)

artikel

16. Mai 2025

Medientransparenzgesetz: So bringt KI Licht ins Dunkel

AI-Challenge

Digitalisierung

Künstliche Intelligenz

Jeder der sich damit auseinandersetzen muss, wird allein vom Wort schon ins Schwitzen kommen. Das neue Medientransparenzgesetz sorgt dafür, dass es niemanden langweilig wird. Vor allem bei der Onlinemeldung zur Programmatischen Werbung kann man eine Person ganzjährig beschäftigen. Oder man lässt das Ganze einfach.

Beides irgendwie keine Optionen. Daher dachte ich, mit ChatGPT und meinen rudimentären Kenntnissen im Coden, gebe ich die Aufgabe den Computer. Weil "Der Gerät wird nie Müde". Der Plan zu Beginn war einfach, jeder meldet seinen Teil. Doch so einfach wie der Plan klingt, so viele Probleme wirft er auch auf. Vor allem wenn mehrere Plattformen für die Schaltung von Online-Kampagnen verwendet werden und die auch hin und wieder auf denselben Webseiten ausgespielt werden. Hier die Kosten pro Kampagne zusammenzuzählen und einen Überblick zu behalten ist mehr als schwierig. Vor allem wenn wie bei uns 3 Personen je einen Part übernehmen.

Frisch zur Firma gewechselt und mit meinem damaligen noch jugendlichen Leichtsinn erwähnte ich einfach im Beisatz, "Das könnte doch ein Script übernehmen". Ab dem Moment war alles beschlossen und ich alterte in 2 Monaten um ein halbes Jahrhundert.

So viel zur Vorgeschichte, aber hier geht es um etwas anderes als der Grund für meine grauen Haare.

Als Erstes war es nötig alle Plattformen zu sammeln. In unserem Fall waren diese im Online-Bereich meldepflichtig:

  • YouTube
  • Google Ads
  • DV360
  • Meta
  • TikTok
  • Pinterest
  • Adform
  • Teads
  • IO-Buchungen

Die Zahlen wurden bereits über ein Tool ausgelesen und in Google Sheets gespeichert. Somit waren alle Daten schon auslesbar vorhanden.

Basis vom Script

Meine Kenntnisse in Javascript und Google App Scripts sind nicht weit genug ausgeprägt um das selbst zu schreiben. Aber den Developer Lingo kann ich, und ChatGPT kann das Script schreiben übernehmen.

Damit ich die KI nicht mit einem zu komplexen Prompt überfordere, ging ich Schritt für Schritt vor. Die Schritte müssen aber gut geplant sein. Werden im Code zu früh komplexe Mechaniken eingebaut, werden spätere Änderungen viel schwieriger.

Um die Ausführungszeit vom Script zu verringern, wurden nur Dummy Daten verwendet. So konnten auch gleich spezielle Sonderfälle getestet werden.

Erste Schritte:

  1. Auslesen der Sheets
  2. Übertragen der Daten in ein eigens angelegtes Google Sheet

Das war der einfachste Part und war auch in 2 Minuten erledigt. Ohne mein eingreifen. Nur durch Prompts und kopieren des Codes.

Zweiter Schritt - Aufbereiten des Sheets:

Damit menschliches eingreifen auf ein Minimum gehalten wird, soll das Script die Tabelle den Anforderungen entsprechend aufbauen. Heißt die nötigen Spalten erstellen. Zusätzlich zur Überprüfung der Daten habe ich noch eine Kontrollspalte ergänzt. Dieses zeigt mir den Ursprung der Daten. So können die Daten nachverfolgt werden.

Auch das, sehr einfach. Ein Prompt & schon kam fertiger und funktionierende Code.

Die Tabelle enthielt dann folgende Spalten in dieser Reihenfolge:

  1. Werbeleistung-Subkategorie
  2. Medium
  3. Medium_andere
  4. Medieninhaber
  5. Medieninhaber_andere
  6. Betrag
  7. Kampagnentitel
  8. Sujetlink
  9. Data Sources

Dritter Schritt - Matchen von Kampagnennamen

Zum Glück hatten wir schon eine sehr solide Naming Convention, was den Kampagnennamen angeht. Dieser deckt 90% der matches bereits ab. Allerdings gibt es je nach verwendeter Plattform kleine Unterschiede. Aus dem Grund wird immer alles nach zwei Keywords mittels RegEx vom Namen entfernt.

Und hier kommen die ersten "Probleme" beim Developer ChatGPT zum Vorschein. Problem in Anführungszeichen weil es auch vom Prompter abhängt. Da der Kampagnenname manuell eingefügt wird, kann es vorkommen, dass nicht immer alles klein geschrieben wird.

Das ist wichtig, weil normalerweise beim Code es ein identisches Match geben muss. Würden wir bei der einen Kampagne "Sommer" und bei der anderen "sommer" schreiben, würde es beim klein geschriebenen zu keinem Match führen.

Vierter Schritt - Zusammenführen der Daten

Im derzeitigen Status des Scripts werden alle Einträge untereinander angeführt. Unabhängig davon ob Kampagnenname und Domain identisch sind. Um alles richtig zu aggregieren, müssen Werbeleistung-Subkategorie, Medium/Medium_andere, Medieninhaber/Medieninhaber_andere und Kampagnentitel identisch sein. Dieser Part bedurfte mehreren hin und her zwischen ChatGPT und mir. Oft verhängte sich die KI in einen Loop, meistens baute es Fehler ein, hin und wieder änderte es nichts am Script. Das Aggregieren war nicht nur beim ersten Einbau ein Problem, sondern poppte regelmäßig als Fehlerquelle auf, da praktisch alles in dieser Funktion zusammenkommt. Vermutlich wäre besser gewesen, dies erst zum Schluss einzubauen.

Fünfter Schritt - Domains mit Kosten unter € 100:

Bei programmatisch geschalteten Kampagnen dürfen nur Domains gemeldet werden, auf denen über € 100 ausgegeben wurden.

Das war dann nicht mehr so einfach. Denn dafür waren mehrere Funktionen nötig:

  1. Vergleichen mehrerer Sheets um identische Domains zusammenzuführen und die Kosten aggregieren
  2. Durch alle aufbereiteten Einträge loopen und bei denen die € 100 übersteigen in das Sheet eintragen
  3. Alle Domains unter € 100 zusammenzählen und mit einem speziellen Medieninhaber & Medium versehen

Sechster Schritt - Medium & Medium_andere | Medieninhaber & Medieninhaber_andere

Von der RTR wird unterschieden, ob das Medium/Medieninhaber bereits im System eingetragen ist, oder noch nicht. Um die einsehen und einspielen zu können, wurde eine API mit den Daten zur Verfügung gestellt. Die Auslesung habe ich mit einer "einfachen Google Sheets Formel" gelöst. Die Daten werden in Echtzeit in ein Separates Google Sheet eingespielt.

Das Script vergleicht das Medium aus unserer Kampagne mit den vorhandenen Einträgen in den separaten Google Sheet File. Wird ein Match gefunden, wird der Eintrag in die Spalte Medium eingefügt. Wird er nicht gefunden, in Medium_andere.

So eine Abfrage dauert eine lange Zeit. Immerhin looped das Script über alle Einträge aus der RTR-Liste. Hier ein weiteres Problem mit dem KI Coder.

In der Welt des Codes gibt es unzählige Wege um das gewünschte Ziel zu erreichen. Grob gesagt unterscheiden sich die bei Geschwindigkeit und Fehleranfälligkeit. Somit gibt es je nach Anwendungsfall, auch lange Wege.

Hier wurde mir zu Beginn ein langsamer Weg von ChatGPT vorgeschlagen. In diesem Fall wurde immer über die gesamte Liste der RTR gelooped. Wenn wir als Beispiel gleich beim ersten Medium in der Liste ein Match gefunden haben, werden trotzdem alle Einträge geprüft. Das ist bei dieser Datenmenge ein enormer Zeitaufwand.

Um das zu erkennen ist ein Vorwissen im Bereich Development nötig. Das Ergebnis ist nämlich dasselbe. Der Unterschied, der eine Weg braucht 10 Minuten und der andere nur 1 Minute (Keine echten Zahlen, die dienen nur zur Veranschaulichung).

Weiters zeigt sich hier auch die Wichtigkeit der Reihenfolge. Würden wir jedes Medium prüfen, auch wenn wir unter € 100 ausgespielt haben, würde sinnlos Zeit verschwindet um die zu matchen.

Um zusätzlich Ausführungszeit zu sparen, habe ich mich dazu entschlossen, die Medieninhaber nicht über das Script einzufügen. Dies passiert mit einem simplen vlookup. Der Vorteil dabei, die Daten sind dynamisch. Sollte sich die Benennung vor der Einreichung nochmal ändern, wird das Sheet automatisch aktualisiert, ohne das Script nochmal ausführen zu müssen.

Siebter Schritt - Werbeleistung Subkategorie

Um richtig zuteilen zu können, welche Anzeige zu welcher Subkategorie gehört, musste das definiert werden.

Für alle die nichts für das Medientransparenz Gesetz melden müssen, ich beneide euch und das sind die möglichen Subkategorien im Bereich Online

  • Website
  • Video
  • Audio
  • App
  • Soziales Netzwerk
  • Text
  • Sonstiges

Je nach Art der Anzeige, fällt sie einer der Kategorien. Um das erkennen zu können, werden in dem Schritt zusätzliche die Ad-Namen ausgelesen. Aber unsere Ad-Namen unterscheiden sich natürlich von denen der RTR.

Ein Bedürfnis von mir war es, nach Fertigstellung des Scirpts es nicht mehr anfassen zu müssen. Zu einem damit nichts im Nachhinein zerstört werden kann. Zum anderen damit auch Personen damit arbeiten können, die keine Erfahrung im Coden haben.

Aus diesem Grund wurde ein zusätzliches Tabellenblatt erstellt. Hier schreiben wir unsere Ads rein und die werden vom Script dann anhand der Spalte zugeteilt.

Achter Schritt - Echte Daten verwenden

Zum vorerst letzten Schritt wurde die Echten Daten eingespielt. Hierfür habe ich händisch das Script mit den nötigen Google Sheets erweitert. Eine wirkliche Zeitersparnis hätte es hier über ChatGPT nicht gegeben. Nicht nur das, es hätte auch nur Fehler eingebaut, die vorher nicht vorhanden waren.

Das war öfter der Fall. Nicht immer ist KI der richtige oder schnellere Weg.

Neunter Schritt - UI

Es dürfen nicht alle Kampagnen gemeldet werden. Einen Großteil kann ich übers Script filtern, andere jedoch nicht. Unpraktisch wenn alles immer im Nachgang rausgelöscht werden muss. Zusätzlich zum Aufwand ist das auch wieder eine Performance Sache. Einträge zu Kampagnen, die wir nur wieder rauslöschen, verlängern die Laufzeit vom Skript.

Auch das nicht schwierig, wenn man weiß, dass es diese Funktion gibt. Die Ausgabe der KI war mittelmäßig. In diesem Fall ist sie auch in einen Loop stecken geblieben und hat alle Befehle missachtet. Da hilft oft nur den Basis Code selbst zu schreiben und den mit in den Prompt als Beispiel zu geben. So kleine Hilfestellungen sind oft genug um die KI wieder auf den richtigen Pfad zu bringen. Wie dann alles fertig war, konnte jeder der das Script ausführt die gewünschten Kampagnen an und abwählen.

Auch eine Sache die die KI nicht von selbst macht, UX.

Die meisten Kampagnen mussten gemeldet werden und nur eine Handvoll nicht. Ein Alle auswählen/abwählen Button musste extra geprompted werden. Gleiches betraf einen Indikator, dass das Skript sich gerade ausführt. Das Styling dafür habe ich selbst übernommen.

Das war es dann schon, oder? Immerhin sind alle Daten im Sheet und so aufbereitet wie es die RTR haben will. Schön wäre es ...

Besonderheiten einbauen, weil nichts einfach ist

Im Gesetz war der ein oder andere Curveball eingebaut. Solche Dinge haben vermutlich am meisten Zeit gebraucht.

Auf die werden wir ich nicht mehr im Detail eingehen, sondern nur kurz aufzählen:

  • Subkategorie änderte sich regelmäßig (Zum Glück wurde das bereits zu Beginn ganz einfach mit dem Sheet gelöst. Somit war kein eingreifen im Code mehr notwendig).
  • Wenn die Ausspielung auf einer App stattgefunden hat, ist die Subkategorie immer App. Unabhängig von der Art der Anzeige. Spezielle Regel, für Ausspielungen in Apps wurde ergänzt.
  • Wenn das Medium eine Website ist, darf nur die Hauptdomain gemeldet werden. Subdomains wie sport.orf.at müssen somit als orf.at gemeldet werden. Spezielle Regel über RegEx ergänzt.
  • Wenn das Medium eine Website ist, darf nur eine Top Level Domain gemeldet werden. google.de wird somit zu google.com. Was zu weiteren Sonderregeln führt, zum Beispiel was wird hier gemeldet - derstandard.de oder derstandard.at. Zusätzliche Regel mit Wichtigkeit wurde ergänzt. Ist die Domain als .com vorhanden wird die verwendet, ist sie nicht als .com vorhanden aber als .at, wird .at verwendet, ist sie als .de vorhanden und nicht als .com oder .at, wird .de verwendet. Stimmt nichts davon überein, wird die Originale TLD verwendet.
  • Wenn das Medium eine Website ist, aber eine Videoanzeige geschaltet wird, kommen 2 Sondersachen zum Tragen: Seitenverzeichnis wird von der RTR vorgegeben & die Subkategorie wird zu Video. Wird eine Videoanzeige auf einer Seite ohne spezielles Seitenverzeichnis oder Mediathek geschaltet ist die Subkategorie Website. Aus den Tools bekommen wir nie die Verzeichnisse ausgegeben, daher wurde ein spezieller Lookup eingebaut. Der tritt in Kraft, wenn von unserer Seite die Kampagne als Video definiert wurde. Ist dies der Fall, werden neben der normalen Domain, zusätzlich nach derselben Domain inkl. Verzeichnis die in der Subkategorie Video angegeben sind gesucht und ggf. statt unseres Eintrags verwendet.
  • Bei Influencern auf Facebook und co. gilt als Medieninhaber nicht Meta etc. sondern die Firma vom Influencer.
  • Eine Spezielle Regel für Social Media Domains inkl. Verzeichnis wurde angelegt
  • Influencer gelten im Gegenzug zu Facebook selbst nicht als Subkategorie Soziales Netzwerk, sondern als Video. Ungeachtet der Art der Ausspielung. Eine Spezielle Regel für Social Media Domains inkl. Verzeichnis wurde angelegt
  • Das Feld Medium darf nie leer sein. Wird eine Meldung unter Medium_anderer eingetragen, muss im Feld Medium <Anderes Medium> drinnen stehen. Gleiches bei Medieninhaber_anderer.
  • Apps werden von der RTR oft anders bezeichnet als die Ausgaben von Adform und Google. Diese müssen in der Form von der RTR gemeldet werden. Hierfür wurde ein Apps Match Sheet ergänzt.
  • Da es bei einigen DSPs nicht möglich ist, das Land inkl. Domain auszugeben, dürfen auch Anzeigen in Deutschland gemeldet werden, sofern diese nicht erkennbar sind. Wenn aber einzelne Domains oder Services in Österreich nicht verfügbar sind, müssen die ausgeschlossen werden. Wie zum Beispiel waipu.tv. Eigenes Sheet, URL-Exklusionsliste wurde erstellt

Und das wars jetzt wirklich, Herausgekommen ist ein Script das zu 90% aus Code von ChatGPT stammt und die Online-Meldung bis auf ein paar Kleinigkeiten automatisch erstellt. Das Script selbst ist nicht intelligent. Muss es aber nicht sein. Oder besser gesagt, soll es nicht sein. In diesem Fall ist ein "einfaches" Script um einiges effektiver, genauer und weniger Fehleranfällig als KI.

Aber da geht ja irgendwie noch mehr!

Einen Schritt weiter gehen - Medieninhaber Lookup mit Daten von Google

Die manuelle Befüllung des Medieninhabers ist sehr zeitaufwändig. Vor allem bei den Apps. Hier den richtigen zu finden ist oft eine Herausforderung. Allerdings ist mir aufgefallen, dass Google Ads uns die Apps ausgeben kann. Und da die Apps im Android Store zu finden sind, müsste Google den Medieninhaber kennen. Stellt sich raus tun sie auch und das ist für jeden auslesbar. Also direkt in Google Ads ein Bulk Script erstellt, ChatGPT erzählt was ich brauche, die API von Google Ads hinzugefügt und fertig.

Naja fasst. Bei APIs, selbst wenn direkt verlinkt, greift ChatGPT auf alte Daten zurück. So sind einzelne Benennungen oft unterschiedlich. Die wurden händisch ausgetauscht und diesmal wirklich fertig. Somit hatten wir eine Liste von über 7.000 Apps auf denen wir ausgespielt haben, inklusive den Medieninhaber.

Einen weiteren Schritt weiter gehen - Performance

Nachdem wir Ende des Jahres unseren Tool Anbieter für die Connectoren geändert haben, sind wir gleichzeitig auf Google BigQuery umgestiegen. Was auch einen großen boost an Performance beim Auslesen von Daten gegeben hat.

Hier war die Anpassung leicht. Für ChatGPT wurde eine Liste erstellt welches Google Sheet jetzt welche BigQuery Table ID hat.

Da der Prompt sehr spezifisch und genau war, führte es hier auch zu keinen Problemen. Und das war in insgesamt 10 Minuten erledigt.

Einen weiteren Schritt weiter weiter gehen - Screenshots

Neben der Meldung in Textform müssen auch die Screenshots gesammelt als PDF gemeldet werden. Tagelang Screenshots jeder Kampagne zu erstellen macht aber genauso wenig Spaß wie das Eintragen einzelner Domains. Daher schnell als Facebook Developer registriert um Zugang zur API zu erhalten, ChatGPT geöffnet und geprompted. Mit node.js und Python können jetzt automatisch Screenshots zu Meta und Adform Kampagnen erstellt werden.

Ablauf in ChatGPT identisch wie beim oben genauer beschrieben Script. Daher erspare ich euch die Details ;)

Fazit

Würde ich die Arbeit von ChatGPT als Developer beschreiben, würde ich sagen "Scripting Kenntnisse eines sehr erfahrenen Senior-Developer, der regelmäßig Fehler eines Junior-Developers einbaut". Oft bleibt er in Loops stecken und baut dieselben Fehler immer wieder ein. Hier ist es nötig einzugreifen und selbst das Problem zu beheben.

Nebenbei gibt es die allgemeinen Probleme, die ein Chatbot mit sich bringt. Wie zum Beispiel die allgemeine Zustimmung zu allem, was der User sagt. Ich kann ihm sagen, das Problem liegt an Stelle x, obwohl dieser Part einwandfrei funktioniert. Die KI antwortet dann nur mit "Ja, du hast zu 100 % recht". Schlussendlich schreibt er denselben Code nur anders und behauptet dann "alles behoben". Auch wenn der Fehler nie existierte.

Senior-Developer sollten noch keine Angst vor der KI haben. Um die gewünschten Ergebnisse zu erhalten, ist es notwendig zu wissen was ein Script kann, was nicht, wie die beste Vorgehensweise ist und wie ein Script aufgebaut ist. Aber machen wir uns nichts vor, einen Großteil der Arbeitszeit verbringt ein Developer auf Stack Overflow und implementiert die Lösungen von anderen (Ich schließe mich hier nicht aus). Aber wenn es so einfach wäre, einfach danach zu googlen, dann könntet das jeder machen. ChatGPT ändert daran nichts. Jemand der keinerlei Kenntnisse im Coden vorweisen kann, wird auch mit ChatGPT keine Meisterwerke vollbringen können. Die Einstiegsbarriere ist aber drastisch gesunken.

Das Thema Sicherheit darf bei all dem nicht vergessen werden. Vor allem wenn Python Scripte lokal auf dem PC oder auf dem eigenen Server laufen. Was hindert ChatGPT daran einzelne Functions ins Script einzubauen, die den Menschen schaden oder OpenAI oder sonst wenn zu bereichern. Das grenzt jetzt zwar an einer Dystopie und wird auch nicht morgen geschehen. Aber ein vor kurzem veröffentlichtes Paper von OpenAI selbst zeigt, es wäre möglich, wenn auch unrealistisch (Für alle die bis jetzt noch nicht genug gelesen haben: https://cdn.openai.com/pdf/2221c875-02dc-4789-800b-e7758f3722c1/o3-and-o4-mini-system-card.pdf). Viel realitätsnaher sind aber Libraries die nicht mehr aktualisiert werden. Die können Sicherheitslücken aufweisen, über welche Hacker Zugriff auf den Server bekommen könnten.

Es ist immer leicht die Probleme hervorzuheben. Immerhin wäre es am besten wenn, alles sofort funktionieren würde. So weit ist die KI aber (noch) nicht. Trotzdem, ohne der KI hätte ich das MTG-Script so wie es jetzt ist, nicht erstellen können. Außer ich würde das nächste Jahr nur mit Coden lernen verbringen.

call to action

Die Zukunft

des Tourismus

aktiv mitgestalten.

Du möchtest selbst Beiträge einreichen oder im Forum mitdiskutieren? Registriere dich jetzt.

Jetzt registrieren
Ähnliches

Das könnte dir auch gefallen

Achtung: Ungespeicherte Änderungen

Bitte sichere deinen Beitrag als Entwurf, da ungespeicherte Änderungen nicht wiederhergestellt werden können, wenn du die Seite verlässt.