Wichtigste Erkenntnisse
- /document/ocr akzeptiert derzeit nur PDFs; führen Sie für Word-, PowerPoint- oder bildbasierte Dokumente zuerst /document/convert aus.
- Verwenden Sie /image/ocr für Fotos, Screenshots und Kameraaufnahmen.
- Das Format meta hält den Text am Dateiobjekt, sodass spätere Steps ihn filtern oder einbrennen können, ohne einen zweiten Durchlauf.
Textextraktion wird dann nützlich, wenn sie Teil der Pipeline ist, die den Upload ohnehin verarbeitet, statt ein separater Dienst zu sein, dem man erst mitteilen muss, wo die Datei liegt. Die wesentlichen Entscheidungen sind, welcher Robot zur Eingabe passt und welche Form die Ausgabe nachgelagert haben muss.
Worauf es besonders ankommt
- Die Granularität list liefert positionierte Fragmente, während full einen einzelnen Textblock zurückgibt.
- Anbieter lassen sich auf aws oder gcp festlegen, wenn Konsistenz wichtiger ist als Verfügbarkeit.
Jede Eingabe an den Robot leiten, der sie akzeptiert
Textextraktion scheitert am häufigsten beim Routing und nicht bei der Erkennung. /document/ocr akzeptiert derzeit nur PDFs, daher liefert eine Word-Datei, eine PowerPoint-Präsentation oder ein TIFF, das direkt dorthin geschickt wird, keinen Text. Wandeln Sie diese zuerst mit /document/convert um und senden Sie Fotos und Screenshots stattdessen an /image/ocr. Ein einzelner Step mit /file/filter vor der Pipeline reicht in der Regel aus, um den Traffic nach Typ aufzuteilen.
Beide Robots nehmen dieselben drei Parameter entgegen. provider wählt zwischen AWS und GCP und ist standardmäßig auf automatische Auswahl gesetzt. granularity wählt zwischen einem einzelnen Textblock und einer positionierten Liste von Fragmenten. format entscheidet, ob der Text als Datei zurückkommt oder an das Dateiobjekt angehängt wird, damit spätere Steps ihn lesen können.
{
"steps": {
":original": {
"robot": "/upload/handle"
},
"pdfs": {
"use": ":original",
"robot": "/file/filter",
"accepts": [
["${file.mime}", "regex", "application/pdf"]
]
},
"photos": {
"use": ":original",
"robot": "/file/filter",
"accepts": [
["${file.mime}", "regex", "^image/"]
]
},
"deskewed": {
"use": "pdfs",
"robot": "/document/autorotate"
},
"pdf_text": {
"use": "deskewed",
"robot": "/document/ocr",
"format": "json",
"granularity": "full"
},
"photo_text": {
"use": "photos",
"robot": "/image/ocr",
"format": "json",
"granularity": "full"
}
}
}PDF-Dateien
/document/ocr verarbeitet sie direkt. Alles andere, was ein Dokument ist, sollte zuerst durch /document/convert laufen.
Fotos und Screenshots
/image/ocr akzeptiert sie ohne Konvertierung, was für die Belegerfassung und mobile Uploads wichtig ist.
Gemischte Stapel
Filtern Sie früh nach Typ, damit ein einzelnes unerwartetes Format nicht eine ansonsten gültige Assembly scheitern lässt.
Die Ausgabeform vor der Wahl des Anbieters festlegen
Der Parameter format wirkt sich stärker auf die umgebende Pipeline aus als jede andere Entscheidung. json und text liefern beide eine Datei, was sich für Archivierung und Indexierung eignet. meta liefert überhaupt keine Datei, sondern speichert die Zeichenfolgen am Dateiobjekt unter ${file.meta.recognized_text}, wo spätere Steps sie lesen können. Genau das macht es möglich, nach erkannten Inhalten zu filtern oder extrahierten Text in ein Bild einzubrennen, ohne die Erkennung zweimal auszuführen.
granularity ergibt sich aus derselben Frage. full liefert einen einzelnen Block, was ein Suchindex braucht. list liefert positionierte Fragmente, die Sie benötigen, um einen Bereich zu schwärzen, ein bestimmtes Feld herauszuziehen oder einen Treffer in einem Viewer hervorzuheben. list zu wählen, wenn Sie nur einen Suchindex brauchen, kostet nichts, erzeugt aber eine Ausgabe, deren Verarbeitung mehr Aufwand bedeutet.
{
"steps": {
":original": {
"robot": "/upload/handle"
},
"recognized": {
"use": ":original",
"robot": "/document/ocr",
"format": "meta",
"granularity": "full",
"provider": "gcp"
},
"only_invoices": {
"use": "recognized",
"robot": "/file/filter",
"accepts": [
["${file.meta.recognized_text}", "regex", "(?i)invoice"]
]
}
}
}meta
Behält den Text am Dateiobjekt für nachgelagerte Steps. Es wird keine Datei erzeugt.
json und text
Erzeugen eine Datei zum Speichern oder Indexieren. Verwenden Sie diese, wenn der Text die Assembly verlässt.
Granularität list
Fügt Positionen hinzu, die Schwärzung und Feldextraktion benötigen, ein Suchindex hingegen nicht.
Die Eingabe vorbereiten, statt den Anbieter zu wechseln
Wenn die Erkennungsqualität enttäuscht, ist der Reflex, den anderen Anbieter auszuprobieren. Die Vorbereitung der Eingabe zahlt sich meist stärker aus. Scans kommen gedreht, schief und ungleichmäßig ausgeleuchtet an, und jeder dieser Punkte kostet Genauigkeit, bevor das Modell die Seite sieht. /document/autorotate vor der Erkennung auszuführen, korrigiert die Ausrichtung, und das Normalisieren des Kontrasts bei abfotografierten Seiten beseitigt eine häufige Ursache für ausgelassene Zeilen.
Bei den Kosten verhält es sich genauso. Für OCR gilt eine Mindestberechnung von einem Megabyte pro Datei, sodass hundert einzeln eingereichte einseitige Scans erheblich mehr kosten als dieselben hundert Seiten, die in einer Assembly gebündelt werden. Bündeln Sie, wo die Arbeitslast es zulässt, und halten Sie die interaktive Erkennung von Massen-Backfills getrennt, damit ein großer Import einen Nutzer, der auf einen einzelnen Upload wartet, nicht verzögern kann.
Zuerst begradigen
/document/autorotate vor der Erkennung behebt die häufigste Ursache für schlechte Ergebnisse.
Kleine Dateien bündeln
Die Mindestberechnung von einem Megabyte pro Datei macht Assemblies pro Seite bei größeren Mengen teuer.
Getrennte Warteschlangen
Halten Sie Massen-Backfills von interaktiven Uploads fern, damit Nutzer nicht hinter einem Import in der Warteschlange stehen.
Erkannten Text als Beleg behandeln, nicht als Datensatz
Beide Robots rufen KI-Dienste von Drittanbietern auf, und diese Anbieter trainieren ihre Modelle neu. Dieselbe PDF-Datei kann Monate später leicht abweichenden Text liefern. Das ist beherrschbar, solange das System nicht vom Gegenteil ausgeht: Speichern Sie den erkannten Text neben der Quelldatei zusammen mit dem Anbieter und dem Datum seiner Erstellung, damit ein späterer Unterschied sichtbar wird und nicht unbemerkt bleibt.
Dieselbe Eigenschaft macht Assertions auf exakte Übereinstimmung zu einer schlechten Wahl in Tests. Prüfen Sie, ob eine bekannte Formulierung vorkommt oder ob sich ein Feld parsen lässt, statt ein vollständiges Transkript zu vergleichen. Wenn ein Wert rechtliche oder finanzielle Folgen hat, behalten Sie das Quelldokument als Aufzeichnung und behandeln Sie den extrahierten Text als Index darauf.
Herkunft speichern
Bewahren Sie Anbieter und Ausführungsdatum zusammen mit dem Text auf, damit Drift später erkannt werden kann.
Lose Assertions
Testen Sie auf das Vorhandensein erwarteter Inhalte statt auf ein exaktes Transkript.
Original behalten
Das Quelldokument bleibt die Aufzeichnung; erkannter Text ist ein Weg, es zu finden.
Einzelne Felder statt vollständiger Transkripte abrufen
Viele Arbeitslasten wollen den Text eines Dokuments überhaupt nicht. Sie wollen eine Rechnungsnummer, ein Datum, eine Summe oder den Bereich einer Seite, der geschwärzt werden muss, bevor die Datei geteilt wird. Genau hier zahlt sich granularity: "list" aus: Er liefert Fragmente mit Positionen, sodass ein nachgelagerter Step nach Position auswählen kann, statt einen einzelnen undifferenzierten Block zu parsen.
Sich allein am Layout zu orientieren, ist fragil, denn ein Lieferant gestaltet ein Formular neu und jede Koordinate verschiebt sich. Wer sich an einem benachbarten Label verankert und die Position nur nutzt, um zwischen wiederholten Treffern zu unterscheiden, übersteht eine solche Neugestaltung. Wo der Dokumentbestand wirklich unvorhersehbar ist, ist es robuster, den erkannten Text an ein Modell mit striktem Ausgabeschema zu übergeben, als eine ständig wachsende Sammlung regulärer Ausdrücke zu pflegen.
Positionen für die Schwärzung
Fragmentkoordinaten ermöglichen es einem späteren Step, einen Bereich abzudecken, statt die Datei neu zu schreiben.
An Labels verankern
Den Text neben einem bekannten Label suchen und die Position nur nutzen, um bei mehreren Treffern zu entscheiden.
Schemata statt Muster
Bei unvorhersehbaren Layouts altert ein typisiertes Extraktionsschema besser als eine angesammelte Menge regulärer Ausdrücke.
Festlegen, was passiert, wenn eine Seite nicht gelesen werden kann
Jedes Archiv enthält Seiten, die die Texterkennung nicht bewältigt: das Foto eines Bildschirms, das Fax eines Faxes, Handschrift am Seitenrand. Für diese Seiten leeren Text zurückzugeben, ist korrektes Verhalten, und die Pipeline benötigt einen Ort, an den sie weitergeleitet werden. Wer ein leeres oder sehr kurzes Ergebnis als Routing-Signal statt als Fehler behandelt, hält den Batch in Bewegung und legt die Ausnahmen einer Person vor.
Dieselbe Datei erneut beim selben Anbieter zu versuchen, hilft selten, weil sich an der Eingabe nichts geändert hat. Ein erneuter Versuch nach einem vorbereitenden Step wie der automatischen Drehung hilft dagegen manchmal. Wenn Sie festhalten, welche Dateien kein Ergebnis geliefert haben und wie viele es waren, wird aus einem unsichtbaren Qualitätsproblem eine Zahl, die sich über die Zeit beobachten lässt.
Leer ist ein Signal
Kurze oder leere Ergebnisse zur Prüfung leiten, statt sie als Fehler zu zählen.
Wiederholungsversuch variieren
Ein zweiter Versuch hilft nur, wenn die Eingabe beim zweiten Mal anders vorbereitet wurde.
Die Rate verfolgen
Die Messung unlesbarer Seiten über die Zeit deckt Probleme bei Scannern und im Eingang an ihrer Quelle auf.
Wissenswerte technische Details
- /document/ocr und /image/ocr akzeptieren beide die Parameter provider, granularity und format. Der Anbieter wird standardmäßig automatisch ausgewählt und kann auf aws oder gcp festgelegt werden.
- Der Parameter format akzeptiert json, meta und text. Die Option meta gibt keine Datei zurück, sondern speichert die Zeichenketten am Datei-Objekt unter ${file.meta.recognized_text}; spätere Steps können sie dort auslesen.
- Der Parameter granularity akzeptiert full und list. Verwenden Sie list, wenn Sie Positionen je Fragment für Schwärzungen oder die Feldextraktion benötigen, und full, wenn Sie nur den Text brauchen.
- Für OCR gilt eine Mindestberechnung von einem Megabyte pro Datei; daher ist es günstiger, viele kleine Scans in einer Assembly zu bündeln, als eine Assembly pro Seite zu starten.
- Die Erkennungsqualität hängt weit stärker von der Vorbereitung der Eingabe ab als von der Wahl des Anbieters. Die Schräglage mit /document/autorotate zu korrigieren und den Kontrast vor der Erkennung zu normalisieren, bringt in der Regel mehr als ein Wechsel des Anbieters.
- Da die Ausgabe variiert, wenn Anbieter ihre Modelle neu trainieren, speichern Sie den erkannten Text zusammen mit der Quelldatei und dem Datum seiner Erstellung, damit eine spätere Änderung sichtbar wird und nicht unbemerkt bleibt.
Ein praxisnaher Ansatz
- 1
Teilen Sie die Eingabe nach Typ auf: PDFs an /document/ocr, Fotografien an /image/ocr, alles andere zuerst durch /document/convert.
- 2
Korrigieren Sie die Schräglage von Scans mit /document/autorotate vor der Erkennung.
- 3
Wählen Sie das Format meta, wenn ein späterer Step den Text verarbeitet, und json oder text, wenn Sie ihn speichern.
- 4
Speichern Sie den Text zusammen mit der Quelldatei, dem Anbieter und dem Ausführungsdatum, damit Drift sichtbar bleibt.
Wann Transloadit hilfreich ist
Verwenden Sie /document/ocr für PDFs und /image/ocr für Fotos und Screenshots. Wandeln Sie andere Dokumentformate zuerst mit /document/convert in PDF um. Wählen Sie das Format meta, wenn spätere Steps den Text benötigen, und die Formate json oder text, wenn Sie ihn speichern.
Architekturgrenze
OCR läuft auf KI-Diensten von Drittanbietern, deren Modelle sich im Laufe der Zeit ändern, sodass dieselbe Eingabe später einen anderen Text liefern kann. Behandeln Sie erkannten Text als durchsuchbaren Beleg und nicht als maßgebliche Aufzeichnung, und prüfen Sie in Tests niemals auf exakte Zeichenfolgen.
Häufig gestellte Fragen
Warum gibt /document/ocr bei meiner Word-Datei nichts zurück?
Derzeit werden ausschließlich PDFs akzeptiert. Führen Sie zunächst /document/convert aus, um ein PDF zu erzeugen, und übergeben Sie dieses Ergebnis anschließend an /document/ocr. Dasselbe gilt für PowerPoint-Dateien und für bildbasierte Dokumente wie mehrseitige TIFFs.
Sollte ich /document/ocr oder /image/ocr verwenden?
Verwenden Sie /document/ocr für PDFs und /image/ocr für Fotos, Screenshots und Kameraaufnahmen. Wenn ein einzelner Upload-Endpunkt beides empfängt, teilen Sie den Traffic mit einem Step auf, der /file/filter verwendet, anstatt alles an einen einzigen Robot zu senden.
Wie verwende ich den extrahierten Text in einem späteren Step?
Setzen Sie format: "meta". Es wird keine Datei zurückgegeben, und die Zeichenfolgen werden am Dateiobjekt unter ${file.meta.recognized_text} gespeichert, wo spätere Steps sie zum Filtern, für Wasserzeichen oder zum Routing auslesen können. Verwenden Sie stattdessen json oder text, wenn der Text die Assembly verlässt, um gespeichert oder indexiert zu werden.
Kann ich über verschiedene Durchläufe hinweg konsistente Ergebnisse erhalten?
Wenn Sie provider auf aws oder gcp festlegen, entfällt die Variation durch die automatische Auswahl; die Anbieter trainieren ihre eigenen Modelle jedoch weiterhin neu, sodass sich die Ausgabe dennoch im Laufe der Zeit ändern kann. Speichern Sie den Text zusammen mit dem zugehörigen Anbieter und dem Ausführungsdatum und vermeiden Sie Assertions auf exakte Zeichenketten in Tests.
Wie lässt sich ein großes Scan-Archiv am günstigsten verarbeiten?
Fassen Sie Dateien in weniger Assemblies zusammen. Für jede Datei gilt eine Mindestberechnung von einem Megabyte, sodass Assemblies pro Seite bei größeren Mengen deutlich teurer sind. Führen Sie das Backfill getrennt vom interaktiven Traffic aus, damit ein langer Import keine Uploads verzögert, auf die ein Nutzer wartet.