Zum Inhalt

KI: Daten aus OCR extrahieren

Der Service Task „KI: Daten aus OCR extrahieren" verarbeitet das Ergebnis des Service Tasks „Dokument auslesen (OCR)" und liefert strukturierte Daten zurück. Aus dem kombinierten OCR-Output (Markdown, Layout-Blöcke, Tabellen, Stempel und Textfragmente) werden gezielt typisierte Felder, Positionslisten (z. B. Artikel mit Menge und Preis) und ein automatischer Schlüssel-Wert-Index für die spätere Suche extrahiert.

Der Task ist generisch und eignet sich für beliebige Geschäftsdokumente – z. B. Lieferscheine, Rechnungen, Verträge, Bestellungen, Zeugnisse oder Formulare. Eine optionale Beschreibung des Dokumententyps und die typisierte Definition jedes Feldes sorgen für deutlich präzisere Ergebnisse als eine generische Text-Extraktion.


Input-Parameter

Die folgenden Felder werden als Eingabe für den Task benötigt:

{
  "ocr": { },
  "documentContext": "Lieferscheine deutscher Speditionen",
  "schema": {
    "deliveryNoteNumber": {
      "type": "string",
      "description": "Lieferschein-Nummer (z. B. LS-2024-001)"
    },
    "deliveryDate": {
      "type": "date",
      "description": "Lieferdatum im Format YYYY-MM-DD"
    },
    "customerName": {
      "type": "string",
      "description": "Name des Empfängers / Kunden"
    },
    "totalAmount": {
      "type": "currency",
      "description": "Gesamtbetrag (numerischer Wert in der Belegwährung)"
    },
    "paymentMethod": {
      "type": "enum",
      "values": ["cash", "invoice", "card"],
      "description": "Zahlungsart"
    }
  },
  "tables": {
    "items": {
      "description": "Positionsliste der gelieferten Artikel",
      "columns": {
        "pos":      { "type": "integer" },
        "article":  { "type": "string"  },
        "quantity": { "type": "number"  },
        "price":    { "type": "currency" }
      }
    }
  },
  "discoverAdditional": true,
  "language": "de",
  "maxContentLength": 50000
}

Erläuterung:

  • ocr: Der vollständige Output des Service Tasks „Dokument auslesen (OCR)" – also das Objekt mit metadata, markdown, pages etc.
  • schema: Die zu extrahierenden Felder. Pro Feld werden Typ und Beschreibung angegeben. Unterstützte Typen:
    • string – Text
    • number – Dezimalzahl
    • integer – Ganzzahl
    • date – Datum (YYYY-MM-DD)
    • currency – Währungsbetrag (numerisch)
    • iban – IBAN
    • email – E-Mail-Adresse
    • booleantrue/false
    • enum – einer aus einer festen Werteliste; zusätzlich values: ["..."] angeben
  • tables (optional): Tabellen, die als Positionslisten zurückgeliefert werden sollen. Pro Tabelle wird eine Beschreibung und das Spaltenschema (Name + Typ) angegeben. Die Werte werden als Array von Objekten zurückgeliefert.
  • documentContext (optional): Eine kurze Beschreibung des Dokumententyps. Hilft der KI, mehrdeutige Beschriftungen wie „Nr." korrekt zuzuordnen (z. B. Lieferschein-Nr. statt Rechnungs-Nr.).
  • discoverAdditional (optional, Standard: false): Wenn true, werden zusätzlich alle weiteren erkennbaren Schlüssel-Wert-Paare zurückgegeben – nützlich als Volltext-Suchindex.
  • language (optional, Standard: de): Sprache der Beschriftungen in discoveredKeyValues.
  • maxContentLength (optional, Standard: 50000): Maximale Zeichenanzahl der OCR-Inhalte, die an die KI übergeben werden.

Output

Der Task liefert ein strukturiertes JSON-Objekt:

