Przejdź do treści
megapromotingPorozmawiajmy

Rozwiązania · Usługi finansowe

Agent, który klasyfikuje ruchy pieniężne, wybierając z zamkniętej listy, a nie pisząc zdanie, które potem ktoś interpretuje.

W organizacji finansowej użyteczny agent nie doradza i niczego nie zatwierdza: czyta dokumenty i transakcje, klasyfikuje je do kategorii z ustalonego zestawu, mówi, jak bardzo jest pewny, i może odpowiedzieć „nie wiem”. Reszta — decyzja, zatwierdzenie, polityka — pozostaje po stronie ludzi.

Oferta, z warunkamiNu scriem „livrat”, pentru că nu avem un agent de acest fel pus în producție la un client din sectorul financiar. Ce avem, și arătăm exact ca atare, e o conductă proprie de ingestie care rulează pe datele noastre: cinci module Python, 1.526 de linii, care citesc notificări bancare din e-mail și extrase în PDF, clasifică fiecare tranzacție prin unelte și o scriu în PostgreSQL cu dedublare, plus patru fluxuri de automatizare pentru webhookuri de la trei procesatori de plăți. Starea reală, spusă în aceeași frază: depozitul nu e sub git, directoarele `tests/` și `webhook-server/` sunt goale, iar potrivirea aproximativă a numelor de contrapartidă folosește o euristică de n-grame marcată în cod ca „de înlocuit cu un serviciu de înglobare înainte de producție”. Partea de platformă financiară în producție — flux de cerere, contract, grafic de plăți, audit — e o lucrare separată, cu dovezile ei, și acolo scriem „livrat”.

Wnioski o agentów AI w usługach finansowych prawie zawsze przychodzą w formie „żeby odpowiadał klientom na pytania o nasze produkty”. To uzasadnione żądanie, ale nie tam oszczędza się czas. Czas traci się gdzie indziej: ktoś codziennie otwiera dziesiątki powiadomień bankowych i wyciągów, patrzy na opis typu ciąg wielkich liter z kodem i decyduje, czy to wpływ od klienta, wynagrodzenie, podatek, rata do wierzyciela czy koszt operacyjny. Ta praca jest powtarzalna, nudna i właśnie dlatego pełna błędów.

Model językowy nadaje się do tego, pod jednym warunkiem: nie wolno prosić go o pisanie odpowiedzi w wolnym tekście. Jeśli poprosisz o zdanie, to Ty je sparsujesz, a parsowanie zrobisz źle. W naszym przepływie model nie pisze: dostaje siedem narzędzi i musi wywołać dokładnie jedno — wpływ od klienta, wynagrodzenie, podatek, płatność do wierzyciela, koszt operacyjny, opłatę bankową albo nieznane. Każde narzędzie wymaga, oprócz nazwy kontrahenta lub kategorii, wskaźnika pewności między 0 a 1. „Nieznane” wymaga zapisanego powodu. Wynik jest strukturą, a nie opinią.

Druga zasada jest taka, że nic nie wchodzi dwa razy. Każda transakcja wyodrębniona z powiadomienia albo z wyciągu dostaje zewnętrzny identyfikator obliczony jako 16-znakowy prefiks z odcisku SHA-256 nad jej polami, kolumna jest unikalna w tabeli, a wstawianie odbywa się przez `ON CONFLICT (external_id) DO NOTHING`. Praktyczna konsekwencja: skrzynka pocztowa może być odczytana ponownie tyle razy, ile chcesz, a saldo się nie podwaja. Bez tej reguły każdy finansowy przepływ ingestii w trzecim tygodniu zaczyna produkować duplikaty, które ktoś czyści ręcznie.

Czego taki agent nie robi i dlaczego ważne jest, żeby napisać to na stronie: nie zatwierdza płatności, nie podejmuje decyzji kredytowej, nie daje rekomendacji inwestycyjnych i nie odpowiada klientowi w imieniu instytucji. Wskaźnik pewności, który zwraca, to ocena modelu o samym modelu, a nie pomiar dokładności wykonany przez nas — ta różnica to różnica między narzędziem a iluzją kontroli.

Co obejmuje

Co konkretnie zmienia się w usługach finansowych

Dokument wchodzi tylko raz, nawet jeśli czytamy go dziesięć razy

Powiadomienia są odczytywane ze skrzynki pocztowej przez IMAP, wyciągi z PDF. Każda transakcja dostaje zewnętrzny identyfikator z odcisku SHA-256 nad jej polami, kolumna `external_id` jest `NOT NULL UNIQUE` w tabeli, a wstawianie odbywa się przez `ON CONFLICT (external_id) DO NOTHING`, z osobnym logiem dla wiersza wstawionego i dla tego pominiętego jako duplikat. Ponowne odczytanie tej samej skrzynki nie tworzy żadnego duplikatu.

