{"id":64,"date":"2025-10-31T16:50:37","date_gmt":"2025-10-31T15:50:37","guid":{"rendered":"https:\/\/content.doppel-t.com\/?p=64"},"modified":"2025-10-31T17:31:00","modified_gmt":"2025-10-31T16:31:00","slug":"mein-erstes-projekt","status":"publish","type":"post","link":"https:\/\/content.doppel-t.com\/index.php\/2025\/10\/31\/mein-erstes-projekt\/","title":{"rendered":"Meine ersten Gehversuche mit der OpenAI-API"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<p>Du sitzt vor der API-Dokumentation von OpenAI, hast gerade deinen ersten API-Key generiert und fragst dich: &#8222;Okay, was baue ich jetzt damit?&#8220; Das war der Moment, in dem ich beschloss, nicht gro\u00df zu philosophieren, sondern einfach ein Tool zu schreiben \u2013 ein Social-Media-Post-Generator. Simpel, aber ausreichend komplex, um zu verstehen, wie die API tats\u00e4chlich funktioniert. Und nebenbei lernte ich etwas \u00fcber Authentication, das mir sp\u00e4ter bei gr\u00f6\u00dferen Projekten ersparte, vorher reinzurechnen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"dasproblempostsohnepromptengineering\">Das Problem: Posts ohne Prompt-Engineering<\/h2>\n\n\n\n<p>Die meisten Chat-Tools funktionieren nach dem gleichen Prinzip: Du schreibst einen m\u00f6glichst pr\u00e4zisen Prompt, schickst ihn los und hoffst auf ein brauchbares Ergebnis. Das ist m\u00e4chtig, aber auch fehleranf\u00e4llig. Wer nicht wei\u00df, wie man gute Prompts schreibt, bekommt schlechte Ergebnisse. Und wenn deine Nutzenden sp\u00e4ter Posts f\u00fcr LinkedIn, Instagram und Twitter schreiben sollen \u2013 das sind v\u00f6llig unterschiedliche Anforderungen an L\u00e4nge, Tonalit\u00e4t und Format.<\/p>\n\n\n\n<p>Meine Idee war eine Ebene Abstraktion dazwischen: Der Nutzende beschreibt nur, was der Post kommunizieren soll. Alles andere \u2013 Plattform, Medium, Tonalit\u00e4t \u2013 wird \u00fcber Formulareingaben gesteuert. Die App \u00fcbersetzt das intern in einen strukturierten Prompt. So wurde ein komplexes Problem auf einmal zug\u00e4nglich.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"diearchitekturparameterstattfreiheit\">Die Architektur: Parameter statt Freiheit<\/h2>\n\n\n\n<p>Das Interface ist bewusst minimalistisch. Vier Eingabefelder, vier Selects, fertig. Hier die Logik dahinter:<\/p>\n\n\n\n<p><strong>Was der Nutzende einfach macht:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Beschreibung eingeben (was soll der Post aussagen?)<\/li>\n\n\n\n<li>Plattform w\u00e4hlen (LinkedIn? Instagram? Twitter?)<\/li>\n\n\n\n<li>Medium definieren (einzelner Post, Story, Carousel?)<\/li>\n\n\n\n<li>Vibe festlegen (professionell, locker, inspirierend, aktivierend?)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Was die App intern macht:<\/strong><\/h3>\n\n\n\n<p>Diese Parameter landen in einem strukturierten Prompt-Template. Statt &#8222;Schreib was \u00fcber unser neues Feature&#8220; wird das zu: &#8222;Schreib einen Instagram Carousel Post (3 Slides) mit inspirierendem Vibe \u00fcber unser neues Feature. Fokus: User Benefits, max. 80 Zeichen pro Slide, Emoji-freundlich.&#8220;<\/p>\n\n\n\n<p>Die OpenAI-API bekommt diese strukturierte Anfrage, nicht das vage Original. Die Qualit\u00e4t der Outputs stieg damit um ein Vielfaches.<\/p>\n\n\n\n<p>Intern nutzte ich einen einfachen Prompt-Builder, der die Parameter zusammensetzt. Nichts Komplexes \u2013 nur String-Konkatenation mit intelligenten Defaults. Aber dieser einfache Mechanismus war der Schl\u00fcssel, warum das Tool f\u00fcr nicht-technische Nutzende \u00fcberhaupt sinnvoll war.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"dererstekontaktmitprofessionalauthclerk\">Der erste Kontakt mit einem Auth-Provider: Clerk<\/h2>\n\n\n\n<p>Hier kam der zweite wichtige Lernpunkt: Authentifizierung. Mein erstes Projekt hatte ich noch selbst mit Sessions und Cookies gebastelt \u2013 das funktionierte, war aber fragil. Diesmal wollte ich es richtig machen.<\/p>\n\n\n\n<p>Clerk war meine erste Wahl. Und das war eine gro\u00dfartig pragmatische Entscheidung. Statt selbst OAuth-Flows zu implementieren, User-Sessions zu managen und Sicherheit zu \u00fcberdenken, integrierte ich Clerk als Drop-in-L\u00f6sung.<\/p>\n\n\n\n<p><strong>Was Clerk f\u00fcr mich erledigte:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Sign-up und Login mit vorgefertigten UI-Komponenten<\/li>\n\n\n\n<li>Session-Management im Backend (signierte JWTs)<\/li>\n\n\n\n<li>User-Datenverwaltung (ID, E-Mail, Metadaten)<\/li>\n\n\n\n<li>Das sichere Weitergeben der User-ID an meine API<\/li>\n<\/ul>\n\n\n\n<p>Das klingt vielleicht banal, aber es war ein wichtiger Moment f\u00fcr mich. Ich erkannte, dass es nicht immer schlau ist, wenn man nicht jede Schicht der Infrastruktur selbst bauen kann. Clerk war gut dokumentiert, sicher und ich konnte mich auf die AI-Features konzentrieren.<\/p>\n\n\n\n<p>Die Integration war simpel: Clerk-Middleware im Backend, Clerk-Components im Frontend, und jeder API-Request konnte die User-ID aus dem Token extrahieren. Keine selbstgebauten Sicherheitsl\u00f6cher, keine Session-Bugs.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"herausforderungendieichunterschtzthabe\">Herausforderungen, die ich untersch\u00e4tzt habe<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Konsistente Outputs bei variablen Inputs<\/h3>\n\n\n\n<p>Ein LLM ist nicht deterministisch. Zwei identische Requests k\u00f6nnen unterschiedliche Ergebnisse liefern. Das war ein Problem, wenn ich die gleiche Anfrage zweimal in Tests gestellt habe und unterschiedliche Outputs erwartete. Die L\u00f6sung: Temperature auf 0.7 runterfahren, damit es konsistent bleibt, aber nicht roboterhaft wirkt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Plattform-spezifische Constraints<\/h3>\n\n\n\n<p>Twitter hat 280 Zeichen, LinkedIn ist ausf\u00fchrlich, Instagram ist visuell. Das LLM musste diese Unterschiede wirklich verstehen. Twitter Posts sind schneller geschrieben, aber getrickst man bei der Zeichenkontrolle, passt der Post nicht. Ich musste das Template mehrfach justieren, bis die Outputs konsistent passten.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"wasdasprojektwirklichlehrte\">Meine Leasings aus dem kleinen Projekt<\/h2>\n\n\n\n<p>Auf der Oberfl\u00e4che: ein simpler Social-Media-Generator. Tats\u00e4chlich war es ein Crash-Kurs in drei Dingen.<\/p>\n\n\n\n<ol class=\"wp-block-list is-style-default\">\n<li><strong>Wie man generative KI wirklich nutzt.<\/strong> Nicht als Blackbox, sondern als Werkzeug mit Eingabe-Output-Logik. Struktur in die Prompts bringen, Parameter nutzen, den Output evaluieren. Das unterscheidet ein brauchbares Tool von Spielerei.<\/li>\n\n\n\n<li><strong>Abstraktionsebenen bauen.<\/strong> Nicht die volle Komplexit\u00e4t den Nutzenden geben. Sie wollen ihre Posts generiert bekommen, nicht Prompt-Engineering lernen. Je simpler das Interface, desto besser die UX \u2013 aber daf\u00fcr braucht es saubere interne Logik.<\/li>\n\n\n\n<li><strong>Professional Dependencies einbauen.<\/strong> Clerk zeigte mir, dass ich nicht alles selbst bauen muss. Auth ist kritisch f\u00fcr Sicherheit \u2013 warum das Risiko eingehen, wenn es erprobte L\u00f6sungen gibt? Das war ein Paradigmenwechsel: &#8222;Build vs. Buy&#8220; intelligent entscheiden.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"direktereinflussaufsptereprojekte\">Direkter Einfluss auf sp\u00e4tere Projekte<\/h2>\n\n\n\n<p>Meine ersten Ans\u00e4tze einer KI-Suite (an der ich sp\u00e4ter arbeitete) ist konzeptionell ein direkter Nachfahre dieses kleinen Tools. Statt freier Prompts wird die Generierung durch Parameter gesteuert. Deshalb. Wie wichtig sind strukturierte Anleitungen f\u00fcr gute Ergebnisse? Hier habe ich etwas gelernt. Vertrauen Sie professionellen L\u00f6sungen zur Authentifizierung? Auch hier.<\/p>\n\n\n\n<p>Manche halten dieses Projekt f\u00fcr eine &#8222;Spielerei&#8220;. Ich sehe es anders: Es war eine Lernschleife. Bauen, um zu lernen, nicht lernen, um zu bauen. Das ist der Unterschied zwischen Theorie und Praxis.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Erstes KI-Projekt: Parameter-gesteuerter Social Media Content Generator mit Clerk Authentication<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[3,22,8,20,9],"class_list":["post-64","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-authentication","tag-clerk","tag-next-js","tag-openai","tag-prompt-engineering"],"_links":{"self":[{"href":"https:\/\/content.doppel-t.com\/index.php\/wp-json\/wp\/v2\/posts\/64","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/content.doppel-t.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/content.doppel-t.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/content.doppel-t.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/content.doppel-t.com\/index.php\/wp-json\/wp\/v2\/comments?post=64"}],"version-history":[{"count":3,"href":"https:\/\/content.doppel-t.com\/index.php\/wp-json\/wp\/v2\/posts\/64\/revisions"}],"predecessor-version":[{"id":78,"href":"https:\/\/content.doppel-t.com\/index.php\/wp-json\/wp\/v2\/posts\/64\/revisions\/78"}],"wp:attachment":[{"href":"https:\/\/content.doppel-t.com\/index.php\/wp-json\/wp\/v2\/media?parent=64"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/content.doppel-t.com\/index.php\/wp-json\/wp\/v2\/categories?post=64"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/content.doppel-t.com\/index.php\/wp-json\/wp\/v2\/tags?post=64"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}