Der Allesschreiber

OpenAI's GPT-3 als Ghostwriter für Vollautomatische Webseitengenerierung

Bild von DALL-E generiert. Prompt von Chat-GPT als Titelbild für diesen Artikel vorgeschlagen: "Draw an image of a robot working at a lab bench, surrounded by books and papers. The robot is holding a tablet or laptop computer. In the background, there is a whiteboard with scientific equations and diagrams."

Vollautomatische Generierung von Webseiten

In diesem Artikel erkläre ich, wie man mittels künstlicher Intelligenz vollautomatisch Webseiten zu beliebigen Themen, inklusive Bildern, generieren kann. Dafür werden wir auf das Sprachmodell GPT-3 zurückgreifen. GPT-3 steht für "Generative Pre-training Transformer 3". Es ist ein neuronales Netzwerk-Modell für maschinelles Lernen, das von OpenAI entwickelt wurde. Als generatives Modell ist es in der Lage neue Inhalte zu erstellen, anstatt nur vorhandene Inhalte zu kategorisieren oder zu klassifizieren. GPT-3 ist besonders gut darin, Texte zu verfassen, die in Stil und Inhalt menschenähnlich sind. Es kann auch für Aufgaben wie Übersetzung, Frage-Antwort-Systeme oder die Erstellung von Zusammenfassungen verwendet werden. GPT-3 ist aktuell eines der leistungsstärksten und vielseitigsten neuronale Netzwerk-Modelle.

Im Gegensatz zum neueren ChatGpt gibt es für GPT-3 eine Programmierschnittstelle. Das Ghostwriter-Skript ist in der Programmiersprache Python geschrieben und wird sowohl Texte, als auch Bilder für die zu generierenden Webseiten vollautomatisch erstellen und keine Nutzereingaben, außer des Themas benötigen. Dieses kann dabei in jeder GPT-3 bekannten Sprache formuliert werden. Es hat sich allerdings gezeigt, dass die Artikelgenerierung besser in Englisch, der "Muttersprache" des Sprachmodells funktioniert.

Bei Vorgabe von Themen in deutscher Sprache werden häufiger generische Kapitelüberschriften wie "Einleitung", "Fazit" oder "Zusammenfassung" erzeugt. Einfache Überschriften eignen sich aber nicht, um aussagekräftige Kapitel zu erzeugen. Darüber hinaus kann es bei Vorgabe eines deutschen Themas auch passieren, dass ganze Kapitel in englisch erzeugt werden. Der Qualitativ beste Weg zur Erstellung deutscher Artikel ist die Erzeugung eines englischen Textes, gefolgt von anschließender automatischer Übersetzung mittels eines Dienstes, wie DeepL. Dies ist jedoch nicht Teil des hier vorgestellten Programmes.

Voraussetzungen

Die Ausführung des Skriptes erfordert das Vorhandensein einer aktuellen Version von Python. Open AI's GPT-3 ist ein auf künstlicher Intelligenz basierendes Sprachmodell und ein kostenpflichtiger Dienst. Die Verwendung des Ghostwriter-Skriptes erfordert daher die Existenz eines gültigen API Keys. Man kann sich aktuell kostenfrei bei OpenAI anmelden und hat dort die Möglichkeit ein Freiguthaben von 18 Euro aufzubrauchen. Danach muss man für die Verwendung des Dienstes Bezahlen. Die Kosten für die Erstellung eines Artikels liegen im niedrigen Centbereich (15-20 Cent).

Wofür braucht man das und wie gut sind die Artikel?

Dieses Skript richtet sich nicht an Schüler oder Studenten, die Ihre Hausaufgaben nicht mehr selber schreiben möchten, wenngleich sie es dafür verwenden könnten. Ich möchte hier demonstrieren, wie einfach mittlerweile die vollautomatische Textgenerierung geworden ist und wie erstaunlich gut die Ergebnisse dieser sind. Mit dem Ghostwriter-Skript kann man schnell Artikelideen prüfen und es liefert einen brauchbaren Ausgangspunkt für weitere eigene Recherchen. Für mich legt es auch einen untere Qualitätsschwelle für Artikel fest. Wenn ein handgeschriebener Artikel weniger informativ oder auch nur gleichwertig zu einem automatisch generierten ist, dann hat man etwas falsch gemacht.

