Zum Inhalt springen

Wissensextraktion

Warum dieser Schritt

Warum benannte Entitäten erkennen

Die Klassifikation hat die Email in eine Kategorie eingeordnet. Jetzt geht die Pipeline einen Schritt tiefer und zieht Namen, Dinge und Zahlen aus dem Text.

Eine Email enthält oft konkrete Bezugspunkte: einen Ansprechpartner, eine Firma, eine Rechnungsnummer, einen Termin. Diese Bezugspunkte heißen in der Welt der Sprachverarbeitung "benannte Entitäten". Sie aus dem Text herauszuziehen und als eigenständige Datensätze zu speichern, ist die Aufgabe des nächsten Pipeline-Schritts. Dieses Unterkapitel zeigt, was so eine Entität überhaupt ist, wozu das System sie braucht, welche Typen erkannt werden und wann der Schritt gar nicht erst aktiv wird.

Was eine Entität ist

Stellt man sich eine Email vor als eine Wand aus Text, sind Entitäten die kleinen Schilder, die einzelne Stellen markieren: "hier steht ein Personenname", "hier steht eine Firma", "hier steht ein Geldbetrag". Für jedes Schild merkt sich das System zwei Dinge: den genauen Text, der dort steht, und den Typ des Schilds.

Beispiel: Eine Email enthält den Satz "Die Rechnung 2025-0042 von der Firma Müller GmbH über 1.250 Euro ist eingetroffen." Daraus zieht der Schritt drei Entitäten: 2025-0042 vom Typ Rechnungsnummer, Müller GmbH vom Typ Organisation, 1.250 Euro vom Typ Geldbetrag. Drei Schilder, drei Datensätze in der entities-Tabelle.

Email-Text als Wand aus Wörtern"Die Rechnung 2025-0042 von Müller GmbH über 1.250 Euro..."
Drei Stellen werden zu SchildernRechnungsnummer, Firma, Geldbetrag
2025-0042INVOICE_NR
Müller GmbHORG
1.250 EuroAMOUNT
Pro Entität: Text plus Typzwei Werte, ein Datensatz

Wozu Entitäten in dieser Pipeline

Klassifikation und Thread-Zuordnung waren grobe Sortierungen. Entitäten gehen feiner: sie geben jeder Email konkrete Anker, an denen man später wieder hängenbleiben kann. Ein paar typische Folgewirkungen:

  • Verknüpfung von Mails: taucht "Müller GmbH" in dreißig Mails auf, lassen sich diese dreißig Mails zu einer einzigen Auflistung zusammenfassen. Der Filter ist ein einfaches WHERE auf der entities-Tabelle.
  • Suche im Inhalt: wer alle Mails zur Rechnungsnummer 2025-0042 sucht, findet sie über die Entitäten, ohne den Volltext durchsuchen zu müssen. Schneller und präziser.
  • Wissensgraph: die Entitäten werden später in einem Graphen mit Beziehungen vernetzt (zum Beispiel "Müller GmbH stellte Rechnung 2025-0042"). Daraus entstehen ganze Beziehungsnetze, die eine Email allein nicht hergibt.
  • RAG-Kontext: bei der späteren Antwort-Generierung kann das System gezielt nach Mails suchen, die dieselben Entitäten erwähnen, und sie als Hintergrund mitliefern.

Ohne Entitäten wäre das System auf Stichwortsuche im Volltext angewiesen. Mit Entitäten wird aus einer losen Sammlung von Texten eine vernetzte Wissensbasis.

Erkannte EntitätenAnker pro Email
WissensgraphMüller GmbH stellte Rechnung 2025-0042
RAG-KontextMails mit gleichen Entitäten
Lose Texte werden zur vernetzten Wissensbasis

Die Typen, die das System kennt

Im Prompt für die Entitäten-Erkennung sind die Typen festgelegt. Diese werden vom Sprachmodell exakt so zurückgegeben, alle anderen Begriffe werden ignoriert.

  • PER (Person): Vor- und Nachnamen, Anreden, namentlich genannte Personen.
  • ORG (Organisation): Firmennamen, Vereine, Behörden, Institutionen.
  • LOC (Location): Städte, Länder, Adressen, Orte.
  • PHONE: Telefonnummern in jeder Schreibweise.
  • EMAIL: Email-Adressen im Text.
  • INVOICE_NR: Rechnungsnummern, oft im Format Jahr-Lfd oder ähnlich.
  • CONTRACT_NR: Vertragsnummern, Auftragsnummern.
  • DATE: Datumsangaben in Worten oder Zahlen.
  • AMOUNT: Geldbeträge mit Währung.

Die Auswahl ist bewusst eng gehalten: lieber neun klare Typen, die sich verlässlich erkennen lassen, als dreißig vage Typen, die dauernd verwechselt werden. Was nicht in dieses Raster passt, taucht gar nicht auf, oder das Modell ordnet es zwangsweise einem der festgelegten Typen zu.

PERPerson
ORGOrganisation
LOCLocation
PHONETelefon
EMAILEmail-Adresse
DATEDatum
INVOICE_NRRechnungsnummer
CONTRACT_NRVertragsnummer
AMOUNTGeldbetrag
Bewusst eng: neun verlässliche Typenstatt dreißig vager

an fester Position in der Pipeline in der Pipeline und die Body-Pflicht

Der NerStep ist Pipeline-an fester Position in der Pipeline. Vor ihm: Parse, Attachment, Contact, Thread, Rule, Classify. Nach ihm: Relations, GraphSync, Chunk, Rag, Draft. Wer ihm vorausging, hat die Email zerlegt, eingeordnet und mit einer Kategorie versehen. Erst jetzt geht es an den Inhalt im Detail.

Eine wichtige Vorbedingung: der Body-Text muss vorhanden sein. Im Code prüft NerStep::process() direkt am Anfang, ob $ctx["parsed"]["body_text"] nicht leer ist. Ist der Body leer, kehrt der Schritt sofort zurück und macht nichts. Das verhindert sinnlose Sprachmodell-Aufrufe für Mails ohne Textinhalt, etwa reine Anhang-Mails oder leere Werbe-Pings.

Was diese Vorprüfung nicht abfängt: Mails, deren Body lediglich aus einer Signatur oder einem Disclaimer besteht. Die laufen ganz normal durch den NerStep. Das Sprachmodell findet dann typischerweise die Personen aus der Signatur und ein paar Pflichtangaben aus dem Impressum.

Schritte 1-6 fertigParse, Attach, Contact, Thread, Rule, Classify
NerStep, an fester Position in der Pipelinehier sind wir
if body_text leerreturn, kein NER-Aufruf
Leerer BodySchritt überspringt sich
Body vorhandenSprachmodell wird gefragt
Nach NerStep: Relations, GraphSync, Chunk, Rag, Draftjeder nutzt die Entitäten anders

Damit ist klar, was eine Entität ist und warum sie überhaupt erkannt wird. Im nächsten Unterkapitel geht es um den Prompt, mit dem das Sprachmodell zur Mitarbeit gebeten wird.