Warum Gordon Ramsay mir jede Woche Rezepte schickt
Maik hier.
Ich erkenne langsam ein Muster. Auch dieses Wochenende habe ich mich wieder mit KI beschäftigt.
Diesmal war’s aber keine Spielerei, wie ein Chat mit Albert Einstein, sondern etwas, was einen wirklichen Bedarf bei mir erfüllen soll – Aber es basiert (teilweise) auf dem selben Quellcode.
Wie so manch anderer habe auch ich ein Thema mit gesunder Ernährung. Im Alltagsstress muss es halt immer schnell gehen und ich persönlich schaffe mir nicht die Zeit für’s Kochen – Mit dem Ergebnis, dass ich viel zu viel Schrott esse.
Für mich war der größte Hemmer immer das Thema „Ja, aber was soll ich denn Kochen?“. Mir fehlte schlicht das Repertoire an gesunden und schnellen Rezepten. Hier hat HelloFresh in der Vergangenheit Abhilfe geschaffen, einmal im Monat kam eine Kochbox mit der passenden Menge an Zutaten und Rezeptbögen. Dieser Service hatte aber auch entsprechend seinen Preis.
Dafür war ich auf Dauer zu geizig, weswegen eine Eigenentwicklung her musste.
Wie so oft ist OpenAI und Python die Lösung.
Auf Basis meines Quellcodes für Discord Bots mit OpenAI Anbindung wollte ich folgendes Erreichen:
- Einen Chatbot erstellen, der meine Vorlieben, Abneigungen und Unverträglichkeiten kennt
- Wöchentliche Rezeptideen samt Einkaufsliste per E-Mail von ihm zu kriegen
- Jederzeit mit ihm chatten zu können um sämtliche Fragen rund um das Thema Ernährung und Kochen loszuwerden
- Dem Ganzen noch eine witzige Note verleihen, indem der Bot den Charakter eines bekannten TV-Kochs annimmt.
Für den „Charakter“ bin ich sehr schnell bei Gordon Ramsay gelandet. Der englische Fernsehkoch ist für seine oftmals derbe Art bekannt. In seiner Show „Hell’s Kitchen“ versucht er zum Beispiel erfolglose Restaurants mit seinem Input zu retten.
Gesagt – Getan. Ich machte mich also auf ans Reißbrett und habe auf Basis des Quellcodes meines Discord-OpenAI Bots einfach mal angefangen.
Die OpenAI Seite
OpenAI-seitig ist das Prozedere recht unspektakulär. Projekt anlegen – Assistant anlegen – Prompt eintragen – API-Key generieren.
Ich habe diesmal trotzdem etwas „Neues“ versucht:
Mir war wichtig, dass der Gordon mir Rezepte vorschlägt, die mir auch wirklich schmecken. Über die Assistant Funktion „File Search“ habe ich also eine .txt-Datei in den bot geladen, welche meine Vorlieben, Abneigungen und Unverträglichkeiten enthält. Im Systemprompt referenziere ich dann entsprechend „Übrigens, schau in die Textdatei“ – die KI macht den Rest.
Das ist das schöne bei künstlicher Intelligenz. Man kann ganz ungehemmt und direkt mit der KI interagieren – Es gibt hier keine „Codeworde“. Die KI versteht’s einfach.
Für alle Interessierten: Folgenden Systemprompt habe ich dem RamsayBot mitgegeben.
Die Basis hierbei lieferte selbstverständlich ChatGPT.
Mit Python zum perfekten Dinner?
Da das Ergebnis eine In-Character E-Mail sein sollte, musste ich also genau diese Schnittstelle noch schaffen – Hier habe ich mich für Python entschieden.
Warum?
Einfach, weil ich die Sprache recht gut beherrsche und mit dem OpenAI Modul schon etwas Erfahrungen habe.
Die Python-Anwendung soll also ein komplettes Wochenend-Menü von OpenAI ziehen. Mit Rezepten – Mit Einkaufslisten – Mit allem.
Puhh. Meine ersten Versuche waren hier Wild. Ursprünglich kam dann sowas wie „Freitags steht ein Lachstartar mit Salat auf dem Menü“. So weit, so gut. Die Zutaten bekam ich dann dazu und das wars.
Coole Sache, danke Gordon. Aber wie mache ich nun das Tartar?
Hier war Feintuning nötig.
Ich habe schnell gemerkt, dass mein Prompt die KI überladen hat. Es sollte mehrere Gerichte samt Zutaten und Zubereitung auf einmal ausgeben. Entweder war der Text zu lang, sodass die Generierung abbrach, oder es kam Schrott dabei raus.
Divide and Conquer
Nicht nur in meinem Arbeitsleben greife ich oft auf dieses Vorgehen – im deutschen „Teile und Herrsche“ – zurück; auch hier war es der Schlüssel zum Erfolg.
Kurz umrissen beschreibt „Teile und Herrsche“ ein Vorgehen, bei dem etwas großes in kleine Unterpunkte aufgeteilt wird, welche einzeln angegangen werden.
Dies kann bspw. der Haushalt sein (Hier teile ich bspw. die Arbeit in einzelne Räume auf), oder eben die Art und Weise, wie ich an die OpenAI API herantrete.
Statt einer großen Abfrage, die das Sprachmodell zum aufgeben bringt, brechen wir das Ziel also in einzelne Komponenten herunter.
Wir erinnern uns: Ich möchte Charakter, Humor und Rezepte. Und am Ende eine Mail.
Das Script setzt nach Start also 5 separate API Calls nacheinander ab. Hier sind die Prompts dazu:
- Du schreibst das Wochenenedmenü per E-Mail an Maik. Schreibe eine Begrüßung und Eröffnung. Formatiere dies in HTML statt in Markup und lass den <html> und <body> tag weg.
- Bitte erstelle das Menü für {day}. Erstelle dazu ein Gericht inklusive Rezept und einer detaillierten Einkaufsliste. Passe die Mengen für eine Person an. Füge keinen weiteren Text bei und gebe ausschließlich die relevanten Daten aus. Berücksichtige dabei die Vorlieben, Abneigungen und Unverträglichkeiten des Benutzers, welche in der Datei Profil_Maik.txt zur Verfügung stehen. Formatiere dies in HTML statt in Markup und lass den <html> und <body> tag weg. Achte darauf, jeden HTML-Tag den du öffnest auch in jedem Fall wieder zu schließen! Dein HTML wird am Ende in eine E-Mail gegeben.
- Du beendest die Mail an Maik. Schreibe einen Schluss und eine Verabschiedung. Formatiere dies in HTML statt in Markup und lass den <html> und <body> tag weg.
Ich schreibe in den Prompt viel von HTML-Tags. Dies hat den Grund, dass ich unfassbar faul bin. Die E-Mail soll am Ende des Tages schön zu lesen sein – mit Formatierung und allem drum und dran. Dafür nutzt man in der Regel HTML.
Indem ich dem Bot sage „mach mal deine Antworten in HTML und achte verdammt nochmal darauf, alle Tags zu schließen“, spare ich mir Aufräumarbeiten – Ich kann den Text einfach so weiterverarbeiten.
Vielleicht fragst du dich jetzt „War nicht eben noch die Rede von 5 API-Calls?“. Ja. Richtig. Dadurch, dass ich den zweiten Prompt parametrisiert habe, kann ich diesen für eine beliebige Anzahl an Wochentagen nutzen.
Da ich realistisch gesehen nicht jeden Tag die Zeit und Lust haben werde, frisch zu kochen, berücksichtigt mein Script drei Tage in der Woche: Freitag, Samstag und Sonntag.
Sie haben Post!
Die letzte Herausforderung war dann nur noch, den Mailversand einzurichten. Glücklicherweise bietet Python auch hierfür bereits eine Library: email.message
Dank der musste ich lediglich ein paar Variablen bzgl. des Absenders und des Empfängers angeben und fertig. Weil der Mailtext schon vollständig in HTML daherkommt, konnte ich diesen einfach übergeben.
Schon hatte ich Post von Gordon Ramsay himself! Hier mal ein kleiner Auszug zum nachkochen!
Das ganze liegt jetzt auf meinem Server und wird von da jeden Mittwoch per cronjob – also automatisiert – gestartet. So kann ich dann entspannt in der zweiten Wochenhälfte einkaufen fahren und über das Wochenende was ordentliches kochen.
Ob Rezepte von einer KI die sich für Gordon Ramsay hält was taugen, oder ob ich bald mit ’ner Lebensmittelvergiftung aus dem Krankenbett blogge, darüber halte ich dich auf dem Laufenden!
Conclusion
Wir leben echt in der wirschesten Zeitschiene… Wo uns damals ein Computer mit der Leistungsfähigkeit heutiger Taschenrechner zum Mond gebracht hat, habe ich heute unvorstellbare Ressourcen zur Verfügung um mir ein Rezept für Seelachs mit Kartoffeln schicken zu lassen…
In diesem Sinne, guten Hunger!
-Maik