Warum ringen wir immer noch im Jahr 2025 mit Dokumenten?
In jeder datengesteuerten Organisation begegnen Sie auf einen Host von PDFs, Phrase-Dateien, PowerPoints, halb gescannten Bildern, handgeschriebenen Notizen und gelegentlichem Überraschungs-CSV, der in einem SharePoint-Ordner lauert. Geschäfts- und Datenanalysten verschwenden Stunden damit, diese Formate in etwas umzubauen, zu teilen und in etwas zu versehen, das ihre Python -Pipelines akzeptieren werden. Sogar die neuesten generativen AI-Stapel können ersticken, wenn der zugrunde liegende Textual content in Grafiken eingewickelt oder über unregelmäßige Tischgitter bestreut ist.
Docling wurde geboren, um genau diesen Schmerz zu lösen. Als Open-Supply-Projekt von IBM Analysis Zürich als Open-Supply-Projekt veröffentlicht und jetzt unter der Linux Basis AI & Knowledge Basis gehostet, ist die Bibliothek Parsing, Format-Verständnis, OCR, Tabellenrekonstruktion, multimodaler Export und sogar Audio-Transkription hinter einer vernünftigerweise einfachen API und Cli-Befehl.
Obwohl Docling die Verarbeitung von HTML, MS -Workplace -Formatdateien, Bildformaten und anderen unterstützt, werden wir sie hauptsächlich verwenden, um PDF -Dateien zu verarbeiten.
Warum sollte ich mich als Datenwissenschaftler oder ML -Ingenieur um das Docling interessieren?
Oft baut der wirkliche Engpass das Modell nicht auf – es füttert es. Wir verbringen einen großen Prozentsatz unserer Zeit mit Daten, und nichts tötet die Produktivität schneller als eine kritische Datensatz, die in einem 100-seitigen PDF gesperrt ist. Dies ist genau das Downside, das Docling löst und als Brücke aus der Welt unstrukturierter Dokumente direkt zur strukturierten Vernunft von Markdown, JSON oder einem Pandas -Datenframe fungiert.
Seine Leistung erstreckt sich jedoch über die gerechte Datenextraktion hinaus direkt in den Bereich der modernen, stehenden Entwicklung. Stellen Sie sich vor, Sie zeigen auf eine HTML -Seite mit API -Spezifikationen. Es übersetzt dieses komplexe Weblayout mühelos in sauberes, strukturiertes Markdown – der perfekte Kontext, um direkt in KI -Codierungsassistenten wie Cursor, Chatgpt oder Claude zu füttern.
Woher kam Docling herab
Das Projekt stammte im Deep Search Staff von IBM, das die Pipelines (Abruf-Augmented Technology) für lange Patent-PDFs entwickelte. Sie haben den Kern im Rahmen einer MIT-Lizenz Ende 2024 geöffnet und seitdem wöchentliche Veröffentlichungen verschickt. Eine lebendige Gemeinschaft bildete sich schnell um ihre einheitlichen DoclingDocument Modell, ein pydantisches Objekt, das Textual content, Bilder, Tabellen, Formeln und Format -Metadaten so nachgelagerte Instruments wie Langchain, Llamaindex oder Haystack zusammenhält, müssen die Lesereihenfolge einer Seite nicht erraten.
Heute integriert Docling visuellsprachige Modelle (VLMs), wie z. Smoldocling, Für Bildunterschrift. Es unterstützt auch Tesseract, Easyoc und Rapidocr für die Textextraktion und versendet Rezepte für die Aufnahme von Chunking, Serialisierung und Vektor. Mit anderen Worten: Sie richten es auf einen Ordner und Sie erhalten Markdown, HTML, CSV, PNGs, JSON oder nur ein pythones Objekt, das mit einem vorgefertigten Python-Objekt-kein zusätzlicher Gerüstcode erforderlich ist.
Was werden wir tun
Um das Docle zu demonstrieren, installieren wir es zuerst und verwenden es dann mit drei verschiedenen Beispielen, die seine Vielseitigkeit und Nützlichkeit als Dokument -Parser und -prozessor demonstrieren. Bitte beachten Sie, dass die Verwendung von Docling ziemlich rechenintensiv ist. Es ist daher hilfreich, wenn Sie Zugriff auf eine GPU in Ihrem System haben.
Bevor wir jedoch mit dem Codieren beginnen, müssen wir eine Entwicklungsumgebung einrichten.
Einrichtung einer Entwicklungsumgebung
Ich habe jetzt damit angefangen, den UV -Paket -Supervisor dafür zu verwenden. Verwenden Sie jedoch gerne die Instruments, mit denen Sie am besten vertraut sind. Beachten Sie auch, dass ich unter WSL2 Ubuntu für Home windows arbeiten und meinen Code mit einem Jupyter -Pocket book ausführen werde.
Beachten Sie, dass selbst mit UV den folgenden Code ein paar Minuten dauerte, um mein System zu vervollständigen, da es sich um eine ziemlich kräftige Bibliotheksanlage handelt.
$ uv init docling
Initialized mission `docling` at `/dwelling/tom/docling`
$ cd docling
$ uv venv
Utilizing CPython 3.11.10 interpreter at: /dwelling/tom/miniconda3/bin/python
Creating digital setting at: .venv
Activate with: supply .venv/bin/activate
$ supply .venv/bin/activate
(docling) $ uv pip set up docling pandas jupyter
Geben Sie nun den Befehl ein,
(docling) $ jupyter pocket book
Und Sie sollten ein Notizbuch in Ihrem Browser offen sehen. Wenn das nicht automatisch passiert, werden Sie wahrscheinlich nach dem Ausführen der Ausführung der Data von Informationen angezeigt Jupyter Pocket book Befehl. Nahe unten finden Sie eine URL zum Kopieren und Einfügen in Ihren Browser, um das Jupyter -Notizbuch zu starten.
Ihre URL wird anders sein als meine, aber sie sollte ungefähr so aussehen:-
http://127.0.0.1:8888/tree?token=3b9f7bd07b6966b41b68e2350721b2d0b6f388d248cc69d
Beispiel 1: Konvertieren Sie PDF oder DOCX in Markdown oder JSON
Der einfachste Anwendungsfall ist auch derjenige, den Sie einen großen Prozentsatz der Zeit verwenden:- Verwandeln Sie den Textual content eines Dokuments in Markdown
Für die meisten unserer Beispiele wird unser Eingangspdf eins mehrmals für verschiedene Checks verwendet. Es handelt sich um eine Kopie von Teslas 10-Q-SEC-Anmeldungsdokument vom September 2023. Es ist ungefähr fünfzig Seiten lang und besteht hauptsächlich aus Finanzinformationen im Zusammenhang mit Tesla. Das vollständige Dokument ist auf der Web site der Securities & Change Fee (SEC) öffentlich verfügbar und kann mit dieser angezeigt/heruntergeladen werden Hyperlink.
Hier ist ein Bild der ersten Seite dieses Dokuments als Referenz.

