ChatGPT Experimente: Generierung von SEO Inhalten für Studiengänge

Kaum klickt man bei Instagram ein paar Mal auf eine der Werbeanzeigen, die revolutionäre Einsatzzwecke der großen Sprachmodelle versprechen, wird man auch schon bombardiert mit weiteren Anzeigen. Zeit einmal selbst erste Schritte in diesem Feld zu machen. Es braucht nur eine Idee und das ist sie:

Inhalte für DESCRIPTION-Tags von 250 Studiengängen

Bei der letzten Betrachtung der Studieninformation der Universität Bielefeld in Hinblick auf die Suchmaschinenoptimierung war ein Ergebnis, dass die Nutzung des DESCRIPTION-Attributs – ein Metadata-Attribut – wünschenswert wäre. Da die Studieninformation eine unserer BIS Anwendungen ist wäre es grundsätzlich leicht, den HTML Inhalt entsprechend zu erweitern.

Das wesentliche Problem ist aber die Aufgabe diese Inhalte überhaupt erst zu erstellen. In unserer Datenbank haben wir nichts, was diesen Zweck gut erfüllen könnte. Bei ca. 250 Studienangeboten ist es keine Kleinigkeit solche Texte aufzubauen und ggf. auch noch abzustimmen.

Wie sollte eine gute Beschreibung aussehen

Google hat natürlich Aussagen dazu, wie ein guter Inhalt aussehen sollte, wobei gleich einschränkend gesagt wird, dass diese Angabe nicht immer verwendet wird. An statt sich die Mühe zu machen hier selbst nachzudenken kann man schon zum ersten Mal ChatGPT (oder ein anderes LLM) befragen, z. B. so:

Ich brauche ein Prompt für ChatGPT 3.5 turbo. Das Prompt soll Texte für ein description Tag in einer Webseite der Universität Bielefeld erzeugen. Die Texte sind Beschreibungen für jeweils einen Studiengang. Was für ein Prompt wäre dafür optimal?

ChatGPT in der Version 4o antwortet darauf so:

Du bist ein KI-Schreibassistent und deine Aufgabe ist es, kurze und prägnante Beschreibungstexte für das description Tag einer Webseite der Universität Bielefeld zu erstellen. Diese Beschreibungen sollen jeweils einen Studiengang vorstellen. Jeder Beschreibungstext sollte etwa 150-160 Zeichen lang sein und die wichtigsten Informationen über den Studiengang enthalten.

Bitte liefere eine Beschreibung für den folgenden Studiengang:

Studiengang: [Name des Studiengangs]

Damit könnte man jetzt manuell schon mal loslegen. Oder in einer Programmierung mit langchain4j daraus ein Prompttemplate erstellen:

Verwendung in einer kleinen Java Anwendung

Die Nutzung des Prompts innerhalb einer eigenen Programmierung erfordert nicht viel. Es reicht ein sogn. Prompttemplate anzulegen, in welches sich dann die studiengangsbezogenen Angaben einfügen lassen:

    public static Prompt provideDescriptionPrompt1(@NotNull FsB fsb, @NotNull Ebene1 e1) {
        String promptTemplateText = """
                Du bist ein KI-Schreibassistent und deine Aufgabe ist es, kurze und prägnante Beschreibungstexte für
                das description Tag einer Webseite der Universität Bielefeld zu erstellen. Diese Beschreibungen
                sollen jeweils einen Studiengang vorstellen und für ihn werben. Jeder Beschreibungstext sollte etwa 150-160 Zeichen lang
                sein und die wichtigsten Informationen über den Studiengang enthalten.
                
                Bitte liefere eine Beschreibung für den folgenden Studiengang:
                
                {{name}}
                
                und verwende dabei diese Beschreibung des Studiengangs:
                
                {{description}}
                """;

        Map<String, Object> variables = new HashMap<>();
        variables.put("name", e1.nameWithFsB(fsb));
        variables.put("description", e1.hasInfotext() ? e1.info_textStripped() : "");

        PromptTemplate promptTemplate = PromptTemplate.from(promptTemplateText);
        return promptTemplate.apply(variables);
    }

In diesem Template wird zusätzlich der Infotext ergänzt, den wir für die meisten Studiengänge haben. Das kann man dann nutzen um es dem Sprachmodell vorzuwerfen und dabei gleich mehrere Versionen abzufragen:

    public static List<String> generateDescriptions(@NotNull ChatLanguageModel model,
                                                    @NotNull FsB fsb, @NotNull Ebene1 e1, int iterations) {

        List<String> description = new ArrayList<>();
        Prompt prompt = provideDescriptionPrompt1(fsb, e1);

        for (int i = 0; i < iterations; i++) {
            description.add(model.generate(prompt.text()));
        }
        return description;
    }

Auf diese Weise lassen sich dann leicht die 250 Fälle durchprobieren. Aber was kommt dabei heraus?

ChatGPT 3.5-turbo

Den ersten Lauf habe ich mit diesem Sprachmodell von OpenAI gemacht, in der API Seite zu den Modellen wird es als fast, inexpensive model for simple tasks beschrieben.

