PDF-Dokumente als wichtiger Träger für die Speicherung von Unternehmens- und persönlichen Informationen stellen seit jeher eine große Herausforderung im Bereich der Datenverarbeitung dar. Mit der Einführung des Gemini 2.0-Modells von Google DeepMind steht dieser Bereich vor einem noch nie dagewesenen Wandel. In diesem Papier werden wir Gemini 2.0 erforschen, wie man das Muster der PDF-Verarbeitung komplett verändern kann, und durch die tatsächlichen Code-Beispiele zeigen, wie man diese Technologie verwendet, um mit verschiedenen Arten von PDF-Dokumenten umzugehen.
Traditionelle Herausforderungen der PDF-Verarbeitung
Die Umwandlung von PDF-Dokumenten in maschinenlesbare strukturierte Daten war lange Zeit das "große Problem" im Bereich der KI und Datenverarbeitung. Traditionelle Lösungen lassen sich grob in drei Kategorien einteilen:
- quelloffenes End-to-End-ModellOft sind sie von der Komplexität des Layouts überfordert und haben Schwierigkeiten, Tabellen, Grafiken und spezielle Typografie richtig zu erkennen.
- Multi-Modell-KombinationsprogrammNVIDIAs nv-ingest z. B. erfordert 8 Dienste und mehrere GPUs, um auf Kubernetes bereitgestellt zu werden, was nicht nur komplex in der Bereitstellung, sondern auch teuer in der Planung ist.
- Kommerzielle Gebühren für DienstleistungenDie Bequemlichkeit ist zwar gegeben, aber die Genauigkeit ist bei komplexen Layouts uneinheitlich, und die Kosten steigen exponentiell, wenn sie in großem Maßstab angewendet werden.
Bei diesen Lösungen ist es schwierig, ein Gleichgewicht zwischen Genauigkeit, Skalierbarkeit und Kosteneffizienz zu finden, vor allem, wenn Hunderte von Millionen Seiten an Dokumenten verarbeitet werden müssen, und die Kosten sind oft unerschwinglich.