Bei der Themenwahl gilt: Garbage in, Garbage out!. Wenn das Thema Unsinn ist, wird auch das Ergebnis Unsinn. So kann man beispielsweise einen Artikel schreiben lassen, in dem erklärt wird, wie Aliens den 100 Jährigen Krieg beendet haben. Der wird nur ziemlich schlecht werden, denn die KI wird sich beim Spagat zwischen tatsächlicher Geschichte und fiktionaler Anforderung verlieren. Die Qualität der Ergebnisse für deutsche Artikel befindet sich ungefähr auf dem Niveau eines Schülerreferates. Die Qualität der erzeugten englischsprachigen Artikel ist jedoch besser.

Beispiele KI-generierte Artikel in deutscher Sprache: Beispiele KI-generierte Artikel in englischer Sprache:

Verwendung

Wer das Ghostwriter-Skript verwenden möchte, der benötigt einen OpenAI API-Key. Dieser muss in der Umgebungsvariable "OPENAI_API_KEY" hinterlegt werden. Die Verwendung von GPT-3 ist kostenpflichtig. Aktuell bietet OpenAI bei Registrierung ein einmaliges Guthaben von 18 Euro an, welches man aufbrauchen kann. Die Kosten für die Erstellung eines Artikels mit Bildern liegen im Centbereich.

Download Ghostwriter-Skript via GitHub

Kommandozeilenparameter

Für die Ausführung benötigt man Python 3. Es kann mit folgender Kommandozeile gestartet werden:

python ./ghostwriter.py -t "The Rise of AI generated Content" -tmpl ./template.html -o ai_content
Parameter Description
-t Das Thema der Webseite. Dieser Text sollte in Anführungsstrichen stehen.
-tmpl TEMPLATE Eine Textdatei (beispielsweise HTML oder PHP), welche den Rahmen für die Webseite bereit stellt. Die Datei muss die Platzhalter {TOPIC}, {CONTENT} und optional {VERSION} enthalten. Diese werden vom Skript automatisch mit der Überschrift, dem HTML formatierten Artikel bzw. der Skriptversionsnummer ersetzt.
-o OUTPUT Ausgabeverzeichnis für den Artikel. Wenn dieses Verzeichnis nicht existiert, wird ein neues angelegt.
-s WRITING-STYLE Optional: Ein Text, der den Schreibstil angibt. (z.B. "Carl Sagan", "National Geographic", "PBS" oder "Drunken Pirate")
-v Optional: Wenn dieses Flag gesetzt ist, gibt das Skript die GPT-3 Anfragen in der Konsole aus.

Prompt Engineering

Die Methode Anweisungen für KI Systeme so aufzubereiten, das diese sie verstehen und tatsächlich das tun, was gewollt ist heißt Prompt Engineering. In diesem Fall muss das Problem in Teilaufgaben zerlegt werden, die einzeln an GPT gesendet werden. Darüber hinaus muss das Ausgabeformat genau spezifiziert werden. GPT-3 hat sowohl Einschränkungen, was die Komplexität der Anfragen, als auch die seiner Antworten angeht. Die Maßeinheit in der das System diese misst sind "Tokens". Ein Token soll in etwa vier Zeichen entsprechen. Das beste Sprachmodell "text-davinci-003" lässt nur insgesamt nur maximal 4000 Tokens für Frage und Antwort zu. Daher ist es ist nicht möglich einen kompletten Artikel mit nur einer Anfrage erzeugen zu lassen.

Der Python-Code um eine einzelne Anfrage zu senden ist sehr einfach:

def __create(self, prompt, temp = 0.3, freq_penalty = 0.3, pres_penalty = 0.2, max_tokens = 4000):
        response = openai.Completion.create(
            model = "text-davinci-003",
            prompt = prompt,
            temperature = temp,
            max_tokens = max_tokens,
            top_p = 1.0,
            frequency_penalty = freq_penalty,
            presence_penalty = pres_penalty
        )

        result = response["choices"][0]["text"]
        result = result.strip()
        return result	
	