Klasyfikacja odbywa się przez narzędzia, z zamkniętą listą wyników

Siedem narzędzi, bez wolnego tekstu: wpływ od klienta, wynagrodzenie, podatek, płatność do wierzyciela, koszt operacyjny, opłata bankowa, nieznane. Model musi wywołać tylko jedno. Pierwsze sześć wymaga obowiązkowo, oprócz nazwy lub kategorii, wskaźnika pewności między 0,0 a 1,0, zadeklarowanego w schemacie narzędzia; siódme wymaga powodu. Używany model jest zadeklarowany w kodzie, nie ukryty w konfiguracji.

„Nieznane” to prawidłowy wynik, z powodem

Klasyfikator, który nie może powiedzieć „nie wiem”, zakwalifikuje błędnie, z dużą pewnością, właśnie nietypowe transakcje — czyli te, które mają znaczenie. Dlatego narzędzie nieznane jest dostępne tak samo jak pozostałe i wymaga zapisanego powodu, który trafia do wiersza. Wiersze nieznane są listą roboczą człowieka, a nie porażką systemu.

Przybliżone dopasowanie nazw kontrahentów, z jego rzeczywistym stanem

Ta sama firma pojawia się w wyciągach w trzech pisowniach. Nad klasyfikacją istnieje dopasowanie po podobieństwie cosinusowym między wektorami. Mówimy dziś dokładnie, czym są te wektory: to heurystyka n-gramów znakowych, napisana w kodzie z komentarzem, że do produkcji trzeba ją zastąpić prawdziwym wywołaniem usługi embeddingowej. Działa dla wariantów zapisu; nie jest dopasowaniem semantycznym.

Webhooki od procesorów płatności trafiają do tej samej tabeli

Cztery przepływy automatyzacji, po jednym dla trzech procesorów płatności i jeden do codziennej rekonsyliacji, z 7 do 10 węzłów każdy. Idea architektury jest taka, że różne źródła — e-mail, PDF, webhook — nie produkują trzech tabel, które potem trzeba uzgadniać, tylko wiersze w tej samej tabeli, z tą samą regułą deduplikacji.

Zużycie modelu mieści się w budżecie na klucz, a nie pod fakturą

Wywołania przechodzą przez własny gateway pod `api.megapromoting.com/v1`, z 44 skonfigurowanymi modelami, każdy z kosztem na token i limitem kontekstu. Klucz projektu ma białą listę modeli, budżet i okres, można go rotować z zachowaniem historii, a zużycie jest konsolidowane codziennie na użytkownik × klucz × model. Szczegół, który zaskakuje wszystkich: modele rozumowania generują wewnętrzne kroki, których system śledzenia nie widzi, ale dostawca je nalicza — więc brutto budżet na klucz ustawia się poniżej pożądanego limitu.

Co można uruchomić bez wynoszenia danych z maszyny

Do kroków, które nie wymagają dużego modelu — wyodrębniania pól ze znanego formatu, dopasowywania nazw, sprawdzeń spójności — nie jest potrzebny żaden zewnętrzny dostawca; to zwykły kod. Model wywołuje się tylko dla kroku klasyfikacji. Gdy twoja polityka zabrania wynoszenia danych, pytanie brzmi, co dokładnie trafia do modelu, a nie czy używa się AI: można wysłać opis transakcji bez identyfikatorów kont.

Czego taki agent nie robi i nie będzie robić

Nie zatwierdza płatności i nie wykonuje przelewu. Nie podejmuje decyzji kredytowej — zasady, progi i zatwierdzenie są polityką instytucji. Nie daje rekomendacji inwestycyjnych i nie odpowiada klientowi w twoim imieniu bez oddzielnego procesu zatwierdzania. I nie gwarantuje ci dokładności: wynik zaufania to wyjście modelu o samym sobie, a nie niezależny pomiar.

Traseul

Jak przechodzi zgłoszenie przez system.

01

Ustalamy zamkniętą listę wyników, przed jakimkolwiek kodem

Pierwsze dostarczenie to nie agent, lecz lista: kategorie, do których może klasyfikować, jakie obowiązkowe pola wymaga każda z nich, i co oznacza u ciebie „nieznane”. Jeśli tej listy nie da się zapisać na jednej stronie, zadanie nie nadaje się na agenta — i lepiej dowiedzieć się tego teraz.

02

Budujemy ingest i deduplikację, bez modelu

Odczyt z e-maila, PDF lub webhooka, wyodrębnianie pól, obliczanie identyfikatora zewnętrznego i zapis do bazy wykonuje się i weryfikuje bez żadnego wywołania modelu. Dostarczamy potok, który poprawnie ingestuje i nie duplikuje. Jeśli ten krok nie jest solidny, model nad nim tylko produkuje bardziej przekonujące błędy.

