Heltalet är 32 767, det största värde som ryms i femton bitar. Det är också den bredaste bild, i pixlar, som en vanlig PDF-renderare producerar. Järnvägsritningar är bredare än så. Vad som händer sedan avgör om en ingenjör någonsin ser sidan.
Buggen
Under den första synkningen hos en kund vägrade en handfull dokument att läsas in. De var inte korrupta och inte lösenordsskyddade. De var breda järnvägsritningar: profiler och planer utlagda längs spåret, sidor gjorda för att skrivas ut meterbreda och läsas på ett bord. Vårt flöde renderar varje PDF-sida till en bild innan något annat händer, i 288 DPI, tillräckligt högt för att måttext och små anteckningar ska förbli läsbara för modellerna som läser dem. En sida som är 2,9 meter bred blir ungefär 33 000 pixlar.
Den siffran spelar roll på grund av hur renderingslagret under oss lagrar storlekar. Poppler, PDF-motorn med öppen källkod, ritar sidor genom grafikbiblioteket cairo, och cairo sätter taket för bilddimensioner vid 32 767 pixlar: det största värde ett 16-bitars heltal med tecken rymmer, en bit för tecknet och femton för talet. En sida som behöver 33 000 pixlar blir inte lätt beskuren. Den blir inte renderad alls. Och i vår första version drog den sidan med sig hela filen. Ett ritningspaket kunde innehålla fyrtio sidor som renderade felfritt, och granskaren fick ingen av dem.
Fixen
Det frestande svaret är att sänka upplösningen över hela linjen och gå vidare. Då byter man bort precis det som renderingen finns till för: läsbar text på vanliga sidor, som är den överväldigande majoriteten. Lösningen som höll är en pixelbudget: ett tak för hur många pixlar en sida får kosta, oavsett hur bred den är, med upplösningen beräknad per sida för att hålla sig under taket. Runt budgeten sitter en trappa. Varje steg ger upp lite. Inget steg ger upp filen.
| Steg | Vad som händer | Vad som går förlorat |
|---|---|---|
| 1 | Sidan renderas i standardupplösning | Ingenting |
| 2 | Sidan renderas om under en fast pixelbudget, med lägre upplösning bara för den sidan | Lite skärpa, på den sidan |
| 3 | Sidan hoppas över; alla sidor som renderar behålls | En sida |
| 4 | Dokumentet faller tillbaka till ren textutvinning | Layout och grafik; texten överlever |
Trappan följer en regel vi numera behandlar som inläsningens första lag:
Klassificera och degradera, förlora aldrig filen.
Bakom regeln ligger en observation som låter som vidskepelse men är en urvalseffekt: filen som kraschar flödet är alltid den granskaren behöver. Dokument som följer mallen renderar felfritt, eftersom mallar är vad renderingskedjor testas mot. Filerna som går sönder är de som avviker: den tre meter breda ritningen, den skannade bilagan, kalkylbladet exporterat på tvären. Avvikelserna är också där granskningsrisken bor. Släpper man de besvärliga filerna har man inte tappat slumpmässiga sidor. Man har systematiskt tappat de intressanta. För en granskare är det värsta utfallet inte en suddig sida. Det är en sida som försvinner utan ett ord.
Den osynliga skatten
Det andra exemplet är mindre än en pixel. Svenska dokument skriver stora tal med mellanslag som tusentalsavgränsare: 1 000 000. Skrivverktyg lägger in avgränsarna som hårda mellanslag (U+00A0) eller smala hårda mellanslag (U+202F), så att talet aldrig radbryts. I ett förfrågningsunderlag gäller det så gott som varje mängd, varje gränsvärde och varje summa. Efter PDF-utvinning finns tecknen överallt i texten, och de är visuellt identiska med ett vanligt mellanslag.
Identiska för ögat. Olika för maskinen. Ett mönster som letar belopp misslyckas tyst. Dedupliceringen bestämmer att 1 000 och 1 000 är två olika strängar, för i bytes är de det. Ett krav som citeras tillbaka mot förfrågningsunderlaget matchar inte längre sin egen källa. Ingenting larmar; resultaten blir bara tyst sämre. Lösningen är en normalisering som körs innan något annat rör texten: några rader kod, den minst glamorösa ändringen i kodbasen, och den flyttade uppmätt träffsäkerhet mer än det mesta av modellarbetet runt omkring.
Poängen
"AI läser era dokument" är en mening i en produktbeskrivning. Under den ligger en pixelbudget, en degraderingstrappa, en Unicode-normalisering och hundra andra beslut av samma storlek. Inget av dem gör sig i en demo. Alla sätter taket, eftersom modellen aldrig får chansen att ha rätt om en sida som aldrig renderades, eller ett tal den fick med fel bytes.
Yesper är AI-civilingenjören för bygg och infrastruktur, och en förvånansvärt stor del av att bygga en sådan ser ut precis så här. Någonstans i ett PDF-bibliotek avgör ett 15-bitars heltal om en järnvägsritning granskas. Vårt jobb är att se till att det avgör till granskarens fördel.
Yesper är AI-civilingenjören för bygg och infrastruktur. AFRY, COWI, NRC Group och andra nordiska bolag använder den för att halvera tiden i en utredning, räkna om på minuter, och fånga fel som annars slinker förbi. Hör av dig om du vill se vad den kan göra för er.
Boka demoInte redo för en demo? Få nästa text i mejlen.
Relaterat