Lassen Sie uns den Docle -Code überprüfen, den wir in Markdown konvertieren müssen. Es richtet den Dateipfad für die Eingabe -PDF ein, führt die Dokumentconverter -Funktion darauf aus und exportiert dann das Parsen -Ergebnis in das Markdown -Format, damit der Inhalt leichter lesen, bearbeitet oder analysiert werden kann.
from docling.document_converter import DocumentConverter
import time
from pathlib import Path
inpath = "/mnt/d//tesla"
infile = "tesla_q10_sept_23.pdf"
data_folder = Path(inpath)
doc_path = data_folder / infile
converter = DocumentConverter()
outcome = converter.convert(doc_path) # → DoclingResult
# Markdown export nonetheless works
markdown_text = outcome.doc.export_to_markdown()
Dies ist die Ausgabe, die wir vom oberen Code ausführen (nur die erste Seite).
## UNITED STATES SECURITIES AND EXCHANGE COMMISSION
Washington, D.C. 20549 FORM 10-Q
(Mark One)
- x QUARTERLY REPORT PURSUANT TO SECTION 13 OR 15(d) OF THE SECURITIES EXCHANGE ACT OF 1934
For the quarterly interval ended September 30, 2023
OR
- o TRANSITION REPORT PURSUANT TO SECTION 13 OR 15(d) OF THE SECURITIES EXCHANGE ACT OF 1934
For the transition interval from _________ to _________
Fee File Quantity: 001-34756
## Tesla, Inc.
(Actual identify of registrant as laid out in its constitution)
Delaware
(State or different jurisdiction of incorporation or group)
1 Tesla Street Austin, Texas
(Handle of principal govt workplaces)
## (512) 516-8177
(Registrant's phone quantity, together with space code)
## Securities registered pursuant to Part 12(b) of the Act:
| Title of every class | Buying and selling Image(s) | Title of every trade on which registered |
|-----------------------|---------------------|---------------------------------------------|
| Frequent inventory | TSLA | The Nasdaq World Choose Market |
Point out by test mark whether or not the registrant (1) has filed all stories required to be filed by Part 13 or 15(d) of the Securities Change Act of 1934 ('Change Act') in the course of the previous 12 months (or for such shorter interval that the registrant was required to file such stories), and (2) has been topic to such submitting necessities for the previous 90 days. Sure x No o
Point out by test mark whether or not the registrant has submitted electronically each Interactive Knowledge File required to be submitted pursuant to Rule 405 of Regulation S-T (§232.405 of this chapter) in the course of the previous 12 months (or for such shorter interval that the registrant was required to submit such information). Sure x No o
Point out by test mark whether or not the registrant is a big accelerated filer, an accelerated filer, a non-accelerated filer, a smaller reporting firm, or an rising progress firm. See the definitions of 'massive accelerated filer,' 'accelerated filer,' 'smaller reporting firm' and 'rising progress firm' in Rule 12b-2 of the Change Act:
Giant accelerated filer
x
Accelerated filer
Non-accelerated filer
o
Smaller reporting firm
Rising progress firm
o
If an rising progress firm, point out by test mark if the registrant has elected to not use the prolonged transition interval for complying with any new or revised monetary accounting requirements supplied pursuant to Part 13(a) of the Change Act. o
Point out by test mark whether or not the registrant is a shell firm (as outlined in Rule 12b-2 of the Change Act). Sure o No x
As of October 16, 2023, there have been 3,178,921,391 shares of the registrant's frequent inventory excellent.
Mit dem Aufstieg von AI -Code -Redakteuren und der Verwendung von LLMs im Allgemeinen ist diese Technik wesentlich wertvoller und relevanter geworden. Die Wirksamkeit von LLMs und Code -Redakteuren kann durch den angemessenen Kontext erheblich verbessert werden. Oft beinhaltet dies die Bereitstellung der Textdarstellung eines bestimmten Instruments oder eines bestimmten Dokumentations-, API- und Codierungsbeispiels.
Das Umwandeln der Ausgabe von PDFs in JSON -Format ist ebenfalls unkompliziert. Fügen Sie einfach diese beiden Codezeilen hinzu. Sie können Einschränkungen mit der Größe der JSON -Ausgabe begegnen. Passen Sie additionally die Druckanweisung entsprechend an.
json_blob = outcome.doc.model_dump_json(indent=2)
print(json_blob(10000), "…")
Beispiel 2: Komplexe Tabellen aus einem PDF extrahieren
Viele PDFs speichern häufig Tische als isolierte Textbrocken oder, schlimmer, als abgeflachte Bilder. Das Tischstrukturmodell von Docling stellt Zeilen, Säulen und Spannungszellen wieder zusammen, wodurch Sie entweder einen PANDAS-Datenframe oder einen CSV-Save-Save-Save-CSV erhalten. Unser Testeingang PDF verfügt über viele Tabellen. Schauen Sie sich beispielsweise auf Seite 11 des PDF an, und wir können die folgende Tabelle sehen.

Mal sehen, ob wir diese Daten extrahieren können. Es ist etwas komplexerer Code als in unserem ersten Beispiel, aber es leistet mehr Arbeit. Das PDF wird erneut unter Verwendung der Docle -Funktionsfunktion von Docling konvertiert, wodurch eine strukturierte Dokumentendarstellung erzeugt wird. Für jede erkannte Tabelle transformiert sie dann die Tabelle in einen Pandas -Datenframe und ruft auch die Seitennummer der Tabelle aus den Provenienzmetadaten des Dokuments ab. Wenn die Tabelle von Seite 11 stammt, wird sie im Markdown -Format ausgedruckt und dann die Schleife durchbricht (so wird nur die erste Matching -Tabelle angezeigt).
import pandas as pd
from docling.document_converter import DocumentConverter
from time import time
from pathlib import Path
inpath = "/mnt/d//tesla"
infile = "tesla_q10_sept_23.pdf"
data_folder = Path(inpath)
input_doc_path = data_folder / infile
doc_converter = DocumentConverter()
start_time = time()
conv_res = doc_converter.convert(input_doc_path)
# Export desk from web page 11
for table_ix, desk in enumerate(conv_res.doc.tables):
page_number = desk.prov(0).page_no if desk.prov else "Unknown"
if page_number == 11:
table_df: pd.DataFrame = desk.export_to_dataframe()
print(f"## Desk {table_ix} (Web page {page_number})")
print(table_df.to_markdown())
break
end_time = time() - start_time
print(f"Doc transformed and tables exported in {end_time:.2f} seconds.")
Und die Ausgabe ist nicht zu schäbig.
## Desk 10 (Web page 11)
| | | Three Months Ended September 30,.2023 | Three Months Ended September 30,.2022 | 9 Months Ended September 30,.2023 | 9 Months Ended September 30,.2022 |
|---:|:---------------------------------------|:----------------------------------------|:----------------------------------------|:---------------------------------------|:---------------------------------------|
| 0 | Automotive gross sales | $ 18,582 | $ 17,785 | $ 57,879 | $ 46,969 |
| 1 | Automotive regulatory credit | 554 | 286 | 1,357 | 1,309 |
| 2 | Vitality technology and storage gross sales | 1,416 | 966 | 4,188 | 2,186 |
| 3 | Providers and different | 2,166 | 1,645 | 6,153 | 4,390 |
| 4 | Whole revenues from gross sales and companies | 22,718 | 20,682 | 69,577 | 54,854 |
| 5 | Automotive leasing | 489 | 621 | 1,620 | 1,877 |
| 6 | Vitality technology and storage leasing | 143 | 151 | 409 | 413 |
| 7 | Whole revenues | $ 23,350 | $ 21,454 | $ 71,606 | $ 57,144 |
Doc transformed and tables exported in 33.43 seconds.
Um alle Tabellen von einem PDF abzurufen, müssten Sie das weglassen Wenn page_number =… Zeile aus meinem Code.
Eine Sache, die ich beim Docling bemerkt habe, ist, dass es nicht schnell ist. Wie oben gezeigt, dauerte es quick 34 Sekunden, um diese einzelne Tabelle aus einem 50-seitigen PDF zu extrahieren.
Beispiel 3: Führen Sie OCR auf einem Bild durch.
In diesem Beispiel habe ich eine zufällige Seite aus der Tesla 10-Q PDF gescannt und sie als PNG-Datei gespeichert. Lassen Sie uns sehen, wie das Ablesen von Copes mit dem Lesen dieses Bildes und dem Konvertieren dessen in Markdown konvertiert wird. Hier ist mein gescanntes Bild.

Und unser Code. Wir verwenden Tesseract als OCR -Motor (andere sind verfügbar)
from pathlib import Path
import time
import pandas as pd
from docling.document_converter import DocumentConverter, ImageFormatOption
from docling.fashions.tesseract_ocr_cli_model import TesseractCliOcrOptions
def most important():
inpath = "/mnt/d//tesla"
infile = "10q-image.png"
input_doc_path = Path(inpath) / infile
# Configure OCR for picture enter
image_options = ImageFormatOption(
ocr_options=TesseractCliOcrOptions(force_full_page_ocr=True),
do_table_structure=True,
table_structure_options={"do_cell_matching": True},
)
converter = DocumentConverter(
format_options={"picture": image_options}
)
start_time = time.time()
conv_res = converter.convert(input_doc_path).doc
# Print all tables as Markdown
for table_ix, desk in enumerate(conv_res.tables):
table_df: pd.DataFrame = desk.export_to_dataframe(doc=conv_res)
page_number = desk.prov(0).page_no if desk.prov else "Unknown"
print(f"n--- Desk {table_ix+1} (Web page {page_number}) ---")
print(table_df.to_markdown(index=False))
# Print full doc textual content as Markdown
print("n--- Full Doc (Markdown) ---")
print(conv_res.export_to_markdown())
elapsed = time.time() - start_time
print(f"nProcessing accomplished in {elapsed:.2f} seconds")
if __name__ == "__main__":
most important()
Hier ist unsere Ausgabe.
--- Desk 1 (Web page 1) ---
| | Three Months Ended September J0,. | Three Months Ended September J0,.2022 | 9 Months Ended September J0,.2023 | 9 Months Ended September J0,.2022 |
|:-------------------------|------------------------------------:|:----------------------------------------|:---------------------------------------|:---------------------------------------|
| Value ol revenves | 181 | 150 | 554 | 424 |
| Analysis an0 developrent | 189 | 124 | 491 | 389 |
| | 95 | | 2B3 | 328 |
| Whole | 465 | 362 | 1,328 | 1,141 |
--- Full Doc (Markdown) ---
## Observe 8 Fairness Incentive Plans
## Different Pertormance-Primarily based Grants
("RSUs") und inventory optlons unrecognized stock-based compensatian
## Abstract Inventory-Primarily based Compensation Data
| | Three Months Ended September J0, | Three Months Ended September J0, | 9 Months Ended September J0, | 9 Months Ended September J0, |
|--------------------------|------------------------------------|------------------------------------|-----------------------------------|-----------------------------------|
| | | 2022 | 2023 | 2022 |
| Value ol revenves | 181 | 150 | 554 | 424 |
| Analysis an0 developrent | 189 | 124 | 491 | 389 |
| | 95 | | 2B3 | 328 |
| Whole | 465 | 362 | 1,328 | 1,141 |
## Observe 9 Commitments and Contingencies
## Working Lease Preparations In Buffalo, New York and Shanghai, China
## Authorized Proceedings
Between september 1 which 2021 pald has
Processing accomplished in 7.64 seconds
Wenn Sie diese Ausgabe mit dem Originalbild vergleichen, sind die Ergebnisse enttäuschend. Ein Großteil des Textes im Bild wurde einfach verpasst oder verstümmelt. Hier kommt ein Produkt wie AWS Textract für sich selbst, da es sich beim Extrahieren von Textual content aus einer Vielzahl von Quellen auszeichnet.
Das Docling bietet jedoch verschiedene Optionen für OCR. Wenn Sie additionally schlechte Ergebnisse von einem System erhalten, können Sie jederzeit zu einem anderen wechseln.
Ich habe die gleiche Aufgabe unter Verwendung von EasyOcR versucht, aber die Ergebnisse unterschieden sich nicht wesentlich von denen, die mit Tesseract erhalten wurden. Wenn Sie es ausprobieren möchten, hier ist der Code.
from pathlib import Path
import time
import pandas as pd
from docling.document_converter import DocumentConverter, ImageFormatOption
from docling.fashions.easyocr_model import EasyOcrOptions # Import EasyOCR choices
def most important():
inpath = "/mnt/d//tesla"
infile = "10q-image.png"
input_doc_path = Path(inpath) / infile
# Configure picture pipeline with EasyOCR
image_options = ImageFormatOption(
ocr_options=EasyOcrOptions(force_full_page_ocr=True), # use EasyOCR
do_table_structure=True,
table_structure_options={"do_cell_matching": True},
)
converter = DocumentConverter(
format_options={"picture": image_options}
)
start_time = time.time()
conv_res = converter.convert(input_doc_path).doc
# Print all tables as Markdown
for table_ix, desk in enumerate(conv_res.tables):
table_df: pd.DataFrame = desk.export_to_dataframe(doc=conv_res)
page_number = desk.prov(0).page_no if desk.prov else "Unknown"
print(f"n--- Desk {table_ix+1} (Web page {page_number}) ---")
print(table_df.to_markdown(index=False))
# Print full doc textual content as Markdown
print("n--- Full Doc (Markdown) ---")
print(conv_res.export_to_markdown())
elapsed = time.time() - start_time
print(f"nProcessing accomplished in {elapsed:.2f} seconds")
if __name__ == "__main__":
most important()
Zusammenfassung
Der generative Increase entzündete eine alte Wahrheit erneut: Müll in, Müll aus. LLMs können nur dann weniger halluzinieren, wenn sie semantisch und räumlich kohärente Eingaben aufnehmen. Das Docling bietet Kohärenz (meistens) über mehrere Quellformate hinweg, die Ihre Stakeholder vorstellen können, und tut dies lokal und reproduzierbar.
Docling hat seine Verwendung über die KI -Welt hinaus. Berücksichtigen Sie die große Anzahl von Dokumenten, die an Standorten wie Bankgewölben, Anwälten und Versicherungsunternehmen weltweit gespeichert sind. Wenn diese digitalisiert werden sollen, kann das Docling einige der Lösungen dafür liefern.
Seine größte Schwäche ist wahrscheinlich die optische Charaktererkennung von Textual content in Bildern. Ich habe versucht, Tesseract und Easyocr zu verwenden, und die Ergebnisse von beiden waren enttäuschend. Sie müssen wahrscheinlich ein kommerzielles Produkt wie AWS Textract verwenden, wenn Sie Textual content aus diesen Arten von Quellen zuverlässig reproduzieren möchten.
Es kann auch langsam sein. Ich habe einen ziemlich hohen Spec-Desktop-PC mit einer GPU, und es dauerte einige Zeit bei den meisten Aufgaben, die ich eingestellt habe. Wenn Ihre Eingabedokumente jedoch in erster Linie PDFs sind, kann Docling eine wertvolle Ergänzung Ihrer Textverarbeitungs -Toolbox sein.
Ich habe nur die Oberfläche dessen, wozu das Docling fähig ist Hyperlink mehr lernen.