Konfigurieren der Umgebung und Einrichten von Gemini 2.0
Um Gemini 2.0 für die Verarbeitung von PDF-Dokumenten zu verwenden, müssen Sie zunächst die Umgebung einrichten und einen Inferenz-Client erstellen. Hier sind die einzelnen Schritte:
Installieren Sie die erforderlichen Bibliotheken
%pip installieren "google-genai>=1"
Erstellen von Clients und Modellkonfigurationen
von google importieren genai
# Client erstellen
api_key = "YOUR_API_KEY" # Ersetzen Sie durch Ihren API-Schlüssel.
client = genai.Client(api_key=api_key)
# Definieren Sie das zu verwendende Modell
model_id = "gemini-2.0-flash" # Verwenden Sie auch "gemini-2.0-flash-lite-preview-02-05" oder "gemini-2.0-pro-exp-02-05".
Hochladen und Verarbeiten von PDF-Dateien
# PDF-Datei hochladen
rechnung_pdf = client.files.upload(file="rechnung.pdf", config={'display_name': 'rechnung'})
# Überprüfen, in wie viele Token die Datei umgewandelt wird
file_size = client.models.count_tokens(model=model_id, contents=invoice_pdf)
print(f'Datei: {Rechnung_pdf.display_name} entspricht {file_size.total_tokens} tokens')
# Musterausgabe: Datei: Rechnung entspricht 821 Token
Mit den oben genannten Schritten haben wir die Konfiguration der Basisumgebung abgeschlossen und die erste PDF-Datei erfolgreich zur Verarbeitung hochgeladen. Es ist erwähnenswert, dass die Gemini File API es erlaubt, bis zu 20 GB an Dateien pro Projekt zu speichern, mit einem Maximum von 2 GB pro Datei, und hochgeladene Dateien werden für 48 Stunden gespeichert.
Praxis der strukturierten PDF-Datenextraktion
Gemini 2.0 verfügt über die Möglichkeit, strukturierte Daten aus PDF-Dateien zu extrahieren. Im Folgenden wird anhand von praktischen Beispielen gezeigt, wie das Pydantic-Modell mit Gemini verwendet werden kann, um diese Funktion zu erreichen.
Definition allgemeiner Datenextraktionsmethoden
Zunächst definieren wir eine generische Methode, um PDF-Dateien zu verarbeiten und strukturierte Daten zurückzugeben:
def extract_structured_data(file_path: str, model: BaseModel).
# Hochladen einer Datei in die Datei-API
file = client.files.upload(file=file_path, config={'display_name': file_path.split('/')[-1].split('.') [0]})
# Generierung einer strukturierten Antwort mit der Gemini-API
prompt = f "Extrahiere die strukturierten Daten aus der folgenden PDF-Datei"
response = client.models.generate_content(model=model_id,
model=model_id, contents=[prompt, file],
'response_schema': model})
# wandelt die Antwort in ein Pydantic-Modell um und gibt es zurück
return response.parsed
Fall 1: Extraktion von Rechnungsdaten
Für die Rechnungsklasse PDF können wir das folgende Modell definieren, um Schlüsselinformationen zu extrahieren:
from pydantic import BaseModel, Feld
class Item(BaseModel).
description: str = Field(description="Die Beschreibung des Artikels")
quantity: float = Field(description="Die Menge des Artikels")
gross_worth: float = Field(description="Der Bruttowert des Artikels")
class Invoice(BaseModel).
"""Extrahiert die Rechnungsnummer, das Datum und alle Listenpositionen mit Beschreibung, Menge und Bruttowert sowie den Gesamtbruttowert.""""
invoice_number: str = Field(description="Die Rechnungsnummer z.B. 1234567890")
date: str = Field(description="Das Datum der Rechnung z.B. 2024-01-01")
items: list[Item] = Field(description="Die Liste der Positionen mit Beschreibung, Menge und Bruttowert")
total_gross_worth: float = Field(description="Der Gesamtbruttowert der Rechnung")
# Extrahieren der Daten anhand dieses Modells
Ergebnis = extract_structured_data("Rechnung.pdf", Rechnung)
# Ausgabe der Ergebnisse
print(f "Extrahierte Rechnung: {result.invoice_number} am {result.date} mit Gesamtbruttowert {result.total_gross_worth}")
for item in result.items: print(f "Artikel: {item_gross_worth}")
print(f "Artikel: {Artikel.Beschreibung} mit Menge {Artikel.Menge} und Bruttowert {Artikel.Bruttowert}")

