[{"content":"Ausgangslage Unterwegs leuchtet eine gelbe Warnleuchte auf. Was bedeutet sie? Das Handbuch liegt im Handschuhfach, 300+ Seiten dick. Niemand schlägt es auf. Dabei stehen dort alle relevanten Informationen: Reifendruck, Ölspezifikationen, Warnleuchten, Sicherungskasten, Wartungsintervalle. In der Praxis nutzt sie niemand, weil die Suche in einem solchen PDF umständlich und zeitaufwändig ist.\nVorgehen und Lösung Wir entwickelten ein Multi-Agenten-System, bei dem spezialisierte KI-Agenten zusammenarbeiten. Ein zentraler Orchestrator entscheidet bei jeder Anfrage, welcher Spezialist zuständig ist.\nDer Prozess läuft wie folgt ab:\nFrage stellen: Der Nutzer stellt eine Frage in natürlicher Sprache, etwa \u0026ldquo;Welcher Reifendruck ist empfohlen?\u0026rdquo; oder \u0026ldquo;Was bedeutet die gelbe Warnleuchte?\u0026rdquo;. Der Orchestrator erkennt die Absicht und leitet an den passenden Agenten weiter. Handbuch durchsuchen: Der Handbuch-Agent durchsucht über 1.500 indexierte Abschnitte aus dem Fahrzeughandbuch. Abschnitte mit konkreten Werten (Tabellen, Spezifikationen) werden priorisiert, damit die Antwort auf echten Daten basiert, nicht auf Verweisen wie \u0026ldquo;siehe Aufkleber\u0026rdquo;. Warnleuchte per Foto erkennen: Der Nutzer lädt ein Foto vom Dashboard hoch. Der Bild-Agent identifiziert das Symbol per Bildanalyse, sucht die passende Stelle im Handbuch und liefert eine Diagnose mit Schweregrad (kritisch, Warnung, Info) und konkreten nächsten Schritten. Fahrzeugprofil einrichten: Beim ersten Gespräch erfasst ein Onboarding-Agent Marke, Modell und Baujahr. Alle Antworten werden anschliessend auf das spezifische Fahrzeug zugeschnitten. Jede Antwort enthält Quellenangaben mit Seitennummer und Abschnitt aus dem Handbuch.\nFür die Dokumentenverarbeitung setzten wir LlamaParse v2 im Agentic-Modus ein. Anders als klassische PDF-Extraktoren versteht LlamaParse die Struktur eines Dokuments: Es erkennt, dass eine Reifendrucktabelle zur darüberstehenden Überschrift gehört, auch wenn dazwischen ein Seitenumbruch liegt. So bleibt zusammen, was zusammengehört.\nDas Besondere: Mit Hilfe eines Vision Language Models (VLM) liest der Parser nicht nur Fliesstext, sondern auch Text auf Bildern, Aufklebern und Diagrammen und wandelt ihn direkt in Markdown um. Zusätzlich erzeugt er kurze Bildbeschreibungen, etwa \u0026ldquo;Motoröldruck-Warnleuchte\u0026rdquo; oder \u0026ldquo;Cockpit mit nummerierten Bedienelementen\u0026rdquo;. Diese Beschreibungen werden zusammen mit dem umgebenden Text durchsuchbar gemacht. Deshalb findet das System auch Informationen von einem Aufkleber im Kofferraum oder zu einem Warnsymbol im Display, ohne dass Bilder selbst in der Vektordatenbank liegen müssen.\nTech-Stack Claude (Anthropic) als Sprachmodell für alle Agenten, gestaffelt nach Aufgabenkomplexität LlamaParse v2 für die strukturerhaltende Extraktion aus dem PDF-Handbuch ChromaDB als Vektordatenbank Streamlit als Chat-Oberfläche mit Bild-Upload und integriertem Dashboard Demo Das Ergebnis Durch diesen Ansatz konnten wir insbesondere folgendes erreichen:\nSofortige Antworten: Fragen zu Reifendruck, Ölspezifikationen oder Wartungsintervallen werden in Sekunden beantwortet, mit Verweis auf die konkrete Handbuchseite. Visuelle Diagnose: Warnleuchten werden per Foto identifiziert und mit einer Handlungsempfehlung versehen, gestützt auf das tatsächliche Fahrzeughandbuch. Qualitätsgesichert: Eine automatisierte Eval-Suite mit 40 Testfragen misst die Retrieval-Qualität (75.6% Hit-Rate) und zeigt bei jeder Systemänderung, ob die Antwortqualität steigt oder fällt. Sicherheitsrelevant abgesichert: Bei Fragen zu Bremsen, Warnleuchten oder Öldruck empfiehlt das System konsequent die sicherere Option. Prompt-Injection-Schutz und Off-Topic-Erkennung sind integriert. Modular erweiterbar: Jeder neue Agent ist eine Klasse und ein Tool-Eintrag. Geplant sind unter anderem ein Werkstatt-Finder und ein Teilevergleich. Monitoring integriert: Ein Dashboard zeigt Anfragen, Kosten, Latenz und Token-Verbrauch pro Request. Fazit Wer ein Sprachmodell direkt nach Reifendruck oder Ölspezifikationen fragt, bekommt wahrscheinlich plausible, aber falsche Antworten. Das Modell kennt weder das konkrete Fahrzeug noch das richtige Handbuch. Die Kombination aus RAG und spezialisierten Agenten löst genau das: Das System antwortet ausschliesslich auf Basis der tatsächlichen Dokumentation und kann bei jeder Antwort die Quelle mitliefern.\nDas Ergebnis ist ein Assistent, der 300+ Seiten Fachwissen in Sekunden zugänglich macht, mit einer Genauigkeit, die eine manuelle Suche nicht erreicht. Dasselbe Prinzip funktioniert überall dort, wo Unternehmen strukturiertes Wissen in PDFs, Handbüchern oder technischen Dokumentationen haben, das heute kaum genutzt wird.\nDu möchtest KI-Agenten in deinem Unternehmen einsetzen? Schreib mir auf LinkedIn oder buche einen kostenlosen Call.\n","permalink":"https://obogazkaya.me/projects/ki-assistent-fahrzeughandbuecher/","summary":"Ein Multi-Agenten RAG-System, das Informationen aus Fahrzeughandbüchern per natürlicher Sprache einfach zugänglich macht.","title":"KI-Assistent für Fahrzeughandbücher"},{"content":"In Part 1 haben wir OpenClaw auf einem VPS installiert und mit VPN, Firewall und eingeschränktem SSH abgesichert. Die Infrastruktur steht. Jetzt geht es darum, den Bot produktiv zu machen.\nAm Ende dieses Artikels hast du: einen OpenClaw-Assistenten, der intelligent zwischen günstigem und teurem Modell wechselt, über thematische Telegram-Gruppen erreichbar ist, nach dem Zero-Trust-Prinzip abgesichert ist, per Sprachnachricht gesteuert werden kann, nützliche Skills installiert hat, auf dich zugeschnitten ist und per Cron-Job eigenständig wiederkehrende Aufgaben erledigt.\nModell-Strategie: Das richtige Modell für die richtige Aufgabe Wenn du OpenClaw rein über API-Keys mit Opus 4.6 betreibst, kann das sehr schnell richtig teuer werden. Dazu kommen harte Rate-Limits, besonders bei neuen Accounts.\nFür den Einstieg: Sonnet 4.6 Meine Empfehlung für den Start: Claude Sonnet 4.6. Es bietet das beste Preis-Leistungs-Verhältnis und ist für die meisten Agent-Tasks kaum schlechter als Opus. Auf dem SWE-bench (einem Standard-Benchmark für Code-Agenten) liegt Sonnet bei 79,6%, Opus bei 80,8%. In der Praxis merkst du den Unterschied selten.\nSonnet kostet $3 / $15 pro Million Input-/Output-Tokens. Opus liegt bei $5 / $25. Für die meisten Aufgaben brauchst du Opus nicht. Wenn doch, kannst du jederzeit wechseln.\nModell wechseln mit /model OpenClaw hat einen eingebauten /model-Befehl. Tippe einfach /model in den Chat und du siehst dein aktuelles Modell und kannst direkt wechseln:\nÜber \u0026ldquo;Browse providers\u0026rdquo; siehst du alle verfügbaren Anbieter und Modelle. Die Auswahl ist riesig: Anthropic, OpenAI, Google, Groq, Mistral, und viele mehr.\nDu kannst auch direkt per Befehl wechseln: /model anthropic/claude-opus-4-6 für komplexe Aufgaben, /model anthropic/claude-sonnet-4-6 zurück für den Alltag. Der Wechsel gilt für die aktuelle Session.\nDauerhaft änderst du das Standardmodell per CLI:\nopenclaw models set anthropic/claude-sonnet-4-6 Fallback-Modell: Haiku für Ausfallsicherheit OpenClaw hat einen eingebauten Fallback-Mechanismus: Wenn dein Hauptmodell ein Rate-Limit erreicht, wechselt der Bot automatisch auf das konfigurierte Fallback-Modell. Als Fallback eignet sich Claude Haiku 4.5. Es ist günstig ($0,80 / $4 pro Million Tokens), schnell und immer verfügbar. So bleibt der Bot erreichbar, auch wenn Sonnet gerade drosselt.\n\u0026ldquo;Setze Claude Sonnet 4.6 als Standardmodell. Wenn Sonnet nicht verfügbar ist, nutze Haiku 4.5 als Fallback.\u0026rdquo;\nWann auf Opus wechseln? Für den Alltag reicht Sonnet. Wechsle manuell auf Opus, wenn du merkst, dass eine Aufgabe mehr Tiefe braucht: Architektur-Entscheidungen, komplexe Planung über mehrere Schritte oder wenn Sonnet bei einer Aufgabe wiederholt nicht das liefert, was du erwartest.\nIn Part 3 zeige ich, wie du das automatisieren kannst: mit Multi-Agent-Setups, bei denen verschiedene Agenten verschiedene Modelle nutzen und Aufgaben automatisch an den richtigen Agenten geroutet werden.\nAlternative: OpenRouter Auto Wer sich nicht mit Modellwahl beschäftigen will, kann OpenRouter als Provider nutzen. OpenRouter bündelt über 246 Modelle aller Anbieter unter einer API. Die Option openrouter/auto wählt automatisch das beste Preis-Leistungs-Modell pro Anfrage. Ich habe das selbst noch nicht getestet, aber die Community berichtet von guten Ergebnissen und deutlichen Kosteneinsparungen.\nTelegram: Gruppen für organisierte Kommunikation In Part 1 haben wir den Telegram-Bot eingerichtet. Jetzt geht es darum, die Kommunikation zu organisieren. Wenn du den Bot als persönlichen Assistenten, für Programmierung und für Recherche nutzt, wird ein einziger Chat schnell unübersichtlich.\nGruppen anlegen Erstelle in Telegram eigene Gruppen für verschiedene Themen:\nÖffne Telegram → Neue Gruppe Gib der Gruppe einen sprechenden Namen (z.B. \u0026ldquo;Startup-Ideen\u0026rdquo;, \u0026ldquo;Buchhaltung\u0026rdquo;, \u0026ldquo;Code-Projekte\u0026rdquo;) Füge deinen Bot als Mitglied hinzu Wichtig: Rechtsklick auf den Bot → Zum Admin befördern → Berechtigungen bestätigen Bot-Verhalten in Gruppen konfigurieren Gib dem Bot eine klare Regel für die Gruppen:\n\u0026ldquo;Ab jetzt füge ich dich in Gruppen-Chats hinzu, in denen nur du und ich sind. Der Gruppenname ist das Thema. In einer Gruppe namens \u0026lsquo;Startup-Ideen\u0026rsquo; redest du nur über Startup-Ideen. In Direktnachrichten können wir über alles reden. Antworte auf jede Nachricht in den Gruppen, nicht nur wenn ich dich tagge. Speichere das als dauerhafte Regel.\u0026rdquo;\nSo hast du getrennte Kontexte: In der Gruppe \u0026ldquo;Buchhaltung\u0026rdquo; bekommst du Antworten zu Finanzen, in \u0026ldquo;Code-Projekte\u0026rdquo; zu Programmierung. Die Chat-Historien bleiben sauber und du findest alles wieder.\nDas Zero-Trust-Prinzip: OpenClaw wie einen fremden Mitarbeiter behandeln Bevor wir anfangen, Skills und externe Services anzubinden, eine Grundregel: Behandle OpenClaw wie einen unbekannten virtuellen Assistenten. Stell dir vor, du hättest eine reale Person eingestellt, die remote aus einem anderen Land arbeitet und Zugriff auf deine Daten hat. Du würdest dieser Person nicht dein Hauptkonto, deine Krypto-Keys oder dein primäres E-Mail-Postfach geben.\nGenau so solltest du mit OpenClaw umgehen.\nEigene Konten für jeden Service Für jeden Dienst, den du mit OpenClaw verbindest, erstellst du ein separates Konto:\nE-Mail: Eigene E-Mail-Adresse nur für den Bot (z.B. deinbot@gmail.com). Niemals deine Haupt-E-Mail. GitHub: Eigener GitHub-Account nur für vom Bot geschriebenen Code. Nicht dein persönlicher Account mit deinen Private Repos. Google Drive / Notion / etc.: Separate Workspace-Accounts, die nur die Daten enthalten, die der Bot sehen darf. API-Keys: Eigene Keys mit minimalen Berechtigungen und harten Ausgabenlimits. Warum das wichtig ist OpenClaw führt Code aus. Es schreibt Dateien, ruft APIs auf und interagiert mit externen Diensten. Wenn durch eine Prompt Injection, einen Bug oder eine Fehlkonfiguration etwas schiefgeht, ist der Schaden auf das Bot-Konto begrenzt. Dein Hauptkonto, deine persönlichen Daten und deine Finanzen bleiben unangetastet.\nFaustregel: Verbinde OpenClaw nur mit Dingen, bei denen du es verkraften könntest, wenn sie kompromittiert werden. Je mehr Services du anbindest, desto größer wird die Angriffsfläche. Jede neue Integration ist ein bewusster Trade-off zwischen Komfort und Risiko.\nSkills: Was sie sind und wie du sie nutzt Skills sind das Herzstück von OpenClaw. Sie erweitern die Fähigkeiten des Bots um konkrete, wiederholbare Aufgaben. Aber bevor du anfängst, wahllos Skills zu installieren, solltest du verstehen, was ein Skill eigentlich ist.\nAnatomie eines Skills Ein Skill ist im Kern eine Markdown-Datei (skill.md), die dem Bot erklärt, was er tun soll. Optional enthält ein Skill zusätzliche Dateien wie Python-Skripte, Shell-Scripts oder Konfigurationsdateien.\nskills/ └── mein-skill/ ├── skill.md # Anleitung für den Bot └── scripts/ └── ausfuehren.py # Optionales Skript Die skill.md enthält den Namen, eine Beschreibung und die Anweisungen. Der Bot liest diese Datei und weiß dann, wie er die Aufgabe ausführen soll. Skills werden über Slash-Befehle aufgerufen (z.B. /skill mein-skill).\nSkills installieren: Gateway, CLI oder Chat Es gibt drei Wege, Skills zu installieren:\nGateway Web UI: Im Browser unter Skills visuell aktivieren/deaktivieren, Abhängigkeiten prüfen und API-Keys konfigurieren CLI: openclaw skills install \u0026lt;skill-slug\u0026gt; im Terminal Chat: Dem Bot sagen: \u0026ldquo;Installiere den Skill X von ClawHub\u0026rdquo; Alle drei Wege installieren in denselben skills/-Ordner. Meine Empfehlung: Nutze das Gateway. Der Grund: Im Gateway siehst du auf einen Blick, welche Skills aktiv sind, welche Abhängigkeiten fehlen und welche API-Keys konfiguriert werden müssen. Per Chat oder CLI installierst du blind. Du musst dem Bot vertrauen, dass er alles richtig einrichtet. Im Gateway behältst du die Kontrolle.\nAußerdem kannst du Skills im Gateway gezielt ein- und ausschalten (enabled: true/false), ohne sie zu deinstallieren. Das ist praktisch, wenn du einen Skill testen willst, ohne ihn dauerhaft aktiv zu haben.\nEingebaute Skills OpenClaw kommt mit über 50 vorinstallierten Skills. Im Gateway findest du sie unter Skills. Hier die wichtigsten zum Aktivieren:\nSkill Was er tut Warum nützlich Coding Agent Schreibt und führt Code aus Kern-Skill für jede Automatisierung GitHub Repos erstellen, Code committen und pushen Bot-Code automatisch sichern Web Search Im Internet recherchieren Aktuelle Infos statt veraltetes Modellwissen Skill Creator Neue Skills erstellen lassen Eigene Workflows ohne manuelles Schreiben Auf ClawHub findest du OpenClaws eigene Skill-Registry. Daneben gibt es Skills.sh von Vercel, eine agentenübergreifende Sammlung, die neben OpenClaw auch Claude Code, Cursor und 40+ andere Agenten unterstützt. Installation per CLI: npx skills add \u0026lt;owner/repo\u0026gt;. Beide Plattformen installieren in denselben skills/-Ordner und tauchen danach im Gateway auf.\nHier ein paar Community-Skills, die sich in der Praxis bewährt haben:\nSkill Quelle Was er tut Excalidraw ClawHub Architekturdiagramme und visuelle Notizen direkt im Chat erstellen (Beispiel) ElevenLabs Agents ClawHub Voice-AI und KI-gestützte Anrufe OpenAI Whisper ClawHub Sprachnachrichten transkribieren, Voice-Modus für Telegram GOG ClawHub Google Workspace CLI für Gmail, Calendar, Drive, Contacts, Sheets und Docs Wichtig: Installiere nicht alles, was gut klingt. Die ClawHub-Community wächst schnell, aber nicht jeder Skill ist sicher oder gut geschrieben. Lies den Code, bevor du ihn auf deinem Server aktivierst. Im Gateway siehst du direkt, welche Abhängigkeiten ein Skill braucht.\nVoice-Modus: Sprachnachrichten transkribieren Tippen ist nicht immer praktisch. Besonders unterwegs ist es schneller, eine Sprachnachricht zu senden. OpenClaw kann Audio transkribieren, wenn du es einrichtest.\nDie zuverlässigste Methode ist Whisper lokal auf dem Server:\n\u0026ldquo;Installiere Whisper lokal, um meine Sprachnachrichten zu transkribieren. Nutze das Base-Modell für Geschwindigkeit.\u0026rdquo;\nNach der Installation kannst du Sprachnachrichten in Telegram senden, und der Bot transkribiert und verarbeitet sie automatisch. Du kannst auch zwischen Base (schneller) und einem größeren Modell (genauer) wählen, je nach Bedarf.\nEigene Skills erstellen Das Mächtige an OpenClaw: Du kannst den Bot bitten, seine eigenen Skills zu schreiben.\n\u0026ldquo;Erstelle einen Skill namens \u0026lsquo;daily-report\u0026rsquo;, der jeden Morgen eine Zusammenfassung meiner gestrigen Aktivitäten, offenen Tasks und anstehenden Termine erstellt.\u0026rdquo;\nDer Bot erstellt die skill.md im Workspace unter skills/daily-report/. Wichtig: Lies die erstellte Datei durch und passe sie an. Die Qualität deiner Skills bestimmt die Qualität der Ergebnisse.\nDen Bot personalisieren: Identity, Soul und Heartbeat In Part 1 haben wir kurz die Memory-Grundlagen konfiguriert. Jetzt geht es darum, den Bot wirklich auf dich zuzuschneiden: Wer ist er, wie kommuniziert er, und was tut er, wenn du nicht da bist.\nEs gibt mehrere Schlüsseldateien, die du kennen solltest.\nDie Dateien im Überblick Datei Zweck memory.md Langzeitspeicher, wird vor jeder Aktion gelesen daily/ Tagesnotizen (standardmäßig nur 2 Tage Rückblick) user.md Informationen über dich (Zeitzone, Vorlieben, Ziele) identity.md Persönlichkeit und Rolle des Bots soul.md Grundsätze, Tonfall, Grenzen tools.md Verfügbare Werkzeuge und Konfigurationen heartbeat.md Anweisungen für autonome Selbstverbesserung User und Identity: Den Bot über dich und sich selbst informieren Statt diese Dateien manuell zu befüllen, lass den Bot die Arbeit machen:\n\u0026ldquo;Ich brauche ein Update der Identity- und User-Dateien. Stell mir Fragen: Was ich mache, wie ich arbeite, was meine Ziele sind, in welcher Zeitzone ich bin, wie du mit mir kommunizieren sollst. Basierend auf meinen Antworten aktualisierst du beide Dateien. Mach das auch in Zukunft weiter: Wenn du etwas Neues über mich lernst, aktualisiere die Dateien.\u0026rdquo;\nDer Bot gibt dir ein strukturiertes Interview und aktualisiert die Dateien basierend auf deinen Antworten. Das ist deutlich effektiver als alles selbst zu tippen.\nSoul: Der Charakter des Bots Die soul.md definiert, wie der Bot kommuniziert und welche Grundsätze er hat. Standardmäßig enthält sie sinnvolle Defaults wie \u0026ldquo;Lies deine Memory-Dateien bei jedem Start\u0026rdquo; und \u0026ldquo;Private Dinge bleiben privat\u0026rdquo;. Du kannst den Tonfall anpassen: sachlich, freundlich, sarkastisch oder minimalistisch. Was auch immer zu deinem Arbeitsstil passt.\nHeartbeat: Der Bot, der sich selbst verbessert Der Heartbeat ist eine der spannendsten Funktionen. Du kannst OpenClaw so konfigurieren, dass es in regelmäßigen Abständen \u0026ldquo;aufwacht\u0026rdquo; (alle 5, 30 oder 60 Minuten) und die heartbeat.md liest.\n\u0026ldquo;Aktualisiere deine Heartbeat-Datei: Wenn du aufwachst, überprüfe die Fehler, die du in vorherigen Sessions gemacht hast, und arbeite an Verbesserungen. Nutze dafür mehrere Sub-Agenten parallel, um verschiedene Aufgaben gleichzeitig zu erledigen.\u0026rdquo;\nDas bedeutet: Auch wenn du nicht aktiv mit dem Bot chattest, kann er im Hintergrund arbeiten. Fehler analysieren, Skills optimieren, Memory aufräumen. Das ist der Punkt, an dem OpenClaw aufhört, ein Chat-Tool zu sein, und anfängt, ein autonomer Agent zu werden.\nCron-Jobs: Aufgaben automatisieren Cron-Jobs machen OpenClaw zum autonomen Assistenten. Statt jede Aufgabe manuell anzustoßen, kannst du wiederkehrende Tasks planen, die der Bot selbständig abarbeitet.\nCron-Jobs im Gateway einrichten Am einfachsten erstellst du Cron-Jobs über das Gateway unter Cron. Dort kannst du neue Jobs anlegen, bestehende bearbeiten und den Verlauf einsehen. Alternativ per Chat:\n\u0026ldquo;Erstelle einen Cron-Job, der jeden Morgen um 8 Uhr eine Zusammenfassung meiner gestrigen Aktivitäten erstellt und mir auf Telegram schickt.\u0026rdquo;\nKonkretes Beispiel: Daily Briefing Hier ein Prompt, den du direkt als Cron-Job anlegen kannst:\n\u0026ldquo;Lies meine Memory-Dateien und die letzten 2 Tagesnotizen. Fasse zusammen: Was habe ich gestern erledigt? Welche offenen Tasks gibt es? Gibt es wichtige Termine heute? Prüfe außerdem das Wetter für meinen Standort. Schicke die Zusammenfassung als eine kompakte Nachricht auf Telegram.\u0026rdquo;\nIm Gateway unter Cron trägst du diesen Prompt ein, setzt das Intervall auf 0 8 * * * (täglich um 8:00) und wählst Sonnet als Modell. Fertig. Ab morgen wachst du mit einem Briefing auf.\nWeitere Cron-Job-Ideen Cron-Job Intervall Was er tut Daily Briefing Täglich 8:00 Zusammenfassung von gestern, offene Tasks, Wetter Memory Cleanup Wöchentlich Veraltete Memory-Einträge aufräumen GitHub Review Täglich 18:00 Offene Issues und PRs zusammenfassen News Digest Täglich 7:00 Nachrichten zu deinen Themen recherchieren und zusammenfassen Cron-Jobs und Kosten Jeder Cron-Job startet eine Agent-Session und verbraucht Tokens. Lass Cron-Jobs mit Sonnet oder Haiku laufen, nicht mit Opus. Und setze sinnvolle Intervalle. Ein Job, der alle 5 Minuten läuft, kann schnell teuer werden.\n\u0026ldquo;Alle Cron-Jobs sollen standardmäßig mit Sonnet laufen.\u0026rdquo;\nAlles zusammen: Der produktive OpenClaw-Stack OpenClaw Produktiv-Setup │ ├── Modell-Strategie │ ├── Sonnet 4.6 → Standard für alles │ ├── Opus 4.6 → bei Bedarf für komplexe Aufgaben │ ├── Haiku 4.5 → Fallback bei Rate-Limits │ └── /model Befehl zum schnellen Wechsel │ ├── Kommunikation │ ├── Telegram-Gruppen nach Thema │ ├── Voice-Modus mit Whisper │ └── Gateway für Konfiguration │ ├── Zero Trust │ ├── Eigene E-Mail für den Bot │ ├── Eigener GitHub-Account │ ├── Separate API-Keys mit Limits │ └── Nur anbinden, was kompromittierbar ist │ ├── Skills │ ├── Eingebaute Skills nach Bedarf │ ├── Eigene Skills für wiederkehrende Aufgaben │ └── ClawHub + Skills.sh (mit Vorsicht) │ ├── Personalisierung │ ├── user.md + identity.md (Interview-basiert) │ ├── soul.md (Charakter) │ └── heartbeat.md (autonome Verbesserung) │ └── Cron-Jobs └── Daily Briefing, Reviews, Cleanup Häufige Fehler vermeiden Alle Skills blind installieren: Jeder Skill ist Code auf deinem Server. Lies ihn, bevor du ihn aktivierst. Weniger ist mehr.\nNur ein Modell nutzen: Opus für alles ist teuer und langsam durch Rate-Limits. Starte mit Sonnet, richte Haiku als Fallback ein und wechsle nur bei Bedarf auf Opus.\nHauptkonten verbinden: Ein Fehler, eine Prompt Injection, und dein persönlicher GitHub-Account ist kompromittiert. Immer separate Konten.\nMemory ignorieren: Wenn du die Memory-Dateien nicht pflegst, vergisst der Bot alles zwischen Sessions. Investiere Zeit in User- und Identity-Dateien.\nHeartbeat ohne Limits: Ein Heartbeat, der alle 5 Minuten Sonnet startet, kann teuer werden. Nutze sinnvolle Intervalle und Haiku für autonome Tasks.\nFazit und Ausblick Nach Part 1 (Infrastruktur und Sicherheit) und Part 2 (Produktivität) hast du jetzt einen OpenClaw-Assistenten, der mit Sonnet kosteneffizient läuft, über Telegram-Gruppen organisiert kommuniziert, nach dem Zero-Trust-Prinzip abgesichert ist, per Voice-Nachricht gesteuert werden kann, durch Skills erweiterbar ist, über Identity und Soul auf dich zugeschnitten ist und per Cron-Job eigenständig arbeitet.\nIn Part 3 geht es ans Eingemachte:\nMulti-Agent-Workflows: Mehrere spezialisierte Agenten, die als Team zusammenarbeiten, mit automatischem Modell-Routing zwischen Sonnet und Opus Praxisbeispiele: Konkrete Workflows, die ich täglich nutze Du möchtest KI-Agenten wie OpenClaw in deinem Unternehmen einsetzen? Schreib mir auf LinkedIn oder buche einen kostenlosen Call.\n","permalink":"https://obogazkaya.me/blog/openclaw-setup-skills-integrations/","summary":"OpenClaw richtig konfigurieren: Modell-Strategie mit Sonnet, Opus und Haiku, Telegram-Gruppen, Zero-Trust-Konten, Voice-Modus, Skills, Personalisierung und Heartbeat für einen produktiven KI-Assistenten.","title":"OpenClaw produktiv einrichten: Skills, Modelle und Zero-Trust-Prinzip (Part 2)"},{"content":"Die meisten OpenClaw-Tutorials zeigen dir, wie du das Tool schnell zum Laufen bringst, aber sie überspringen das Thema Sicherheit komplett. OpenClaw mit offenen Ports auf dem Heimrechner zu betreiben, bedeutet, dass API-Keys, verbundene Dienste und persönliche Daten ungeschützt erreichbar sind.\nDieser Guide ist der erste von drei Teilen. In Part 1 (diesem Artikel) zeige ich dir ein sauberes Setup mit OpenClaw auf einem VPS, abgesichert mit VPN-Tunnel, Firewall und eingeschränkten Benutzerrechten. Dazu die Anbindung der AI-Modelle sowie die Kommunikation über Telegram. In Part 2 geht es um Zero-Trust-Prinzip, Modell-Strategie, Skills, Cron-Jobs und die Memory-Architektur. Und in Part 3 um Multi-Agent-Workflows und fortgeschrittene Automatisierungen.\nWas ist OpenClaw und wie funktioniert es? OpenClaw ist kein KI-Modell. Es ist ein Open-Source KI-Agent, der zwischen dir und KI-Modellen wie Claude, GPT, Gemini oder DeepSeek sitzt. Stell dir eine Kommandozentrale vor, die Aufgaben an Sub-Agenten delegieren, Integrationen mit Tools wie Gmail oder GitHub verwalten und Workflows autonom ausführen kann.\nOpenClaw nimmt deine Anweisungen, zerlegt sie in Teilaufgaben, startet Sub-Agenten, die diese parallel abarbeiten, und liefert Ergebnisse zurück. Alles unter Beibehaltung von Kontext und Gedächtnis über Sessions hinweg. Du kannst über ein Web-Gateway, Telegram oder andere Messaging-Integrationen interagieren.\nDiese Unterscheidung ist entscheidend: OpenClaw braucht Zugriff auf deine API-Keys, deine verbundenen Dienste und potenziell sensible Daten. Wer Zugang zu deiner OpenClaw-Instanz bekommt, bekommt Zugang zu allem, was damit verbunden ist. Deshalb ist Sicherheit keine Option, sie ist das Fundament, auf dem alles andere aufbaut.\nSchritt 1: VPS einrichten OpenClaw auf deinem Heimrechner zu betreiben bedeutet: Deine persönlichen Dateien, Browser-Passwörter, Krypto-Wallets und Banking-Sessions befinden sich auf dem gleichen Gerät wie ein KI-Agent, der Code ausführt. Wenn jemand Zugriff auf OpenClaw bekommt (durch eine Prompt Injection, einen offenen Port oder einen geleakten API-Key), ist alles auf diesem Gerät gefährdet.\nAuch eigene Hardware wie ein Mac Mini ist nicht ideal. Du öffnest damit Traffic auf dein Heimnetzwerk, bist abhängig davon, dass das Gerät immer läuft, und hast keine automatischen Backups.\nEin Virtual Private Server (VPS) trennt alles sauber. Eine eigene Umgebung mit nichts drauf außer dem, was du installierst. Dazu kommen automatische Backups, schnelle Internetanbindung und physische Sicherheit im Rechenzentrum. Für 5 bis 10 Euro im Monat bekommst du etwas, das zuverlässiger und sicherer ist als jede Heimlösung.\nProvider und OS wählen Hostinger bietet günstige VPS-Pläne, die gut für OpenClaw funktionieren. Der KVM2-Plan (2 vCPUs, 8 GB RAM, $9.99/Monat) reicht für den Anfang locker aus.\nTipp: Über diesen Affiliate-Link bekommst du 20% Rabatt auf den KVM2-Plan. (Transparenzhinweis: Das ist ein Affiliate-Link, über den ich eine kleine Provision erhalte. Dir entstehen keine Mehrkosten.)\nWähle als Betriebssystem Debian 13 (oder Ubuntu, falls dir das lieber ist). Beide haben guten Community-Support für die Tools, die du brauchst.\nHostinger hat auch ein One-Click-Deploy für OpenClaw. Das funktioniert, wenn du es schnell haben willst. Wir machen hier aber das manuelle Setup, weil wir die Sicherheit selbst kontrollieren wollen.\nErster Zugang Nach der VPS-Bereitstellung erhältst du eine IP-Adresse und ein Root-Passwort. Generiere ein sicheres, zufälliges Passwort (nicht den Namen deines Hundes). Verbinde dich per SSH:\nssh root@DEINE_SERVER_IP Das ist das letzte Mal, dass du dich über die öffentliche IP als Root anmeldest. Ab jetzt sichern wir alles ab.\nSchritt 2: Tailscale VPN installieren (erste Priorität) Das Erste, was wir auf dem Server tun, ist Tailscale zu installieren. Noch bevor wir irgendetwas anderes konfigurieren. Tailscale erstellt ein verschlüsseltes Mesh-VPN, bei dem nur Geräte, die du persönlich genehmigst, deinen Server sehen oder sich verbinden können.\nTailscale auf dem Server installieren curl -fsSL https://tailscale.com/install.sh | sh sudo tailscale up --ssh Der zweite Befehl (mit --ssh) aktiviert den Tailscale-SSH-Dienst, der uns später erlaubt, ohne Passwort über das VPN auf den Server zuzugreifen.\nEs erscheint eine Authentifizierungs-URL. Öffne sie im Browser auf deinem lokalen Rechner und melde dich mit deinem Tailscale-Konto an. Klicke auf \u0026ldquo;Connect\u0026rdquo;, um den Server zu verknüpfen.\nTailscale auf deinem lokalen Rechner installieren Gehe auf die Tailscale-Website und installiere die App für dein Betriebssystem (Windows, Mac, Linux, oder sogar dein Handy). Melde dich mit dem gleichen Account an. Beide Geräte sind jetzt im selben verschlüsselten Netzwerk.\nStatus prüfen tailscale status Du solltest beide Geräte sehen: deinen lokalen Rechner und den Server. Merke dir die Tailscale-IP des Servers (beginnt meist mit 100.), die brauchst du gleich.\nSchritt 3: SSH absichern und Root-Zugang sperren Jetzt, wo Tailscale läuft, schränken wir SSH so ein, dass es nur noch über den VPN-Tunnel erreichbar ist. Das macht den Server im öffentlichen Internet praktisch unsichtbar.\nSSH-Konfiguration anpassen nano /etc/ssh/sshd_config Ändere folgende Werte:\nListenAddress DEINE_TAILSCALE_IP PasswordAuthentication no PermitRootLogin no Die entscheidende Änderung: ListenAddress wird auf deine Tailscale-IP gesetzt (die mit 100. anfängt, nicht die öffentliche Server-IP). Damit hört SSH nur noch auf Verbindungen aus dem Tailscale-Netzwerk.\nSpeichere mit Ctrl+S und schließe mit Ctrl+X.\nNon-Root-User erstellen OpenClaw als Root laufen zu lassen, ist einer der größten Fehler. Wenn der Agent-Prozess als Root läuft und jemand reinkommt, hat er volle Kontrolle über den gesamten Server.\nadduser deinname usermod -aG sudo deinname Das erstellt einen Benutzer mit eingeschränktem Sudo-Zugang. Alle OpenClaw-Prozesse laufen unter diesem User.\nTeste den neuen User kurz:\nsu deinname sudo whoami Wenn root erscheint, ist der Sudo-Zugang korrekt eingerichtet.\nSSH neu starten und testen systemctl restart ssh Dann ausloggen:\nlogout Jetzt der wichtige Test: Versuche, dich über die öffentliche IP zu verbinden:\nssh deinname@DEINE_SERVER_IP Das sollte fehlschlagen. Keine Verbindung, kein Timeout, einfach nichts. Genau so soll es sein.\nJetzt über die Tailscale-IP:\nssh deinname@DEINE_TAILSCALE_IP Das funktioniert sofort, ohne Passwort, weil Tailscale die Authentifizierung übernimmt. Nur autorisierte Geräte in deinem Tailscale-Netzwerk können den Server erreichen.\nBonus-Test: Trenne Tailscale auf deinem lokalen Rechner (Disconnect). Versuche erneut, dich per SSH zu verbinden. Es wird nicht funktionieren. Verbinde Tailscale wieder, und der Zugang ist sofort da.\nSchritt 4: Cloud-Firewall bei Hostinger konfigurieren Tailscale und die SSH-Einschränkung sind der erste Schutz. Jetzt fügen wir eine zweite Schicht hinzu: eine Cloud-Firewall direkt bei Hostinger. Die blockiert Traffic auf Netzwerkebene, noch bevor er den Server überhaupt erreicht.\nFirewall erstellen Öffne das Hostinger Dashboard für deinen VPS Gehe zu Security \u0026gt; Firewall Erstelle eine neue Firewall (z.B. \u0026ldquo;main\u0026rdquo;) Aktiviere die Firewall Regel hinzufügen Standardmäßig blockiert die Firewall allen eingehenden Traffic. Wir brauchen nur eine einzige Regel:\nAktion Protokoll Port Quelle Accept UDP 41641 Anywhere Port 41641 ist der Port, den Tailscale für die verschlüsselte Kommunikation nutzt. Ohne diese Regel würde die Firewall auch den Tailscale-Tunnel blockieren.\nWichtig: Wir öffnen nicht TCP Port 22 (SSH). Das ist Absicht. SSH läuft über den Tailscale-Tunnel, nicht über das öffentliche Internet. Selbst wenn jemand die IP deines Servers kennt und versucht, Port 22 zu scannen: Die Firewall blockiert es auf Netzwerkebene.\nKlicke auf Synchronize, um die Regeln auf den Server anzuwenden.\nOptionale Ports Falls du in Zukunft eine öffentliche Website auf dem Server hosten willst (nicht das OpenClaw-Dashboard, sondern eine echte Website), brauchst du zusätzlich:\nAktion Protokoll Port Quelle Accept TCP 80 Anywhere Accept TCP 443 Anywhere Für unser OpenClaw-Setup brauchst du das aber nicht.\nSchritt 5: OpenClaw installieren Mit dem abgesicherten Server ist es Zeit, OpenClaw selbst zu installieren. Die Installation läuft über einen einfachen Befehl direkt von der OpenClaw-Website.\nInstallation starten Stelle sicher, dass du als dein Non-Root-User eingeloggt bist (nicht als root):\nssh deinname@DEINE_TAILSCALE_IP Dann den Installer von der OpenClaw-Website ausführen (den aktuellen Befehl findest du auf openclaw.com unter dem Reiter \u0026ldquo;Mac OS / Linux\u0026rdquo;):\ncurl -fsSL https://openclaw.com/install.sh | sh Der Installer führt dich dann durch ein interaktives Setup. Hier die wichtigsten Einstellungen:\nModell konfigurieren Das Setup fragt dich nach dem KI-Modell. Hier hast du mehrere Optionen:\nWenn du einen Provider wie OpenAI oder Anthropic auswählst, hast du jeweils zwei Wege, dich zu authentifizieren:\nOption A: Abo nutzen (empfohlen, deutlich günstiger)\nWenn du ein ChatGPT Pro Abo ($200/Monat) oder ein Claude Pro/Max Abo ($17-100/Monat) hast, kannst du das bestehende Kontingent nutzen statt per API-Token zu zahlen.\nFür Codex (ChatGPT Pro): Wähle \u0026ldquo;OpenAI Codex\u0026rdquo; und folge dem OAuth-Flow. Du bekommst eine URL, authentifizierst dich im Browser, kopierst den Code aus der Redirect-URL (zwischen code= und \u0026amp;scope) und fügst ihn ein.\nFür Claude: Wähle \u0026ldquo;Anthropic\u0026rdquo; und authentifiziere dich mit deinem Claude-Account. Mit dem Pro-Abo ($17/Monat) bekommst du Zugang zu Opus, allerdings ist das Kontingent nach wenigen Tagen intensiver Nutzung aufgebraucht. Für Heavy-User lohnt sich Max (ab $100/Monat) mit 5x bis 20x mehr Nutzung.\nOption B: API-Keys\nIch würde diese Option nicht empfehlen, da es ohne sauber gesetzte Limits sehr schnell teuer werden kann. Falls du es trotzdem nutzen willst: Gehe zu platform.openai.com bzw. console.anthropic.com, erstelle API-Keys und füge sie ein. Setze unbedingt monatliche Ausgabenlimits.\nTelegram-Bot einrichten Telegram ist die empfohlene Art, mit deiner OpenClaw-Instanz zu interagieren. Wähle Telegram in der Channel-Auswahl aus und folge den Anweisungen.\nDanach wirst du nach einem API-Token gefragt. Das kannst du in Telegram wie folgt erstellen:\nÖffne Telegram und schreibe @BotFather an Sende /newbot und folge den Anweisungen Gib dem Bot einen Namen (z.B. \u0026ldquo;Dev\u0026rdquo;) und einen Usernamen (muss auf _bot enden) Kopiere das Bot-Token, das du erhältst Wichtig: Lösche die Nachricht mit dem Token aus dem Chat mit BotFather, damit du es nicht versehentlich leakst.\nWährend des interaktiven Setups (oder nachträglich) wirst du nach dem Telegram-Token gefragt. Füge es ein und bestätige.\nDanach fragt das Setup: \u0026ldquo;How do you want to hatch your bot?\u0026rdquo;. Wähle hier \u0026ldquo;Hatch in TUI\u0026rdquo; aus. Damit startet der Bot direkt im Terminal-Interface.\nNach dem Start begrüßt dich der Bot mit ein paar Personalisierungsfragen:\nWie soll er dich nennen? Wie willst du ihn nennen? (Standard: \u0026ldquo;Claw\u0026rdquo;) Welchen Stil soll er haben? calm/clinical, warm, snarky, minimalist, proactive. Wähle, was zu dir passt Deine Zeitzone (sonst nimmt er UTC an) Alles was du hier einstellst, kannst du jederzeit später in der memory.md anpassen.\nVerlasse das TUI mit /exit.\nJetzt müssen wir noch den Telegram-Bot pairen. Öffne hierzu Telegram und gehe zu deinem neu erstellten Bot. Klicke auf \u0026ldquo;Start\u0026rdquo;, um den Bot zu aktivieren. Der Bot antwortet mit deiner Telegram User-ID, einem Pairing-Code und dem passenden Befehl:\nKopiere den kompletten Befehl inkl. Pairing-Code aus der Telegram-Nachricht und füge ihn in deinem Terminal auf dem Server ein. Ab jetzt kannst du direkt in Telegram mit deinem KI-Assistenten chatten.\nSchritt 6: Das Gateway Web-Interface nutzen OpenClaw hat ein grafisches Web-Interface (Gateway), über das du den Bot konfigurieren, Skills installieren, Modelle wechseln und Logs einsehen kannst.\nZugriff über SSH Port-Forwarding Da das Gateway auf 127.0.0.1:18789 gebunden ist (Loopback), kannst du es nicht direkt aufrufen. Der Zugriff läuft über SSH Port-Forwarding:\nÖffne ein zweites Terminal-Fenster auf deinem lokalen Rechner und führe aus:\nssh -N -L 18789:127.0.0.1:18789 deinname@DEINE_TAILSCALE_IP Dieser Befehl leitet Port 18789 vom Server auf deinen lokalen Rechner weiter. Es erscheint keine Ausgabe (das ist normal). Lass das Terminal offen.\nJetzt kannst du im Browser öffnen — aber mit dem Gateway-Token direkt in der URL, sonst bekommst du einen Unauthorized-Fehler:\nhttp://127.0.0.1:18789?token=DEIN_GATEWAY_TOKEN Falls du das Token nicht notiert hast, findest du es auf dem Server mit:\ngrep token ~/.openclaw/openclaw.json Kopiere den Wert hinter \u0026quot;token\u0026quot;: und setze ihn in die URL ein.\nWas du im Gateway tun kannst Modelle konfigurieren: LLM-Auswahl und Fallback-Regeln Skills installieren und verwalten: Über eine grafische Oberfläche (50+ eingebaute Skills) Logs einsehen: Sessions, Sub-Agenten, Fehler Cron-Jobs verwalten: Geplante Aufgaben erstellen und überwachen Channels verwalten: Telegram und andere Verbindungen Schritt 7: Memory optimieren Es gibt verschiedene Mechanismen, wie OpenClaw Wissen speichert. Die zwei wichtigsten sind Dateien auf dem Dateisystem:\nmemory.md (Langzeitspeicher): Wird vor jeder Aktion gelesen. Wenn du willst, dass der Agent etwas dauerhaft weiß, gehört es in diese Datei. Daily Memory (Tagesnotizen): Tägliche Notizen, die standardmäßig nur die letzten 2 Tage umfassen. Um die Memory-Fähigkeit zu verbessern, sind noch folgende Settings zu aktivieren. Gib deinem Bot einfach in Telegram folgende Anweisung:\n\u0026ldquo;Bitte setze compaction.memoryFlush.enabled auf true und memorySearch.experimental.sessionMemory auf true.\u0026rdquo;\nWas die beiden Settings bewirken:\ncompaction.memoryFlush.enabled sorgt dafür, dass OpenClaw bei langen Konversationen automatisch einen Memory-Flush auslöst. Wichtiger Kontext wird in die Memory-Dateien geschrieben, bevor die History komprimiert wird. memorySearch.experimental.sessionMemory bezieht auch aktuelle Session-Transkripte in die Gedächtnissuche ein, nicht nur die gespeicherten Memory-Dateien. QMD-Backend für vektorbasierte Gedächtnissuche Der Standard-Suchmechanismus ist begrenzt. Eine deutliche Verbesserung erreichst du durch das QMD-Backend: ein lokaler Search-Sidecar, der BM25, Vektoren und Reranking kombiniert. Deine Markdown-Dateien bleiben die Quelle der Wahrheit, OpenClaw nutzt QMD nur für die Suche.\nGib deinem Bot in Telegram folgende Anweisung:\n\u0026ldquo;Setze memory.backend = \u0026quot;qmd\u0026quot; in der Per-Config und installiere das QMD CLI. Stelle sicher, dass das qmd Binary im PATH ist.\u0026rdquo;\nOpenClaw richtet den Rest automatisch ein. Deine Memory-Dateien werden in Vektoren umgewandelt, und der Agent findet relevante Informationen auch dann, wenn die exakten Begriffe nicht übereinstimmen.\nDie gesamte Architektur auf einen Blick Dein Computer / Handy │ └── Tailscale VPN (verschlüsselter Tunnel) │ └── Hostinger Cloud-Firewall (nur UDP 41641) │ └── VPS (Debian) │ ├── SSH nur auf Tailscale-IP (ListenAddress) │ ├── Non-Root-User (kein Root-Login möglich) │ └── OpenClaw Jede Schicht fügt Schutz hinzu. Die Cloud-Firewall blockiert allen Traffic außer Tailscale. Nur deine autorisierten Geräte können durch den VPN-Tunnel. SSH hört nur auf die Tailscale-IP. OpenClaw läuft als Non-Root-User, Sudo braucht ein Passwort, das der Bot nicht kennt.\nHäufige Fehler vermeiden Auf dem Heimcomputer betreiben: Dein persönliches Gerät mit allen Zugangsdaten auf demselben System wie ein KI-Agent, der Code ausführt? Keine gute Idee.\nAls Root betreiben: Wenn jemand den Agent-Prozess ausnutzt und der als Root läuft: Game Over. Der Non-Root-User plus Sudo-Passwort ist dein letzter Schutz.\nKeine Firewall einrichten: Tailscale allein reicht nicht. Die Cloud-Firewall blockt Traffic auf Netzwerkebene, bevor er den Server überhaupt erreicht.\nAPI-Keys ohne Ausgabenlimits verwenden: Egal welche API-Keys für welchen Service du nutzt, setze immer Limits, um unerwartete Kosten zu vermeiden. Harte monatliche Obergrenzen sind Pflicht.\nFazit und Ausblick Dein OpenClaw-Assistent läuft jetzt auf einem VPS mit VPN, Firewall, eingeschränktem SSH und eigenem User. Kein Setup ist 100% sicher, aber die Angriffsfläche ist so klein wie möglich.\nIn Part 2 zeige ich dir, wie du OpenClaw produktiv einsetzt:\nZero-Trust-Prinzip für alle verbundenen Dienste Dual-Modell-Strategie mit Opus und Codex für optimale Kosten Telegram-Gruppen für organisierte Kommunikation Skills installieren, erstellen und über das Gateway verwalten Cron-Jobs für automatisierte Tasks Memory-Architektur mit Identity-, User- und Soul-Dateien Und in Part 3 geht es ans Eingemachte: fortgeschrittene Automatisierungen, Multi-Agent-Workflows und wie du OpenClaw nicht nur als persönlichen Assistenten nutzt, sondern ein Team aus mehreren KI-Agenten aufbaust, die rund um die Uhr verschiedene Aufgaben übernehmen.\nDu möchtest KI-Agenten wie OpenClaw in deinem Unternehmen einsetzen? Schreib mir auf LinkedIn oder buche einen kostenlosen Call.\n","permalink":"https://obogazkaya.me/blog/openclaw-sicher-einrichten-ki-assistent/","summary":"Komplettanleitung: OpenClaw sicher auf einem VPS mit Tailscale-VPN, Hostinger Cloud-Firewall und kostenoptimierter Modellstrategie einrichten, ohne deine Daten zu gefährden.","title":"Dein erster 24/7 KI-Assistent: OpenClaw sicher einrichten (Part 1)"},{"content":"SAP-Projekte starten fast immer gleich: Jemand kommt aus einem Meeting, hat handschriftliche Notizen, und irgendwann — Wochen später — steht ein Fachkonzept. In diesem Artikel zeige ich, wie 5 KI-Agenten diesen Prozess in 28 Minuten erledigen. Nicht perfekt, aber 80% der Arbeit. Der Rest bleibt beim Menschen.\nDas Problem Wer SAP-Projekte kennt, kennt den Weg von der Anforderung zur Spezifikation:\nMeeting mit dem Fachbereich (1 Tag) Anforderungen strukturieren (2–3 Tage) SAP-Objekte zuordnen — Tabellen, TCodes, BAPIs (2–3 Tage) Fachkonzept schreiben (3–5 Tage) Technische Spezifikation erstellen (2–3 Tage) QA-Review und Überarbeitung (1–2 Tage) Das sind 2–3 Wochen Beraterzeit. Bei Tagessätzen von 1.500–2.500 € schnell fünfstellig.\nDie Frage war: Wie viel davon ist Routinearbeit, die sich automatisieren lässt?\nDie Idee: Ein AI-Beraterteam Statt einem einzelnen AI-Prompt baue ich ein Team aus 5 spezialisierten Agenten. Jeder hat eine klare Rolle — wie in einem echten SAP-Projektteam:\n┌─────────────────────────────────────────────────────────┐ │ Claude Code Orchestrator │ │ (koordiniert alle 5 Agenten) │ └──────────┬──────┬──────┬──────┬──────┬──────────────────┘ │ │ │ │ │ ▼ ▼ ▼ ▼ ▼ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │ 01 │ │ 02 │ │ 03 │ │ 04 │ │ 05 │ └────┘ └────┘ └────┘ └────┘ └────┘ Req. SAP Func. ABAP QA Extr. Mapper Spec Advisor Review Die Agenten arbeiten sequenziell — jeder liest den Output des vorherigen Agenten und baut darauf auf. Genau wie in einem echten Projekt.\nProjektstruktur Das Setup ist bewusst einfach gehalten:\nsap-ai-team/ ├── knowledge_base/ ← SAP-Referenzdaten (das \u0026#34;Beraterwissen\u0026#34;) │ ├── sap_modules.json ← 8 Module (MM, SD, FI, CO, PP, WM, QM, HCM) │ ├── sap_tables.json ← 20 Tabellen mit Feldern │ ├── sap_tcodes.json ← 25 Transaktionscodes │ ├── sap_bapis.json ← 14 BAPIs und Funktionsbausteine │ └── sap_glossary.json ← 20 SAP-Begriffe ├── workspace/ ← Agenten schreiben hier ihre Ergebnisse ├── doc_generator/ ← Python-Script für Word-Export │ └── docx_builder.py ├── output/ ← Fertiges Word-Dokument ├── examples/ ← Beispiel-Input │ └── sample_requirements.txt └── CLAUDE.md ← Projektkontext für Claude Code Die Knowledge Base Das ist das \u0026ldquo;Beraterwissen\u0026rdquo; als JSON. Keine KI-Magie — einfach strukturierte SAP-Referenzdaten, die die Agenten als Grundlage nutzen:\nsap_modules.json — SAP-Module mit Prozessen und Abhängigkeiten:\n{ \u0026#34;code\u0026#34;: \u0026#34;MM\u0026#34;, \u0026#34;name\u0026#34;: \u0026#34;Materials Management\u0026#34;, \u0026#34;description\u0026#34;: \u0026#34;Handles procurement, purchasing, inventory management...\u0026#34;, \u0026#34;key_processes\u0026#34;: [\u0026#34;Purchase Requisition\u0026#34;, \u0026#34;Purchase Order\u0026#34;, \u0026#34;Goods Receipt\u0026#34;, ...], \u0026#34;related_modules\u0026#34;: [\u0026#34;FI\u0026#34;, \u0026#34;CO\u0026#34;, \u0026#34;PP\u0026#34;, \u0026#34;WM\u0026#34;, \u0026#34;QM\u0026#34;] } sap_tables.json — Tabellen mit wichtigen Feldern:\n{\u0026#34;table\u0026#34;: \u0026#34;EKKO\u0026#34;, \u0026#34;description\u0026#34;: \u0026#34;Purchasing Document Header\u0026#34;, \u0026#34;important_fields\u0026#34;: [\u0026#34;EBELN\u0026#34;, \u0026#34;BUKRS\u0026#34;, \u0026#34;BSTYP\u0026#34;, \u0026#34;BSART\u0026#34;, \u0026#34;LIFNR\u0026#34;, \u0026#34;EKORG\u0026#34;, \u0026#34;EKGRP\u0026#34;], \u0026#34;module\u0026#34;: \u0026#34;MM\u0026#34;} sap_tcodes.json — Transaktionscodes mit Use Cases:\n{\u0026#34;tcode\u0026#34;: \u0026#34;ME21N\u0026#34;, \u0026#34;description\u0026#34;: \u0026#34;Create Purchase Order\u0026#34;, \u0026#34;module\u0026#34;: \u0026#34;MM\u0026#34;, \u0026#34;use_case\u0026#34;: \u0026#34;Create new purchase orders with line items, pricing...\u0026#34;} sap_bapis.json — BAPIs für programmatische Integration:\n{\u0026#34;name\u0026#34;: \u0026#34;BAPI_PO_CREATE1\u0026#34;, \u0026#34;description\u0026#34;: \u0026#34;Create Purchase Order via BAPI\u0026#34;, \u0026#34;module\u0026#34;: \u0026#34;MM\u0026#34;, \u0026#34;key_parameters\u0026#34;: [\u0026#34;POHEADER\u0026#34;, \u0026#34;POHEADERX\u0026#34;, \u0026#34;POITEM\u0026#34;, ...]} sap_glossary.json — SAP-Terminologie:\n{\u0026#34;term\u0026#34;: \u0026#34;Release Strategy\u0026#34;, \u0026#34;definition\u0026#34;: \u0026#34;Configuration that defines approval workflow for purchasing documents...\u0026#34;, \u0026#34;sap_field\u0026#34;: \u0026#34;FRGSX\u0026#34;} In einem echten Setup würdest du diese Daten aus dem SAP-System selbst ziehen — z.B. über einen MCP-Connector, der SE11-Metadaten live abfragt. Für den Proof of Concept reichen die statischen JSON-Dateien.\nDie CLAUDE.md Die CLAUDE.md ist der Projektkontext, den Claude Code bei jedem Start liest. Hier definierst du, wie die Agenten kommunizieren:\n# SAP Spec Agent — Project Context ## How Agents Communicate - Agents work sequentially: 1 → 2 → 3 → 4 → 5 - Each agent reads the previous agent\u0026#39;s output from workspace/ - File naming convention: - Agent 1 writes: workspace/01_requirements.json - Agent 2 reads 01, writes: workspace/02_sap_mapping.json - Agent 3 reads 01 + 02, writes: workspace/03_functional_spec.json - Agent 4 reads 02 + 03, writes: workspace/04_technical_spec.json - Agent 5 reads ALL (01-04), writes: workspace/05_qa_review.json ## SAP Knowledge Base Agents 2, 3, and 4 MUST read knowledge_base/ files to inform their work. Der Input: Eine echte Meetingnotiz Hier der Realitätscheck. Das ist kein bereinigtes Template — es ist eine typische Meetingnotiz, wie sie in SAP-Projekten täglich anfallen:\nhey so we discussed in the meeting yesterday with Thomas from purchasing and Maria from finance. basically what we need is: the current purchase order approval process is too slow. right now everything over 5000 EUR needs to be approved by the department head but it takes forever because they have to go into SAP and check each PO manually. what we want: - automatic approval for POs under 1000 EUR - POs between 1000-5000 EUR should go to cost center manager - POs over 5000 EUR should go to department head AND finance controller - if any PO has items from a \u0026#34;critical\u0026#34; material group it should always go to department head regardless of amount - we need email notifications when a PO is waiting for approval - approvers should be able to approve from their phone somehow - we also want a report showing all POs pending approval and how long they\u0026#39;ve been waiting — Thomas wants this weekly - oh and Maria mentioned that the budget check should happen BEFORE the approval workflow starts, not after like it does now - also can we get the vendor rating somehow shown on the PO approval screen? timeline is Q2 this year. thomas says it\u0026#39;s urgent. Informell, unstrukturiert, mit offenen Fragen. Genau das, was ein Berater als Input bekommt.\nDie 5 Agenten im Detail Agent 1: Requirements Extractor Rolle: Senior SAP Business Analyst\nAufgabe: Lies die chaotische Meetingnotiz und extrahiere strukturierte Anforderungen.\nPrompt (gekürzt):\nYou are a senior SAP business analyst. Read examples/sample_requirements.txt and extract structured business requirements. For each requirement create: ID (REQ-001 format), title, detailed description, business process area, priority (must/should/could), open questions, and acceptance criteria. Also identify: project_context, assumptions, and out_of_scope items. Write valid JSON to workspace/01_requirements.json. Output: workspace/01_requirements.json\n{ \u0026#34;project_name\u0026#34;: \u0026#34;Purchase Order Approval Workflow Redesign\u0026#34;, \u0026#34;stakeholders\u0026#34;: [ {\u0026#34;name\u0026#34;: \u0026#34;Thomas\u0026#34;, \u0026#34;role\u0026#34;: \u0026#34;Key User\u0026#34;, \u0026#34;department\u0026#34;: \u0026#34;Purchasing\u0026#34;}, {\u0026#34;name\u0026#34;: \u0026#34;Maria\u0026#34;, \u0026#34;role\u0026#34;: \u0026#34;Key User\u0026#34;, \u0026#34;department\u0026#34;: \u0026#34;Finance\u0026#34;} ], \u0026#34;requirements\u0026#34;: [ { \u0026#34;id\u0026#34;: \u0026#34;REQ-001\u0026#34;, \u0026#34;title\u0026#34;: \u0026#34;Automatic Approval for Low-Value POs (\u0026lt; 1,000 EUR)\u0026#34;, \u0026#34;priority\u0026#34;: \u0026#34;must\u0026#34;, \u0026#34;acceptance_criteria\u0026#34;: [ \u0026#34;POs with total net value \u0026lt; 1,000 EUR are auto-approved without manual intervention\u0026#34;, \u0026#34;Auto-approval is logged for audit trail\u0026#34; ] }, ... ], \u0026#34;assumptions\u0026#34;: [ \u0026#34;SAP ECC 6.0 or S/4HANA is in use\u0026#34;, \u0026#34;Organizational hierarchy is maintained in HR-OM\u0026#34;, ... ], \u0026#34;open_questions\u0026#34;: [ \u0026#34;Which specific material groups are classified as critical?\u0026#34;, \u0026#34;Should approval be parallel or sequential for dual-approval?\u0026#34;, ... ] } 9 strukturierte Anforderungen, 9 Annahmen, 11 offene Fragen — aus einer informellen Meetingnotiz.\nAgent 2: SAP Mapper Rolle: Senior SAP Functional Consultant (15+ Jahre Erfahrung)\nAufgabe: Ordne jede Anforderung konkreten SAP-Objekten zu. Keine allgemeinen Vorschläge — echte Tabellen, echte TCodes, echte BAPIs.\nWas der Agent liest:\nworkspace/01_requirements.json Alle 5 Knowledge-Base-Dateien Output-Beispiel für REQ-001 (Auto-Approval):\n{ \u0026#34;requirement_id\u0026#34;: \u0026#34;REQ-001\u0026#34;, \u0026#34;module\u0026#34;: \u0026#34;MM\u0026#34;, \u0026#34;tcodes\u0026#34;: [ {\u0026#34;tcode\u0026#34;: \u0026#34;ME28\u0026#34;, \u0026#34;description\u0026#34;: \u0026#34;Release Purchase Order\u0026#34;, \u0026#34;usage\u0026#34;: \u0026#34;Manual release fallback\u0026#34;}, {\u0026#34;tcode\u0026#34;: \u0026#34;ME21N\u0026#34;, \u0026#34;description\u0026#34;: \u0026#34;Create Purchase Order\u0026#34;, \u0026#34;usage\u0026#34;: \u0026#34;PO creation triggering auto-release\u0026#34;} ], \u0026#34;tables\u0026#34;: [ {\u0026#34;table\u0026#34;: \u0026#34;EKKO\u0026#34;, \u0026#34;description\u0026#34;: \u0026#34;Purchasing Document Header\u0026#34;, \u0026#34;purpose\u0026#34;: \u0026#34;Read PO total value (GNETWR)\u0026#34;}, {\u0026#34;table\u0026#34;: \u0026#34;T16FS\u0026#34;, \u0026#34;description\u0026#34;: \u0026#34;Release Strategy\u0026#34;, \u0026#34;purpose\u0026#34;: \u0026#34;Release strategy configuration\u0026#34;} ], \u0026#34;bapis\u0026#34;: [ {\u0026#34;name\u0026#34;: \u0026#34;BAPI_PO_RELEASE\u0026#34;, \u0026#34;use_case\u0026#34;: \u0026#34;Programmatically approve POs under threshold\u0026#34;} ], \u0026#34;implementation_approach\u0026#34;: \u0026#34;configuration + custom_abap\u0026#34;, \u0026#34;enhancement_points\u0026#34;: [ {\u0026#34;type\u0026#34;: \u0026#34;BADI\u0026#34;, \u0026#34;name\u0026#34;: \u0026#34;ME_PROCESS_PO_CUST\u0026#34;, \u0026#34;description\u0026#34;: \u0026#34;Central PO processing hook\u0026#34;} ], \u0026#34;complexity\u0026#34;: \u0026#34;medium\u0026#34; } Der Agent hat für alle 9 Anforderungen SAP-Objekte zugeordnet — plus 7 Authorization Objects, 7 Integrationspunkte und 12 Testing-Überlegungen (inklusive Grenzwerttests bei 999,99 EUR und 5.000,01 EUR).\nAgent 3: Functional Spec Writer Rolle: Expert SAP Specification Author\nAufgabe: Schreibe ein vollständiges Fachkonzept mit AS-IS/TO-BE Prozessbeschreibung, Feldtabellen, Geschäftsregeln und Testfällen.\nWas der Agent liest:\nworkspace/01_requirements.json workspace/02_sap_mapping.json knowledge_base/sap_tables.json Highlights aus dem Output:\nAS-IS Prozess — Beschreibt den aktuellen manuellen Freigabeprozess mit allen Schwachstellen.\nTO-BE Prozess — 13-stufiger Ablauf vom PO-Anlegen bis zur Freigabe, mit allen Pfaden (Auto-Approval, Single, Dual, Critical Material Override).\nGeschäftsregeln — 53 dokumentierte Regeln, darunter:\nRegel Beschreibung BR-005 Der 1.000 EUR Schwellenwert ist exklusiv (strictly less than) BR-009 Segregation of Duties: Kostenstellenverantwortlicher darf nicht PO-Ersteller sein BR-014 Critical Material Group Override zählt als Department-Head-Freigabe im Dual-Approval Feldmapping — Echte SAP-Felder mit Tabelle, Datentyp und Validierung:\nFeld SAP-Feld Tabelle Typ Validierung PO Net Value GNETWR EKKO CURR Must be \u0026gt; 0 Material Group MATKL EKPO CHAR(9) Check against ZCRIT_MATGRP Cost Center KOSTL EKKN CHAR(10) Must exist in CSKS 28 Testfälle — inklusive Grenzwerttests:\nTest Beschreibung Erwartetes Ergebnis TC-002 PO mit 999,99 EUR Auto-Approval TC-003 PO mit 1.000,00 EUR Route zu Cost Center Manager TC-006 PO mit 5.000,00 EUR Route zu Cost Center Manager (exklusiv) TC-007 PO mit 5.000,01 EUR Route zu Dept Head + Finance Controller Agent 4: ABAP Technical Advisor Rolle: Senior ABAP Developer \u0026amp; Technical Architect\nAufgabe: Erstelle eine technische Spezifikation mit Entwicklungsobjekten, Pseudo-ABAP-Code und Aufwandsschätzung.\nWas der Agent liest:\nworkspace/02_sap_mapping.json workspace/03_functional_spec.json knowledge_base/sap_bapis.json 15 Entwicklungsobjekte — alle mit Z_-Prefix und Pseudo-Code:\nMETHOD if_me_process_po_cust~process_header. DATA: lv_total TYPE netwr, lv_eur TYPE netwr. * Get PO total value lv_total = im_header-\u0026gt;get_data( )-gnetwr. * Convert to EUR if needed IF im_header-\u0026gt;get_data( )-waers \u0026lt;\u0026gt; \u0026#39;EUR\u0026#39;. CALL FUNCTION \u0026#39;CONVERT_TO_LOCAL_CURRENCY\u0026#39; EXPORTING date = sy-datum foreign_amount = lv_total foreign_currency = im_header-\u0026gt;get_data( )-waers local_currency = \u0026#39;EUR\u0026#39; type_of_rate = \u0026#39;M\u0026#39; IMPORTING local_amount = lv_eur. ELSE. lv_eur = lv_total. ENDIF. * Auto-release for POs under 1000 EUR IF lv_eur \u0026lt; 1000. CALL FUNCTION \u0026#39;BAPI_PO_RELEASE\u0026#39; EXPORTING purchaseorder = im_header-\u0026gt;get_data( )-ebeln po_rel_code = \u0026#39;SA\u0026#39;. CALL FUNCTION \u0026#39;BAPI_TRANSACTION_COMMIT\u0026#39; EXPORTING wait = \u0026#39;X\u0026#39;. ENDIF. ENDMETHOD. Aufwandsschätzung:\nObjekt Typ Aufwand (Tage) Komplexität ZCL_IM_ME_PROCESS_PO BAdI Implementation 4 Hoch Z_PO_APPROVAL_WF Workflow Template 7 Hoch Z_FIORI_PO_APPROVE_EXT Fiori Extension 6 Hoch Z_PO_PENDING_APPROVAL ALV Report 3 Mittel ZCL_PO_BUDGET_CHECK Budget-Prüfung 4 Hoch \u0026hellip; \u0026hellip; \u0026hellip; \u0026hellip; Gesamt 67 Tage Aufschlüsselung: 46 Tage Entwicklung + 16 Tage Unit-Testing + 5 Tage Dokumentation.\nAgent 5: QA Reviewer Rolle: Senior QA \u0026amp; Compliance Reviewer\nAufgabe: Prüfe ALLE 4 vorherigen Dokumente auf Vollständigkeit, Konsistenz, Risiken und Lücken.\nWas der Agent liest: Alle 4 workspace-Dateien.\nUnd hier wird es spannend. Der QA-Agent ist kein Rubber Stamp:\nErgebnis: Amber — 82% — Nicht freigabereif\n┌─────────────────────────────────┐ │ QA-Ergebnis: AMBER 82% │ │ │ │ ● 2 Kritisch │ │ ● 6 Major │ │ ● 6 Minor │ │ ● 3 Hinweise │ │ │ │ Empfehlung: Needs Rework │ └─────────────────────────────────┘ Die kritischen Findings:\nQA-F-001 (Kritisch): Die Liste der kritischen Warengruppen fehlt. Ohne sie kann das System nicht konfiguriert werden. Der Agent empfiehlt: Workshop innerhalb einer Woche mit Thomas einberufen.\nQA-F-005 (Major): Der SAP Mapper (Agent 2) verwendet EKKO-NETWR als Header-Feld — das existiert nicht im SAP-Standard. Korrekt ist EKKO-GNETWR. Die Agenten 3 und 4 verwenden es richtig, aber die Inkonsistenz in Dokument 2 könnte Entwickler verwirren.\nQA-F-006 (Major): Die WBS-Budgetprüfung ist im Pseudo-Code nur als Platzhalter implementiert. POs mit WBS-Kontierung würden die Budgetprüfung stillschweigend überspringen.\nQA-F-015 (Hinweis): Die 67 Tage Aufwand sind reine Entwicklungszeit. Integrationstests, UAT, Performance-Tests und Cutover fehlen. Realistisch: 95–110 Tage.\nDas ist der überzeugendste Teil des gesamten Projekts: Die KI überprüft sich selbst und findet echte Fehler. Kein SAP-Experte musste draufschauen, damit der NETWR/GNETWR-Fehler auffällt.\nDen ganzen Prozess starten Den Prompt jedes Mal neu eintippen? Muss nicht sein. Claude Code hat Custom Agents und Slash-Commands — damit wird die ganze Pipeline zu einem einzigen Befehl.\nDie Struktur:\nsap-ai-team/ └── .claude/ ├── agents/ │ ├── sap-requirements-extractor.md │ ├── sap-mapper.md │ ├── sap-spec-writer.md │ ├── sap-abap-advisor.md │ └── sap-qa-reviewer.md └── commands/ └── sap-fachkonzept.md Jede Datei unter agents/ definiert einen Agenten. Der Slash-Command in commands/ ruft sie der Reihe nach auf.\nDie 5 Agent-Definitionen .claude/agents/sap-requirements-extractor.md\n--- name: sap-requirements-extractor description: Extracts structured requirements from messy meeting notes --- You are a senior SAP business analyst. Read examples/sample_requirements.txt and extract structured requirements. For each requirement: ID (REQ-001), title, description, business process area, priority (must/should/could), open questions, acceptance criteria. Also capture: project_context, assumptions, out_of_scope. Write valid JSON to workspace/01_requirements.json. .claude/agents/sap-mapper.md\n--- name: sap-mapper description: Maps requirements to concrete SAP objects --- You are a senior SAP functional consultant with 15+ years experience. Read workspace/01_requirements.json and all files in knowledge_base/. For each requirement map: SAP module, TCodes, tables, BAPIs, enhancement points, authorization objects, integration touchpoints, complexity (low/medium/high). No generic suggestions — use the real objects from the knowledge base. Write valid JSON to workspace/02_sap_mapping.json. .claude/agents/sap-spec-writer.md\n--- name: sap-spec-writer description: Writes a complete SAP functional specification --- You are an expert SAP functional specification writer. Read workspace/01_requirements.json, workspace/02_sap_mapping.json, and knowledge_base/sap_tables.json. Write a complete functional spec with: AS-IS process, TO-BE process, business rules (with IDs like BR-001), field mapping table with SAP field names, data types and validation rules, test cases including edge cases. Write valid JSON to workspace/03_functional_spec.json. .claude/agents/sap-abap-advisor.md\n--- name: sap-abap-advisor description: Creates ABAP technical specification with effort estimate --- You are a senior ABAP developer and technical architect. Read workspace/02_sap_mapping.json, workspace/03_functional_spec.json, and knowledge_base/sap_bapis.json. Create a technical spec with: all development objects (Z_ prefix), pseudo-ABAP code for key logic, effort estimate per object in days (split: development / unit test / documentation). Write valid JSON to workspace/04_technical_spec.json. .claude/agents/sap-qa-reviewer.md\n--- name: sap-qa-reviewer description: QA review across all 4 previous agent outputs --- You are a senior SAP QA and compliance reviewer. Read ALL files in workspace/ (01 through 04). Check for: completeness, consistency between documents, missing requirements, incorrect SAP field names or table references, unrealistic estimates, compliance gaps (authorization, audit trail, segregation of duties). Rate each finding: Critical / Major / Minor / Note. Give an overall score (0–100%) and a release recommendation (Green/Amber/Red). Write valid JSON to workspace/05_qa_review.json. Der Slash-Command .claude/commands/sap-fachkonzept.md\nRun the SAP spec agent pipeline sequentially: 1. Use agent sap-requirements-extractor 2. Use agent sap-mapper 3. Use agent sap-spec-writer 4. Use agent sap-abap-advisor 5. Use agent sap-qa-reviewer Each agent reads the previous outputs from workspace/ before writing its own. All agents working with SAP objects must read the relevant knowledge_base/ files. Ausführen Meetingnotiz in examples/sample_requirements.txt ablegen, dann in Claude Code:\n/sap-fachkonzept Das war\u0026rsquo;s. Claude Code startet alle 5 Agenten nacheinander, die Datei-Übergaben laufen automatisch. Nach ~28 Minuten liegen die JSON-Outputs im workspace/-Ordner.\nDas Word-Dokument generieren Der letzte Schritt: Aus den 5 JSON-Dateien ein professionelles Word-Dokument erstellen.\nsource .venv/bin/activate python doc_generator/docx_builder.py ============================================================ SAP Functional Specification — Document Generator ============================================================ Loading workspace files... Loading knowledge base glossary... Building document... Section 1 — Business Overview Section 2 — Requirements Section 3 — SAP Object Mapping Section 4 — Functional Specification Section 5 — Technical Specification Section 6 — Test Cases Section 7 — QA Review Appendix — SAP Glossary Document saved to: output/SAP_Functional_Spec_20260226_160649.docx ============================================================ Das Ergebnis: 83 Seiten, professionell formatiert, mit gestalteten Tabellen, SAP-Glossar im Anhang und Monospace-Font für ABAP-Code. Bereit für die Kundenabstimmung.\nTipp: Den Python-Code kannst du dir sparen. Es gibt MCP-Connectoren für Claude Code, die Word-Dokumente direkt erzeugen — z.B. den Office-Word-MCP-Server oder mcp-pandoc. Einmal eingerichtet, kann ein sechster Agent den Spec-Output direkt als .docx schreiben, ohne externes Script.\nDie Ergebnisse Metrik Wert Anforderungen extrahiert 9 Geschäftsregeln dokumentiert 53 Testfälle erstellt 28 ABAP-Objekte entworfen 15 QA-Findings identifiziert 17 Geschätzte Aufwandstage 67 Gesamtdauer 28 Minuten Token-Verbrauch ~305.000 (Agenten) API-Kosten je nach Modell: 3–18 € Was als Nächstes möglich wäre Das Setup hier ist bewusst einfach. Ohne externe Anbindungen, ohne Custom Skills. Die nächsten Ausbaustufen:\nEigene Agent Skills pro Kundenkontext:\nFür jeden SAP-Kunden eigene Agent-Definitionen mit kundenspezifischen Namenskonventionen, Z-Objektpräfixen und Customizing-Logik. Statt eines generischen /sap-fachkonzept dann z.B. /sap-fachkonzept-kunde-xyz.\nMCP-Connectoren:\nSAP-System direkt anbinden — Tabellen-Metadaten live aus SE11 Jira/Azure DevOps — Anforderungen direkt aus Tickets Confluence/SharePoint — Spec automatisch veröffentlichen Eigene Knowledge Base:\nSAP Help Portal als RAG-Quelle statt statischer JSON-Dateien OSS Notes für bekannte Probleme und Lösungen Firmenspezifische SAP-Best-Practices Fazit Ersetzt KI den SAP-Berater? Nein. Aber sie automatisiert den Großteil der wiederkehrenden Arbeit — in Minuten statt Tagen.\nDie 5 Agenten liefern 80% des Fachkonzepts. Den Rest — Stakeholder-Entscheidungen, die feinen Konfigurationsdetails, die eine Einstellung in SPRO, die alles zum Laufen bringt — das bleibt beim Menschen.\nDer spannendste Teil: Der QA-Agent, der die eigene Pipeline kritisiert und echte Fehler findet. Das ist kein Rubber Stamp. Das ist ein System, das sich selbst hinterfragt.\n28 Minuten. 83 Seiten. 82% QA-Score. Nicht perfekt — aber ein Vorsprung, der sich nicht ignorieren lässt.\nDu möchtest ein Multi-Agenten-System für SAP-Projekte in deinem Unternehmen einsetzen? Dann schreib mir einfach auf LinkedIn oder buche direkt einen kostenlosen Call.\n","permalink":"https://obogazkaya.me/blog/sap-ai-agent-team-funktionale-spezifikation/","summary":"Wie ich mit Claude Code Agent Teams ein 83-seitiges SAP-Fachkonzept aus einer chaotischen Meetingnotiz generiert habe — in 28 Minuten statt 2 Wochen.","title":"SAP Fachkonzept in 28 Minuten: 5 KI-Agenten ersetzen den Beratungsprozess"},{"content":"Ausgangslage Kassenzettel stapeln sich im Geldbeutel, verblassen nach wenigen Wochen und landen am Ende manuell in einer Tabelle. Wer mehrere Belege pro Woche erfasst, verliert schnell den Überblick, besonders wenn Belege aus verschiedenen Ländern in unterschiedlichen Währungen hinzukommen. Die Folge: fehlerhafte Buchhaltung, fehlende Nachweise für die Steuererklärung und viel unnötige Handarbeit.\nDas Ziel war ein Workflow, der den gesamten Prozess auf eine einzige Aktion reduziert: Foto aufnehmen, an den Bot schicken, fertig.\nVorgehen und Lösung Wir haben einen n8n-Workflow gebaut, der Kassenzettel vollautomatisch vom Foto bis zur archivierten Tabellenzeile verarbeitet.\nBildempfang: Ein Telegram-Bot empfängt das Foto direkt im Chat. Der Nutzer braucht keine App, kein Login, kein Formular.\nTexterkennung: Das Bild wird an einen OCR-Dienst übergeben, der speziell für schlechte Druckqualität und Thermodruck optimiert ist. Hochskalierung und Tabellenerkennungsmodus verbessern die Genauigkeit bei realen Kassenzetteln erheblich.\nKI-Extraktion: Der rohe OCR-Text ist unstrukturiert und variiert je nach Händler stark. Statt fragiler Regex-Logik übernimmt ein Sprachmodell die Extraktion. Es liest den Text und liefert strukturierte Felder: Geschäft, Kategorie, Datum, Betrag, Währung und Artikelliste.\nArchivierung: Das Belegfoto wird mit einem sprechenden Dateinamen in Google Drive abgelegt. Die extrahierten Daten landen als neue Zeile in Google Sheets, mit fortlaufender Belegnummer.\nBestätigung: Der Bot antwortet direkt im Telegram-Chat mit einer Zusammenfassung: Geschäft, Betrag, Kategorie und Link zur Tabelle.\nArchitekturübersicht:\nTelegram (Foto) → n8n → OCR → KI-Extraktion → Google Drive + Google Sheets → Telegram (Bestätigung) Tech-Stack n8n als Workflow-Engine (self-hosted) ocr.space für Texterkennung gpt-4o-mini (via OpenRouter) für strukturierte Datenextraktion Telegram Bot API als Nutzer-Schnittstelle Google Sheets und Google Drive für Datenspeicherung und Archivierung Das Ergebnis Durch diesen Ansatz konnten wir insbesondere folgendes erreichen:\nKein manuelles Abtippen mehr. Jeder Beleg wird in Sekunden vollständig erfasst, ohne dass der Nutzer etwas eintippen muss. Automatische Kategorisierung. Die KI ordnet jeden Beleg zuverlässig einer Ausgabenkategorie zu: Lebensmittel, Gesundheit, Transport, Restaurant und weitere. Mehrsprachigkeit und Mehrwährung. Belege auf Deutsch, Englisch und Französisch werden erkannt, EUR, CHF und USD automatisch unterschieden. Lückenlose Archivierung. Jedes Bild liegt mit Datum und Kategorie im Namen in Google Drive, jede Transaktion ist in Google Sheets nachvollziehbar. Geringe Einstiegshürde. Telegram ist auf jedem Smartphone vorhanden. Kein separates Tool, kein Onboarding. Fazit Der Beleg-Bot zeigt, wie ein alltäglicher Prozess mit wenigen Bausteinen komplett automatisiert werden kann. OCR und KI ergänzen sich dabei ideal: Die Texterkennung liefert den rohen Text, das Sprachmodell macht daraus strukturierte Daten. Wer regelmäßig Belege erfasst, gewinnt damit spürbar Zeit und erhält eine saubere, jederzeit durchsuchbare Beleghistorie.\nDu möchtest Geschäftsprozesse automatisieren? Schreib mir auf LinkedIn oder buche einen kostenlosen Call.\n","permalink":"https://obogazkaya.me/projects/telegram-beleg-bot/","summary":"Automatische Bilderkennung und Verarbeitung via Telegram und OCR für die automatische Kategorisierung und Übersicht von Belegen.","title":"Rechnungsverwaltung mit KI"},{"content":"Das Problem: Strukturierte Daten aus Text extrahieren Du hast hunderte Geschäftsdokumente, E-Mails oder Berichte und musst daraus systematisch Informationen extrahieren:\nFirmennamen aus Verträgen Geldbeträge aus Rechnungen Personennamen aus Pressemitteilungen Produktbezeichnungen aus Spezifikationen Manuell ist das nicht skalierbar. Aber welcher automatisierte Ansatz ist der richtige?\nDie 4 NER-Ansätze im Überblick ┌─────────────────────────────────────────────────────────────────┐ │ NER APPROACHES: VON EINFACH BIS KI-POWERED │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ REGEX │────▶│ spaCy │────▶│ GLiNER │ │ │ │ │ │ │ │ │ │ │ │ Pattern- │ │ Rule-based │ │ Zero-shot │ │ │ │ Matching │ │ + Statistical│ │ NER Model │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ Schnell, │ │ Gute Balance │ │ Flexibel, │ │ │ │ Präzise │ │ Performance/ │ │ Custom │ │ │ │ aber rigide │ │ Genauigkeit │ │ Entity Types │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ │ │ ┌──────────────┐ │ │ │ LLM-based │ │ │ │ │ │ │ │ Höchste │ │ │ │ Genauigkeit │ │ │ └──────────────┘ │ │ │ │ │ ▼ │ │ ┌──────────────┐ │ │ │ Teuer, aber │ │ │ │ versteht │ │ │ │ Kontext │ │ │ └──────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────┘ Ansatz 1: Regex – Der Klassiker Regex ist perfekt für strukturierte, vorhersehbare Muster.\nBeispiel: E-Mail-Adressen und Geldbeträge extrahieren import re text = \u0026#34;\u0026#34;\u0026#34; Kontakt: max.mustermann@firma.de Rechnungsbetrag: EUR 12.500,00 Ansprechpartner: anna.schmidt@partner.com Summe: € 8.750,50 \u0026#34;\u0026#34;\u0026#34; # E-Mail-Adressen email_pattern = r\u0026#39;[\\w.-]+@[\\w.-]+\\.\\w+\u0026#39; emails = re.findall(email_pattern, text) print(f\u0026#34;E-Mails: {emails}\u0026#34;) # Output: [\u0026#39;max.mustermann@firma.de\u0026#39;, \u0026#39;anna.schmidt@partner.com\u0026#39;] # Geldbeträge (EUR/€ Format) money_pattern = r\u0026#39;(?:EUR|€)\\s*[\\d.,]+\u0026#39; amounts = re.findall(money_pattern, text) print(f\u0026#34;Beträge: {amounts}\u0026#34;) # Output: [\u0026#39;EUR 12.500,00\u0026#39;, \u0026#39;€ 8.750,50\u0026#39;] Wann Regex verwenden? Gut für Schlecht für E-Mail-Adressen Personennamen Telefonnummern Firmennamen Datumsformate Kontextabhängige Entitäten Postleitzahlen Variationen und Tippfehler Fazit: Regex ist schnell und präzise, aber nur für strukturierte Muster geeignet.\nAnsatz 2: spaCy – Der Industriestandard spaCy bietet trainierte NER-Modelle für Standard-Entitäten.\nInstallation und Modell laden pip install spacy python -m spacy download de_core_news_lg Beispiel: Entitäten aus Geschäftstext extrahieren import spacy nlp = spacy.load(\u0026#34;de_core_news_lg\u0026#34;) text = \u0026#34;\u0026#34;\u0026#34; Die BMW Group hat heute bekannt gegeben, dass CEO Oliver Zipse eine Investition von 2,5 Milliarden Euro in das Werk München plant. Der Aufsichtsrat tagt am 15. März 2026 in Berlin. \u0026#34;\u0026#34;\u0026#34; doc = nlp(text) for ent in doc.ents: print(f\u0026#34;{ent.text:25} → {ent.label_}\u0026#34;) Output:\nBMW Group → ORG Oliver Zipse → PER 2,5 Milliarden Euro → MONEY München → LOC 15. März 2026 → DATE Berlin → LOC spaCy Entity Types Label Bedeutung Beispiele PER Person Oliver Zipse, Angela Merkel ORG Organisation BMW Group, Deutsche Bank LOC Ort München, Berlin MONEY Geldbetrag 2,5 Milliarden Euro DATE Datum 15. März 2026 Wann spaCy verwenden? Gut für Schlecht für Standard-Entitäten (PER, ORG, LOC) Domänenspezifische Entitäten Deutsche/Englische Texte Custom Entity Types Produktionsumgebungen Zero-Shot ohne Training Batch-Verarbeitung Seltene Entitätstypen Ansatz 3: GLiNER – Zero-Shot Custom Entities GLiNER ist ein Zero-Shot NER-Modell: Du definierst beliebige Entity-Typen, ohne zu trainieren.\nInstallation pip install gliner Beispiel: Custom Entities extrahieren from gliner import GLiNER model = GLiNER.from_pretrained(\u0026#34;urchade/gliner_multi-v2.1\u0026#34;) text = \u0026#34;\u0026#34;\u0026#34; Die Tesla Model 3 Performance erreicht eine Reichweite von 547 km und beschleunigt in 3,3 Sekunden von 0 auf 100 km/h. CEO Elon Musk präsentierte das Update auf der CES 2026. \u0026#34;\u0026#34;\u0026#34; # Custom Entity Types definieren labels = [\u0026#34;Automodell\u0026#34;, \u0026#34;Reichweite\u0026#34;, \u0026#34;Beschleunigung\u0026#34;, \u0026#34;Person\u0026#34;, \u0026#34;Event\u0026#34;] entities = model.predict_entities(text, labels) for entity in entities: print(f\u0026#34;{entity[\u0026#39;text\u0026#39;]:30} → {entity[\u0026#39;label\u0026#39;]}\u0026#34;) Output:\nTesla Model 3 Performance → Automodell 547 km → Reichweite 3,3 Sekunden von 0 auf 100 km/h → Beschleunigung Elon Musk → Person CES 2026 → Event GLiNER vs spaCy Aspekt spaCy GLiNER Entity Types Vordefiniert Frei definierbar Training nötig? Für Custom: Ja Nein (Zero-Shot) Geschwindigkeit Schneller Langsamer Genauigkeit Hoch für Standard Hoch für Custom GPU empfohlen? Nein Ja Wann GLiNER verwenden? Gut für Schlecht für Domänenspezifische Entitäten Hohe Batch-Volumen Prototyping ohne Training Ressourcen-limitierte Umgebungen Wechselnde Entity-Typen Wenn spaCy ausreicht Ansatz 4: LLM-basierte Extraktion LLMs wie GPT-4 oder Claude verstehen Kontext und können komplexe Extraktionen durchführen.\nBeispiel mit OpenAI from openai import OpenAI import json client = OpenAI() text = \u0026#34;\u0026#34;\u0026#34; In der Vorstandssitzung vom 12.02.2026 wurde beschlossen, dass Dr. Maria Weber (CFO) und Thomas Klein (CTO) das Joint Venture mit Siemens AG im Wert von 450 Mio. EUR federführend verhandeln. Die Unterzeichnung ist für Q2 2026 geplant. \u0026#34;\u0026#34;\u0026#34; response = client.chat.completions.create( model=\u0026#34;gpt-4o\u0026#34;, messages=[ { \u0026#34;role\u0026#34;: \u0026#34;system\u0026#34;, \u0026#34;content\u0026#34;: \u0026#34;\u0026#34;\u0026#34;Extrahiere strukturierte Informationen aus dem Text. Antworte als JSON mit folgenden Feldern: - personen: Liste von {name, rolle} - organisationen: Liste von Firmennamen - geldbetraege: Liste von {betrag, waehrung} - termine: Liste von {datum, beschreibung}\u0026#34;\u0026#34;\u0026#34; }, {\u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, \u0026#34;content\u0026#34;: text} ], response_format={\u0026#34;type\u0026#34;: \u0026#34;json_object\u0026#34;} ) result = json.loads(response.choices[0].message.content) print(json.dumps(result, indent=2, ensure_ascii=False)) Output:\n{ \u0026#34;personen\u0026#34;: [ {\u0026#34;name\u0026#34;: \u0026#34;Dr. Maria Weber\u0026#34;, \u0026#34;rolle\u0026#34;: \u0026#34;CFO\u0026#34;}, {\u0026#34;name\u0026#34;: \u0026#34;Thomas Klein\u0026#34;, \u0026#34;rolle\u0026#34;: \u0026#34;CTO\u0026#34;} ], \u0026#34;organisationen\u0026#34;: [\u0026#34;Siemens AG\u0026#34;], \u0026#34;geldbetraege\u0026#34;: [ {\u0026#34;betrag\u0026#34;: \u0026#34;450 Mio.\u0026#34;, \u0026#34;waehrung\u0026#34;: \u0026#34;EUR\u0026#34;} ], \u0026#34;termine\u0026#34;: [ {\u0026#34;datum\u0026#34;: \u0026#34;12.02.2026\u0026#34;, \u0026#34;beschreibung\u0026#34;: \u0026#34;Vorstandssitzung\u0026#34;}, {\u0026#34;datum\u0026#34;: \u0026#34;Q2 2026\u0026#34;, \u0026#34;beschreibung\u0026#34;: \u0026#34;Geplante Unterzeichnung\u0026#34;} ] } Wann LLM-basierte Extraktion verwenden? Gut für Schlecht für Komplexe, kontextabhängige Extraktion Hohe Volumen (Kosten!) Strukturierte JSON-Ausgaben Latenz-kritische Anwendungen Relationen zwischen Entitäten Datenschutz-sensible Daten Unstrukturierte Dokumente Wenn einfachere Methoden reichen Vergleich: Welcher Ansatz für welchen Use Case? Performance-Vergleich Ansatz Geschwindigkeit Genauigkeit (Standard) Genauigkeit (Custom) Kosten Regex ⚡⚡⚡⚡⚡ ⚡⚡⚡⚡⚡ (für Pattern) ❌ Gratis spaCy ⚡⚡⚡⚡ ⚡⚡⚡⚡ ⚡⚡ (Training nötig) Gratis GLiNER ⚡⚡ ⚡⚡⚡ ⚡⚡⚡⚡ Gratis LLM ⚡ ⚡⚡⚡⚡⚡ ⚡⚡⚡⚡⚡ €€€ Entscheidungsbaum ┌─────────────────────────────────────────────────────────────────┐ │ WELCHER NER-ANSATZ? │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ Sind die Entitäten strukturiert (E-Mail, Datum, PLZ)? │ │ │ │ │ ├── JA → Regex │ │ │ │ │ └── NEIN ↓ │ │ │ │ Sind es Standard-Entitäten (Person, Ort, Organisation)? │ │ │ │ │ ├── JA → spaCy │ │ │ │ │ └── NEIN ↓ │ │ │ │ Hast du Zeit/Daten für Training? │ │ │ │ │ ├── JA → spaCy Custom Training │ │ │ │ │ └── NEIN ↓ │ │ │ │ Ist Latenz/Kosten kritisch? │ │ │ │ │ ├── JA → GLiNER │ │ │ │ │ └── NEIN → LLM-basiert │ │ │ └─────────────────────────────────────────────────────────────────┘ Kombinierter Ansatz: Das Beste aus allen Welten In der Praxis kombinierst du oft mehrere Ansätze:\nimport re import spacy from gliner import GLiNER def hybrid_extraction(text): results = {} # 1. Regex für strukturierte Daten results[\u0026#34;emails\u0026#34;] = re.findall(r\u0026#39;[\\w.-]+@[\\w.-]+\\.\\w+\u0026#39;, text) results[\u0026#34;phone\u0026#34;] = re.findall(r\u0026#39;\\+?[\\d\\s-]{10,}\u0026#39;, text) # 2. spaCy für Standard-Entitäten nlp = spacy.load(\u0026#34;de_core_news_lg\u0026#34;) doc = nlp(text) results[\u0026#34;persons\u0026#34;] = [ent.text for ent in doc.ents if ent.label_ == \u0026#34;PER\u0026#34;] results[\u0026#34;organizations\u0026#34;] = [ent.text for ent in doc.ents if ent.label_ == \u0026#34;ORG\u0026#34;] # 3. GLiNER für domänenspezifische Entitäten gliner = GLiNER.from_pretrained(\u0026#34;urchade/gliner_multi-v2.1\u0026#34;) custom_entities = gliner.predict_entities(text, [\u0026#34;Produktname\u0026#34;, \u0026#34;Technologie\u0026#34;]) results[\u0026#34;products\u0026#34;] = [e[\u0026#34;text\u0026#34;] for e in custom_entities if e[\u0026#34;label\u0026#34;] == \u0026#34;Produktname\u0026#34;] return results Fazit: Der richtige Ansatz für dein Projekt Quick Summary Du brauchst\u0026hellip; Verwende\u0026hellip; E-Mails, Telefonnummern, PLZ Regex Personen, Orte, Organisationen spaCy Custom Entities ohne Training GLiNER Komplexe, kontextabhängige Extraktion LLM Alles zusammen Hybrid-Ansatz Meine Empfehlung Starte mit spaCy – deckt 80% der Fälle ab Ergänze mit Regex – für strukturierte Muster Nutze GLiNER für Prototypen – schnell Custom Entities testen LLM nur wenn nötig – wenn Kontext entscheidend ist Die beste NER-Lösung ist die, die zu deinem Use Case passt – nicht die technisch aufwändigste.\nRessourcen spaCy Dokumentation GLiNER GitHub Hugging Face NER Models OpenAI Structured Outputs Du möchtest Entity Extraction oder NLP in deinem Unternehmen einsetzen? Dann schreib mir einfach auf LinkedIn oder buche direkt einen kostenlosen Call.\n","permalink":"https://obogazkaya.me/blog/ner-entity-extraction-vergleich/","summary":"Ein praktischer Vergleich von 4 NER-Ansätzen: Regex, spaCy, GLiNER und LLM-basierte Extraktion. Welcher passt zu deinem Use Case?","title":"NER im Vergleich: Von Regex bis KI-Modelle für Entity Extraction"},{"content":"Das Problem: Nutzerdaten verlassen deine Infrastruktur Jedes Mal, wenn deine Anwendung einen Prompt an OpenAI, GPT-4 oder ein anderes Cloud-LLM sendet, verlässt dieser Text deine eigene Infrastruktur. Für die meisten Anwendungsfälle ist das unproblematisch — aber sobald deine Prompts personenbezogene Daten (PII) enthalten, hast du ein ernstes Problem.\nSo sieht PII in echten Prompts aus:\n\u0026#34;Fasse diesen E-Mail-Thread mit john.smith@acmecorp.com zusammen. Es geht um die Rechnung über 14.500 € an Herrn John Smith, geb. 12.03.1985, wohnhaft Ahornstraße 42, 80331 München.\u0026#34; Dieser einzelne Prompt enthält:\nEine E-Mail-Adresse Einen vollständigen Namen Ein Geburtsdatum Eine Postanschrift Einen Geldbetrag, der einer Person zugeordnet ist Das unverschlüsselt an OpenAI zu senden, erzeugt Compliance-Risiken unter DSGVO, CCPA, HIPAA und den meisten unternehmensinternen Sicherheitsrichtlinien. OpenAI bietet zwar eine Zero-Data-Retention-Option an, aber vertragliche Kontrollen verhindern nicht, dass die Daten die eigene Infrastruktur überhaupt verlassen.\nDie Lösung: Prompt abfangen, PII anonymisieren, bereinigten Text an OpenAI senden, Originalwerte in der Antwort wiederherstellen — für den Endnutzer vollkommen transparent.\nMicrosoft Presidio im Überblick Microsoft Presidio ist ein quelloffenes SDK zur Erkennung und Anonymisierung von PII. Es wurde vom Datenwissenschaftsteam von Microsoft entwickelt, ist produktionsreif, erweiterbar und kostenlos.\n┌─────────────────────────────────────────────────────────────────┐ │ MICROSOFT PRESIDIO — KERNARCHITEKTUR │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────┐ ┌────────────────────────────┐ │ │ │ presidio-analyzer │ │ presidio-anonymizer │ │ │ │ │ │ │ │ │ │ Erkennt PII im Text │──────▶│ Ersetzt PII durch │ │ │ │ via NLP + Regex │ │ Platzhalter oder Ops │ │ │ │ │ │ │ │ │ │ Liefert: │ │ Operatoren: │ │ │ │ - Entity-Typ │ │ - replace (Platzhalter) │ │ │ │ - Start/End-Offset │ │ - redact (entfernen) │ │ │ │ - Konfidenzwert │ │ - hash (SHA256) │ │ │ └─────────────────────┘ │ - encrypt (AES) │ │ │ │ - custom (eigene Fkt.) │ │ │ └────────────────────────────┘ │ │ │ └───────────────────────────────────────────────────────────────────┘ Kernfunktionen im Überblick Funktion Beschreibung 50+ eingebaute Recognizer E-Mail, Telefon, SSN, IBAN, Kreditkarte, Reisepass, IP-Adresse u.v.m. Mehrsprachige Unterstützung Englisch, Deutsch, Spanisch, Französisch, Italienisch über spaCy-Modelle Eigene Recognizer Regex- oder ML-basierte Erkenner für domänenspezifische Entitäten Pluggbare Anonymisierer Ersetzen, entfernen, hashen, verschlüsseln oder eigene Transformation Hohe Performance Verarbeitet tausende Texte pro Sekunde; läuft vollständig lokal Keine Datenweitergabe Analyzer und Anonymizer laufen on-premises — nur der bereinigte Text erreicht die Cloud Unterstützte PII-Typen (Auswahl) Entität Beispiele PERSON John Smith, Dr. Maria Weber EMAIL_ADDRESS john@beispiel.de PHONE_NUMBER +49 89 12345678 CREDIT_CARD 4111 1111 1111 1111 IBAN_CODE DE89 3704 0044 0532 0130 00 DATE_TIME 12.03.1985, 15. Januar 2026 LOCATION Ahornstraße 42, München IP_ADDRESS 192.168.0.1 Installation pip install presidio-analyzer presidio-anonymizer spacy fastapi openai uvicorn python -m spacy download de_core_news_lg Grundlegende Erkennung und Anonymisierung Bevor wir den vollständigen Proxy aufbauen, schauen wir uns die Kern-API von Presidio an.\nfrom presidio_analyzer import AnalyzerEngine from presidio_anonymizer import AnonymizerEngine analyzer = AnalyzerEngine() anonymizer = AnonymizerEngine() text = ( \u0026#34;Bitte kontaktiere john.smith@acmecorp.com oder ruf +49 89 12345678 an. \u0026#34; \u0026#34;Seine Kreditkartennummer lautet 4111 1111 1111 1111.\u0026#34; ) # Schritt 1: PII erkennen results = analyzer.analyze(text=text, language=\u0026#34;de\u0026#34;) for r in results: print(f\u0026#34;{r.entity_type:20} | Score: {r.score:.2f} | \u0026#39;{text[r.start:r.end]}\u0026#39;\u0026#34;) Ausgabe:\nEMAIL_ADDRESS | Score: 1.00 | \u0026#39;john.smith@acmecorp.com\u0026#39; PHONE_NUMBER | Score: 0.75 | \u0026#39;+49 89 12345678\u0026#39; CREDIT_CARD | Score: 1.00 | \u0026#39;4111 1111 1111 1111\u0026#39; # Schritt 2: Anonymisieren anonymized = anonymizer.anonymize(text=text, analyzer_results=results) print(anonymized.text) Ausgabe:\nBitte kontaktiere \u0026lt;EMAIL_ADDRESS\u0026gt; oder ruf \u0026lt;PHONE_NUMBER\u0026gt; an. Seine Kreditkartennummer lautet \u0026lt;CREDIT_CARD\u0026gt;. Einfach und wirkungsvoll — aber dieser Ansatz hat einen gravierenden Haken.\nDas Informationsverlust-Problem Wenn jede E-Mail-Adresse durch denselben Platzhalter \u0026lt;EMAIL_ADDRESS\u0026gt; ersetzt wird, kann das Modell nicht mehr zwischen verschiedenen Entitäten desselben Typs unterscheiden.\nBeispiel-Prompt:\n\u0026#34;Leite diesen Thread an alice@vertrieb.de weiter und setze bob@recht.de in CC. Stelle sicher, dass alice@vertrieb.de den Anhang erhält.\u0026#34; Nach einfacher Anonymisierung:\n\u0026#34;Leite diesen Thread an \u0026lt;EMAIL_ADDRESS\u0026gt; weiter und setze \u0026lt;EMAIL_ADDRESS\u0026gt; in CC. Stelle sicher, dass \u0026lt;EMAIL_ADDRESS\u0026gt; den Anhang erhält.\u0026#34; Aus Sicht des Modells:\nAlle drei Platzhalter sehen identisch aus Es kann nicht erkennen, dass der erste und der dritte dieselbe Person sind Es kann Alice nicht von Bob unterscheiden Die Antwort wird ungenau oder falsch sein Außerdem: Wenn das Modell gebeten wird, eine Antwort an \u0026lt;EMAIL_ADDRESS\u0026gt; zu formulieren, enthält die Antwort, die der Nutzer zurückbekommt, ebenfalls \u0026lt;EMAIL_ADDRESS\u0026gt; — das ist für den Nutzer wertlos.\nEs gibt also zwei Probleme zu lösen:\nEindeutigkeit — jeder distinct PII-Wert braucht ein eindeutiges Token, damit das Modell erkennt, dass EMAIL_1 und EMAIL_2 verschiedene Personen sind Round-Trip-Konvertierung — Platzhalter in der Modellantwort müssen vor der Ausgabe an den Nutzer wieder in echte Werte zurückverwandelt werden Besserer Ansatz: Eindeutige Identifier mit Round-Trip-Konvertierung Die Lösung: eine sitzungsbezogene Zuordnungstabelle zwischen echten PII-Werten und eindeutigen Platzhaltern, die beim Response wieder umgekehrt wird.\n┌──────────────────────────────────────────────────────────────────┐ │ PII-PROXY — VOLLSTÄNDIGER REQUEST/RESPONSE-FLOW │ ├──────────────────────────────────────────────────────────────────┤ │ │ │ Nutzer-Prompt │ │ \u0026#34;Schreib an alice@co.de und bob@co.de\u0026#34; │ │ │ │ │ ▼ │ │ ┌──────────────────┐ Zuordnungstabelle: │ │ │ Presidio │ EMAIL_1 → alice@co.de │ │ │ Anonymisierer │ EMAIL_2 → bob@co.de │ │ │ (unique Tokens) │ │ │ └──────────────────┘ │ │ │ │ │ ▼ │ │ Bereinigter Prompt │ │ \u0026#34;Schreib an \u0026lt;EMAIL_ADDRESS_1\u0026gt; und \u0026lt;EMAIL_ADDRESS_2\u0026gt;\u0026#34; │ │ │ │ │ ▼ │ │ ┌──────────────────┐ │ │ │ OpenAI API │ ← Sieht nur Tokens, niemals echte PII │ │ └──────────────────┘ │ │ │ │ │ ▼ │ │ LLM-Antwort │ │ \u0026#34;Ich schicke den Bericht an \u0026lt;EMAIL_ADDRESS_1\u0026gt;, CC: \u0026lt;EMAIL_ADDRESS_2\u0026gt;.\u0026#34; │ │ │ │ │ ▼ │ │ ┌──────────────────┐ │ │ │ De-Anonymisierer│ Rücksuche in der Zuordnungstabelle │ │ └──────────────────┘ │ │ │ │ │ ▼ │ │ Endgültige Antwort an den Nutzer │ │ \u0026#34;Ich schicke den Bericht an alice@co.de, CC: bob@co.de.\u0026#34; │ │ │ └──────────────────────────────────────────────────────────────────┘ Der PII-Vault from presidio_analyzer import AnalyzerEngine from presidio_anonymizer import AnonymizerEngine class PIIVault: \u0026#34;\u0026#34;\u0026#34; Anonymisiert PII im Text mit eindeutigen sitzungsbezogenen Tokens und unterstützt Round-Trip-De-Anonymisierung. \u0026#34;\u0026#34;\u0026#34; def __init__(self): self.analyzer = AnalyzerEngine() self.anonymizer = AnonymizerEngine() # Ordnet Token → Originalwert zu, z.B. \u0026#34;\u0026lt;EMAIL_ADDRESS_1\u0026gt;\u0026#34; → \u0026#34;alice@co.de\u0026#34; self._mapping: dict[str, str] = {} # Zählt, wie viele Tokens je Typ bereits erstellt wurden self._counters: dict[str, int] = {} def _get_token(self, entity_type: str, value: str) -\u0026gt; str: \u0026#34;\u0026#34;\u0026#34;Gibt vorhandenes Token für einen Wert zurück oder erstellt ein neues.\u0026#34;\u0026#34;\u0026#34; for token, original in self._mapping.items(): if original == value: return token count = self._counters.get(entity_type, 0) + 1 self._counters[entity_type] = count token = f\u0026#34;\u0026lt;{entity_type}_{count}\u0026gt;\u0026#34; self._mapping[token] = value return token def anonymize(self, text: str, language: str = \u0026#34;de\u0026#34;) -\u0026gt; str: \u0026#34;\u0026#34;\u0026#34;Ersetzt PII im Text durch eindeutige nummerierte Tokens.\u0026#34;\u0026#34;\u0026#34; results = self.analyzer.analyze(text=text, language=language) results.sort(key=lambda r: r.start, reverse=True) anonymized = text for result in results: original_value = text[result.start:result.end] token = self._get_token(result.entity_type, original_value) anonymized = anonymized[:result.start] + token + anonymized[result.end:] return anonymized def deanonymize(self, text: str) -\u0026gt; str: \u0026#34;\u0026#34;\u0026#34;Ersetzt Tokens im Text durch die ursprünglichen PII-Werte.\u0026#34;\u0026#34;\u0026#34; result = text for token, original in sorted(self._mapping.items(), key=lambda x: -len(x[0])): result = result.replace(token, original) return result @property def mapping(self) -\u0026gt; dict: return dict(self._mapping) Schnelltest vor dem API-Aufbau:\nvault = PIIVault() prompt = ( \u0026#34;Bitte leite das Dokument an alice@vertrieb.de und bob@recht.de weiter. \u0026#34; \u0026#34;Stelle sicher, dass alice@vertrieb.de als Hauptempfänger eingetragen ist.\u0026#34; ) anonymized = vault.anonymize(prompt) print(\u0026#34;Anonymisierter Prompt:\u0026#34;) print(anonymized) print() print(\u0026#34;Zuordnungstabelle:\u0026#34;) for token, value in vault.mapping.items(): print(f\u0026#34; {token} → {value}\u0026#34;) Ausgabe:\nAnonymisierter Prompt: Bitte leite das Dokument an \u0026lt;EMAIL_ADDRESS_1\u0026gt; und \u0026lt;EMAIL_ADDRESS_2\u0026gt; weiter. Stelle sicher, dass \u0026lt;EMAIL_ADDRESS_1\u0026gt; als Hauptempfänger eingetragen ist. Zuordnungstabelle: \u0026lt;EMAIL_ADDRESS_1\u0026gt; → alice@vertrieb.de \u0026lt;EMAIL_ADDRESS_2\u0026gt; → bob@recht.de Das Modell erhält zwei unterschiedliche Platzhalter und kann korrekt mit zwei verschiedenen Personen umgehen. Jetzt simulieren wir eine Antwort:\n# Simulierte LLM-Antwort mit Tokens llm_response = ( \u0026#34;Ich habe den Entwurf fertiggestellt. Die E-Mail geht an \u0026lt;EMAIL_ADDRESS_1\u0026gt;, \u0026#34; \u0026#34;\u0026lt;EMAIL_ADDRESS_2\u0026gt; wird in CC gesetzt.\u0026#34; ) restored = vault.deanonymize(llm_response) print(restored) Ausgabe:\nIch habe den Entwurf fertiggestellt. Die E-Mail geht an alice@vertrieb.de, bob@recht.de wird in CC gesetzt. Der Nutzer sieht echte E-Mail-Adressen. OpenAI hat sie zu keinem Zeitpunkt gesehen.\nDen FastAPI-Proxy aufbauen Jetzt bauen wir das Ganze in eine FastAPI-Anwendung ein, die als transparenter Proxy zwischen deinem Frontend und der OpenAI API arbeitet.\n# main.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from openai import OpenAI import uuid from pii_vault import PIIVault # unsere Klasse von oben app = FastAPI(title=\u0026#34;PII-sicherer OpenAI-Proxy\u0026#34;) openai_client = OpenAI() # liest OPENAI_API_KEY aus der Umgebung # In Produktion: Redis oder Datenbank mit Session-ID als Schlüssel verwenden. # Für dieses Beispiel reicht ein In-Memory-Store. session_store: dict[str, PIIVault] = {} class ChatRequest(BaseModel): session_id: str | None = None # optional; wird erzeugt falls nicht angegeben message: str model: str = \u0026#34;gpt-4o\u0026#34; system_prompt: str = \u0026#34;Du bist ein hilfreicher Assistent.\u0026#34; class ChatResponse(BaseModel): session_id: str message: str # de-anonymisierte Antwort anonymized_prompt: str # nur zum Debuggen (in Produktion entfernen) @app.post(\u0026#34;/chat\u0026#34;, response_model=ChatResponse) async def chat(request: ChatRequest): # 1. Vault für diese Session holen oder neu erstellen session_id = request.session_id or str(uuid.uuid4()) if session_id not in session_store: session_store[session_id] = PIIVault() vault = session_store[session_id] # 2. Nutzernachricht anonymisieren anonymized_message = vault.anonymize(request.message) # 3. OpenAI mit dem bereinigten Prompt aufrufen try: response = openai_client.chat.completions.create( model=request.model, messages=[ {\u0026#34;role\u0026#34;: \u0026#34;system\u0026#34;, \u0026#34;content\u0026#34;: request.system_prompt}, {\u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, \u0026#34;content\u0026#34;: anonymized_message}, ], ) except Exception as e: raise HTTPException(status_code=502, detail=str(e)) raw_reply = response.choices[0].message.content # 4. Modellantwort de-anonymisieren restored_reply = vault.deanonymize(raw_reply) return ChatResponse( session_id=session_id, message=restored_reply, anonymized_prompt=anonymized_message, # in Produktion entfernen ) @app.delete(\u0026#34;/session/{session_id}\u0026#34;) async def clear_session(session_id: str): \u0026#34;\u0026#34;\u0026#34;Entfernt die PII-Zuordnung einer Session aus dem Speicher.\u0026#34;\u0026#34;\u0026#34; session_store.pop(session_id, None) return {\u0026#34;status\u0026#34;: \u0026#34;gelöscht\u0026#34;} Server starten:\nuvicorn main:app --reload Den Proxy testen curl -X POST http://localhost:8000/chat \\ -H \u0026#34;Content-Type: application/json\u0026#34; \\ -d \u0026#39;{ \u0026#34;message\u0026#34;: \u0026#34;Fasse den Vertrag zwischen Alice Braun (alice@firma.de) und Bob Müller (bob@lieferant.de) zusammen. Alices Geburtsdatum ist der 15.06.1990.\u0026#34;, \u0026#34;model\u0026#34;: \u0026#34;gpt-4o\u0026#34; }\u0026#39; Antwort:\n{ \u0026#34;session_id\u0026#34;: \u0026#34;3f7a2c1d-...\u0026#34;, \u0026#34;message\u0026#34;: \u0026#34;Der Vertrag besteht zwischen Alice Braun und Bob Müller. Alices Geburtsdatum ist der 15. Juni 1990. Die wichtigsten Punkte sind ...\u0026#34;, \u0026#34;anonymized_prompt\u0026#34;: \u0026#34;Fasse den Vertrag zwischen \u0026lt;PERSON_1\u0026gt; (\u0026lt;EMAIL_ADDRESS_1\u0026gt;) und \u0026lt;PERSON_2\u0026gt; (\u0026lt;EMAIL_ADDRESS_2\u0026gt;) zusammen. \u0026lt;PERSON_1\u0026gt;s Geburtsdatum ist der \u0026lt;DATE_TIME_1\u0026gt;.\u0026#34; } OpenAI hat \u0026lt;PERSON_1\u0026gt;, \u0026lt;EMAIL_ADDRESS_1\u0026gt;, \u0026lt;DATE_TIME_1\u0026gt; verarbeitet — der Nutzer erhält echte Namen und Daten in der Antwort.\nGesamtarchitektur ┌──────────────────────────────────────────────────────────────────────┐ │ PRODUKTIONS-ARCHITEKTUR DES PII-PROXYS │ ├──────────────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────┐ HTTPS ┌────────────────────────────────────┐ │ │ │ Deine App / │ ─────────▶ │ FastAPI PII-Proxy │ │ │ │ Frontend │ │ │ │ │ └──────────────┘ │ POST /chat │ │ │ ▲ │ ┌──────────────────────────────┐ │ │ │ │ │ │ 1. Session-Vault laden │ │ │ │ │ de-anonymisierte │ │ 2. Presidio: PII erkennen │ │ │ │ │ Antwort │ │ 3. Durch Tokens ersetzen │ │ │ │ │ │ │ 4. OpenAI aufrufen │ │ │ │ │ │ │ 5. Token-Mapping umkehren │ │ │ │ │ │ │ 6. Bereinigte Antwort senden │ │ │ │ └────────────────────│ └──────────────────────────────┘ │ │ │ └────────────────┬───────────────────┘ │ │ │ nur bereinigter Prompt│ │ ▼ │ │ ┌────────────────────────────────────┐ │ │ │ OpenAI API (gpt-4o usw.) │ │ │ │ Sieht niemals echte PII │ │ │ └────────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ Session-Store (Redis / Datenbank) │ │ │ │ session_id → { \u0026#34;\u0026lt;EMAIL_1\u0026gt;\u0026#34;: \u0026#34;alice@co.de\u0026#34;, ... } │ │ │ └─────────────────────────────────────────────────────────────────┘ │ │ │ └────────────────────────────────────────────────────────────────────────┘ Mehrschrittige Konversationen Der sitzungsbasierte Vault ist besonders nützlich für mehrstufige Chats. Die Zuordnungstabelle bleibt über alle Nachrichten einer Session hinweg konsistent — das Modell kann zuvor erwähnte Entitäten korrekt referenzieren.\nclass ChatRequest(BaseModel): session_id: str | None = None messages: list[dict] # vollständige Konversationshistorie model: str = \u0026#34;gpt-4o\u0026#34; @app.post(\u0026#34;/chat/multi-turn\u0026#34;) async def chat_multi_turn(request: ChatRequest): session_id = request.session_id or str(uuid.uuid4()) if session_id not in session_store: session_store[session_id] = PIIVault() vault = session_store[session_id] # Nur die neueste Nutzernachricht anonymisieren (vorherige Turns bereits bereinigt) sanitised_messages = [] for i, msg in enumerate(request.messages): if msg[\u0026#34;role\u0026#34;] == \u0026#34;user\u0026#34; and i == len(request.messages) - 1: sanitised_messages.append({ \u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, \u0026#34;content\u0026#34;: vault.anonymize(msg[\u0026#34;content\u0026#34;]) }) else: sanitised_messages.append(msg) response = openai_client.chat.completions.create( model=request.model, messages=sanitised_messages, ) raw_reply = response.choices[0].message.content return { \u0026#34;session_id\u0026#34;: session_id, \u0026#34;message\u0026#34;: vault.deanonymize(raw_reply), } Produktionshinweise 1. Session-Speicherung Das In-Memory-Dict überlebt keine Neustarts und skaliert nicht horizontal. In der Produktion empfiehlt sich Redis mit TTL:\nimport redis, json r = redis.Redis(host=\u0026#34;localhost\u0026#34;, port=6379, decode_responses=True) SESSION_TTL = 3600 # 1 Stunde def save_vault(session_id: str, vault: PIIVault): r.setex(f\u0026#34;vault:{session_id}\u0026#34;, SESSION_TTL, json.dumps(vault.mapping)) def load_vault(session_id: str) -\u0026gt; PIIVault | None: data = r.get(f\u0026#34;vault:{session_id}\u0026#34;) if not data: return None vault = PIIVault() vault._mapping = json.loads(data) return vault 2. Konfidenzschwellen Presidio vergibt jedem Treffer einen Konfidenzwert. Niedrige Werte lassen sich herausfiltern, um Falschpositive zu reduzieren:\nresults = analyzer.analyze(text=text, language=\u0026#34;de\u0026#34;) high_confidence = [r for r in results if r.score \u0026gt;= 0.75] 3. Eigene Recognizer Domänenspezifische Muster lassen sich einfach ergänzen — zum Beispiel interne Mitarbeiter-IDs:\nfrom presidio_analyzer import PatternRecognizer, Pattern mitarbeiter_recognizer = PatternRecognizer( supported_entity=\u0026#34;MITARBEITER_ID\u0026#34;, patterns=[Pattern(name=\u0026#34;mitarbeiter_id\u0026#34;, regex=r\u0026#34;MA-\\d{6}\u0026#34;, score=1.0)], ) analyzer.registry.add_recognizer(mitarbeiter_recognizer) 4. Logging und Auditing Die Zuordnungstabelle darf niemals in Anwendungslogs erscheinen — das würde den gesamten Schutz aufheben. Protokolliere nur Metadaten:\nimport logging logger = logging.getLogger(__name__) # Richtig — nur Metadaten logger.info(f\u0026#34;Session {session_id}: {len(vault.mapping)} PII-Entitäten anonymisiert\u0026#34;) # Falsch — PII im Log # logger.info(f\u0026#34;Mapping: {vault.mapping}\u0026#34;) 5. Was Presidio nicht erkennt Presidio ist leistungsstark, aber nicht unfehlbar. Folgendes kann übersehen werden:\nKontextuell eingebettete PII wie „der Kollege aus dem Dienstagsmeeting\u0026quot; Verschleierte Werte wie alice [at] firma [punkt] de Seltene Eigennamen in wenig unterstützten Sprachen Domänenspezifische Identifikatoren ohne eigenen Recognizer Für hochsensible Pipelines empfiehlt sich ein zusätzlicher LLM-basierter Check oder die Kombination mit spaCy-NER-Ergebnissen.\nVergleich der Ansätze Ansatz OpenAI sieht Modell unterscheidet Entitäten? Nutzer sieht echte Werte? Keine Anonymisierung alice@co.de Ja Ja — aber PII wird übertragen Einfacher Platzhalter \u0026lt;EMAIL_ADDRESS\u0026gt; Nein — alle gleich Nein — Platzhalter in Antwort Eindeutige Tokens \u0026lt;EMAIL_ADDRESS_1\u0026gt; Ja Ja — de-anonymisiert Hash a3f4bc... Ja (opak) Nein — Hash unlesbar für Modell Eindeutige Tokens mit Round-Trip-Konvertierung bieten den besten Kompromiss: Datenschutz ohne Einbußen bei Modellgenauigkeit oder Nutzererlebnis.\nZusammenfassung Das haben wir aufgebaut:\nPresidio Analyzer erkennt PII im Nutzer-Prompt mit hoher Genauigkeit PIIVault ersetzt jeden distinct PII-Wert durch ein eindeutiges nummeriertes Token und speichert die Umkehrzuordnung FastAPI-Proxy fängt jeden Request ab, anonymisiert den Prompt, sendet ihn an OpenAI und de-anonymisiert die Antwort Sitzungsbezogene Zuordnungstabelle sorgt für konsistente Tokens innerhalb einer Konversation Redis-Speicherung macht die Lösung zustandslos, horizontal skalierbar und TTL-gesteuert Deine Nutzer erhalten präzise, kontextbezogene LLM-Antworten. OpenAI verarbeitet zu keinem Zeitpunkt echte personenbezogene Daten. Und dein Compliance-Team kann ruhig schlafen.\nRessourcen Microsoft Presidio auf GitHub Presidio Dokumentation FastAPI Dokumentation OpenAI Datenschutz-FAQ spaCy NER-Modelle Du möchtest KI-Systeme in deinem Unternehmen datenschutzkonform einsetzen und sicherstellen, dass sensible Daten deine Infrastruktur nie verlassen? Dann schreib mir einfach auf LinkedIn oder buche direkt einen kostenlosen Call.\n","permalink":"https://obogazkaya.me/blog/pii-redaction-presidio-fastapi/","summary":"Wie du sensible personenbezogene Daten aus deinen Prompts entfernst, bevor sie OpenAI erreichen — und sie in der Antwort wiederherstellst — mit Microsoft Presidio und einem FastAPI-Proxy.","title":"PII-Daten aus OpenAI API-Anfragen entfernen mit Presidio und FastAPI"},{"content":"Das Problem: ML ist kein einmaliges Projekt Die meisten ML-Projekte scheitern nicht an der Modellierung, sondern an der Erwartung, dass ein einmal trainiertes Modell \u0026ldquo;fertig\u0026rdquo; ist.\nTypischer Ablauf (der scheitert):\nDaten sammeln ✓ Modell trainieren ✓ Deployen ✓ \u0026hellip;und dann? Was passiert in der Realität:\nDaten ändern sich (Data Drift) Neue Edge Cases tauchen auf Performance degradiert über Zeit Niemand weiß, wie man das Modell verbessert Das Factory Model: ML als Produktionssystem Das Factory Model beschreibt ML-Entwicklung als kontinuierlichen, zyklischen Prozess – wie eine Fabrik, die immer bessere Produkte herstellt.\n┌─────────────────────────────────────────────────────────────────┐ │ THE ML FACTORY │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────┐ │ │ │ 1. COLLECT │ ◄────────────────────────────────┐ │ │ │ Data │ │ │ │ └──────┬───────┘ │ │ │ │ │ │ │ ▼ │ │ │ ┌──────────────┐ │ │ │ │ 2. LABEL │ │ │ │ │ Data │ │ │ │ └──────┬───────┘ │ │ │ │ │ │ │ ▼ │ │ │ ┌──────────────┐ │ │ │ │ 3. TRAIN │ │ │ │ │ Model │ │ │ │ └──────┬───────┘ │ │ │ │ │ │ │ ▼ │ │ │ ┌──────────────┐ │ │ │ │ 4. EVALUATE │ │ │ │ │ Model │ │ │ │ └──────┬───────┘ │ │ │ │ │ │ │ ▼ │ │ │ ┌──────────────┐ │ │ │ │ 5. ANALYZE │───────────────────────────────────┘ │ │ │ Shortcomings│ │ │ └──────────────┘ │ │ │ │ ═══════════════════════════════════════════════════════ │ │ Jede Iteration → Besseres Modell │ │ ═══════════════════════════════════════════════════════ │ │ │ └─────────────────────────────────────────────────────────────────┘ Der Zyklus im Detail 1. Collect Data\nSammle Daten aus der realen Anwendung Fokus auf Bereiche, wo das Modell schwach ist Systematisches Logging von Edge Cases 2. Label Data\nAnnotiere gesammelte Daten Priorisiere nach Schwächen des aktuellen Modells Qualitätskontrolle der Labels 3. Train Model\nTrainiere auf erweitertem Datensatz Experimentiere mit Architekturen Vergleiche mit vorheriger Version 4. Evaluate Model\nTeste auf Hold-out Set Analysiere Per-Class Performance Identifiziere systematische Fehler 5. Analyze Shortcomings\nWo versagt das Modell? Welche Daten fehlen? Zurück zu Schritt 1 Warum das Factory Model funktioniert Der Virtuous Loop Version 1: 70% Accuracy │ ├── Fehleranalyse: \u0026#34;Modell verwechselt Katzen mit Hunden\u0026#34; ├── Aktion: Mehr Katze/Hund-Bilder sammeln │ ▼ Version 2: 82% Accuracy │ ├── Fehleranalyse: \u0026#34;Modell versagt bei schlechter Beleuchtung\u0026#34; ├── Aktion: Bilder mit verschiedenen Lichtverhältnissen sammeln │ ▼ Version 3: 89% Accuracy │ ├── Fehleranalyse: \u0026#34;Seltene Rassen werden nicht erkannt\u0026#34; ├── Aktion: Long-tail Klassen gezielt erweitern │ ▼ Version 4: 94% Accuracy ... Jede Iteration ist gezielt: Man verbessert nicht blind, sondern adressiert spezifische Schwächen.\nDie Infrastruktur der ML-Factory Das Factory Model erfordert Investition in Infrastruktur – aber diese zahlt sich exponentiell aus.\nNotwendige Komponenten ┌─────────────────────────────────────────────────────────────────┐ │ ML FACTORY INFRASTRUCTURE │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │ │ Data Pipeline │ │ Label Platform │ │ Model Registry │ │ │ │ │ │ │ │ │ │ │ │ - Ingestion │ │ - Annotation UI │ │ - Versioning │ │ │ │ - Validation │ │ - QA Workflow │ │ - Experiments │ │ │ │ - Storage │ │ - Active Learn. │ │ - Comparison │ │ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │ │ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │ │ Training Infra │ │ Eval Pipeline │ │ Monitoring │ │ │ │ │ │ │ │ │ │ │ │ - GPU Cluster │ │ - Test Sets │ │ - Production │ │ │ │ - Hyperparams │ │ - Metrics │ │ - Data Drift │ │ │ │ - Automation │ │ - Error Analysi │ │ - Alerting │ │ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────┘ ROI der Infrastruktur Investition Einmalig Laufender Nutzen Data Pipeline 2-4 Wochen Automatische Datenerfassung Label Platform 1-2 Wochen 10x schnelleres Labeling Model Registry 1 Woche Reproduzierbare Experimente Eval Pipeline 2 Wochen Automatische Fehleranalyse Monitoring 1 Woche Früherkennung von Problemen Ohne Infrastruktur: Jede Iteration ist manueller Aufwand. Mit Infrastruktur: Der Zyklus läuft semi-automatisch.\nPraktisches Beispiel: Autonomes Fahren Die Factory in Aktion ┌─────────────────────────────────────────────────────────────────┐ │ ADAS FACTORY CYCLE │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ITERATION 1 │ │ ├── Collect: 100.000 km Testfahrten │ │ ├── Label: Verkehrsschilder annotieren │ │ ├── Train: CNN auf 50.000 Bilder │ │ ├── Evaluate: 92% Accuracy │ │ └── Shortcoming: Versagt bei Nacht │ │ │ │ ITERATION 2 │ │ ├── Collect: 50.000 km Nachtfahrten (gezielt!) │ │ ├── Label: Nacht-Szenarien priorisieren │ │ ├── Train: Erweiterter Datensatz │ │ ├── Evaluate: 95% Accuracy, Nacht 88% → 94% │ │ └── Shortcoming: Versagt bei Regen + Nacht │ │ │ │ ITERATION 3 │ │ ├── Collect: Regen-Nacht-Szenarien aus Simulation (CARLA) │ │ ├── Label: Automatisch aus Simulation │ │ ├── Train: Real + Synthetic Data │ │ ├── Evaluate: 97% Accuracy, Edge Cases abgedeckt │ │ └── Shortcoming: Neue Schildertypen in anderem Land │ │ │ │ ... und so weiter │ │ │ └─────────────────────────────────────────────────────────────────┘ Schlüssel-Einsichten Gezielte Datensammlung: Nicht mehr Daten, sondern die richtigen Daten Simulation als Multiplikator: Synthetic Data für seltene Edge Cases Kontinuierliche Verbesserung: Modell wird mit jeder Iteration robuster Anti-Patterns: Was die Factory sabotiert 1. \u0026ldquo;Fire and Forget\u0026rdquo; ❌ Modell einmal trainieren und deployen ✅ Kontinuierliches Monitoring und Iteration 2. \u0026ldquo;Mehr Daten = Besser\u0026rdquo; ❌ Blind mehr Daten sammeln ✅ Gezielt Daten für identifizierte Schwächen 3. \u0026ldquo;Accuracy ist alles\u0026rdquo; ❌ Nur auf Gesamtgenauigkeit schauen ✅ Per-Class Analyse, Edge Cases, Failure Modes 4. \u0026ldquo;Labeling ist ein einmaliger Aufwand\u0026rdquo; ❌ Einmal labeln, dann fertig ✅ Kontinuierliches Labeling als Teil des Prozesses 5. \u0026ldquo;Infrastruktur kommt später\u0026rdquo; ❌ Erst Modell, dann Pipeline ✅ Pipeline früh aufbauen, dann skalieren Wie man startet: Minimal Viable Factory Du brauchst nicht alles auf einmal. Starte mit dem Minimum:\nPhase 1: Der manuelle Loop (Woche 1-2) 1. Sammle erste Daten (manuell) 2. Labele in Spreadsheet/Tool 3. Trainiere erstes Modell 4. Evaluiere auf Test Set 5. Dokumentiere Fehler in Notion/Confluence 6. → Zurück zu 1 Ziel: Den Zyklus einmal durchlaufen, Schwächen verstehen.\nPhase 2: Semi-Automatisierung (Monat 1-2) 1. Data Pipeline aufsetzen (S3 + DVC) 2. Label-Tool einführen (Label Studio) 3. Training automatisieren (MLflow) 4. Eval-Dashboard bauen (Streamlit) 5. Error Analysis standardisieren Ziel: Iteration beschleunigen, von Wochen auf Tage.\nPhase 3: Vollständige Factory (Monat 3+) 1. Production Monitoring 2. Automatic Data Collection 3. Active Learning für Labeling 4. CI/CD für Modelle 5. A/B Testing in Production Ziel: Kontinuierliche Verbesserung mit minimalem manuellem Aufwand.\nTools für die ML-Factory Komponente Open Source Cloud Data Pipeline DVC, Airflow AWS S3 + Glue Labeling Label Studio Scale AI, Labelbox Experiment Tracking MLflow, W\u0026amp;B SageMaker, Vertex Model Registry MLflow SageMaker Registry Monitoring Evidently, Grafana Arize, Fiddler Orchestration n8n, Prefect Step Functions Key Takeaways Das Factory Model in einem Satz \u0026ldquo;ML ist keine einmalige Entwicklung, sondern ein kontinuierlicher Produktionsprozess, bei dem jede Iteration das Modell gezielt verbessert.\u0026rdquo;\nDie 5 Prinzipien Zyklisch denken: Plane von Anfang an für Iteration Fehler sind Daten: Jeder Fehler zeigt, welche Daten fehlen Infrastruktur früh: Pipeline-Investment zahlt sich aus Gezielt sammeln: Die richtigen Daten \u0026gt; mehr Daten Automatisieren: Je schneller der Zyklus, desto besser das Modell Wann das Factory Model anwenden? Szenario Factory Model? Einmaliges Forschungsprojekt Nein Kaggle Competition Nein Produkt mit ML-Komponente Ja Autonomes Fahren / ADAS Ja Recommendation System Ja Content Moderation Ja Fazit Das Factory Model ist kein fancy Framework – es ist die Realität, wie erfolgreiche ML-Systeme in der Industrie gebaut werden.\nDer Unterschied zwischen Hobbyist und Profi:\nHobbyist: \u0026ldquo;Mein Modell hat 95% Accuracy, fertig!\u0026rdquo; Profi: \u0026ldquo;Mein Modell hat 95% Accuracy. Wo versagt es? Welche Daten brauche ich?\u0026rdquo; Die initiale Investition in Infrastruktur und Prozesse ist nicht trivial. Aber sobald die Factory läuft, wird sie zum Flywheel: Jede Iteration macht das System besser, schneller und robuster.\nInspiriert von: Andrej Karpathy\u0026rsquo;s Konzept der \u0026ldquo;Factory Model of Machine Learning\u0026rdquo;\nDu willst robuste ML-Pipelines und skalierbare KI-Systeme in deinem Unternehmen aufbauen? Dann schreib mir einfach auf LinkedIn oder buche direkt einen kostenlosen Call.\n","permalink":"https://obogazkaya.me/blog/factory-model-machine-learning/","summary":"Warum die meisten ML-Projekte scheitern – und wie das \u0026lsquo;Factory Model\u0026rsquo; einen systematischen Weg zu kontinuierlich besseren Modellen bietet.","title":"Das Factory Model: Wie man ML-Systeme systematisch verbessert"},{"content":"Überblick In diesem Tutorial zeige ich dir, wie du:\nn8n auf einem Hostinger VPS einrichtest – einfach und ohne SSH-Kenntnisse Claude Code mit n8n verbindest – über den MCP-Server n8n-Skills installierst – für spezialisiertes Workflow-Wissen Workflows per Sprachbefehl baust – in Claude Code Desktop oder VS Code Das Ergebnis: Du beschreibst in natürlicher Sprache, was dein Workflow tun soll, und Claude erstellt, validiert und deployt ihn direkt zu deiner n8n-Instanz.\nArchitektur ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ Claude Code │────▶│ n8n MCP │────▶│ n8n Instance │ │ + n8n Skills │ │ Server │ │ (Hostinger VPS)│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │ │ \u0026#34;Erstelle einen Workflow, │ │ der täglich Daten abruft\u0026#34; │ │ ▼ └──────────────────────────────────────▶ Workflow erstellt und aktiviert Schritt 1: n8n auf Hostinger VPS einrichten Das Besondere an Hostinger: n8n ist als fertige Applikation verfügbar. Kein SSH, kein Docker, keine manuelle Konfiguration nötig.\nVPS erstellen Erstelle einen Hostinger Cloud Account Wähle einen VPS-Plan (KVM 2 oder höher empfohlen – 2 vCPU, 4GB RAM) Bei der Betriebssystem-Auswahl: Wähle n8n aus den verfügbaren Applikationen Hostinger installiert n8n automatisch mit:\nVorinstalliertem SSL-Zertifikat Konfigurierter Domain Automatischen Updates n8n API-Key generieren Nach der Installation:\nÖffne deine n8n-Instanz unter https://deine-subdomain.hostingersite.com Erstelle einen Admin-Account Gehe zu Settings → API → Create API Key Speichere den API-Key sicher ab – du brauchst ihn für die MCP-Konfiguration Schritt 2: n8n-Skills für Claude Code installieren Die n8n-Skills geben Claude Code spezialisiertes Wissen über n8n – von Node-Konfiguration bis zu Workflow-Patterns.\nSkills installieren # Skills-Repository klonen git clone https://github.com/anthropics/claude-code-n8n-skills.git # Skills in dein Projekt kopieren mkdir -p dein-projekt/.claude/skills cp -r claude-code-n8n-skills/skills/* dein-projekt/.claude/skills/ Verfügbare Skills Skill Was er kann n8n-mcp-tools-expert Hilft bei der effektiven Nutzung der MCP-Tools n8n-node-configuration Erklärt Node-Einstellungen und Abhängigkeiten n8n-code-javascript Schreibt JavaScript für Code-Nodes n8n-code-python Schreibt Python für Code-Nodes n8n-expression-syntax Validiert n8n-Expressions n8n-workflow-patterns Kennt bewährte Workflow-Architekturen n8n-validation-expert Interpretiert und behebt Validierungsfehler GitHub Repository: github.com/anthropics/claude-code-n8n-skills\nSchritt 3: MCP-Server konfigurieren Der MCP-Server (Model Context Protocol) verbindet Claude Code direkt mit deiner n8n-Instanz.\nFür Claude Code Desktop Öffne die Claude Desktop Einstellungen und füge unter \u0026ldquo;Developer\u0026rdquo; → \u0026ldquo;Edit Config\u0026rdquo; hinzu:\n{ \u0026#34;mcpServers\u0026#34;: { \u0026#34;n8n-mcp\u0026#34;: { \u0026#34;command\u0026#34;: \u0026#34;npx\u0026#34;, \u0026#34;args\u0026#34;: [\u0026#34;n8n-mcp\u0026#34;], \u0026#34;env\u0026#34;: { \u0026#34;N8N_API_URL\u0026#34;: \u0026#34;https://deine-subdomain.hostingersite.com/\u0026#34;, \u0026#34;N8N_API_KEY\u0026#34;: \u0026#34;dein-api-key-hier\u0026#34; } } } } Für VS Code mit Claude Code Extension Erstelle .mcp.json im Projekt-Root:\n{ \u0026#34;mcpServers\u0026#34;: { \u0026#34;n8n-mcp\u0026#34;: { \u0026#34;command\u0026#34;: \u0026#34;npx\u0026#34;, \u0026#34;args\u0026#34;: [\u0026#34;n8n-mcp\u0026#34;], \u0026#34;env\u0026#34;: { \u0026#34;N8N_API_URL\u0026#34;: \u0026#34;https://deine-subdomain.hostingersite.com/\u0026#34;, \u0026#34;N8N_API_KEY\u0026#34;: \u0026#34;dein-api-key-hier\u0026#34; } } } } Verfügbare MCP-Tools Nach der Konfiguration hat Claude Zugriff auf:\nDokumentation \u0026amp; Validierung:\nsearch_nodes – Nodes nach Stichwort finden get_node – Detaillierte Node-Dokumentation abrufen validate_node – Node-Konfiguration prüfen validate_workflow – Gesamten Workflow validieren search_templates – Workflow-Templates durchsuchen Workflow-Management:\nn8n_create_workflow – Neuen Workflow erstellen n8n_update_full_workflow – Workflow aktualisieren n8n_delete_workflow – Workflow löschen n8n_test_workflow – Workflow testen Schritt 4: Workflows per Sprache bauen Jetzt kommt der spannende Teil: Du kannst Workflows in natürlicher Sprache beschreiben.\nBeispiel: Newsletter-Workflow erstellen Der folgende Prompt erstellt einen kompletten Newsletter-Workflow:\nErstelle einen wöchentlichen Newsletter-Workflow, der: - Jeden Montag um 7 Uhr UTC läuft - Mit SerpAPI nach \u0026#34;autonomous driving news\u0026#34; der letzten Woche sucht - Die Ergebnisse mit einem AI Agent zusammenfasst - Einen HTML-Newsletter generiert - Den Newsletter per Gmail versendet Claude Code Output:\nDer erstellte Workflow in n8n:\nBeispiel-Ausgabe – Der generierte Newsletter:\nTipps für effektive Prompts Sei spezifisch – Nenne konkrete Services (Gmail, Slack, Notion) Beschreibe den Trigger – Wann soll der Workflow starten? Definiere das Ziel – Was soll am Ende passieren? Iteriere – Starte einfach und erweitere schrittweise Best Practices Sicherheit Committe niemals .mcp.json mit echten API-Keys Füge .mcp.json zur .gitignore hinzu Nutze Umgebungsvariablen für sensible Daten Workflow-Entwicklung Validiere vor dem Deploy – Sage \u0026ldquo;Validiere den Workflow bevor du ihn pushst\u0026rdquo; Teste manuell zuerst – Aktiviere Schedule-Trigger erst nach erfolgreichem Test Nutze inkrementelle Updates – Kleine Änderungen sind einfacher zu debuggen Troubleshooting MCP-Server verbindet nicht Prüfe die N8N_API_URL – muss mit / enden Teste den API-Key direkt: curl -s \u0026#34;https://deine-subdomain.hostingersite.com/api/v1/workflows\u0026#34; \\ -H \u0026#34;X-N8N-API-KEY: dein-key\u0026#34; Starte Claude Code neu nach Änderungen an der MCP-Konfiguration Permission Denied bei npx chmod +x ~/.npm/_npx/*/node_modules/.bin/n8n-mcp Skills werden nicht erkannt Stelle sicher, dass die Skill-Dateien im richtigen Verzeichnis liegen:\ndein-projekt/ └── .claude/ └── skills/ ├── n8n-mcp-tools-expert.md ├── n8n-node-configuration.md └── ... Ressourcen n8n Dokumentation Claude Code Dokumentation MCP Spezifikation n8n-mcp GitHub Hostinger VPS Praxisbeispiel: Telegram Beleg-Bot Was mit diesem Setup in der Praxis möglich ist, zeigt der Telegram Beleg-Bot – ein 9-Node-Workflow, der Kassenzettel per Foto entgegennimmt, per OCR und KI automatisch Geschäft, Kategorie und Betrag extrahiert und alles in Google Sheets + Google Drive ablegt. Der gesamte Workflow wurde mit Claude Code und dem n8n MCP-Server per Sprachbefehl erstellt.\nFazit Mit dieser Kombination aus Hostinger VPS, n8n, MCP-Server und Claude Code Skills kannst du Workflows in natürlicher Sprache beschreiben und direkt deployen.\nDie Hauptvorteile:\nSchneller Start – n8n ist auf Hostinger in Minuten eingerichtet Natürliche Interaktion – Beschreibe was du willst, nicht wie Validierung inklusive – Claude prüft Konfigurationen vor dem Deploy Iteratives Arbeiten – Erweitere Workflows durch Konversation Du möchtest Automatisierungen und KI-Workflows in deinem Unternehmen einsetzen? Dann schreib mir einfach auf LinkedIn oder buche direkt einen kostenlosen Call.\n","permalink":"https://obogazkaya.me/blog/ai-newsletter-claude-code-n8n/","summary":"Wie du n8n auf einem Hostinger VPS einrichtest und mit Claude Code Skills und MCP-Integration Workflows per Sprachbefehl erstellst.","title":"n8n auf Hostinger VPS + Claude Code: Workflows per Sprachbefehl bauen"},{"content":"Mit über 10 Jahren Erfahrung in der Automobilindustrie und in der Leitung verschiedener Digitalisierungsprojekte, bringe ich genau das mit was in vielen KI-Projekten heute fehlt:\nDas Verständnis dafür, wie Technologie in gewachsene Strukturen, Prozesse und Stakeholder-Realitäten integriert wird.\nWas mich heute als AI Engineer antreibt: KI nicht nur zu verstehen, sondern sie in echte, funktionierende Lösungen zu übersetzen, immer mit dem Anspruch, dass am Ende etwas entsteht, das wirklich genutzt wird und einen Mehrwert bietet. Denn gute KI-Lösungen entstehen nicht im Prototyp, sondern dort, wo sie messbaren Wert in bestehende Prozesse bringen.\nSchreib mir gerne oder buche direkt ein kostenloses Beratungsgespräch, wenn auch du AI-Projekte aus dem PoC in die Produktion bringen willst.\nKernkompetenzen Generative AI \u0026amp; LLMs: Produktionsreife Anwendungen mit Large Language Models, inkl. lokaler LLMs für maximalen Datenschutz. Agentic AI Systems: Autonome KI-Agenten, die mehrstufige Aufgaben eigenständig lösen (z.B. mit LangGraph, Claude Agent SDK). RAG Pipelines: LLMs an internes Firmenwissen anbinden, für präzise, faktenbasierte Antworten auf Basis deiner Daten. Data Pipelines \u0026amp; Datenqualität: Skalierbare ETL-/ELT-Pipelines und solide Datenqualität als Fundament für jede KI-Lösung. Workflow Automation: End-to-End-Automatisierung von Geschäftsprozessen mit n8n, Make und Python-basierter Orchestrierung. MLOps \u0026amp; Production: Deployment, Monitoring und Skalierung von ML-Modellen in Produktionsumgebungen. Neugierig, wie das in der Praxis aussieht? Schau dir meine bisherigen Projekte an, dort findest du konkrete Beispiele und Inspirationen.\n","permalink":"https://obogazkaya.me/about/","summary":"\u003cp\u003eMit über 10 Jahren Erfahrung in der Automobilindustrie und in der Leitung verschiedener Digitalisierungsprojekte, bringe ich genau das mit was in vielen KI-Projekten heute fehlt:\u003c/p\u003e\n\u003cp\u003eDas Verständnis dafür, wie Technologie in gewachsene Strukturen, Prozesse und Stakeholder-Realitäten integriert wird.\u003c/p\u003e\n\u003cp\u003eWas mich heute als AI Engineer antreibt: KI nicht nur zu verstehen, sondern sie in echte, funktionierende Lösungen zu übersetzen, immer mit dem Anspruch, dass am Ende etwas entsteht, das wirklich genutzt wird und einen Mehrwert bietet. Denn gute KI-Lösungen entstehen nicht im Prototyp, sondern dort, wo sie messbaren Wert in bestehende Prozesse bringen.\u003c/p\u003e","title":"Über mich"}]