Published on

PDF-Dokumente mit Claude verarbeiten — mit Quellenangabe

Authors

PDF-Dokumente mit Claude auswerten

TL;DR

Claude nimmt PDF direkt entgegen — ohne vorgelagerte Texterkennung, mit Layout und Abbildungen. Bis 32 MB je Anfrage und 600 Seiten. Der unterschätzte Teil sind die Zitate: Sie bekommen seitengenaue Fundstellen zurück, und das verändert die Prüfbarkeit einer Auskunft grundlegend.


Der direkte Weg

Das Dokument gehört vor den Textblock:

import base64

with open("bericht.pdf", "rb") as f:
    daten = base64.standard_b64encode(f.read()).decode("utf-8")

antwort = client.messages.create(
    model="claude-opus-5",
    max_tokens=16000,
    messages=[{
        "role": "user",
        "content": [
            {
                "type": "document",
                "source": {
                    "type": "base64",
                    "media_type": "application/pdf",
                    "data": daten,
                },
            },
            {"type": "text", "text": "Welche Mängel sind dokumentiert?"},
        ],
    }],
)

Zwei Details, die Fehler verursachen: Die Base64-Zeichenkette darf keine Zeilenumbrüche enthalten — standard_b64encode liefert sie sauber, ältere Hilfsfunktionen nicht immer. Und die Reihenfolge zählt: Dokument zuerst, Frage danach.

Grenzen: 32 MB je Anfrage, 600 Seiten je Dokument — bei Modellen mit 200.000 Token Kontext, also Claude Haiku 4.5, sind es 100 Seiten.

Mehrfach verwenden: die Files-API

Wenn Sie mehrere Fragen zum selben Dokument stellen, laden Sie es einmal hoch statt es jedes Mal mitzuschicken:

# Hochladen — Beta-Kennung nötig
hochgeladen = client.beta.files.upload(
    file=("vertrag.pdf", open("vertrag.pdf", "rb"), "application/pdf"),
)

for frage in ["Wie lautet die Kündigungsfrist?",
              "Welche Zahlungsziele sind vereinbart?"]:
    antwort = client.beta.messages.create(
        model="claude-opus-5",
        max_tokens=16000,
        betas=["files-api-2025-04-14"],       # auch hier nötig
        messages=[{
            "role": "user",
            "content": [
                {"type": "document",
                 "source": {"type": "file", "file_id": hochgeladen.id}},
                {"type": "text", "text": frage},
            ],
        }],
    )

client.beta.files.delete(hochgeladen.id)

Die Beta-Kennung wird an beiden Stellen gebraucht — beim Hochladen und bei jedem Aufruf, der die Datei referenziert. Wer sie nur beim Hochladen setzt, bekommt beim zweiten Schritt einen Fehler.

Grenzen: 500 MB je Datei, 100 GB je Organisation. Die Dateioperationen selbst sind kostenfrei; berechnet wird der Inhalt als Eingabe-Token, sobald er in einer Nachricht verwendet wird.

Nicht verfügbar auf Amazon Bedrock und Google Vertex AI. Wer aus Gründen der Datenresidenz dorthin geht, muss den Base64-Weg nehmen und das Dokument bei jeder Anfrage mitschicken — was den Token-Verbrauch vervielfacht. Die Einordnung steht im Beitrag zur EU-Datenresidenz.

Der unterschätzte Teil: Zitate

Der Grund, warum das für Unternehmensanwendungen relevanter ist als eine reine Textextraktion:

antwort = client.messages.create(
    model="claude-opus-5",
    max_tokens=16000,
    messages=[{
        "role": "user",
        "content": [
            {
                "type": "document",
                "source": {"type": "base64", "media_type": "application/pdf",
                           "data": daten},
                "title": "Bericht 2026-Q2",
                "citations": {"enabled": True},
            },
            {"type": "text", "text": "Welche Mängel sind dokumentiert?"},
        ],
    }],
)

for block in antwort.content:
    if block.type == "text":
        print(block.text)
        for zitat in getattr(block, "citations", None) or []:
            print(f"   → Seite {zitat.start_page_number}: {zitat.cited_text[:80]}")

Die Antwort wird dabei in mehrere Textblöcke aufgeteilt; belegte Blöcke tragen ein citations-Feld. Bei PDF ist die Fundstelle vom Typ page_location mit start_page_number und end_page_numbereins-basiert, also unmittelbar für Menschen verwendbar.

