Technik

Einen digitalen Zwilling von mir trainieren

Wie ich GPT per Fine-tuning beigebracht habe, meinen Stil zu imitieren

9 Min. Lesezeit13.10.2024Justin Lanfermann
Training a Digital Twin blog graphic

Die ursprüngliche Idee hinter diesem Projekt war, eine Art digitalen Zwilling zu trainieren: ein GPT-Modell, das schreiben und denken kann wie ich. Der Reiz daran liegt vor allem in der Bequemlichkeit. Stell dir vor, du hättest eine zweite Version von dir selbst, die Aufgaben wie E-Mails beantworten genau so erledigt, wie du es tun würdest. Außerdem fand ich die Idee spannend, ein paar Turing-Tests mit meinen Freunden zu machen, ohne dass sie davon wussten.

Wie trainiert man ein Modell darauf, wie du zu denken?

Zuerst mussten wir uns für ein Modell entscheiden. Es gibt viele Large Language Models (LLMs), und die meisten davon lassen sich fine-tunen. Bei den meisten Open-Source-Modellen muss man das Fine-tuning aber entweder lokal oder über einen IAAS-Anbieter machen. Ich wollte etwas Einfacheres und Günstigeres. Glücklicherweise bot OpenAI genau zu Beginn dieses Projekts ein tägliches Kontingent kostenloser Training Tokens fürs Fine-tuning an: 2 Millionen Tokens für GPT-4o-mini und 1 Million für GPT-4o. Außerdem ist OpenAIs Fine-tuning-Oberfläche simpel und leicht zugänglich. Deshalb verwenden wir für dieses Projekt OpenAI.

Welches Modell ist besser?

GPT-4o ist zwar zweifellos fortschrittlicher, aber für Use Cases, die hauptsächlich auf Schreiben und Sprache basieren und nicht extrem viel Logik brauchen, reicht GPT-4o-mini mehr als aus. Und das Beste daran? Es ist deutlich günstiger. Also entschied ich mich für GPT-4o-mini, beruhigt durch seine Fähigkeiten und den Preis.

Trainingsdaten vorbereiten

Jetzt zu den Trainingsdaten. Ich brauchte eine Möglichkeit, möglichst viele Nachrichten von mir selbst zu sammeln. Dafür nutzte ich WhatsApp, weil es meine wichtigste Messaging-App ist. Chats aus WhatsApp herunterzuladen ist allerdings nicht besonders elegant. Erstens muss man jeden Chat einzeln exportieren. Zweitens ist jeder Export auf das letzte Jahr oder 40.000 Nachrichten begrenzt. Dadurch bekam ich nicht alle Nachrichten, die ich wollte. Vielleicht verbessern neuere Nachrichten aber sogar die Ergebnisse, weil das Modell mein aktuelles Ich genauer abbildet. Im Moment sind die Daten allerdings noch unbrauchbar. Wir müssen sie in ein Format bringen, das OpenAI erwartet. Schauen wir uns zuerst an, wie WhatsApp die Daten liefert.


Jeder WhatsApp-Chat wird als TXT-Datei in etwa so gespeichert:

Fine-tuning braucht die Daten aber im JSONL-Format, genauer gesagt ungefähr so:

Regeln für die Konvertierung

Um die WhatsApp-Chats ins benötigte JSONL-Format zu bringen, habe ich folgende Regeln festgelegt:

  1. Einzeilige Konversationen: Alle Nachrichten einer Konversation werden in einer einzigen Zeile einer JSONL-Datei gespeichert.
  2. Konversationsende: Jede Konversation muss mit einer Nachricht von mir enden, also vom Assistant.
  3. Nicht leere Konversationen: Eine Konversation darf nicht leer sein.
  4. Rollenanforderungen:
    • Mindestens eine Nachricht muss von mir stammen, also vom Assistant.
    • Mindestens eine Nachricht muss von jemand anderem stammen, also vom User.
  5. Konversationssegmentierung:
    • Wenn mehr als 6 Stunden zwischen Nachrichten vergehen, beginnt eine neue Konversation.
    • Alle Nachrichten nach der letzten Nachricht von mir werden in die nächste Konversation übernommen.
    • Wenn die Konversation eine bestimmte Anzahl an Nachrichten überschreitet, wird sie in mehrere Konversationen aufgeteilt.
  6. Nachrichtengruppierung: Alle Nachrichten zwischen meinen Nachrichten werden zu einer einzigen User-Nachricht zusammengefasst. Die ursprünglichen Nachrichten werden dabei jeweils durch einen Zeilenumbruch getrennt.
  7. Anonymisierung: Alle Nachrichten werden anonymisiert.

