Klassifikation
Warum dieser Schritt
Warum das Sprachmodell hier klassifiziert
Bis zu diesem Punkt hat die Pipeline alle Vorarbeit erledigt: Email geparst, Anhänge versorgt, Kontakt erkannt, Thread zugeordnet, Vorfilter geprüft. Was übrig bleibt, sind genau jene Mails, die keine einfache Regel gefangen hat. Hier kommt nun das Sprachmodell ins Spiel und nimmt die eigentliche inhaltliche Einordnung vor. Dieses Unterkapitel zeigt, was hier eigentlich ankommt, was die Klassifikation an Werten liefert, warum dafür überhaupt ein Sprachmodell gebraucht wird, und welche Wirkung ihre Ergebnisse später in der Pipeline entfalten.
Was der ClassifyStep zu sehen bekommt
Der ClassifyStep ist Pipeline-an fester Position in der Pipeline, direkt hinter dem Vorfilter. Hat eine Regel die Email bereits abgefangen und das Skip-Flag im Zusammenhang aus vorherigen Schritten gesetzt, kommt der ClassifyStep gar nicht erst zum Zug. Sein erster Befehl ist genau diese Prüfung: if (!empty($ctx["skip_llm"])) { return; }. Damit ist sichergestellt, dass das Sprachmodell nur für Mails arbeitet, die wirklich seine Aufmerksamkeit brauchen.
Eingehend bekommt der ClassifyStep das geparste Email-Objekt aus dem Zusammenhang aus vorherigen Schritten, also Absender, Betreff, Body-Text und alle weiteren Felder, die ParseStep zusammengetragen hat. Damit hat er alles, was zur inhaltlichen Beurteilung nötig ist.
Was die Klassifikation liefert
Das Sprachmodell beantwortet hier nicht nur eine einzige Frage, sondern füllt ein kleines strukturiertes Formular mit fünf Feldern. Jedes Feld hat eine eigene Aufgabe und wird später an unterschiedlichen Stellen gebraucht.
- category: die Hauptkategorie aus einer festen Liste von Werten (zum Beispiel "anfrage", "beschwerde", "spam", "newsletter").
- subcategory: eine optionale, freier formulierte Verfeinerung. Kann auch leer sein.
- confidence: ein Zahlenwert zwischen 0.0 und 1.0, den das Sprachmodell selbst dazu liefert. Niedrige Werte sind ein Hinweis darauf, dass die Email schwer einzuordnen war.
- sentiment: einer von drei Werten: "positive", "neutral", "negative". Ein grober Stimmungs-Marker.
- summary: eine kurze Inhaltszusammenfassung in maximal achtzig Zeichen.
Vier dieser fünf Felder werden direkt in die classifications-Tabelle geschrieben. Das fünfte Feld, die Priorität, ist nicht Teil des Sprachmodell-Outputs in diesem Schritt: sie wird mit dem Default-Wert "normal" eingetragen. Eine Verfeinerung der Priorität kann später durch Regeln, Kategorie-Mappings oder den Menschen am Bildschirm passieren.
Warum genau hier ein Sprachmodell
Der Vorfilter kann nur das einfangen, was eindeutig ist: feste Adressen, fixe Stichwörter, formale Muster. Alles andere bleibt offen. Die Frage "ist diese Email eine Anfrage, eine Beschwerde, ein Feedback, eine Bewerbung oder doch eher eine private Nachricht zwischen Bekannten" lässt sich nicht mit str_contains beantworten. Sie braucht Sprachverständnis: Tonfall, Kontext, Höflichkeitsformeln, Fachausdrücke.
Genau das leistet ein modernes Sprachmodell. Es liest die Email, erkennt typische Muster (eine Frage am Ende des Texts, ein "Hallo" zu Beginn, ein Anhang mit einer Tabelle) und ordnet das Ganze einer aus einer festen Liste von Kategorien zu. Es bringt sogar gleich eine Selbsteinschätzung mit, wie sicher es sich ist. Diese Selbstauskunft ist nicht perfekt, aber ein nützlicher Anhaltspunkt.
Wer das vergleichen möchte: ein Mensch, der dieselbe Email einordnet, braucht ein paar Sekunden und liefert dieselben fünf Felder. Das Sprachmodell macht im Wesentlichen dasselbe, nur automatisiert und rund um die Uhr.
Was die Klassifikation in der Pipeline weiter auslöst
Sobald die Klassifikation vorliegt, schreibt der ClassifyStep zwei Dinge in die Datenbank: einen neuen Eintrag in der classifications-Tabelle und einen Statuswechsel auf der Email selbst (status = "classified"). Damit ist die Email aus Sicht der Bedien-Oberfläche fertig eingeordnet.
Zusätzlich legt der Schritt die Kategorie in den Zusammenhang aus vorherigen Schritten ($ctx["category"]). Diese Information wird später im Entwurfs-Schritt wieder gelesen: bei den Kategorien "spam" und "newsletter" entfällt die Antwort-Generierung, weil keine Antwort sinnvoll ist. Andere Kategorien laufen normal durch den Entwurfs-Schritt.
Schliesslich löst der ClassifyStep ein Domain-Ereignis vom Typ EmailClassified aus. Listener im System können darauf reagieren, etwa um eine Benachrichtigung an den zuständigen Kollegen zu schicken, ein Dashboard zu aktualisieren oder eine Statistik zu fortzuschreiben. Das Ereignis enthält email_id, Kategorie, Subkategorie und Konfidenz als Strings.
Damit ist klar, was hier geschieht und warum. Im nächsten Unterkapitel schauen wir uns an, wie der Prompt aussieht, mit dem das Sprachmodell zur Mitarbeit gebracht wird.