Fall 2: Formularverarbeitung mit handschriftlichem Inhalt
Für Formulare, die handschriftliche Inhalte enthalten, können wir ebenfalls spezielle Modelle definieren:
class Form(BaseModel).
"""Extrahieren Sie die Formularnummer, das Datum für den Beginn und das Ende des Geschäftsjahres sowie die Planverbindlichkeiten zu Beginn und am Ende des Jahres. """"
form_number: str = Field(description="Die Formularnummer")
start_date: str = Field(description="Effective Date")
beginning_of_year: float = Field(description="Die Planverbindlichkeiten zu Beginn des Jahres")
end_of_year: float = Field(description="Die Planverbindlichkeiten am Ende des Jahres")
# Daten extrahieren
result = extract_structured_data("handschriftliches_formular.pdf", Formular)
# Ausgabe der Ergebnisse
print(f'Extrahierte Formularnummer: {result.form_number} mit Startdatum {result.start_date}. \nPlanverbindlichkeiten Anfang des Jahres {result.beginning_of_year} und Ende des Jahres {result.end_of_year}')
# Ausgabebeispiel: Extrahierte Formularnummer: CA530082 mit Beginndatum 02/05/2022.
# Planverbindlichkeiten Anfang des Jahres 40000.0 und Ende des Jahres 55000.0
Anhand des obigen Beispiels können wir sehen, dass Gemini 2.0 den Textinhalt in der PDF-Datei genau identifizieren kann, auch handschriftlichen Text, und ihn in ein strukturiertes JSON-Datenformat konvertieren kann, was den Datenextraktionsprozess erheblich vereinfacht.
Fortgeschrittene Anwendungen: Chunking von Dokumenten und semantisches Verstehen
In RAG-Systemen (Retrieval Augmented Generation) ist das Chunking von Dokumenten ein wichtiger Schritt zusätzlich zur grundlegenden Textextraktion, und Gemini 2.0 ermöglicht es uns, sowohl OCR als auch semantisches Chunking in einem einzigen Schritt durchzuführen.
Beispiel für semantisches Chunking im PDF-Format
Hier ist ein Tipp für die Konvertierung von PDF in Markdown und das gleichzeitige semantische Chunking:
CHUNKING_PROMPT = """OCR die folgende Seite in Markdown. Tabellen sollten als HTML formatiert werden.
Umgeben Sie Ihre Ausgabe nicht mit dreifachen Backticks.
Unterteilen Sie das Dokument in Abschnitte von etwa 250 bis 1000 Wörtern. Unser Ziel ist
Unser Ziel ist es, Teile der Seite mit demselben semantischen Thema zu identifizieren.
Diese Chunks werden eingebettet und in einer RAG-Pipeline verwendet.
Umgeben Sie die Chunks mit html-Tags.""""
# verwendet diese Eingabeaufforderung für die Verarbeitung
response = client.models.generate_content(
model=model_id,
contents=[CHUNKING_PROMPT, pdf_file]
)
chunked_content = response.text
Mit diesem Ansatz werden die semantischen Grenzen eines Dokuments ermittelt und aussagekräftigere Textabschnitte erzeugt, was die Genauigkeit der anschließenden Suche erheblich verbessert. Im Vergleich zum herkömmlichen mechanischen Chunking, das auf der Anzahl der Zeichen basiert, ist das semantische Chunking besser in der Lage, die Kohärenz und Integrität des Inhalts zu erhalten.
Komplexe Datenextraktion mit Pydantic
Für komplexere Szenarien können wir verschachtelte Pydantic-Modelle definieren, um mehrere Datenebenen zu verarbeiten:
class Person(BaseModel): first_name: str = Field(description="Der Vorname der Person")
first_name: str = Field(description="Der Vorname der Person")
last_name: str = Field(description="Der Nachname der Person")
last_name: str = Field(description="Der Nachname der Person") last_name: str = Field(description="Der Nachname der Person")
work_topics: list[Topic] = Field(description="Die Interessengebiete der Person, falls nicht angegeben, bitte eine leere Liste zurückgeben")
# Generieren einer Antwort unter Verwendung des Modells Person
prompt = "Philipp Schmid ist Senior AI Developer Relations Engineer bei Google DeepMind und arbeitet an Gemini, Gemma mit der Mission, jedem Entwickler zu helfen zu helfen, KI auf verantwortungsvolle Weise zu entwickeln und zu nutzen."
response = client.models.generate_content(
model=model_id,
content=prompt,
config={'response_mime_type': 'application/json', 'response_schema': Person}
)
Das #-SDK wandelt die Antwort automatisch in ein Pydantic-Modell um
philipp: Person = response.parsed
print(f "Vorname ist {philipp.first_name}")
Leistungsoptimierung und bewährte Praktiken
Im Folgenden finden Sie einige bewährte Verfahren zur Verbesserung der Effizienz und Genauigkeit bei der Verarbeitung von PDF-Dokumenten in großem Umfang:
Stapelverarbeitung und Token-Optimierung
Wenn Sie eine große Anzahl von PDF-Szenen bearbeiten müssen, können Sie eine Stapelverarbeitung durchführen, um die Effizienz zu steigern:
async def batch_process_pdfs(file_paths, model, batch_size=10):: results = [].
results = []
for i in range(0, len(file_paths), batch_size):: batch = file_paths[i:i+batch_size): batch = file_paths[i:i
batch = file_paths[i:i+batch_size]: results = [] for i in range(0, len(file_paths), batch_size).
tasks = [extract_structured_data(path, model) for path in batch]
batch_results = await asyncio.gather(*tasks)
results.extend(batch_results)
print(f "Verarbeiteter Stapel {i//batch_size + 1}/{(len(file_paths)+batch_size-1)//batch_size}")
Ergebnisse zurückgeben
Modellauswahl und Kostenkontrolle
Die Auswahl der richtigen Modellvariante für die tatsächlichen Anforderungen kann die Kosten erheblich senken:
- Zwilling 2.0 FlashDie beste Wahl für Allzweck-Szenarien, mit einem ausgezeichneten Preis-Leistungs-Verhältnis
- Gemini 2.0 Flash-Lite: Bietet ein besseres Preis-Leistungs-Verhältnis für einfache Dokumente
- Gemini 2.0 ProHandhabung extrem komplexer Dokumente oder Szenen, die hohe Präzision erfordern
Im Folgenden wird die Verarbeitungseffizienz der verschiedenen Modelle verglichen:
Modellierung | Verarbeitete PDF-Seiten pro Dollar (Markdown-Konvertierung) |
---|---|
Zwilling 2.0 Flash | Ca. 6.000 Seiten |
Gemini 2.0 Flash Lite | Ca. 12.000 Seiten |
Zwilling 1.5 Blitzlicht | Ca. 10.000 Seiten |
OpenAI 4-mini | Ca. 450 Seiten |
OpenAI 4o | Etwa 200 Seiten |
Anthropic Claude-3.5 | Ca. 100 Seiten |
Fehlerbehandlung und Wiederholungsmechanismus
In einer Produktionsumgebung ist es wichtig, robuste Mechanismen zur Fehlerbehandlung zu implementieren:
def extract_with_retry(file_path, model, max_retries=3):: for attempt in range(max_retries)
for attempt in range(max_retries).
try.
return extract_structured_data(file_path, model): for attempt in range(max_retries): try.
except Exception as e: if attempt == max_retries
if attempt == max_retries - 1: print(f "Failed to get to the file.
print(f "Konnte {file_path} nach {max_retries} Versuchen nicht verarbeiten: {e}")
return Keine
print(f "Versuch {Versuch+1} fehlgeschlagen, erneuter Versuch: {e}")
time.sleep(2 ** attempt) # exponentielle Wiederholungsstrategie

Optimierung der Formverarbeitung
Bei PDFs, die komplexe Formulare enthalten, können die folgenden Stichwörter verwendet werden, um die Genauigkeit der Formularerkennung zu verbessern:
TABLE_EXTRACTION_PROMPT = """Extrahiert alle Tabellen aus der PDF-Datei als HTML-Tabellen.
Behalten Sie die exakte Struktur bei, einschließlich zusammengefügter Zellen, Überschriften und Formatierungen.
Jede Tabelle sollte semantisch vollständig sein und die Beziehungen zwischen den Zellen beibehalten.
Behalten Sie bei numerischen Werten deren exaktes Format bei, wie es im Dokument dargestellt ist. """"
Schlussbemerkungen
Anhand der in diesem Artikel vorgestellten Methoden und Beispielcodes können Sie bereits mit der Verwendung von Gemini 2.0 beginnen, um ein leistungsfähiges System zur Verarbeitung von PDF-Dokumenten aufzubauen. Von der einfachen Textextraktion bis hin zum komplexen Parsen strukturierter Daten und anschließendem semantischen Chunking hat Gemini 2.0 eine hervorragende Leistung gezeigt und ist sehr kostengünstig.
Obwohl es in Bereichen wie der Bounding-Box-Erkennung noch Raum für Verbesserungen gibt, haben wir Grund zu der Annahme, dass die Zukunft der PDF-Verarbeitung intelligenter und effizienter werden wird, da sich die Technologie ständig weiterentwickelt. Für alle, die Dokumentdaten in großem Umfang für Einzelpersonen oder Organisationen verarbeiten müssen, ist Gemini 2.0 zweifellos eine Lösung, die Aufmerksamkeit und die Übernahme von technologischen Durchbrüchen verdient.