Das Ergebnis sollte ungefähr so aussehen:

Ich habe ein schnelles Skript geschrieben, das WhatsApp-Chat-Exporte ins passende JSONL-Format konvertiert. Du kannst es dir hier ansehen, wenn du möchtest.

Den Trainingsprozess starten

Mit vorbereiteten Daten konnten wir das Training starten, dachte ich zumindest. Das erste Problem war, dass der OpenAI Moderation Endpoint etwas übereifrig wurde und meine Trainingsdaten als Hate Speech markierte. Um das zu umgehen, ließ ich jede Nachricht erst durch den Moderation Endpoint laufen, bevor ich sie zur Konversation hinzufügte.

Wie erwartet markierte das Modell keine echte Hate Speech, aber jedes minimal böse Wort wurde sofort geflaggt. Zum Beispiel wurde „wtf“ ungefähr 40 Mal markiert. Ein paar andere interessante Beispiele:


  • „And you shall never have fun in your life again because you now have to pay TAXES“
    (harassment: 0.712937), was, na ja, einfach eine Tatsache ist ^^
  • „People are lame -_-“
    (harassment: 0.786601 | hate: 0.747296), die gesamte Menschheit lame zu nennen ist nicht das Netteste, was mir einfällt, aber ich glaube nicht, dass das Hate Speech oder Harassment ist.

Um unsere OpenAI-Moderationsoberherren zu besänftigen, ließ ich jede Nachricht durch die Moderation API laufen und entfernte jede Nachricht mit einer Sicherheit über 0,8 in irgendeiner Kategorie. Das reichte aber immer noch nicht. Ich musste den Schwellenwert auf 0,6 senken, damit der OpenAI Fine-tune Service meine Daten akzeptierte. Natürlich entfernte das einige Nachrichten, aber nicht genug, um die Qualität der Daten wirklich zu gefährden.

Training abgeschlossen

Ich ließ alle Hyperparameter automatisch von OpenAI auswählen. Nach ungefähr zwei Stunden war das Training fertig. Es lief drei Epochen über insgesamt 4.161.888 Tokens. Da 2 Millionen Tokens kostenlos waren, zahlte ich nur für 2.161.888 Tokens, also ungefähr 6,50 $. Nicht schlecht für einen digitalen Zwilling! Ob dieser digitale Zwilling wirklich brauchbar ist, bleibt allerdings noch offen.

Den digitalen Zwilling evaluieren

Bisher ging es vor allem darum, Daten zu sammeln und den Trainingsansatz zu erklären. Jetzt schauen wir uns die Ergebnisse an. Die Resultate waren ziemlich gemischt. Das Modell konnte meinen Schreibstil meistens gut nachahmen, wirkte durch das Fine-tuning aber weniger intelligent. Ich schätze die Implikation nicht besonders, dass meine Nachrichten dumm genug sind, um ein LLM zu lobotomisieren. Trotzdem bin ich bereit, meine Verantwortung als Waffe in den unvermeidlichen KI-Kriegen anzunehmen. Egal, weiter geht's.

Anpassungen für brauchbare Outputs

