Pentru majoritatea aplicațiilor de finanțe personale, importarea tranzacțiilor bancare ar trebui să fie partea ușoară. Îți conectezi banca, aplicația preia extrasul și… primești o listă de șiruri criptice, fiecare așteptând să descoperi care dintre cheltuielile tale reprezintă, de fapt.
Plata la POS;POS 14/03/2026 TID KG847531 MEGA IMAGE SRL Timisoara RO
29483761 RRN: 481726304859 auth 761843920184736;TITULAR CONT;
REF: 023POSQ261430XK9
E o cumpărătură la Mega Image. Tu știai asta. Aplicația, până acum, nu.
Tocmai am lansat o funcție care schimbă acest lucru. Fiecare rând bancar importat este întâmpinat de o sugestie cu un singur clic: „Se pare că e abonamentul lunar la Prime Video — confirmi?” sau „Asta se potrivește cu cheltuiala cu chiria pe care ai introdus-o ieri — le legi?” Dacă sugestia e corectă, dai un clic. Dacă e greșită, o corectezi. Oricum, nu mai trebuie să te uiți la șiruri POS criptice.
Ceea ce face acest lucru să funcționeze nu este abordarea evidentă „bagă-l într-un chatbot”. Este ceva mai interesant și vrem să-ți arătăm cum este construit — pentru că alegerile de design contează și sunt cele care fac funcția să pară aproape magică cu cât o folosești mai mult.
Problema despre care nu vorbește nimeni
Există un motiv pentru care potrivirea tranzacțiilor este grea, și nu acela că AI-ul nu e suficient de inteligent. Motivul este că două înregistrări ale aceluiași eveniment financiar aproape niciodată nu arată la fel.
Când îți treci cardul printr-o cafenea, banca înregistrează:
- Data lor de decontare (1–3 zile mai târziu, nu ziua în care ai cumpărat efectiv cafeaua).
- Numele legal al comerciantului —
STARBUCKS COFFEE COMPANY EU LIMITED, nu „Starbucks”. - Un ID de terminal, o referință de rutare, un token de autorizare, un număr de secvență intern al băncii.
- Suma în moneda contului tău — chiar dacă ai plătit într-o altă monedă într-o călătorie în străinătate.
- Zero informații despre ce categorie este, pentru ce a fost sau dacă vrei să o urmărești.
Când tu introduci aceeași achiziție manual o săptămână mai târziu, scrii:
- „Cafea cu Andrei” — descrierea care are sens efectiv pentru tine.
- Ziua în care îți amintești că s-a întâmplat, nu cea în care s-a decontat.
- Categoria ta proprie (
#cafea, sau#intalniri, sau#personal). - Poate prețul original pe care ți-l amintești — să zicem 4,50 €— fără să te gândești la cursul valutar.
Aceste două înregistrări sunt același eveniment financiar. Aproape nu au date comune.
Înmulțește asta peste:
- Transferuri interne — un singur transfer între propriile tale conturi apare ca două rânduri bancare, pe două conturi diferite, cu semne opuse.
- Abonamente recurente — taxa lunară Prime Video arată ușor diferit în fiecare lună (coduri de referință diferite, ocazional sume diferite) și aproape sigur nu ai introdus-o în avans.
- Plăți facturi — poate ai un rând
Facturăîn aplicație pentru curent electric, dar banca nu spune „aceasta e factura ta de curent pe noiembrie”. SpuneEON ENERGIE 247,83 RON RRN: 605971817971. - Schimburi valutare — banca debitează în RON, dar pagina comerciantului arată prețul în EUR, iar tu ai notat EUR.
- Rambursări de credite — același mecanism de transfer, dar e o restituire de credit, nu o cheltuială normală.
Pentru toate acestea, interpretarea corectă se află în istoricul tău. Indiciul despre ce este MEGA IMAGE SRL Timisoara se găsește în cele zeci de dăți în care ai etichetat deja tranzacții de la acest comerciant ca #alimente. Indiciul despre ce este un transfer de 2.000 RON către „STANESCU LUCIA-MARIA” se găsește în cele optzeci de transferuri pe care le-ai făcut către acest nume în ultimii trei ani.
Abordarea plictisitoare care nu funcționează
Soluția evidentă sunt regulile. „Când descrierea conține MEGA IMAGE, sugerează categoria Alimente.” Simplu.
Cade aproape imediat:
- Fiecare utilizator își denumește categoriile diferit. Unii au
#alimente. Alții auGroceries. Alții au o categorie numitădaily needscare conține atât cumpărături de la supermarket cât și gustări de la benzinărie. - Fiecare bancă formatează descrierile diferit. Aceeași tranzacție Mega Image arată diferit pe BT, ING, Raiffeisen, Revolut.
- Comercianții își schimbă numele, sunt achiziționați, își refac brand-ul, se extind în noi categorii.
- Regulile cresc și cresc, și nimeni nu le întreține.
Următorul răspuns evident este „bagă-l într-un GPT-4” sau orice alt model lingvistic mare. La fel de problematic:
- Costurile per apel se adună — câțiva cenți per scanare, înmulțiți cu fiecare utilizator activ în fiecare zi, devin rapid o sumă reală.
- Latența este suficient de mare pentru a părea greoaie la scara „un utilizator tocmai și-a sincronizat banca și așteaptă potriviri acum”.
- Mai important: un model generic nu cunoaște convențiile tale. Nu știe că etichetezi transferurile către partenerul tău cu
#impartit. Nu cunoaște numele categoriilor tale. Nu știe care transferuri sunt către economiile tale și care către familie.
Răspunsul corect este undeva la mijloc: lasă AI-ul să citească istoricul tău și să-l folosească pentru a interpreta noile rânduri bancare, fără a-ți expune vreodată datele către contul altcuiva.
Cum funcționează cu adevărat — partea ingenioasă
Iată designul într-o singură propoziție: folosim un AI mic și ieftin pentru a transforma fiecare tranzacție (a ta și a băncii) într-o amprentă matematică, apoi găsim amprentele din propriul tău istoric care seamănă cel mai mult cu cea nouă și lăsăm acei vecini să voteze ce este tranzacția nouă.
Câteva detalii care merită înțelese:
1. Amprentele provin din textul băncii, nu din descrierile tale
Aceasta este perspicacitatea structurală care face ca sistemul să funcționeze pe date reale.
Când ai confirmat luna trecută o cheltuială pentru „Prime Video”, ai scris abonament Prime Video (sau poate doar #video). Banca, în schimb, a înregistrat Plata la POS non-BT cu card MASTERCARD; ... Prime Video 1 Principal Place, Worship Str LONDON GB ....
Dacă am încerca să potrivim un nou rând bancar cu textul tău tastat, amprentele nu s-ar alinia — Plata la POS … nu seamănă cu abonament Prime Video la o verificare de similaritate. Sunt aceeași idee, dar cuvintele sunt diferite.
Așa că facem invers: potrivim noul rând bancar cu rândurile bancare pe care le-ai confirmat anterior. Text bancar cu text bancar. Plata la POS … Prime Video … cu Plata la POS … Prime Video …. Acestea se potrivesc, frumos, pentru că zgomotul este comun și identitatea comerciantului se află în același loc în fiecare lună.
Când sistemul găsește potrivirea, împrumută apoi descrierea ta tastată, categoria ta, contul tău de destinație — pentru că acelea sunt ceea ce i-ai spus deja sistemului că vrei.
În esență: amprenta este textul băncii. Decizia (categorie, tip, cont) este judecata ta. Fiecare operează în stratul în care are semnalul cel mai puternic.
2. Trei lucruri votează, nu unul
Pentru fiecare rând bancar nou, trei semnale se combină pentru a produce o sugestie:
- Similaritate — cât de mult seamănă noua descriere bancară cu una anterioară pe care ai etichetat-o deja?
- Proximitate de sumă și dată — este aceasta în limita de ±5% din suma candidatului și în 10 zile de la data sa?
- Acord structural — când cincisprezece rânduri bancare similare din trecut s-au transformat toate în „creează o cheltuială recurentă în categoria X cu contul Y”, este un semnal puternic că noul rând este același tipar.
Toate trei contează. Doar similaritatea se sparge pentru comercianții întâlniți prima dată. Doar suma/data produce falsuri pozitive (două debite de 47,83 RON fără legătură în aceeași zi). Doar acordul structural este gol pentru categorii noi. Împreună dau un număr de încredere pe care putem acționa.
3. Sistemul devine mai inteligent cu cât îl folosești mai mult
Aceasta este adevărata propunere de valoare a designului.
Când activezi funcția pentru prima dată, sistemul citește tot ce ai făcut deja — fiecare tranzacție pe care ai confirmat-o manual vreodată, fiecare categorie pe care ai atribuit-o, fiecare pereche de transfer pe care ai legat-o, fiecare șablon recurent pe care l-ai configurat. Acel istoric devine imediat setul de antrenament al AI-ului. Setul tău de antrenament.
Luna următoare, când confirmi mai multe tranzacții, acelea se alătură bazei. Fiecare „da, e corect” pe care îl dai AI-ului este un exemplu pe care îl poate folosi pentru următoarea sugestie. Fiecare „nu, schimbă această categorie” este de asemenea un semnal.
După un an de utilizare:
- Sistemul cunoaște numele tuturor celor către care transferi în mod regulat bani.
- Sistemul știe care comercianți aparțin cărei categorii — după taxonomia ta, nu a altcuiva.
- Sistemul îți cunoaște abonamentele recurente și le poate sugera chiar înainte ca extrasul bancar să sosească la data obișnuită.
- Sistemul știe că transferurile de 4.000 RON din contul tău principal în contul partenerului tău sunt un transfer de buget casnic cu descrierea „Transfer BT Pay” și categoria „Familie”.
Și, esențial: nimic din toate acestea nu se întâmplă pentru niciun alt utilizator. Datele fiecărui cont sunt separate. Tiparele tale informează doar sugestiile tale.
4. Auto-confirmare pentru cazurile evidente
Unele potriviri sunt atât de clare încât a cere utilizatorului să dea clic este friction fără beneficiu. A 30-a taxă Prime Video din an. Transferul lunar de chirie pe care l-ai confirmat fără modificări timp de douăsprezece luni consecutive.
Pentru acestea, există o setare opțională de auto-confirmare. Când o potrivire trece un prag de încredere (și ai optat explicit pentru auto-confirmare), sistemul realizează singur legătura. Tabloul de bord arată „AI a auto-confirmat 5 tranzacții la ultima ta sincronizare” — și un buton de anulare cu un clic dacă ceva este greșit.
Aceasta este opt-in și limitată ca rată: se activează doar pentru conturile care au etichetat deja suficiente tranzacții pentru a avea un set real de antrenament, iar pragul de încredere este calibrat în raport cu datele istorice de decizie, astfel încât rata fals pozitivelor să rămână scăzută.
Ce înseamnă asta pentru tine, utilizatorul
Experiența practică se schimbă în câteva moduri:
-
Sincronizează și mergi mai departe. Conectează-ți banca, apasă sincronizare și, data viitoare când te uiți la lista în așteptare, majoritatea rândurilor au carduri de confirmare cu un singur clic lângă ele. Cardurile spun lucruri precum „Asta arată ca factura ta lunară Vodafone — o plătești din contul principal?” sau „Asta se potrivește cu transferul către contul tău de economii de marți — le legi?”
-
Sistemul învață din modificările tale. Dacă accepți o sugestie, dar schimbi categoria, AI-ul vede acea schimbare. Data viitoare când apare o tranzacție similară, va sugera categoria pe care o vrei tu efectiv, nu pe cea pe care a ghicit-o inițial.
-
Pornirea la rece este acoperită de euristica veche. Chiar înainte ca AI-ul să aibă date de antrenament — chiar din prima ta zi — sistemul tot sugerează potriviri prin euristici de dată/sumă/cont. AI-ul nu le înlocuiește; le completează odată ce are suficient istoric pentru a fi de încredere. Întotdeauna ai pe ce să acționezi.
-
Tiparele recurente devin vizibile. Sistemul poate recunoaște acum „aceasta este a opta oară când vine această taxă de la acest comerciant și ai un șablon recurent pentru ea” — și să propună plata facturii corespunzătoare sau escaladarea la un șablon de cheltuială recurentă dacă încă nu ai unul.
-
Auto-confirmarea îți oferă opțiunea de a o face invizibilă pentru tiparele care sunt evidente atât pentru tine cât și pentru AI.
De ce suntem mândri, din punct de vedere tehnic
Trei detalii pe care le considerăm că merită evidențiate:
Este ieftin și devine din ce în ce mai ieftin. Un utilizator obișnuit cu opt-in costă mult sub 0,10 € pe lună în infrastructură AI. Utilizatorii intensivi cu istoricuri lungi costă o fracțiune de cent per sincronizare după încălzirea inițială a istoricului. Economia se scalează.
Folosește modele mici, nu mari. Modelul de embedding (Amazon Titan Embed v2) și modelul de curățare/sugestie (Amazon Nova Micro) sunt intenționat ușoare. Am luat în considerare modele mai mari — Claude Haiku, Nova Pro, Claude Sonnet — și le-am evaluat. Pentru această sarcină specifică, abordarea model-mic + arhitectură-inteligentă a învins model-mare + arhitectură-simplă atât la acuratețe cât și la cost. Dependența de un LLM mare este un plan de rezervă, nu motorul principal.
Respectă suveranitatea datelor utilizatorului. Istoricul tranzacțiilor fiecărui cont este singura intrare de antrenament a AI-ului pentru sugestiile acelui cont. Nu antrenăm încrucișat între utilizatori. Nu agregăm date comportamentale. Greutățile modelului sunt gestionate de AWS (folosim modelele fundament din raft); personalizarea trăiește în întregime în indexul de embedding pe care îl menținem per cont.
Ce urmează
Funcția este live pentru beta opt-in. Lucruri pe foaia de parcurs:
- Detectarea tiparelor rare între conturi — recunoașterea „acest format de tranzacție înseamnă o taxă de monitorizare a fraudei” sau tipare similare la nivel de bancă, păstrând în același timp datele izolate per cont.
- Detectare mai inteligentă a perechilor de transfer — legarea automată a debitului-pe-contul-A și a creditului-pe-contul-B care sunt cele două părți ale unui singur transfer intern, când ambele sosesc în aceeași sincronizare.
- Îmbunătățiri ale calității descrierilor — în prezent ne bazăm pe Nova Micro pentru a curăța descrierile bancare zgomotoase; curățătorul bazat pe regex este extins pentru a gestiona nativ mai multe formate bancare, eliminând un strat de apeluri LLM.
- Recalibrări — folosirea semnalelor de acceptare/respingere pentru a regla automat coeficienții de potrivire, astfel încât sistemul să se îmbunătățească odată cu comportamentul populației, fără nicio reantrenare manuală a modelului.
Dar propunerea principală de valoare este deja în vigoare: cu cât folosești CashControl mai mult, cu atât CashControl îți cere mai puțină muncă. Fiecare tranzacție pe care o confirmi o face pe următoarea mai ușoară. Fiecare categorie pe care o alegi învață sistemul convențiile tale. Fiecare ciudățenie a felului în care îți organizezi banii devine un avans pe care AI-ul îl primește la următoarea ta sincronizare bancară.
Acesta este pariul și asta am construit.