Ergebnisse für 3.5

Betrachten wir dieses Prompt für einen realen Studiengang:

Du bist ein KI-Schreibassistent und deine Aufgabe ist es, kurze und prägnante Beschreibungstexte für
das description Tag einer Webseite der Universität Bielefeld zu erstellen. Diese Beschreibungen
sollen jeweils einen Studiengang vorstellen und für ihn werben. Jeder Beschreibungstext sollte etwa 150-160 Zeichen lang
sein und die wichtigsten Informationen über den Studiengang enthalten.

Bitte liefere eine Beschreibung für den folgenden Studiengang:

Bachelor of Arts Anglistik: British and American Studies Kernfach (fw)

und verwende dabei diese Beschreibung des Studiengangs:

Wer sich für die englischsprachige Literatur- und Medienwelt begeistert, ist bei „Anglistik: British and American Studies“ bestens aufgehoben. Autoren wie William Shakespeare, J.K. Rowling, Mark Twain oder Jack Kerouac werden in diesem Programm unter die Lupe genommen, recherchiert, analysiert und diskutiert.Zu Beginn des Studiums setzen sich die Studierenden auf breiter Grundlage mit den Wissensfeldern Sprache, Literatur und Kultur auseinander. In der zweiten Studienhälfte erfolgt dann eine Schwerpunktbildung, die sich vor allem an späteren Berufswünschen orientieren sollte. Während des gesamten Studiums ist die Vermittlung fachlicher Kompetenzen eng mit der Vermittlung von interkulturellen und kommunikativen Schlüsselkompetenzen verknüpft. „Anglistik: British and American Studies“ kann mit zwei unterschiedlichen geografischen Schwerpunkten studiert werden: British Studies oder American Studies. Diese Themenschwerpunkte spezialisieren sich auf die britischen oder nordamerikanischen Kulturen und Geschichten sowie die Besonderheiten der Literaturen und der Medien dieser Regionen. Studierende setzen sich auf diesem Weg sowohl mit britischen als auch mit nordamerikanischen sprachlichen, kulturellen und literarischen Formen auseinander und erwerben somit neben text- und medienanalytischen Kompetenzen insbesondere interkulturelle und interdisziplinäre Fähigkeiten.Dabei ist der wissenschaftliche Blick der Bielefelder Anglistik nicht nur auf Großbritannien und die USA begrenzt. Vielmehr bezieht er in Forschung und Lehre auch die Sprache, Kultur und Literatur von Sprach- und Kulturgemeinschaften in Afrika, der Karibik oder Indien und von Ländern wie Kanada, Australien, Neuseeland, Irland oder Schottland mit ein.Studierenden, die ein Studium in „Anglistik: British and American Studies“ absolvieren, stehen viele unterschiedliche Berufsfelder offen. Wie viele andere geisteswissenschaftliche Fächer ist dieses Bachelor- Programm nicht auf ein spezifisches Berufsziel ausgerichtet. Die Kompetenzen, die bei einem Studium in Anglistik erworben werden, werden von unseren Absolvent*Innen unterschiedlich eingesetzt, beispielsweise in kulturellen Institutionen wie Museen oder Archiven, der Erwachsenenbildung sowie in städtischen Institutionen oder privaten Firmen in Public Relations, Kommunikation oder in der Medienanalyse.

Der Text ist so unformatiert, da ich ihn vorher von HTML Code bereinigt habe, in der echten Darstellung hat er Umbrüche und eingebettete Videos. Die kursiv gesetzten Teile sind die, die in das Prompttemplate eingefügt wurden. Daraus werden diese 3 Varianten erzeugt. Da jeder Aufruf eines Sprachmodells einen zufälligen Faktor enthält wird ein Ergebnis selten zwei Mal geliefert:

Variante 1:

Der Bachelor of Arts Anglistik: British and American Studies Kernfach (fw) an der Universität Bielefeld bietet eine intensive Auseinandersetzung mit englischsprachiger Literatur und Medien. Von Shakespeare bis Rowling, von Großbritannien bis zu den USA – entdecke die Vielfalt der englischsprachigen Welt. Mit Schwerpunkten in British oder American Studies erwirbst du interkulturelle und interdisziplinäre Fähigkeiten, die in vielen Berufsfeldern gefragt sind, von Museen über PR bis zur Medienanalyse. Entdecke die Welt der englischsprachigen Kulturen und Geschichten an der Universität Bielefeld!

Variante 2:

„Tauche ein in die englischsprachige Literatur- und Medienwelt mit dem Bachelor of Arts Anglistik: British and American Studies Kernfach (fw) an der Universität Bielefeld. Erforsche Autoren wie Shakespeare, Rowling und Twain, spezialisiere dich auf British oder American Studies und erwerbe interkulturelle Kompetenzen für vielfältige Berufsfelder.“

Variante 3:

Mit dem Bachelor of Arts Anglistik: British and American Studies Kernfach tauchst du tief in die englischsprachige Literatur- und Medienwelt ein. Entdecke Autoren wie Shakespeare, Rowling und Twain, erweitere deine interkulturellen Fähigkeiten und wähle zwischen British oder American Studies als Schwerpunkt. Bereite dich auf vielfältige Berufsfelder vor, von der Erwachsenenbildung bis zu Public Relations.

Bewertung der Ergebnisse von 3.5

Eine Sache, die sofort auffällt, ist die Länge der Texte: Der erste umfasst 600 Zeichen, obwohl im Prompt maximal 160 vorgegeben waren. Auch die kürzeste Version ist immer noch mehr als 350 Zeichen lang. Merkwürdigerweise ist die 2. Variante von Hochkommata umgeben, etwas, dass immer mal wieder vorkommt. Generell wirken die Texte aber erstmal durchaus brauchbar.

Geschwindigkeit und Kosten für 3.5

Die Generierung hat mich ca. 30 Cent gekostet. Ich habe keinen genauen Tokencount ermittelt, aber insgesamt sind ca. 750 Abfragen erzeugt worden und dabei teilweise umfangreiche Textmengen mitgeschickt worden.

Gedauert hat der nicht parallelisierte Lauf ca. 25 Minuten. Ob das ist immer so ist, oder von der jeweiligen Last bei OpenAI abhängt, müsste man in weiteren Tests herausfinden. Mein API Key ist ein privater Key, also nicht an ein Enterprise Konto gebunden.

ChatGPT 4o

Dieses Modell bezeichnet OpenAI heute als our fastest and most affordable flagship model.

Ergebnisse für 4o

Hier wurde das gleiche Prompt verwendet wie zuvor, aber die Ergebnisse sind deutlich anders:

Variante 1:

Erleben Sie die englischsprachige Literatur- und Medienwelt im Bachelor „Anglistik: British and American Studies“ an der Uni Bielefeld. Spezialisieren Sie sich auf British oder American Studies und erwerben Sie interkulturelle Kompetenzen.

Variante 2:

Erlebe die Welt der englischsprachigen Literatur und Kultur im Bachelor of Arts Anglistik: British and American Studies an der Universität Bielefeld. Wähle deinen Schwerpunkt!

Variante 3:

Entdecken Sie britische und amerikanische Literatur und Kultur im Bachelor of Arts Anglistik. Vertiefen Sie Ihre Kenntnisse in Sprache, Literatur und Medien und erwerben Sie wertvolle interkulturelle Kompetenzen.

Bewertung der Ergebnisse von 4o

Diese ChatGPT Version hält sich viel besser an die vorgegebene Zeichenanzahl, diese Ausgaben dürften sich vom Umfang her problemlos direkt in die Webseiten einbauen lassen. Hier scheint auch der werbende Charakter, zu dem im Prompt aufgefordert wurde, viel stärker durchzukommen. Das müsste man für einen realen Einsatz vielleicht etwas zurückschrauben.

In diesem Beispiel wird je nach Ergebnis mal mit Du und mal mit Sie angeredet, auch in weiteren Fällen kommt das vor. Hier kann man vermutlich durch das Prompt nachsteuern.

Geschwindigkeit und Kosten für 4o

Die Generierung hat mich hier ca. 2 Euro gekostet. Gedauert hat der Lauf ca. 16 Minuten, also fast 9 Minuten weniger als das 3.5 Modell. Es wurde der gleiche API Key eingesetzt.

Fazit

Das erste größere Experiment mit einer Inhaltsgenerierung per Sprachmodell würde ich als durchaus erfolgreich einstufen. Allerdings müsste man wohl eher zu Version 4o greifen, um verlässlich innerhalb der vorgegebeben Zeichenlänge zu bleiben.

Die Programmierung dafür war innerhalb weniger Stunden erledigt, wobei die meiste Zeit auf das notwendige Lernen der neuen Bestandteile verwendet wurde, nicht weil der Code an sich so komplex ist. Eigentlich ist der Code kinderleicht und damit wirft man dann unglaublich mächtige Werkzeuge in der Cloud an, die verblüffende Dinge tun können.

Könnte man die so generierten Ergebnisse blind und ohne weitere menschliche Qualitätssicherung nutzen? Ich würde diese Frage bejahen, zumindest bei diesen Texten, die für die Besucher*innen unserer Webseite erstmal unsichtbar sind erscheint das Risiko gering und es sind mir keine groben Ausreißer aufgefallen.

Man könnte vielleicht auch die Auswahl des besten Ergebnisses wieder dem Sprachmodell überlassen, ein Prompt zu bauen mit der Frage, welche der drei Zusammenfassung am besten dem ursprünglichen Inhalt entspricht und vielleicht bestimmte Qualitätsvorgaben erfüllt wäre nicht schwer.

Wenn man sich erst einmal daran gewöhnt hat, dass diese Art der Programmierung keine reproduzierbaren und nicht immer zu 100% verlässlichen Ergebnisse bietet, dann kann man mit ihr Dinge in kürzester Zeit erledigen, die vorher für ein kleines Team kaum leistbar waren.