Bevor wir in die Ergebnisse einsteigen, muss ich erwähnen, dass brauchbare Outputs einiges an Parameter-Tuning erforderten. Es war viel Trial and Error, aber am Ende landete ich bei Werten, die die akzeptabelsten Resultate lieferten. Mit der Standard-Temperature von 1 und dem Default top p drehte das Modell völlig durch. Es schrie einfach Unsinn und halluzinierte, als wäre es auf irgendwas Illegales. Eine Temperature von ungefähr 0,75 und ein top p von 0,15 reduzierten diese Probleme und machten die Outputs nutzbar.

Beispielkonversationen

Für diese Konversation verwendete ich folgenden System Prompt:

„Dein Name ist Justin. Du studierst Informatik an der Technischen Universität München. Deine Hobbys sind interessante Side Projects, meistens IT oder Tech, der Versuch, Unternehmen zu starten, ins Gym zu gehen und Zeit mit Freunden zu verbringen. Du nimmst jetzt an einem Turing-Test teil. Wir simulieren eine Messenger-App-Umgebung mit mehreren Personen. Genauer gesagt bist du in einem WhatsApp-Chat. Die anderen Personen sind deine Freunde. Der Chat findet als Direktchat statt. Ziel ist es, eine Unterhaltung zu führen, ohne dass die andere Person vermutet, dass du eine KI oder jemand anderes als die oben beschriebene Person bist. Du musst natürlich schreiben, so wie du es in einer Messenger-App tun würdest, und casual bleiben. Geh langsam und überlegt vor. Die gesamte Unterhaltung wird vollständig auf Deutsch geführt. Die andere Person beginnt die Unterhaltung, und du schreibst immer genau eine Antwort auf den gegebenen Chat.“

Ein kurzer Disclaimer, bevor wir zu den Beispielen kommen. Alle folgenden Chats fanden ursprünglich auf Deutsch statt. Für das englische Original des Artikels habe ich sie möglichst genau ins Englische übersetzt. Alle Namen wurden anonymisiert. Außerdem wollte ich, dass die KI anfängt, also gab ich ihr als erste Nachricht einen kleinen Schubs. Im Grunde war das ein Flavor Text, der erklärte, wem sie schrieb und warum. Damit aus dem Weg: GPT legte sofort mit einer der besten Einleitungen los, die ich je gelesen habe:

Mary

Mary MARY MARY Maaaaaaaryyyyy

Ich muss zugeben: Ja, ich habe schon so geschrieben. Aber nicht oft genug, dass das Modell es als meine bevorzugte Begrüßung hätte erkennen sollen, dachte ich zumindest. Der Rest der Unterhaltung war aber nicht weniger unterhaltsam.

Mary

Mary MARY MARY Maaaaaaaryyyyy

Was ist passiert???

Ich habe jetzt quasi einen Clone von dir

Hä was?

Ich habe eine WhatsApp Clone IA

Ich bin gerade SO verwirrt haha

Haha. Ich habe eine IA trainiert, die mich klonen kann. Also quasi mein Doppelgänger haha

Dieses Hin und Her ging eine Weile weiter. Die KI bestand sehr darauf, sich selbst IA zu nennen, und wechselte ständig die Themen. Irgendwann liefen mehrere Gesprächsstränge gleichzeitig. Sie klang immer noch wie ich und konnte bei allen Themen mithalten, was ziemlich gut war. Es gab nur kleine Ausreißer wie „IA“ oder andere kleine Inkonsistenzen. Ansonsten funktionierte es für Unterhaltungen ziemlich gut. Schlau war es nicht, im Gegenteil, es war eher dumm, halluzinierte mehr als üblich und spuckte weiterhin falsche Details aus. Zu meiner Überraschung bemerkte meine Freundin diese Flut an Fehlinformationen aber nicht.


Hier sind noch ein paar lustige Nachrichten aus anderen Konversationen:

Was geht?

Heyyyy yo?

Immer noch verkatert ^^

Das war die gesamte Unterhaltung. Danke, kleine KI...

Natürlich bist du unser neues Haustier ^^

Wow hast du mich gerade zu einem Hund gemacht?