Man schickt eine Anfrage (prompt) und stellt einige Parameter ein. Der Parameter max_tokens gibt an, wie viele Tokens von GPT-3 bei einer Anfrage verarbeitet werden dürfen. Damit wird sichergestellt, dass Anfragen an das Modell nicht zu lang werden und es schnell genug Antworten kann.

Der Parameter frequency_penalty beeinflusst die Häufigkeit von Wörtern in der von GPT-3 generierten Textausgabe. Um so höher dieser Wert, um so größer wird die Strafe für Wortwiederholungen mit jedem erneuten Vorkommen eines Wortes im Ausgabetext.

Der Parameter presence_penalty steuert ebenfalls wie oft Wortwiederholungen erlaubt sind. Im Gegensatz zur frequency_penalty hängt die presence_penalty nicht von der Häufigkeit ab, mit der Wörter in früheren Vorhersagen auftauchen sie ist immer gleich und greift, sobald das Wort mindestens einmal verwendet wurde.

Der Parameter temperature regelt wie viel Einfluss der Zufall bei der Erstellung der Antwort hat. Ist dieser Wert 0, wird GPT immer gleich antworten.

Inhaltsverzeichnis erzeugen

Der Artikel startet mit der Generierung eines Inhaltsverzeichnisses. Dafür wird ein Befehl an GPT-3 gesendet, in welchem von der KI verlangt wird ein Inhaltsverzeichnis für den Artikel zu erstellen. Es wird weiterhin verlangt, das die Rückgabe in Form einer speziell formatierten XML-Datei erfolgen soll. Dies geschieht durch Vorgabe eines XSD-Schemas.

Create table of contents for an article titled "{topic}" with at least {nchapter} chapters; 
Captions must be unnumbered; Output in XML with the XSD scheme listed below; 
Caption attribute must consist of at least two words
<?xml version="1.0" encoding="utf-8"?>
    <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    ...

Es ist bemerkenswert, dass das Sprachmodell diese Anweisung versteht. Das bedeutet, dass GPT-3 mit XML- und XSD-Dateiformaten vertraut sein muss. Das XSD-Schema habe ich mit einem online Tool aus einer XML-Datei erstellt, die GPT-3 ein einem früheren Durchlauf erstellt hatte. Die folgende XML-Datei zeigt die Ausgabe für einen englischsprachigen Artikel zum Thema "Paleocene–Eocene Thermal Maximum":

<?xml version="1.0" encoding="utf-8"?>
<outline>
  <topic>Paleocene–Eocene Thermal Maximum>/topic>
  <subtopic Caption="Background Information">
	<subsubtopic Caption="Geological Context" />
	<subsubtopic Caption="Climate Changes" />
  </subtopic>
  <subtopic Caption="Impacts on Ecosystems">
	<subsubtopic Caption="Marine Ecosystems" />
	<subsubtopic Caption="Terrestrial Ecosystems" />
  </subtopic>
  <subtopic Caption="Modern Implications">
	<subsubtopic Caption="Global Warming" />
	<subsubtopic Caption="Carbon Cycle" />
  </subtopic>
</outline>

Kapitel erstellen

Mit diesem, maschinenlesbaren, Inhaltsverzeichnis können nun Kapitel für Kapitel Text und Bilder erzeugt werden. Dafür wird einfach durch die Knoten der XML-Datei iteriert und jedes Kapitel bzw. Jeder Unterabschnitt einzeln angefordert. Es gibt keine feste Formatvorgabe für Anfragen an GPT-3. Das folgende Beispiel erstellt ein Kapiteleinleitung für einen englischen Artikel über die Kambrische Explosion im HTML Format.

Topic: Introduction / The Cambrian Explosion; 
Introductory; 100 Words; [Format:HTML;No heading;use <p> tags]

Ich musste die künstliche Intelligenz hier explizit darauf hinweisen in der Ausgabe <p> Tags zu verwenden, da dies gelegentlich unterlassen wurde. Die Prompts für die Erstellung von Unterkapiteln sehen so aus:

[Caption: The Cambrian Explosion][Topic: "Evolutionary Causes:Genetic Changes"][Format:HTML;No heading;use <p> tags][Write: min. 600 words]