‚ChatGPT Is a Blurry JPEG of the Web’ – eine interessante Analogie zum Verständnis der großen Sprachmodelle

Aus der Folge 109 des Podcasts Auslegungssache mit dem Thema ‘Das KI DSGVO Dilemma’ habe ich einen interessanten Link gezogen: In The New Yorker erschien im Februar 2023 ein Artikel mit diesem Titel und er eröffnet eine etwas andere – und für mich sehr eingängige – Herangehensweise an das Verständnis der großen Sprachmodelle (Large Language Model / LLM):

Statt des Versuchs die komplexen Algorithmen auf eine verständliche Ebene zu bringen, die beim Training eines LLMs große Massen von Daten verarbeiten und in eine Form bringen, aus der sich die manchmal verblüffend intelligent wirkenden Ergebnisse dieser Werkzeuge produzieren lassen, wird hier der Vergleich mit verlustbehafteten Verfahren zur Datenkompression gezogen. Und daraus lässt sich gut ableiten

  • worauf die Antworten der LLMs beruhen,
  • warum sie halluzinieren,
  • in welchen Bereichen ihre Antworten mal mehr und mal (viel) weniger gut sind und
  • warum sich die Antworten von Konversation zu Konversation ändern

Ungenaue Abbildung von Informationen – meist merkt’s niemand

Vermutlich hat jede*r schon einmal erlebt, wie in einem Netflix-Video plötzlich große, unscharfe Artefakte auftauchen, weil die Bandbreite nicht mehr ausreichend ist. Oder wie der Versuch, in einem digitalen Foto kleine Details zu finden, in einer schwammigen Masse von Pixeln endet. Insbesondere wenn das Datenvolumen des Fotos reduziert wurde, was Messenger Apps wie WhatsApp gerne tun, um Speicherplatz zu sparen.

In beiden Fällen enthalten die digitalen Dateien nicht mehr alle Informationen, die bei der ursprünglichen Aufnahme einmal vorhanden waren. Durch geschicktes Ausnutzen der Eigenschaften des menschlichen Sehapparats werden viele Informationen verworfen, ohne dass es einem (meist) beim Betrachten auffällt. In diesem Beispiel mit der Großen Welle von Kanagawa sind zwischen den ersten beiden Bildvarianten kaum Unterschiede auszumachen, auch wenn das Datenvolumen nur noch ca. ein Viertel beträgt:

Erst wenn doch zu viele Informationen bei der Datenkompression verworfen wurden – wie hier im dritten Bild – werden die Lücken erkennbar, die das menschliche Gehirn sonst gerne ersetzt mit Informationen, die gar nicht da sind. Zu welchen umfassenden Ergänzungen oder gar Halluzinationen der Sehapparat dabei fähig ist, zeigt sich zum Beispiel bei Erkrankungen wie dem Charles-Bonnet-Syndrom.

Auch LLMs verwerfen Informationen

Bei der Erstellung der großen Sprachmodelle geschieht etwas ähnliches: Auch wenn es Modelle gibt, die mit Billionen – also tausenden von Milliarden – Parametern hantieren, bedeutet dies nicht, dass das ganze Weltwissen hier wortwörtlich abgespeichert wird. Das kann man grob selbst abschätzen:

Es gibt Datensammlungen wie FineWeb, die versprechen den englischsprachigen Inhalt des Internets verfügbar zu machen. Der vollständige Satz an Daten umfasst ca. 15 Billionen Tokens, was vermutlich einem Datenvolumen von ca. 16 Terabyte entspricht. Und das ist nur der englische Teil des Internets.

Die austrainierten Modelle, die man sich herunterladen kann, sind aber deutlich kleiner, normalerweise im Bereich von Gigabyte, also einem Faktor von bis zu 1.000 kleiner.

Dieser grobe Vergleich hinkt natürlich etwas, weder wissen wir genau, was alles in das Training einzelner Modelle eingegangen ist, noch lässt sich den Modellen jede erdenkliche Frage stellen und das Ergebnis genau überprüfen. Trotzdem zeigt dies schon: Ein LLM kann nicht in der Lage sein, jeden Satz, den man ihm beim Training gezeigt hat, 1-zu-1 wiederzugeben. Das ist ein wesentlicher Unterschied zu einer klassischen Suchmaschine wie Google, die zumindest heute noch weitgehend Textschnipsel aus den entsprechenden Quellen wiedergibt.

Woher kommen dann die geschliffenen Texte und selbstsicheren Antworten?

Da ein Sprachmodell gar nicht mehr alles ‚weiß‘, was einmal in seinem Training eine Rolle spielte, und man es ja auch nach Dingen fragen kann, die garantiert nie in den Trainingsdaten enthalten waren, stellt sich die Frage wie es dann trotzdem antworten kann: Hier findet eine Synthese oder Interpolation auf Basis der reduzierten, im Modell noch vorliegenden Daten statt. Diese Synthese ist eine der großen Stärken dieser Sprachmodelle, wenn es darum geht überraschende Kreationen wie eine Verordnung für das korrekte Binden von Schnürsenkeln zu entwerfen:

Dem Syntheseprozess ist es egal, ob die Fragestellung Sachverhalte zusammenbringt, die in den Trainingsdaten niemals so vorkamen. Es werden einfach die entsprechenden Datenpunkte zusammengeführt und dann los gerechnet. Und dies erzeugt den verblüffenden, menschlicher Kreativität scheinbar nahe kommenden Effekt der Sprachmodelle.

Weniger gut ist dieses Verfahren aber, wenn es um die sachlich korrekte Wiedergabe von Fakten geht:

Ungenaue Wiedergabe erzeugt den Eindruck von Verständnis…oder Blödheit

In dem Artikel wird hier ein interessanter Vergleich mit dem menschlichen Lernprozess gezogen: Wenn uns jemand einen Satz aus einem Lehrbuch – oder der Wikipedia – 1-zu-1 aus dem Gedächtnis vortragen kann, dann halten wir das eher nicht für ein Beispiel von Intelligenz. Höchstens von gutem Gedächtnis. Die Fähigkeit, etwas zu paraphrasieren, ist oft der Kern der Herausforderung bei schriftlichen Prüfungen im Bildungssystem und die 1-zu-1 Kopie ein zu kennzeichnendes Zitat. Oder ein Plagiat, wenn es nicht gekennzeichnet wird. Wer etwas korrekt paraphrasieren kann, der*dem billigen wir zu, einen Sachverhalt verstanden zu haben und anwenden zu können.

Das dem Paraphrasieren zu Grunde liegende Verständnis eines Sachverhalts ist aber auch ein Weg, um diesen trotz einer verlustbehafteten Kompression vollständig wiedergeben zu können. Ein einfaches Beispiel sind hier die Grundrechenarten: Hat man sie verstanden, so kann man jede beliebige Kombination von Zahlen und Rechenregeln korrekt verarbeiten, ohne dass man die (unendlich große) Menge aller möglichen Kombinationen erlernen bzw. abspeichern muss. Eine kurze, verstandene Rechenregel ersetzt hier also riesige Tabellen mit konkreten Rechenergebnissen.

Bei ChatGPT zeigt sich der Effekt der verlustbehafteten Kompression dann aber nicht als Quelle eines daraus entstandenen Verstehens, sondern als schlichter Unsinn:

Die Maschinerie hat hier also nicht den inneren Zusammenhang zwischen Zahlen und Rechenregeln gelernt, sondern gibt letztlich Vermutungen über das mögliche Ergebnis ab, auf der Grundlage von Rechenbeispielen, die im Internet irgendwo zu finden waren. Und gerät bei der mittleren Frage auf Abwege. Was mit dem Wissen, das diese Antworten aus beim Training verwendeten Texten synthetisiert wurden, direkt verständlich wird.

Die (Nach)Frage verändert die Antwort

Ein weiterer, bei der Nutzung von Sprachmodellen zunächst überraschender Effekt ist deren ‚Fähigkeit‘ sich zu korrigieren. Das sieht man an diesem einfachen Beispiel, bei dem ich ChatGPT nach meinem Geburtstag frage:

Hier sieht man zum einen, dass ChatGPT versucht Internetquellen mit Bezug zu der Fragestellung einzubeziehen, also kontextbezogene Informationen zu ergänzen, die beim ursprünglichen Training des Sprachmodells nicht verwendet wurden. Das ist schon eine Erweiterung der grundlegenden Arbeitsweise eines Sprachmodells.

Die erste Antwort ist gewohnt selbstsicher und gibt eine präzise Antwort, auch wenn sie falsch ist, weder Monat noch Tag sind passend. Auf den vorsichtigen Hinweis hin, dass das vielleicht nicht korrekt ist, kommt eine Richtigstellung, die aber auf dem Level eines einfachen Sprachautomatens wie der uralten ELIZA bleibt.

Warum scheint ChatGPT einen Fehler ‚einzugestehen‘? Weil bei der zweiten Antwort die vorherige Konversation berücksichtigt und zur Synthese der Antwort verwendet wird. Hier beeinflusst also der Verlauf der Konversation das Ergebnis.

Unterschiedliche Antworten auf die gleiche Frage

Starte ich eine komplett neue Konversation mit ChatGPT kommt auf die Frage wieder die ursprüngliche, selbstsichere Antwort…nur habe ich dieses Mal am 1. Oktober Geburtstag. Der Grund für die andere – falsche – Antwort ist, dass bei der Synthese der Antworten ein zufälliger Faktor in das Sprachmodell gegeben wird, so dass man selten eine Antwort zweimal erhält.

In Midjourney, der KI zur Generierung von Bildern, erhält man als Reaktion auf eine Eingabe (Prompt) immer gleich 4 Varianten:

Hier kann man sich dann die Variation auswählen, mit der man weiterarbeitet und auf deren Basis man neue Varianten erstellen lässt. Alles, ohne dass man das ursprüngliche Prompt anpassen muss. In ChatGPT gibt es eine Option zur erneuten Generierung einer Antwort, die einen analogen Effekt hat.

Die Konversation nutzen, um die Maschine aufzuschlauen

Der Effekt, dass bei der Synthese einer Antwort die vorherige Konversation berücksichtigt wird, kann verwendet werden um der Maschine – zumindest kurzzeitig – etwas beizubringen:

Dieses ‚Wissen‘ besteht aber nur in dieser speziellen Konversation und steht nicht in der nächsten Konversation zur Verfügung.

Trotzdem kann es für manche Aufgabenstellungen ausreichen um aus Sicht der Nutzer*innen ein an die eigene Situation angepasstes Chaterlebnis zu kreieren, selbst wenn das zu Grunde liegende Sprachmodell gar keine entsprechende Spezialisierung hat. Dazu muss das Chatsystem nur – unsichtbar für die Nutzer*innen – eine entsprechende Vorkonversation führen und das Sprachmodell dadurch in einen entsprechenden Zustand versetzen, auf dem die Nutzer*innen dann ihre eigenen Fragen stellen.

Fazit

Wenn man sich folgende Aspekte von LLMs vergegenwärtigt, ist eine Einschätzung des Verhaltens und der Fähigkeiten vermutlich einfacher möglich, als über den Versuch die tief-technischen Details dieser Systeme zu verstehen:

  • Ein Sprachmodell speichert das Wissen, welches für sein Training verwendet wurde, nicht 1-zu-1 ab. Dies ist ein wesentlicher Unterschied zu Suchmaschinen
  • Zumindest heute können Sprachmodelle daraus keine allgemeinen Regeln wie zum Beispiel die Grundrechenarten destillieren und zuverlässig anwenden
  • Antworten auf Fragen werden aus diesem verdichteten Wissen synthetisiert, die Antworten sind damit grundsätzlich nicht faktentreu
  • Die Halluzination, also die Generierung von unwahren Aussagen, ist ein konzeptioneller Bestandteil eines Sprachmodells und kein Fehler, der sich komplett ausmerzen ließe
  • Die Synthese der Antworten enthält einen zufälligen Faktor, und ist damit meist nicht reproduzierbar
  • Die Antworten werden durch vorherige Konversationen beeinflusst, auf diese Weise lässt sich kurzzeitig zusätzliches Wissen in begrenztem Umfang einspeisen

Einschränkend muss man dazu sagen, dass die Entwicklung der Sprachmodelle stürmisch ist und die verschiedenen Anbieter diese Eigenschaften natürlich genau kennen. Dementsprechend begegnet man heute oft nicht mehr reinen Sprachmodellen, sondern um weitere Funktionen ergänzte Chatbots, die einige dieser Eigenschaften abmildern.

Leseempfehlung: ‚Die Hyperion-Gesänge‘ von Dan Simmons

Urlaubszeit ist Lesezeit bei mir, wann hat man sonst Zeit dafür? Dieses Mal kam der Tipp dazu aus dem Security Now Podcast, den ich hier sonst eher wegen seines eigentlichen Themas ‚IT Sicherheit‘ erwähne, der aber immer mal wieder eine gute Quelle für Science Fiction Literatur ist.

Bei dieser Empfehlung merkt man das Alter der beiden Hosts, denn der erste der beiden Romane, um die er hier geht, wurde im Jahr 1989 veröffentlicht: Hyperion von Dan Simmons. Der folgende Roman, der die Handlung abschließt, ist Der Sturz von Hyperion und erschien ein Jahr darauf. Wer meiner Empfehlung folgt, sollte gleich zu Die Hyperion-Gesänge greifen, ein 2002 erschienener Sammelband mit beiden Teilen.

Gut gealtert

Bei Science Fiction ist es so eine Sache mit dem Altern…manche Romane lesen sich Jahrzehnte nach dem Erscheinen eher albern oder gar peinlich, weil die Autor*innen sich die Zukunft in Details ausgemalt haben, die von der Realität überholt oder aus heutiger Sicht einfach kurzsichtig erscheinen.

Aber Dan Simmons hat es geschafft eine Zukunftsvision zu beschreiben, die sehr ferne Elemente enthält, wie eine verzögerungslose Reisemöglichkeit zwischen den Sternen. Aber auch aus heutiger Sicht bereits (fast) gegenwärtige Elemente, wie ein allgegenwärtiges Datennetz, in dem sich alle Menschen nahezu permanent aufhalten, und dessen Abwesenheit zu Entzugserscheinung und Hilflosigkeit führt. Als er das geschrieben hat gab es das Internet zwar schon in technischer Hinsicht, aber es war nur wenigen Menschen bekannt und die Aussicht, jeder Mensch könnte ein Gerät bei sich führen, welches jederzeit Zugriff auf diese Sphäre ermöglichen, eine Vision, die vielen vermutlich ferner schien als die fliegenden Autos, die wir eigentlich alle schon haben sollten.