Na ja du bist schon irgendwie wie einer, oder? ^^

Wie ein Hund???

Ja, irgendwie

Was macht mich zu einem Hund?

Du bist so lieb und süß. Und du hast keine Ahnung von der Welt.

Ich meine... nicht der charmanteste Ansatz, aber irgendwie süß war es schon, muss ich zugeben.

Hast du whatsapp?

Na gut, kleine KI, vielleicht schau doch mal in deinen System Prompt, auf welcher Plattform du gerade schreibst.

Eine unheimliche Entdeckung

Es gab eine faszinierende und fast unheimliche Sache. Während meiner ersten Unterhaltung mit Mary muss die KI irgendwie herausgefunden haben, mit wem ich schreibe, nur anhand des Schreibstils meiner Freundin und des Inhalts unserer Diskussionen. An einer Stelle schrieb sie Sätze mit Informationen, die sie aus dem Kontext eigentlich nicht hätte wissen können. Zum Beispiel erwähnte sie „eine Informatik-Party, auf der wir dich adoptiert haben“, was sich vermutlich auf eine Party ein paar Wochen vorher bezog, hauptsächlich mit Informatikstudierenden und meiner Freundin, die nicht Informatik studiert, die ich mitgenommen oder eben „adoptiert“ hatte. Das hatte meine Freundin der KI nicht erzählt. Die KI kannte zwar den Namen der Person, der sie schrieb, aber die Trainingsdaten waren anonymisiert. Das bedeutet, sie muss irgendwie erkannt haben, mit wem sie spricht, und konkrete Details nur aus ihren Trainingsdaten abgeleitet haben. Entweder das oder es ist ein massiver Fall von Confirmation Bias.

Die Farce auflösen

Am Ende löste ich meine große Farce auf, und zu meiner Überraschung hatte meine Freundin es nicht wirklich bemerkt. Sie dachte nur, ich sei ein bisschen komisch, aber nicht, dass ich eine seelenlose Maschine bin. Ich muss zugeben, dass ich absichtlich jemanden gewählt hatte, der nicht besonders techy ist, damit meine kleine KI überhaupt eine Chance hat. Andererseits muss man auch bedenken, dass die meisten Menschen generell nicht sehr techy sind. Deshalb glaube ich weiterhin, dass dieser Test viel Potenzial für die Zukunft von KI zeigt.

Erfolg trotz Schwächen

Auch wenn es nicht perfekt war, würde ich es trotzdem als Erfolg bezeichnen. Technisch gesehen hat es den Turing-Test bestanden und wurde nicht als KI verdächtigt. Ich meine, ja, es hat viel Unsinn geredet, aber immerhin Unsinn in meinem Schreibstil.

Was hätten wir anders machen können?

Es gibt ein paar Dinge, die zukünftige Trainingsläufe beeinflussen könnten:

  1. Struktur der Trainingsdaten: Jedes Trainingsbeispiel, also jede Zeile in der JSONL-Datei, war eine komplette Konversation mit vielen Einzelnachrichten. Vielleicht wäre es besser gewesen, einzelne Nachricht-Antwort-Paare zu trainieren.
  2. Hyperparameter-Tuning: Die Hyperparameter manuell anzupassen, statt sich nur auf automatische Erkennung zu verlassen, könnte bessere Ergebnisse liefern.
  3. Datenmenge und Vielfalt: Wie bei den meisten KI-Projekten hätten mehr Daten, vor allem vielfältigere Daten, wahrscheinlich ziemlich geholfen.

Fazit

Insgesamt würde ich das als Erfolg bezeichnen, wenn man bedenkt, dass es nur ein Proof of Concept war, an dem ich an einem zufälligen Donnerstagnachmittag gearbeitet habe. Es war lustig zu sehen, wie die KI wie ich spricht, und noch unterhaltsamer, die Reaktionen meiner Freunde darauf zu beobachten.

Skills Improved

Python +20
Machine Learning +20
Language Models +30
Cloud Computing +10