03

Dodajemy klasyfikację i mierzymy ją na twoich przypadkach

Na wierzchu działającego potoku kładziemy narzędzia klasyfikacji i uruchamiamy je na zestawie twoich rzeczywistych transakcji, z poprawnym wynikiem ustalonym przez osobę, która dziś wykonuje tę pracę. Dostarczamy tabelę zgodności i niezgodności, a nie stwierdzenie o dokładności. Próg, od którego wiersz trafia do człowieka, wybiera się z tej tabeli.

04

Ustawiamy budżet, dziennik i bramki

Klucz projektu z białą listą modeli i budżetem, codzienna konsolidacja zużycia, dziennik z wywołanym narzędziem i wynikiem oraz bramka, która przekazuje do człowieka wszystko, co jest poniżej progu lub nieznane. Dostarczamy dostępy, dokument uruchomieniowy i pisemną listę tego, co agent robi samodzielnie, a czego nie.

1E-mail, PDF sauwebhook2extragerea câmpurilor3amprentă SHA-2564scriere cu ONCONFLICT DO NOTHING5încadrare prin unadin șapte unelte, cuscorrândurile„necunoscut” către om
Traseul, în 6 pași

Dane

Czego dotykamy, gdzie to leży i jak długo zostaje

Zasady różnią się w zależności od branży. To są te, które obowiązują w usługach finansowych.

Jakiego rodzaju danych dotyka, konkretnie
Ruchy pieniędzy, z datą, kwotą, walutą, opisem i stroną przeciwną. Część stron przeciwnych to osoby fizyczne — wynagrodzenie zawiera nazwisko pracownika — więc tabela zawiera dane osobowe pracowników, a nie tylko dane handlowe. To zmienia, kto ma prawo otworzyć tabelę.
Co trafia do modelu i co zostaje na miejscu
Do modelu trafia tekst opisu transakcji i kwota. Identyfikatory kont, numery IBAN i pozostałe pola nie mają czego szukać w zapytaniu, aby klasyfikacja zadziałała, więc można je pozostawić poza nim. Zasada, którą stosujemy ogólnie: tego, co nie jest potrzebne do danego kroku, nie wysyła się, bo to, co nie wychodzi, nie może zostać zatrzymane przez nikogo.
Gdzie są przechowywane wyekstrahowane dane
PostgreSQL, z unikalnym `external_id` i indeksem na nim. Baza pozostaje po Waszej stronie, na Waszej infrastrukturze albo na takiej, którą obsługujemy my. Nie istnieje wspólny magazyn dla wszystkich klientów, bo nie ma technicznego powodu, by istniał.
Ślad decyzji automatycznej
Każdy wiersz zachowuje informację, jakie narzędzie zostało wywołane, z jakim wynikiem i, gdy trzeba, z powodem „nieznane”. To minimum potrzebne, żeby po sześciu miesiącach ktoś mógł odpowiedzieć na pytanie „dlaczego ta transakcja została zakwalifikowana do kosztów operacyjnych” — odpowiedzią, a nie wzruszeniem ramion.
Okres przechowywania, którego tutaj nie wybiera się samodzielnie
Dokumenty finansowe mają okresy przechowywania określone przez przepisy rachunkowe i podatkowe, a nie przez naszą ani Waszą preferencję. W projekcie finansowym okres bierze się z tych reguł, zapisuje w rejestrze przetwarzania i dopiero potem wdraża usuwanie. Odwrotna kolejność — najpierw wdrożyć, sprawdzić później — tworzy systemy, które usuwają to, co należało zachować.

Przykład

Potok ingestii, który można bez obaw uruchomić ponownie

Sytuacja

Powiadomienia bankowe i miesięczne wyciągi trafiały do skrzynki pocztowej i były czytane przez osobę, która klasyfikowała je według kategorii. Pierwsza oczywista wersja — skrypt, który czyta skrzynkę i zapisuje do bazy — ma problem, który wychodzi na jaw dopiero w trzecim tygodniu: przy każdym ponownym uruchomieniu albo ponownym odczycie te same transakcje trafiają ponownie.

Co zbudowaliśmy

Napisaliśmy pięć modułów, 1.526 linii Pythona: dwa analizatory powiadomień przez IMAP, ekstraktor wyciągów PDF, klasyfikator oparty na narzędziach i zapis do PostgreSQL. Główną zasadą jest identyfikator zewnętrzny — 16-znakowy prefiks z odcisku SHA-256 nad polami transakcji — z unikalną kolumną w tabeli i wstawianiem `ON CONFLICT DO NOTHING`. Klasyfikacja nie zwraca tekstu: model wywołuje jedno z siedmiu narzędzi, z obowiązkowym wynikiem zaufania, a „nieznane” wymaga podania powodu.

Co z tego wyszło