Aber auch hier ist die Vision so geschrieben, dass man sich nicht daran stört, wenn von Komlogs (im Original comlogs) die Rede ist und nicht von iPhones, und es betont nur, welche menschlichen Eigenschaften über die Zeit hinweg vielleicht unverändert bleiben werden.

Bestimmte Begriffe wie SimStim oder das schwarze Eis, welches zur Charakterisierung der Datenwelt verwendet wird, deuten auf das Entstehen in den 80ern hin, zumindest kenne ich sie aus den Neuromancer-Romanen, die ein paar Jahres zuvor erschienen und danach sind sie mir nicht mehr begegnet. Aber das wirkt nicht antiquiert, es sind einfach nur Begriffe unter vielen anderen spannenden Wortschöpfungen.

Krieg, Religion, Gier und Altruismus

Die Geschichte hat einige der ‚üblichen‘ Zutaten einer Space Opera: Es gibt Raumschlachten, viele verschiedene Welten, an der Zeit wird herumgespielt, die Menschheit breitet sich kolonisierend über das All aus und benimmt sich dabei nicht besser als die europäischen Eroberer, die weite Teile der Erde unterworfen und ausgebeutet haben, die Sinnfrage ist immer noch nicht abschließend beantwortet.

Allerdings ist dies nur der Hintergrund, vor dem sich die verschiedenen Handlungsstränge entfalten und die ungefähr 10 Individuen bewegen, denen die Geschichte folgt. Und deren individuelle Motivationen anders sind und denen man, auch wenn sie nicht durchweg Sympathieträger sind, durch die mehr als 1.000 Seiten gerne folgt.

Und für mich war am Ende beeindruckend und schön, wie die ganzen Fäden und absurden Einfälle – ich nenne hier nur die merkwürdigen Parasiten – zusammengeführt werden und ein homogenes Gebilde ergeben.

Aktuell: Die Entwicklung der KI

Ein wesentlicher Aspekt der Romane ist aber auch das Entstehen von KIs und deren irgendwann zur Menschheit konkurrierende Entwicklung. Das hier gezeichnete Bild ist grob genug, um heute nicht lächerlich zu wirken, aber die Ideen für so eine Entwicklung lassen sich auch in den durch das Erscheinen von ChatGPT befeuerten Diskussionen wiederfinden und wirken daher weiterhin aktuell.

Und auch das, was ich als eine Kernfrage der Romane sehen würde: Inwieweit sollte man Produkten und ‚Geschenken‘ von KI Systemen vertrauen, die man nicht mehr versteht und deren Motivation damit ebenso wenig?

Bilder aus der KI

Die drei hier enthaltenen Bilder sind dabei auch aus einer KI gekommen. Mit Hilfe von Midjourney habe ich versucht eine Impression zu erstellen, welche bei Leser*innen der Romane hoffentlich schnell eine Assoziation auslösen wird.

Jetbrains AI Assistent – kurz ausprobiert

Wir setzen in der Programmierung der BIS Anwendungen seit einiger Zeit auf Intellij, die Java IDE von Jetbrains, und zwar in der Ultimate Edition. Der Schritt weg von Eclipse – damals schon mit der Spring Tool Suite – war zunächst nicht ganz leicht, aber im Endeffekt sind die Hilfsfunktionen dieses Produkts so leistungsfähig, dass sich der Umstieg gelohnt und die Kosten in Form von besserer Produktqualität und Entwicklungsgeschwindigkeit aus meiner Erfahrung voll zu rechtfertigen sind. Auch die Tatsache, dass Android Studio, welches wir für unsere App verwenden, auf Intellij basiert und somit der Wechsel zwischen den IDEs leichter fällt, ist hier ein Argument.

Was ist der AI Assistent

Seit ein paar Wochen vermarktet Jetbrains nun seinen auf OpenAI Technologien basierenden AI Assistenten und verspricht hier durch die direkte Integration in die IDE – und deren schon vorher vorhandenes, tiefes Verständnis des Programmcodes – eine bessere Leistung und nahtlosere Integration, als sie mit anderen vergleichbaren Tools zu erreichen sei.

Hier ein paar Erfahrungen dazu, wie sich das Tool in einem komplett neu gegründeten Java 22 Projekt anfühlt. Da das hier beschriebene Verhalten vermutlich schon wieder veraltet ist kann man das aber nur als eine momentane Bestandsaufnahme sehen:

Automatische Codevorschläge nur aus der Methodensignatur

Ein erster Effekt ist dieser: Es reicht aus – jedenfalls oft – eine Methodensignatur zu schreiben und der Assistent macht einen Vorschlag. Zum Beispiel sorgt die Signatur

public Set<Fachabschluss> fachAbschluesse()

für diesen völlig korrekten Codevorschlag:

Aufforderung zur Methodenimplementierung per Prompt

Nicht immer klappt es mit dem Automatismus, warum ist mir nicht klar geworden. Aber in so einem Fall kann man per Prompt zur Implementierung auffordern:

Allerdings zeigt sich hier die Unberechenbarkeit der heutigen KI Lösungen: Im ersten Anlauf wurde direkt der passende Code erzeugt. Als ich das Ganze noch einmal für die Screenshots gemacht habe aber nicht und erst ein erneutes Prompt brachte das gewünschte Ergebnis:

Hier wurde also zuerst eine sinnfreie Implementierung vorgeschlagen, die einfach nur null liefert. Es kann natürlich sein, dass der Assistent hier gemerkt hat, dass ich den vorherigen Vorschlag verworfen hatte und daher so ‚reagiert‘. Trotzdem wirkt es etwas skurril und unberechenbar, aber durchaus im Einklang mit den Erfahrungen vom ChatGPT oder Google Bard (inzwischen abgelöst durch Gemini), die fehlerhafte Ergebnisse liefern und dann auf Hinweis auf die Fehler etwas besseres nachliefern.

Überhaupt das Thema Fehler:

Verwendung von nicht existierenden Methoden

Eine Sache, die scheinbar regelmäßig vorkommt, ist die Verwendung von nicht existierenden Codebestandteilen im Vorschlag:

Die richtige Lösung wäre es hier gewesen noch eine Ebene tiefer zu gehen und aus den Modulabschluss-Objekten die enthaltenen Fachabschluss-Objekte zu holen. Und nicht über eine nicht vorhandene Methode eine Filterung durchzuführen.

Konsistenz: Unterschiedliche Lösungen für gleiche Aufgaben

Auch wenn es nicht falsch ist gibt es ein Verhalten, welche mein Stilempfinden stört: Der Assistent erzeugt für gleiche Aufgaben unterschiedlichen Code. Das sind teilweise nur Nuancen, aber sie machen den Code inhomogen und damit schwerer verständlich.

Code Variante 1

    public Set<Fachabschluss> fachAbschluesse() {
        return module.stream()
                .flatMap(mip -> mip.fachAbschluesse().stream())
                .collect(Collectors.toSet());
    }

Code Variante 2

    public Set<Fachabschluss> fachAbschluesse() {
        return profile.stream()
                .map(Profil::fachAbschluesse)
                .flatMap(Set::stream)
                .collect(Collectors.toSet());
    }

Beide Varianten führen zum gleichen Ergebnis, aber es zeigt die Zufälligkeit der von der KI generierten Codes.

Nicht ganz up to date

Das generelle Problem der heutigen LLMs, die prinzipbedingt nicht tagesaktuell sein können, zeigt sich auch hier an manchen Stellen, etwa beim Versuch die Java Version in der pom.xml des maven-Projekts über den Assistenten auf Java 22 zu erhöhen:

Das Java 22 JDK wurde ca. 10 Tage vor dem Schreiben dieses Posts veröffentlicht. Allerdings scheint das ‚Wissen‘ des Assistenten noch deutlich älter zu sein, was man aus der Behauptung schließen kann, die letzte stabile Java Version sei 17. Selbst wenn ’stabile Version‘ die LTS Releases meint, so wäre das Java 21 und das kam am 19. September 2023 raus.

Grundsätzlich führt einen der Assistent hier aber auf die richtige Spur und sagt, was man machen muss. Und das ohne die IDE verlassen zu müssen. In vielen Anwendungsfällen dürfte es nicht stören, wenn der Assistent nicht die allerletzten Sprachversionen kennt. Allerdings hatte ich bei anderen Assistenten auch schon Probleme damit, dass Versionen von Open Source Projekten eingebunden wurden, die entweder schon nicht mehr existierten, oder die wegen lange bekannter Sicherheitsprobleme bereits nicht mehr zur Nutzung empfohlen wurden.

Fazit

Durch das Entstehen von KI Werkzeugen, die Programmcodes in hoher Qualität erstellen können, wird auch das Berufsbild der Softwareentwickler*innen schon jetzt sehr in Frage gestellt. Und was ein Tool wie der Jetbrains Assistent zeigt: Für bestimmte Routinen muss man nicht mehr selbst programmieren können. Oder nur noch in Teilen.

Allerdings ist mein Einsatz des Werkzeugs vermutlich noch zu sehr vom Denken als klassischer Softwareentwickler geprägt, der es gewohnt ist die Struktur seiner Software vorzugeben. Daher habe ich der KI nur etwas Zuarbeit überlassen. Das eigentliche Versprechen ist es aber, dass man eigentlich gar nicht mehr direkt Software entwickeln können muss, sondern ’nur‘ seine Anforderungen und Ziele definiert und der Rest kommt automatisch. Vielleicht noch mit etwas ‚low code‘.

Also so, wie ich beim Generieren von Fotos per Midjourney – siehe das Bild der Roboterhände am Anfang – vorgehe, ohne irgendeine besondere Kenntnis von Malerei oder Graphikdesign zu haben. Aber um so an die Softwareentwicklung herangehen zu können müsste ich erst einmal viel entlernen, was ich mir in Jahrzehnten erarbeitet habe. Mal sehen, ob mir das beim nächsten Versuch gelingt.