Ich habe das Format hier ein wenig geändert, weil ich gemerkt habe, das man GPT-3 mit eckigen Klammern kurz Zusammenhänge signalisieren kann. Je kürzer, desto besser, denn man möchte ja Tokens sparen. Ganz ohne Nacharbeit geht es allerdings nicht, denn in der Antwort wird GPT-3 im ersten Abschnitt immer erklären, worum es bei dem gewählten Thema überhaupt geht. In diesem Beispiel würde es also immer wieder aufs Neue beschreiben, was die Kambrische Explosion eigentlich war. Es weiß ja nicht, dass es das in den vorangegangenen Unterkapiteln bereits getan hat. Aus diesem Grund wird der erste Abschnitt in der Antwort von GPT-3 von Ghostwriter-Skript immer ignoriert.

Bilder erstellen

Die Erzeugung passender Bilder erfolgt ebenfalls durch GPT-3. Hierfür müssen wir die KI bitten uns einen Prompt zu erstellen, der ein Bild beschreibt, welches das Kapitel gut illustrieren würde:

Create an DALL-E prompt in english for creating a photorealistic illustration for an 
article with this title:The Cambrian Explosion

Dall-E ist eine künstliche Intelligenz von OpenAI für die Erstellung von Bildern aus Textvorgaben. Die Antwort senden wir direkt an GPT-3 zurück, damit es uns diese Bild erstellt:

Create a photorealistic illustration of a diverse range of animals from the Cambrian period, 
representing the sudden emergence of life during the Cambrian Explosion.

Vermutlich verwendet GPT-3 für die Bilderzeugung ebenfalls DALL-E. Das erzeugte Bild kann mittels Python von einer URL herunter geladen werden:

def create_image_from_prompt(self, prompt, save_path):
	response = openai.Image.create(
		prompt=prompt,
		n=1,
		size="512x512"
	)
	image_url = response['data'][0]['url']
	response = requests.get(image_url)

	image = Image.open(BytesIO(response.content))
	image.save(save_path)

Beispielprompts

Die komplette Liste mit allen Anfragen, die für die Erstellung eines englischsprachigen Artikels über die kambrische Explosion notwendig waren, kann hier eingesehen werden.

Erkennung KI-generierter Texte

Nach Aussagen von OpenAI lassen sich KI-generierte Texte anhand eines eingebrachten Fingerprints identifizieren. So etwas ließe sich durch subtile Veränderungen von Worthäufigkeiten oder durch die Verwendung bestimmter seltenerer Formulierungen erreichen. Was genau OpenAI macht ist unbekannt. Es gibt aber bereits KI-Modelle, die auf die Erkennung von KI-generierten Text spezialisiert sind. Eine Beispiel für einen solchen Detektor ist der openai-openai-detector, ein auf RoBERTa basierender GPT-2 Detektor. Das Katz und Mausspiel zwischen KI-Sprachsystemen und KI-Systemen zu deren Erkennung hat begonnen. Werfen wir also einen Blick auf die Fähigkeiten des OpenAi-OpenAi-Detektors.

Übersetzung schützt nicht vor Entdeckung

Meine Tests zeigen, dass die Übersetzung eines maschinengenerierten Textes mittels Deep-L in eine Fremdsprache, gefolgt vom zurückübersetzen nicht vor Erkennung schützt. Selbst nach dem Übersetzen ins Chinesische oder Deutsche wurden die Texte nach erfolgter Rückübersetzung ins Englische noch als Produkte von GPT ausgewiesen.

Detektor erkennt KI-Generationen in deutscher Sprache nicht aber...

Der GPT-2 Detektor scheint derzeit nicht in der Lage zu sein, Texte in deutsche Sprache als KI-generiert zu erkennen. Das liegt vermutlich daran, dass er mit englischen Texten trainiert wurde. Bei meinen Tests wurde allerdings ein in deutscher Sprache maschinengenerierter Text als maschinengeneriert erkannt, wenn er mit Deep-L ins englische Übersetzt wurde.

Testen wir mal das erste Kapitel dieser Webseite:
Wie wir unten links sehen, ist alles ok. Der GPT-2 Detektor ist sich zu 99.98 % sicher, dass der Text "echt" ist. Aber was ist, wenn wir den Text mittels Deep-L ins englische übersetzen?

