Snilld

Fra PDF til RAG med deepDoctection 1.2.x i en kørende notebook

En ny hands-on tutorial demonstrerer en fuld dokumentintelligens‑pipeline med deepDoctection 1.2.x. Den samler layoutdetektion, tabelstruktur, OCR, læserækkefølge og annoteringslinking i ét sammenhængende flow – og kan køres direkte som en reproducérbar PoC via notebook med pip‑install og wget. Det er praktisk, men også et wake‑up call om drift, versioner og governance før produktion.

23. august 2026 Peter Munkholm

En praktisk tutorial viser nu, at deepDoctection 1.2.x kan drive en end‑to‑end dokumentpipeline, der ikke bare finder bokse på en side, men binder struktur, tekst og relationer sammen til noget man faktisk kan arbejde med. Notebooken kan køres direkte som en PoC med få kommandoer, og output rammer et ordnet JSONL-format, som er lige til at proppe i RAG- eller søgesystemer. Det er tættere på plug‑and‑play, end man er vant til – men stadig med et par skarpe hjørner.

Pointen er konkret. Der er kode, konfiguration og eksempeldata på plads, så tekniske teams kan validere mod egne filer på en eftermiddag. Det interessante er, hvor langt man kan nå i én notesbog, og hvor hullerne begynder, når snuden peger mod produktion.

Hvad notebooken faktisk gør

Tutorialen samler seks trin i ét workflow: layoutdetektion, tabelstrukturgenkendelse, OCR, læserækkefølge, annoteringslinking og struktureret eksport. Den konfigurerer analysen med DocLayNet-baseret layoutmodel, Table Transformer til tabelstruktur og DocTR som OCR-motor. Alt sammen i deepDoctection 1.2.x, og alt sammen verificeret direkte i koden og de viste udskrifter fra modellen.

Opsætningen starter med en håndfuld pip-installationer: deepdoctection, transformers (version 5.2.0 eller nyere), timm, python-doctr, pdfplumber, networkx og lxml. Der sættes også miljøvariabler for at styre runtime, herunder DD_USE_TORCH=True, DPI=200, LOG_LEVEL=INFO og ENABLE_DYNAMIC_OBJECT_TYPES=False. Små ting, men de gør driften forudsigelig i en PoC.

Et test-setup i et lille laboratorium: en tekniker (ansigt ude af frame) peger på en fysisk prøveopstilling hvor udskårne papirer og en printet tabelvise ligger ved siden af måleudstyr; naturligt lys, reportagestil.

PEFT og kompatibilitet

En lille, men vigtig detalje i notebooken er en patch til Transformers’ PEFT-integration: import af transformers.integrations.peft efterfulgt af en overstyring, så _hf_peft.is_peft_available returnerer False. Det forhindrer, at der ledes efter PEFT-adapters ved from_pretrained. Det er en nødvendig lappeløsning med den nævnte versionskombination, og samtidig en påmindelse om at låse versioner og teste i CI.

Her bør teams kæde kravene til et requirements.txt med pinned versions og lave en minimal smoke-test ved build. Ellers risikerer man, at en tilsyneladende uskyldig opdatering af transformers vælter hele kæden. Det lyder banalt. Det er det ikke i praksis.

Data ind og ud

Notebooken henter eksempelfiler med wget: en PDF til \/content\/docs og et finans-billede til \/content\/imgs. Strukturen er enkel, og output foldes ud i en separat \/content\/out-mappe. En lille hjælper, analyze_any, står for korrekt dispatch mellem mappe, PDF og enkeltbillede. For billeder kræves bytes= indlæst fra filen, ellers falder den på gulvet med en ValueError. En nyttig detalje, som sparer fejlsøgning.

Det, der kommer ud, er ikke bare løse tekststumper. Resultaterne ligger som Page-objekter, der rummer tekst, figurer, tabeller, relationer, provenance og læserækkefølge. I praksis betyder det, at man kan referere tilbage til hvor på siden noget stod, og i hvilken orden det bør læses. Det gør efterbehandling markant nemmere.

Valg af komponenter

Valget af DocLayNet-modellen til layoutdetektion er fornuftigt, fordi den er trænet på dokumentlayout med fine-grained kategorier. Table Transformer er velegnet til at udlede tabelstrukturer, ikke kun kasser med “her er en tabel”. DocTR bruges til OCR og spiller sammen med resten af kæden uden store krumspring. Kombinationen er ikke ny i feltet, men sjældent samlet så stramt i én opskrift.

Banner