Skrzynka pocztowa może być odczytana ponownie w dowolnym momencie, a wiersze już przetworzone są pomijane i oznaczane jako duplikat w dzienniku. Transakcje, których model nie potrafi zaklasyfikować, pojawiają się jako lista robocza, z podanym obok powodem, zamiast być wpychane do kategorii tylko po to, żeby wyglądało, że wszystko się udało.

Czego nie mówi ten przypadek

To wewnętrzny potok, a nie system dostarczony klientowi finansowemu: nie jest pod git, katalogi testowe są puste, a przybliżone dopasowanie nazw korzysta z heurystyki n-gramów, którą kod wyraźnie oznacza jako tymczasową. Opisałam to tutaj, bo pokazuje metodę, a nie dlatego, że jest to produkt.

Pytania

Czego pyta ktoś z usług finansowych

Czy agent zatwierdza płatności lub kredyty?

Nie, i nie jest to ograniczenie techniczne, które pokonamy w następnej wersji. Zatwierdzanie jest decyzją o skutkach prawnych, która należy do upoważnionej osoby w instytucji. Agent przygotowuje: klasyfikuje, uzupełnia, sygnalizuje, co nie pasuje. System, który sam zatwierdza, powinien umieć odpowiedzieć przed kontrolerem, a wynik zaufania nie jest odpowiedzią.

Skąd wiadomo, że zaklasyfikował poprawnie?

Nie z wyniku zaufania — to jest ocena modelu samego siebie, a nie pomiar. Wiadomo to z porównania z decyzjami osoby, która dziś wykonuje tę pracę, na zbiorze rzeczywistych transakcji, przygotowanym przed uruchomieniem czegokolwiek w trybie automatycznym. Wynik tego porównania to tabela, którą dostarczamy, w tym wiersze, w których agent się pomylił.

Co się dzieje, gdy nie ma pewności?

Wywołaj narzędzie „nieznane” i wpisz powód. Wiersz trafia na listę roboczą osoby, a nie do wybranej losowo kategorii tylko po to, by system wyglądał na działający. Klasyfikator bez wyjścia „nie wiem” myli się dokładnie tam, gdzie błąd kosztuje: przy nietypowych transakcjach.

Jeśli odczytamy dwa razy to samo powiadomienie, kwota się podwaja?

Nie. Każda transakcja ma zewnętrzny identyfikator obliczony jako odcisk na podstawie jej pól, kolumna jest unikalna, a wstawianie używa `ON CONFLICT (external_id) DO NOTHING`. Pominięty wiersz jest odnotowany w dzienniku jako duplikat, więc widać, że został odczytany ponownie.

Czy nasze dane trafiają do dostawcy modelu?

Na etapie klasyfikacji tak: opis transakcji i kwota trafiają do wybranego modelu przez nasz gateway, z kluczem projektu, listą dozwolonych modeli i budżetem. Pozostałe etapy — odczyt, ekstrakcja, deduplikacja, dopasowanie nazw — to zwykły kod i nigdzie nie wychodzą. To, co dokładnie może wyjść, ustala się na piśmie wcześniej, a nie odkrywa z logów później.

Czy potraficie czytać wyciągi w PDF, a nie tylko powiadomienia e-mail?

Tak, to jeden z modułów potoku. Trzeba wiedzieć, że wyciąg PDF to format kruchy: odczytuje się go według struktury generowanej przez dany bank, a gdy bank zmienia szablon, moduł trzeba dostosować. Dlatego pisze się go z kontrolami, które wyraźnie się wywracają, a nie zgadują.

Dlaczego na tej stronie jest napisane „oferta”, a nie „dostarczone”?

Ponieważ nasza zasada wymaga co najmniej dwóch własnych wdrożeń, aby napisać „dostarczone”, a opisana tutaj potok działa na naszych danych, a nie w produkcji u klienta z sektora finansowego. Ma też braki, które nazywamy: nie jest pod git, nie ma testów, a dopasowanie nazw używa heurystyki oznaczonej w kodzie jako tymczasowa. Gdy będziemy mogły powołać się na dwa wdrożenia u klientek i klientów, zmienimy to słowo.

Czego potrzebujecie od nas, żeby rozpocząć pracę?

Trzech rzeczy: zamkniętej listy kategorii, do których wolno klasyfikować, zestawu rzeczywistych transakcji z poprawną odpowiedzią podaną przez osobę, która dziś wykonuje tę pracę, oraz pisemnej decyzji, jakie pola mogą wychodzić z waszej sieci. Bez trzeciego punktu nie zaczynamy, bo to jedyny, którego nie da się naprawić później.

Co chcesz, żeby działało lepiej?

Opowiedz nam o swoim procesie. Wspólnie ustalimy, co warto zbudować, co da się połączyć i jak sprawdzimy wynik.

Porozmawiajmy