Der deutsche Originaltext des ersten Kapitels sieht unverdächtig aus. Allerdings ist davon auszugehen, dass die Erkennung von KI-generierten Texten mit englischen Texten antrainiert wurde.
Wenn man das Kapitel mit Deep-L übersetzt ist sich der KI-Detektor plötzlich 100% sicher, das er Autor dieses Kapitels eine KI war.

Das Ergebnis nach Übersetzung ins Englische ist eindeutig: Der Detektor ist überzeugt, dass der erste Abschnitt eine KI-Schöpfung ist. Er hat recht, zumindest teilweise und das ist wirklich überraschend. Ich habe dieses Kapitel tatsächlich von ChatGPT schreiben lassen. Diesen Text habe ich aber nicht im Original verwendet, sondern ihn eingekürzt und ein wenig umgeschrieben. Ich würde schätzen, das ich nur 75 % des generierten Textes verwendet habe. Vor Erkennung hat das nicht geschützt.

Es scheint auch nicht so zu sein, das hier die Übersetzung von Deep-L fälschlicherweise zur Erkennung führt, weil beispielsweise der Schreibstil von Deep-L als maschinengeneriert erkannt wird. Bei Tests habe ich es nicht erlebt, das ein originaler, deutscher, Text nach Übersetzung durch Deep-L fälschlicherweise als maschinengeneriert klassifiziert wurde.

Der Schreibstil "drunken pirate" scheint den GPT-2 Detektor am meisten zu verwirren. (Erzeugt von Dall-E; Prompt: "Create an image of a Pirate sitting at a table writing an essay. On the table is a bottle of rum and a knocked over glass.")

Veränderter Schreibstil bietet nur begrenzten Schutz vor Erkennung

Gibt man GPT-3 explizit einen Schreibstil vor, dann wird die Erkennung als maschinengenerierter Text erschwert. Dafür kann man die "-s" Option des Ghostwriter Skriptes verwenden. Bei in englischer Sprache generierten Texten im Schreibstil von Carl Sagen war sich der Detektor bei größeren Textmengen zwar sicher, dass die Texte authentisch sind. Wenn man allerdings die Abschnitte einzeln Testen lässt, verkehrt sich das Bild ins Gegenteil. Ein Wirksamer Schutz vor Erkennung ist das nicht. Der einzige Schreibstil, der sicher vor Entdeckung geschützt hat, war der Schreibstil "Drunken Pirate". Artikel, die im Stile eines betrunkenen Piraten geschrieben sind, sollten also vorerst nicht so einfach als KI-Produkt zu erkennen sein.

Detektor anfällig für Fehlerkennungen

Abschließend sollte auch erwähnt werden, dass der GPT-2 Detektor anfällig für Fehlerkennungen ist. Dies scheint insbesondere auf englische Texte zuzutreffen, die im vereinfachtem Englisch verfasst wurden. So wird Beispielsweise der Artikel zum Magnetischen Pendel in der vereinfachten englischsprachigen Wikipedia als KI-Produkt eingeordnet. Das ist aber unmöglich, da diese Artikelversion drei Jahre älter als GPT ist. Nach kurze Suche in dieser Wikipediaversion konnte ich auch noch weitere Fehldetektionen finden, so zum Beispiel der Artikel Northern Territory in der Version von 2014 oder der Artikel zu Chlorite.

Ich halte es für unwahrscheinlich, dass das Zufall ist. Es ist vorstellbar, das Texte im vereinfachten englisch und KI-generierte Texte eine ähnliche Struktur aufweisen. Es kann auch sein, das die Sprachsysteme häufig beim Training auf solche vereinfachten Texte zurückgreifen, da diese leichter Verständlich sind. In diesem Fall würden sie selbstverständlich deren Struktur in ihrer Ausgabe replizieren. Speziell für den OpenAI-OpenAI-Detektor kann ich also nicht mit Sicherheit sagen ob er gut darin ist KI-generierte Texte zu erkennen oder ob er gut darin ist Texte in vereinfachter englischer Sprache zu erkennen. Da scheint es deutliche Überschneidungen zu geben.