Extrakce
Tady projekt uspěje, nebo selže. Dokument nezačíná návrhem, ale výčtem toho, co na těch PDF nefunguje, a končí seznamem případů, u kterých autor přiznává, že řešení zatím nemá.
- Stav
- plánováno — žádný kód pipeline neexistuje
- Výchozí práh
- 0,85 skóre spolehlivosti
- Přísnější práh
- 0,95 pro pohledávky nad 1 000 000 Kč
- Klíč cache
- SHA-256 dokumentu plus verze extraktoru
- LLM stádium
- volitelné na úrovni nasazení; bez něj vše končí v kontrole
Proč to nejde vyřešit klasickým OCR
- Dokumenty jsou převážně skeny velmi různé kvality z desetiletí různých skenerů.
- Přihláška je formulář, jehož význam nese layout — o tom, jestli je číslo jistina nebo příslušenství, zajištěná nebo nezajištěná část, rozhoduje políčko, ve kterém stojí.
- Přílohy o stovkách stran jsou běžné, což je zároveň nákladový i kontextový problém.
- Novela z roku 2017 změnila formulář i režim přezkumu, takže parser psaný na dnešní dokumenty u starších případů tiše nevrátí nic.
Stádia a routing
Stažení adresuje dokument hashem obsahu, takže známý hash se přeskočí. Následuje klasifikace typu dokumentu a oddílu spisu, OCR na text a layoutové boxy, extrakce do deklarovaného JSON schématu (model si tvar výstupu nevolí) a validace: schéma, doménová pravidla, konzistence napříč poli a u závěrek účetní identity.
Skóre je per pole i per záznam. Záznam, u kterého je nominál jistý a příznak zajištění ne, pošle do kontroly příznak a nominál zapíše — pokud záznam zůstane vnitřně konzistentní. Pokud ne, jde do kontroly celý.
Selhané validační pravidlo a selhaná účetní identita míří do kontroly vždy, bez ohledu na skóre. Prompt navíc modelu výslovně přikazuje vrátit null místo odhadu.
%% title: Stádia dokumentové pipeline
%% caption: Dokument je adresovaný hashem obsahu a výsledek extrakce se cachuje podle hashe a verze extraktoru. Neprošlá kontrola citace nebo částky pošle pohledávku ke kontrole bez ohledu na ostatní. Dnes jen pro přihlášky; obecná klasifikace typu dokumentu, čtení rozvržení stránky a skóre po jednotlivých polích zatím postavené nejsou.
flowchart LR
A["Stažení<br/>adresováno obsahem"] --> H{"Hash<br/>už známý?"}
H -- "ano" --> C[("Cache<br/>SHA-256 + verze extraktoru")]
H -- "ne" --> B["Výběr dokumentu<br/>typ události a oddíl"]
B --> O["Text stránky<br/>vrstva nebo OCR"]
O --> E["Extrakce modelem<br/>do JSON schématu"]
E --> V{"Validace<br/>citace, částky,<br/>součty, IČO"}
V -- "selhala" --> Q["Fronta kontroly"]
V -- "prošla" --> S{"Skóre<br/>po dílčí pohledávce"}
S -- "pod prahem" --> Q
S -- "nad prahem" --> W[("Zápis s proveniencí<br/>dokument, stránka, skóre")]
E -.-> C
click A href "/roadmap/dokumentova-pipeline" "Dokumentová pipeline"
click C href "/architecture/vysledky-extrakce-jsou-cachovane" "Výsledky extrakce jsou cachované"
click E href "/architecture/ocr-a-llm-extrakce-do-schematu" "OCR + LLM extrakce do schématu"
click O href "/architecture/ocr-a-llm-extrakce-do-schematu" "OCR + LLM extrakce do schématu"
click V href "/docs/extrakce" "Extrakce"
click S href "/architecture/confidence-je-plnohodnotne-pole" "Confidence je plnohodnotné pole"
click Q href "/roadmap/fronta-lidske-kontroly" "Fronta lidské kontroly"
click W href "/about/cislo-bez-zdroje-neni-udaj" "Číslo bez zdroje není údaj"
class A st-in_progress
class Q st-in_progress
Barva uzlu je stav položky na roadmapě: Rozpracováno
Šest případů, které lepší prompt nevyřeší
| Případ | Proč rozbíjí naivní extrakci |
|---|---|
| Přihláška mimo úřední formulář | ruční podání nemá layout, o který by se šlo opřít |
| Přílohy o stovkách stran | náklad a kontextové limity; před extrakcí je potřeba výběr stran |
| Řízení před rokem 2017 | protokoly z přezkumného jednání místo zpráv o přezkumu — jiný dokument, jiný slovník |
| Rozvrhová usnesení | odkazují pořadová čísla ze seznamu přihlášených pohledávek, ne P-pozice |
| Více dílčích pohledávek v jedné přihlášce | opakující se sekce formuláře se musí rozdělit správně, jinak se částky slijí |
| Opravy a doplnění | pozdější dokument mění dřívější; seznam událostí to musí zaznamenat, ne přepsat historii |
Cache a náklad
Výsledky se ukládají podle hashe dokumentu a verze extraktoru. Není to optimalizace, je to podmínka, aby byl event-sourced návrh vůbec finančně únosný — bez cache by každá oprava projektoru stála celý backfill v OCR a tokenech a tým by chyby v projektoru přestal opravovat. Zvýšení verze extraktoru zneplatňuje cache záměrně a výběrově, jen pro typy dokumentů, které se změnily.
Každý dokument stojí čas OCR a tokeny. Rozhodnutí o rozsahu backfillu je proto v prvé řadě nákladové — a nákladový model má být vyplněný před startem fáze 1, ne po něm. Zatím vyplněný není.
Kde to v repozitáři žije
docs/EXTRACTION.md— proč je to těžké, stádia, prahy, cache, obtížné případy, měření kvalitydocs/ACCEPTANCE.md— cíle přesnosti a zlatá sada, na které se měří regresesrc/progresus_isir/config.py— prahy 0,85 a 0,95 a hranice vysokého nomináludocs/development/COST-MODEL.md— co se musí změřit, než se rozhodne o rozsahu
Souvisí
OCR + LLM extrakce do schématu
Klasické OCR na formulářích přihlášek selhává. Pipeline kombinuje OCR a multimodální extrakci do deklarovaného JSON schématu, výsledek validuje a teprve pak zapisuje.
Detail
Výsledky extrakce jsou content-addressed a cachované
Dokument je identifikovaný SHA-256 svých bajtů a výsledek extrakce je uložený proti tomuto hashi. Přehrání projekce znovu použije cache a nespustí OCR ani LLM. Bez toho by každá oprava projektoru stála celý backfill znovu.
Detail
Dokumentová pipeline
RozpracovánoStahování do content-addressed úložiště, OCR, extrakce do deklarovaného schématu, validace a skóre spolehlivosti — dnes pro přihlášky, zprávy o přezkumu zatím ne. Výsledky jsou cachované podle hashe dokumentu a verze extraktoru, takže přehrání projekce nic nestojí.
Detail