{
  "fields": {
    "deliveryNoteNumber": "LS-2024-001",
    "deliveryDate": "2024-03-15",
    "customerName": "Müller GmbH",
    "totalAmount": 3425.0,
    "paymentMethod": "invoice"
  },
  "positions": {
    "items": [
      { "pos": 1, "article": "Schrauben M8", "quantity": 100, "price": 0.45 },
      { "pos": 2, "article": "Muttern M8",   "quantity": 100, "price": 0.18 }
    ]
  },
  "discoveredKeyValues": [
    { "key": "Lieferadresse",   "value": "Industriestr. 5, 70469 Stuttgart" },
    { "key": "Bestellreferenz", "value": "PO-7788" }
  ],
  "notFound": []
}

Erläuterung:

  • fields: Die im schema definierten Felder mit typgerechten Werten. Felder, die im Dokument nicht gefunden wurden, sind null und erscheinen zusätzlich in notFound.
  • positions: Nur enthalten, wenn tables definiert wurde. Pro Tabelle wird ein Array von Objekten zurückgeliefert – die Schlüssel entsprechen den definierten Spalten.
  • discoveredKeyValues: Nur enthalten, wenn discoverAdditional: true gesetzt war. Eine Liste aller weiteren erkennbaren Schlüssel-Wert-Paare (max. 60 Einträge). Eignet sich gut als Volltext-Suchindex.
  • notFound: Liste der Schema-Feldnamen, für die kein Wert gefunden werden konnte.

JSONata-Beispiele

// OCR-Ergebnis direkt aus dem vorherigen Schritt übergeben
{
  "ocr": $.ocrResult,
  "documentContext": "Lieferscheine",
  "schema": {
    "deliveryNoteNumber": { "type": "string", "description": "Lieferschein-Nummer" },
    "deliveryDate":       { "type": "date",   "description": "Lieferdatum" },
    "customerName":       { "type": "string", "description": "Empfänger / Kunde" }
  }
}
// Positionsliste mit Spalten extrahieren
{
  "ocr": $.ocrResult,
  "documentContext": "Rechnungen",
  "schema": {
    "invoiceNumber": { "type": "string",   "description": "Rechnungsnummer" },
    "invoiceDate":   { "type": "date",     "description": "Rechnungsdatum" },
    "totalAmount":   { "type": "currency", "description": "Gesamtbetrag" }
  },
  "tables": {
    "items": {
      "description": "Rechnungspositionen",
      "columns": {
        "article":  { "type": "string"   },
        "quantity": { "type": "number"   },
        "price":    { "type": "currency" }
      }
    }
  }
}
// Mit Suchindex für späteres Wiederfinden im Data Lake
{
  "ocr": $.ocrResult,
  "schema": {
    "documentNumber": { "type": "string", "description": "Belegnummer" }
  },
  "discoverAdditional": true,
  "language": "de"
}

Hinweise

  • Der Task setzt zwingend ein OCR-Ergebnis aus dem Service Task „Dokument auslesen (OCR)" voraus.
  • Eine präzise description pro Feld verbessert die Trefferquote deutlich (z. B. „Datum im Format YYYY-MM-DD" statt nur „Datum").
  • Bei documentContext reicht eine kurze Beschreibung – die KI nutzt diese, um Felder von ähnlichen Dokumenttypen zu unterscheiden (z. B. „Lieferschein-Nr." vs. „Rechnungs-Nr.").
  • Werte werden so extrahiert, wie sie im Dokument stehen – nur Typ-Konvertierungen (z. B. Datumsnormalisierung) werden vorgenommen.
  • Wird ein Wert nicht zuverlässig gefunden, wird null zurückgegeben – die KI rät nicht.
  • Bei sehr großen OCR-Outputs kann maxContentLength angehoben werden.
  • Der Task verwendet ein leistungsfähiges Sprachmodell und benötigt typischerweise 5–20 Sekunden – abhängig von der Komplexität von Schema und Positionslisten.

Tipp

Mit nur zwei Service Tasks – „Dokument auslesen (OCR)" gefolgt von „KI: Daten aus OCR extrahieren" – lässt sich ein vollständiger Workflow von der eingegangenen Datei (PDF oder Bild) bis zu strukturierten Daten im Data Lake abbilden. In Kombination mit discoverAdditional: true entsteht zusätzlich automatisch ein Suchindex, mit dem Belege später auch über Felder gefunden werden, die nicht im Schema definiert waren.