Wer schon einmal versucht hat, aus Arztbriefen, Vertragstexten, Support-Tickets oder Logfiles verlässlich strukturierte Daten zu gewinnen, kennt das Dilemma: Reguläre Ausdrücke sind schnell am Ende, klassische NLP-Pipelines brauchen Trainingsdaten, und wirft man das Ganze einfach in ein LLM, bekommt man zwar JSON zurück, aber ohne jede Garantie, dass die extrahierten Werte auch wirklich im Originaltext stehen. Genau hier setzt LangExtract an, eine Python-Bibliothek von Google, die im Mai mit Version 1.5.0 erschienen ist und auf GitHub bereits über 36.000 Sterne gesammelt hat.

Was LangExtract macht

LangExtract extrahiert strukturierte Informationen aus unstrukturiertem Text auf Basis von Anweisungen, die man selbst definiert. Man beschreibt in einem Prompt, was man haben möchte, liefert ein, zwei hochwertige Beispiele mit, und das Tool kümmert sich um den Rest: Chunking langer Dokumente, parallele Verarbeitung, Schema-Erzwingung und am Ende eine interaktive Visualisierung.

Der entscheidende Unterschied zu einem nackten LLM-Aufruf liegt im Source Grounding. Jede einzelne Extraktion wird auf ihre exakte Position im Quelltext zurückgeführt. Man weiß also nicht nur, dass das Modell „Ibuprofen 400 mg” gefunden hat, sondern auch wo genau im Dokument dieser Wert steht. Das ist kein Komfort-Feature, sondern in regulierten Umfeldern, Medizin, Recht, Compliance, die Grundvoraussetzung dafür, dass man dem Ergebnis überhaupt trauen darf.

Die Kernideen im Überblick

Sieben Eigenschaften machen das Tool aus, und sie greifen sauber ineinander:

Präzises Source Grounding. Jede Extraktion wird auf ihren Ursprung im Text gemappt, was visuelles Highlighting und damit echte Nachvollziehbarkeit ermöglicht. Findet das Modell etwas, das sich nicht im Quelltext lokalisieren lässt, bekommt die Extraktion ein char_interval = None, solche Halluzinationen lassen sich also gezielt herausfiltern.

Zuverlässige strukturierte Ausgaben. Das Ausgabeschema wird aus den mitgelieferten Few-Shot-Beispielen abgeleitet und konsistent durchgehalten. Bei unterstützten Modellen wie Gemini sorgt Controlled Generation dafür, dass die Struktur garantiert eingehalten wird.

Optimiert für lange Dokumente. Das berüchtigte „Needle in a Haystack”-Problem großer Texte wird über eine Kombination aus Text-Chunking, paralleler Verarbeitung und mehreren Extraktions-Durchläufen angegangen. Mehr Durchläufe bedeuten höheren Recall.

Interaktive Visualisierung. Aus den Ergebnissen generiert LangExtract eine eigenständige HTML-Datei, in der sich auch tausende extrahierte Entitäten in ihrem ursprünglichen Kontext durchstöbern lassen.

Flexible Modellwahl. Von Cloud-Modellen der Gemini-Familie über OpenAI bis zu lokalen Open-Source-Modellen via Ollama ist alles dabei, und über ein Plugin-System lassen sich eigene Provider ergänzen.

Domänenunabhängig und ohne Fine-Tuning. Eine neue Extraktionsaufgabe definiert man mit wenigen Beispielen. Es braucht kein Training, kein angepasstes Modell.

Quick Start

Die API ist angenehm schlank. Man definiert Prompt und Beispiele, ruft lx.extract auf – fertig. Hier das kanonische Beispiel aus der Dokumentation, das Figuren, Emotionen und Beziehungen aus einem Shakespeare-Zitat zieht:

import langextract as lx
import textwrap

prompt = textwrap.dedent("""\
    Extract characters, emotions, and relationships in order of appearance.
    Use exact text for extractions. Do not paraphrase or overlap entities.
    Provide meaningful attributes for each entity to add context.""")

examples = [
    lx.data.ExampleData(
        text="ROMEO. But soft! What light through yonder window breaks? It is the east, and Juliet is the sun.",
        extractions=[
            lx.data.Extraction(
                extraction_class="character",
                extraction_text="ROMEO",
                attributes={"emotional_state": "wonder"}
            ),
            lx.data.Extraction(
                extraction_class="emotion",
                extraction_text="But soft!",
                attributes={"feeling": "gentle awe"}
            ),
        ]
    )
]

