V předchozích dílech jsem psal o tom, jak z PDF výpisu dostat data, jak popsat desítky bank pravidly a jak to celé testovat nad produkcí. Dnes se chci dotknout tématu, které je možná ze všech nejzajímavější, a zároveň o něm budu psát nejopatrněji. Upravené výpisy.
Hned na začátek jedno upozornění: nebudu popisovat, podle čeho konkrétně upravený výpis poznáváme. Důvod je jednoduchý. Každá veřejně popsaná kontrola je zároveň návod, jak ji obejít. Takže dnes spíš o přístupu a o tom, co jsem se naučil.
Proč by někdo upravoval výpis?
Výpis z účtu slouží jako doklad. O příjmu, o tom, že platíte nájem, o tom, že máte na účtu dost peněz. A kde je doklad, tam je i pokušení si ho „trochu vylepšit“. Změnit jednu částku, přidat jednu příchozí platbu, posunout zůstatek. S dnešními nástroji na úpravu PDF to zvládne skoro každý za pár minut.
Když jsem začínal, tohle vůbec nebylo mým zadáním. Měl jsem výpis přečíst, ne soudit. Jenže velmi rychle se ukázalo, že tyhle dvě věci od sebe oddělit nejdou. Výpis, který nesedí, je buď špatně přečtený, nebo upravený. A já potřeboval vědět, která z těch možností to je.
První linie: nesedí to
Nejjednodušší kontroly jsou ty obsahové. Počáteční zůstatek plus všechny transakce musí dát konečný zůstatek. Všechny transakce musí spadat do období výpisu. IBAN musí odpovídat číslu účtu. Tyhle kontroly jsou levné, srozumitelné a překvapivě účinné — kdo upraví jednu částku a zapomene na zůstatek, neprojde.
Mají ale jednu slabinu: stejně tak selžou, když výpis špatně přečtu já. Proto je pro mě tak důležitá kvalita samotné extrakce a golden testy z minulého dílu. Každá chyba parseru je zároveň falešný poplach.
Druhá linie: jak dokument vznikl
PDF je nejen obsah, ale i stopa toho, jak vznikl. Je to také jeden ze způsobů, jak vytvořit anonymizovaný otisk, o kterém jsem se zmiňoval v minulém článku. Banka generuje výpisy svým systémem, pořád stejně, tisíckrát denně. Dokument má svoje technické vlastnosti — kdo ho vytvořil, jaká písma obsahuje, jestli je podepsaný, jak je vnitřně poskládaný. Když s ním někdo pracuje v editoru, ty vlastnosti se změní. Někdy výrazně, někdy nenápadně.
První verze kontrol byla ruční. Pro každou banku jsem sepsal, jaké vlastnosti její výpisy mají, a už na připraveném otisku jsem viděl, jestli se jedná o shodu nebo nikoliv. Fungovalo to, ale naráželo to na dva problémy. Banky svůj systém průběžně aktualizují, takže ruční seznam artefaktů stárnul a pravé výpisy začínaly padat. A hlavně — ruční seznam obsahuje jen to, co mě napadlo zapsat.
Učit se z pravých výpisů
A tak jsem to otočil. Místo toho, abych popisoval, jak vypadá podvod, nechávám aplikaci naučit se, jak vypadá pravý výpis každé banky. Z ověřených výpisů vzniká pro každý layout profil — co mají všechny společné, co se u nich vyskytuje a co nikdy. Profil neobsahuje obsahová data, ale semantiku samotného dokumentu. Příchozí výpis se pak s profilem porovná a hlásí se jen to, co ověřené výpisy této banky nikdy nemají.
Výsledkem není „ano / ne“, ale jeden ze tří verdiktů: důvěryhodný, podezřelý a pravděpodobně upravený. A ke každému verdiktu důvody, aby člověk, který výpis kontroluje, věděl, kam se podívat.
Pár věcí, na které jsem si musel dát pozor:
- Profil se nesmí učit z podvrhů. Do učení jdou jen výpisy, které prošly kontrolou kvality a u kterých nic nenasvědčuje úpravě. Výpisy, které lidé při kontrole označili jako upravené, se do učení nedostanou nikdy.
- Málo dat = žádný profil. Pokud pro banku nemám dost ověřených výpisů, profil se nepoužije. Raději nic, než falešná jistota.
- Nepřesný výsledek je horší než žádný. Proto nový verdikt zatím běží v takzvaném shadow režimu. Počítá se u každého výpisu a ukládá, ale klient ho zatím nevidí. Porovnávám ho s tím, jak výpisy ohodnotili lidé, a teprve až si budu jistý, že nekřičí zbytečně, pustím ho ven.
Kurátorovaná sada
Aby to celé dávalo smysl, potřeboval jsem i sadu výpisů, u kterých vím, jak dopadnout mají. Část výpisů z produkce kontrolují lidé a označují je jako v pořádku nebo upravené. Z těch jsem sestavil referenční sadu, a každá změna v kontrolách se na ní automaticky vyhodnotí. Když se u některého výpisu změní verdikt, test selže a já se musím podívat, jestli je to zlepšení, nebo ne.
Upřímně, tahle sada mi otevřela oči. Některé upravené výpisy jsou tak dobré, že bych je na první pohled nepoznal. A některé pravé výpisy vypadají tak podivně, že bych na ně vsadil, že jsou upravené. Pokora je tady na místě.
Není to důkaz
Na závěr asi to nejdůležitější. Žádná z těchto kontrol není důkaz. Je to heuristika, která pomáhá člověku rozhodnout, kam se podívat. Pravděpodobně upravený výpis si zaslouží lidskou kontrolu. Důvěryhodný výpis není záruka. A to je podle mě správně — rozhodnutí o člověku by nemělo dělat jen pár pravidel nad PDF.
Tahle část je zatím ve vývoji a v rámci GoodVeri ji postupně ladíme. Až bude venku, možná napíšu, jak dopadla.
Zajímalo by mě, jak to řešíte vy — věříte dokumentům, které vám klienti posílají, nebo máte vlastní způsob, jak je ověřit?