Konfigurationen i deepDoctection sætter bl.a. USE_LAYOUT, USE_TABLE_SEGMENTATION, USE_OCR og vægte til de konkrete modeller. Der filtreres eksplicit efter table for at føre Table Transformer på de relevante regioner. Det reducerer unødig computation og støj, og giver et renere resultat i Page-objektet.

Et fotografisk kort malet på et råt betongulv med markerede ruter i cyan og grøn, to zoner (PoC/Production) adskilt af en skygge — makrofølelse med menneskelig skala til stede i kanten.

Udvidelser uden at forgribe sig på kernen

Tutorialen viser, hvordan man kan registrere egne objekttyper og lægge en custom PipelineComponent ind til at finde beløb og datoer samt klassificere dokumenter efter tabellariske kendetegn. Det er en pragmatisk model: i stedet for at forgribe sig på frameworkets indvolde tilføjes en forarbejder i kanten. Fordelen er lav friktion og bedre opgraderbarhed.

Begrænsningen er, at simpel heuristik kan snuble over domæner med mange varianter, f.eks. regnskaber med minusparenteser eller valutaformater, der blander mellemrum og punktummer. Hvis man forventer robusthed på tværs af sprog og formater, skal komponenten enten være mere sprogbevidst eller kobles til en lille NER-model. Det er ikke svært, men det koster tid.

Fra pipeline til fil

Workflowet samles manuelt med ServiceFactory, inklusive filtrering og en form for service rollback, så fejl i en tjeneste ikke vælter alt. Sider serialiseres, og annoteringer bliver til ordnede JSONL-chunks. Formatet er struktureret, med læserækkefølge og provenance intakt, så downstream retrieval og RAG kan bruge det uden at gætte layout. Og det virker.

PoC på en eftermiddag

Det håndgribelige i notebooken er interessant: pip install og et par wget, mapperne \/content\/docs og \/content\/imgs, en OUT-mappe – og så kører den. En DPI på 200 som default, torchenabler sat, og et par logniveauer som gør det til at holde ud. Alt er beskrevet i klare trin, som er lette at gentage i Colab eller en frisk VM.

En detalje, der ofte overses, er GPU-planlægning. Selvom pipeline godt kan køre på CPU i lille skala, er både layoutmodellen og tabelstrukturen tungere end de ser ud. Et enkelt T4 eller L4 gør en verden til forskel i throughput. Det er ikke med i tutorialen, men værd at notere før man lover en chef, at “den er klar på mandag”.

Et test-setup i et lille laboratorium: en tekniker (ansigt ude af frame) peger på en fysisk prøveopstilling hvor udskårne papirer og en printet tabelvise ligger ved siden af måleudstyr; naturligt lys, reportagestil.

Fra PoC til drift

Notebooken er pæn som PoC, men den springer driftsspørgsmålene over: overvågning, metrikker, modellivscyklus og driftsmæssige rollback‑mønstre. Ingen ord om latencymål, batch-strategi eller forbrug per side. Ingen opskrift på GPU‑memorybudget eller auto-skalering. Det er ikke en kritik af forfatteren, mere en påmindelse om, at det næste stykke er det hårde.

Her støder man også på governance. Hvem godkender modelopdateringer, hvordan dokumenteres versionsskift, og hvornår skal data slettes eller maskeres for PII. Der er tavshed i tutorialen, og det er fair; men før produktion bør en minimal MLOps‑kæde være på plads: data sampling, kvalitetschecks, driftsovervågning og en enkel feedback‑loop til fejlretning.

JSONL og integration

Eksporten til ordnede JSONL-chunks gør integration til søgeindeks eller RAG mere lavfriktions. Kravet den stiller tilbage til platformen er simpelt: behold side- og afsnits‑ID’er, gem læserækkefølge, og undlad at blande figurer, tabeller og brødtekst i samme chunk med mindre det er tilsigtet. Ellers stiger støjen i retrievallaget.

For teams med ERP eller CRM i baghånden betyder JSONL’en, at data kan lægges ind i en pipeline for validering, berigelse og derefter tilgængeliggøres i et QA‑lag. Ingen magi, bare disciplin. Det er netop det, der virker i praksis.

Versioner og afhængigheder

Transformers>=5.2.0, PEFT‑patchen, timm, python‑doctr og vennerne skal holdes i snor. Det oplagte er at bygge en container med pinned versions, køre en CI‑test der spinner en mini‑pipeline op mod to sider, og fejle build ved regression. Husk også at fiksere modelvægt‑URI’er – registreringen i ModelCatalog er hjælpsom, men eksterne vægtlinks kan flytte sig over tid.

Banner