result = lx.extract(
    text_or_documents="Lady Juliet gazed longingly at the stars, her heart aching for Romeo",
    prompt_description=prompt,
    examples=examples,
    model_id="gemini-3.5-flash",
)

Wichtig ist dabei: Die Beispiele steuern das Modellverhalten maßgeblich. Der extraction_text sollte möglichst wortgetreu aus dem Beispieltext stammen und nicht umschrieben werden, LangExtract warnt standardmäßig, wenn die Beispiele diesem Muster nicht folgen.

Für lange Texte skaliert man über zusätzliche Parameter. Das Tool kann komplette Dokumente direkt von einer URL verarbeiten:

result = lx.extract(
    text_or_documents="https://www.gutenberg.org/files/1513/1513-0.txt",
    prompt_description=prompt,
    examples=examples,
    model_id="gemini-3.5-flash",
    extraction_passes=3,    # mehr Durchläufe = höherer Recall
    max_workers=20,         # parallele Verarbeitung
    max_char_buffer=1000    # kleinere Kontexte = höhere Genauigkeit
)

Damit lässt sich der komplette „Romeo und Julia”-Text (knapp 148.000 Zeichen) verarbeiten und in hunderte Entitäten zerlegen.

Lokal betreiben mit Ollama

Für mich als Homelab-Betreiber ist der interessanteste Punkt, dass LangExtract komplett ohne Cloud und API-Key auskommt. Lokale Inferenz läuft über Ollama:

import langextract as lx

result = lx.extract(
    text_or_documents=input_text,
    prompt_description=prompt,
    examples=examples,
    model_id="gemma2:2b",          # wählt automatisch den Ollama-Provider
    model_url="http://localhost:11434",
)

Das Setup ist überschaubar: Ollama von ollama.com installieren, ollama pull gemma2:2b, dann ollama serve. Damit verlässt kein einziges Byte des zu verarbeitenden Textes die eigene Infrastruktur, für sensible Daten, etwa im medizinischen oder juristischen Kontext, ist das ein gewichtiges Argument. Wer mag, kann das Ganze auch im eigenen Cluster containerisieren; ein Dockerfile liegt dem Projekt bei.

Wofür man es einsetzt

Die mitgelieferten Beispiele zeigen die Bandbreite deutlich. Neben der literarischen Spielerei mit Shakespeare liegt der Fokus klar auf strukturierter Informationsextraktion aus Fachtexten: das Herausziehen von Medikamentennamen, Dosierungen und Verabreichungswegen aus klinischen Notizen etwa, inklusive der Beziehungen zwischen diesen Entitäten. Ein Live-Demo namens RadExtract auf HuggingFace Spaces zeigt, wie sich Radiologie-Berichte automatisch strukturieren lassen.

Übertragen auf den Alltag heißt das: überall dort, wo strukturierte Felder aus Fließtext gewonnen werden müssen und Nachvollziehbarkeit zählt. Vertragsanalyse, Extraktion aus Behördenschreiben, Aufbereitung von Support-Tickets, Auswertung von Forschungsliteratur – die Aufgabe definiert man jeweils über ein paar Beispiele neu, das Werkzeug bleibt dasselbe.

Einordnung

LangExtract ist ausdrücklich kein offiziell unterstütztes Google-Produkt, sondern steht unter Apache-2.0-Lizenz als Open Source bereit. Für gesundheitsbezogene Anwendungen gelten zusätzlich die Health-AI-Developer-Foundations-Nutzungsbedingungen. Man sollte sich außerdem bewusst sein, dass die Qualität der Extraktion immer vom gewählten Modell, der Komplexität der Aufgabe und der Klarheit von Prompt und Beispielen abhängt – das Tool nimmt einem die sorgfältige Formulierung der Aufgabe nicht ab.

Was es aber liefert, ist die fehlende Schicht zwischen „LLM gibt irgendwas zurück” und „verlässlich weiterverarbeitbare Daten”: ein erzwungenes Schema, nachprüfbare Quellenbezüge und eine Visualisierung, mit der man Ergebnisse tatsächlich kontrollieren kann. Für jeden, der LLMs über die Spielerei hinaus produktiv für Extraktionsaufgaben einsetzen will, lohnt sich ein genauer Blick.


Repository: github.com/google/langextract · Installation: pip install langextract