Damit wird aus "das Modell sagt, es gebe drei Mängel" ein "auf Seite 7 steht folgender Satz". Für jede Auskunft, die jemand nachprüfen können muss — Berichte, Verträge, Genehmigungen —, ist das der Unterschied zwischen brauchbar und nicht brauchbar.

Zwei Regeln: Zitate müssen für alle Dokumente einer Anfrage aktiviert sein oder für keines. Und sie sind nicht mit erzwungenen Ausgabeformaten kombinierbar — citations zusammen mit output_config.format gibt einen Fehler 400. Sie müssen sich entscheiden: strukturierte Ausgabe oder belegte Ausgabe.

Wann sich der direkte Weg lohnt

Ja, wenn: Layout eine Rolle spielt, Tabellen enthalten sind, Abbildungen ausgewertet werden sollen, oder Sie seitengenaue Belege brauchen.

Nein, wenn: Es sich um Massenverarbeitung tausender Dokumente handelt und nur wenige Felder extrahiert werden sollen. Dann ist ein spezialisierter Parser mit anschließend gezielter Modellanfrage günstiger — die Abwägung steht im Vergleich der Dokumentenparser.

Der Grund ist der Token-Verbrauch: Ein 40-seitiges PDF belegt bei jeder Anfrage Kontext. Bei einer einmaligen Analyse ist das gleichgültig, bei 4.000 Dokumenten nicht.

Zwei Maßnahmen, die den Verbrauch dämpfen: Prompt-Caching für Dokumente, die mehrfach befragt werden — Cache-Lesen kostet ein Zehntel. Und die Batch-API für nicht eilige Massenverarbeitung, mit 50 Prozent Rabatt.

Häufig gestellte Fragen

Kann Claude PDF direkt lesen?

Ja, ohne vorgelagerte Texterkennung — inklusive Layout, Tabellen und Abbildungen. Das Dokument wird als eigener Inhaltsblock vor dem Textblock übergeben, entweder base64-kodiert oder als Verweis auf eine zuvor hochgeladene Datei. Die Grenzen liegen bei 32 MB je Anfrage und 600 Seiten je Dokument.

Wie bekomme ich seitengenaue Quellenangaben?

Über citations: {"enabled": true} am Dokumentblock. Die Antwort wird dann in mehrere Textblöcke aufgeteilt, und belegte Blöcke tragen ein citations-Feld mit start_page_number und end_page_number — eins-basiert. Zitate müssen für alle Dokumente einer Anfrage aktiviert sein oder für keines.

Warum bekomme ich einen Fehler 400 bei aktivierten Zitaten?

Wahrscheinlich, weil gleichzeitig ein erzwungenes Ausgabeformat gesetzt ist. Zitate und output_config.format schließen sich aus. Sie müssen sich entscheiden: strukturierte Ausgabe nach Schema oder belegte Ausgabe mit Fundstellen.

Wann lohnt sich die Files-API gegenüber Base64?

Sobald Sie mehrere Fragen zum selben Dokument stellen. Statt es bei jeder Anfrage erneut zu übertragen, laden Sie es einmal hoch und referenzieren die Kennung. Wichtig: Die Beta-Kennung muss sowohl beim Hochladen als auch bei jedem referenzierenden Aufruf gesetzt sein.

Funktioniert die Dateiverarbeitung auf Amazon Bedrock?

Die Files-API nicht — sie steht dort und auf Google Vertex AI nicht zur Verfügung. Der Base64-Weg funktioniert, bedeutet aber, dass das Dokument bei jeder Anfrage vollständig mitgeschickt und als Eingabe berechnet wird. Bei mehrfacher Befragung desselben Dokuments vervielfacht das den Token-Verbrauch.


Der nächste Schritt

Aktivieren Sie Zitate bei Ihrer ersten Dokumentenanwendung, auch wenn Sie sie zunächst nicht anzeigen. Der Aufwand ist eine Zeile, und sobald jemand eine Auskunft anzweifelt, haben Sie die Seitenzahl statt einer Diskussion. Beim Aufbau helfen wir gern.

📖 Verwandte Artikel

Weitere interessante Beiträge zu ähnlichen Themen