Derudover bør man gemme runtime‑konfigurationen sammen med output som provenance. Det lyder tørt, men når en compliance‑rundtur lander i indbakken om tre måneder, er det rart at kunne svare skarpt på “hvilken modelversion lavede den her udtrækning”.

Notebook versus referencearkitektur

Som kontrast peger AWS’ Agentic Data Operations Platform på en anden skala: en referencearkitektur, der lover at skære uger af data‑onboarding ved at lade AI‑agenter generere ETL, kvalitetskontroller og politikker, som så promoveres via CI\/CD. Det er et build‑time‑accelerator‑synspunkt, ikke en runtime‑afhængighed, og det adresserer governance og livscyklus i samme åndedrag.

Hvor notebooken viser håndværket tæt på metallet, søger ADOP at standardisere operationslaget. Det er to forskellige mål: PoC‑fart versus driftssikkerhed. Ingen af dem gør det hele. Kombinationen – en klar PoC, derefter en platformiseret vej ind i produktion – er den realistiske sti.

Hvad der stadig mangler svar

Der er ingen publicerede målinger på nøjagtighed for layout, tabeller og OCR i eksemplerne. Ingen tal for throughput pr. side, GPU‑forbrug eller latency. Ingen anbefalet cloudprofil eller batch‑\/realtime‑arkitektur. Ingen dokumenteret strategi for kontinuerlig træning eller håndtering af koncept‑drift i layout over tid.

Der mangler også en praksisnær sikkerhedssektion: PII‑rensning, logmaskering, adgangsstyring, og hvorvidt mellemresultater må persisteres. Alt sammen ting, der er afgørende, når dokumenterne ikke er neutrale papers, men kundedata med navne og beløb.

Tre potentielle faldgruber

For det første kan læserækkefølgen snyde ved flerspaltede layouts. Et simpelt top‑til‑bund kan samle kolonner forkert. Test tidligt med publikationer, der har sidehoveder, fodnoter og indskudte bokse.

For det andet splitter tabeldetektionen nogle gange store tabeller ved sidebrud eller uens linjetykkelser. En eval‑suite med syntetiske og rigtige eksempler gør det tydeligt, om man bør tune NMS eller efterbehandle celler.

For det tredje laver OCR oftere fejl på specialtegn, valuta og tekniske symboler. Sæt sprog- og token‑normalisering ind i pipeline tidligt, og mål effekten på downstream QA. Det føles som nusseri. Det er det værd.

Hvad det betyder i praksis

Kort sagt kan tekniske teams reproducere tutorialen hurtigt og afgøre, om deepDoctection dækker de faktiske dokumenter i porteføljen. Hvis svaret er ja, ligger vejen åben for at koble struktureret JSONL ind i søgning og QA. Hvis svaret er nej, afslører PoC’en hurtigt hvor skoen trykker – tabeller, OCR eller læserækkefølge – og hvor der skal investeres.

Næste skridt for praktikere

Reproducer notebooken uændret og gem alle artefakter. Lav derefter en lille benchmark mod egne filer med 50–100 sider fordelt på 3–4 doktyper, og mål nøjagtighed for layout, tabeller og OCR. Containerisér med pinned versions, og kør en daglig CI‑smoketest.

Instrumentér pipeline med metrikker for fejlrate pr. komponent, behandlingstid pr. side og andel af sider med tom OCR. Planlæg en minimal governance: versionslog, rollback‑knap, og en simpel feedback‑kanal hvor fejlmarkeringer kan samples til forbedring. Små skridt, stor effekt.

Den bredere bevægelse

Open source‑værktøjer som deepDoctection gør dokumentintelligens mere tilgængelig. Man kan samle en funktionsdygtig kæde uden at binde sig til én leverandør. Men operationslaget – det ADOP peger mere på – kræver stadig omtanke, så integration, compliance og livscyklus spiller sammen uden overraskelser.

Det, der overraskede her, var hvor langt en enkelt notesbog kan bære. Og hvor tydeligt den samtidig afslører de næste beslutninger om drift, der ikke kan udskydes. Begge ting er sunde. Det holder projektet ærligt.

Konklusion

Tutorialen leverer en brugbar, reproducerbar end‑to‑end‑pipeline i deepDoctection 1.2.x med layout, tabeller, OCR, læserækkefølge, linking og struktureret JSONL‑eksport. Den viser også de uafklarede spørgsmål om drift, performance og styring, der skal besluttes, før noget bliver robust i produktion. Start med at køre den, mål på egne dokumenter, lås versionerne – og byg derfra.

Kilder

    Gør brugeroplevelsen bedre.
    Hvilket firma arbejder du for?