Wróć do projektów

Projekt osobisty

Money Tracker

Rejestrowanie wydatków w języku naturalnym z deterministycznymi regułami, ograniczonymi przepływami AI i lokalnym panelem.

Jak podporządkowałem asystenta AI regułom finansowym

Money Tracker to osobisty asystent finansowy przeznaczony przede wszystkim do pracy lokalnej. Określiłem kierunek produktu i architekturę, a przy wdrażaniu korzystałem z agentów kodujących. Główne pytanie brzmiało: jak zmienić niepewną interpretację w sprawdzoną i autoryzowaną operację finansową?

  • Python
  • LangChain / LangGraph
  • llama.cpp
  • PostgreSQL
  • FastAPI / React
  • Langfuse
  • Restic

Jedna domena finansowa, dwa interfejsy

Telegram i lokalny panel korzystają z tych samych usług aplikacji oraz autorytatywnych danych finansowych. Model interpretuje prośby; domena kontroluje zapisy. Diagram podsumowuje wdrożone komponenty i odpowiedzialności.

Usługa zewnętrzna

Telegram Bot API

Lokalna stacja robocza

Gateway · long polling
PostgreSQL · trwały inbox / outbox
Worker · typowany dispatcher
Panel React
FastAPI · lokalne API
Deterministyczne usługi finansowe
PostgreSQL · finanse + audyt

llama.cpp zapewnia lokalną inferencję przepływom.

Langfuse obserwuje wywołania modelu lokalnie; jest opcjonalny i oddzielony od autorytatywnych danych finansowych.

Strzałki oznaczają przetwarzanie i wywołania usług. Inbox, outbox i finanse to osobne odpowiedzialności w PostgreSQL aplikacji. Odpowiedź wraca przez outbox i gateway.

Od wiadomości do sprawdzalnej operacji

Gateway utrwala autoryzowane dane przed przesunięciem offsetu. Osobny worker przetwarza wiadomości po kolei; wolna inferencja nie zatrzymuje odbioru.

  1. 1Autoryzacja i zapis
  2. 2Rozpoznanie intencji
  3. 3Uruchomienie specjalisty
  4. 4Renderowanie i kolejkowanie odpowiedzi

Wydatek / korekta

Typowana ekstrakcja → walidacja domeny → autoryzowany, idempotentny zapis. Propozycje kategorii czekają na jawną decyzję właściciela.

Pytanie / porada

Narzędzia tylko do odczytu → deterministyczne agregaty → odpowiedź modelu. Ta ścieżka nie ma narzędzi zapisu finansowego.

Decyzje i kompromisy

Ograniczone grafy i jawny dispatcher

Osobne kontrakty utrzymują profil, czas i odwołania do działań w zaufanym kontekście runtime.

Nowa intencja wymaga jawnej gałęzi i schematu. Sprawdzalne uprawnienia oznaczają więcej kodu orkiestracji.

PostgreSQL aplikacji i inbox/outbox

Zapisy finansowe, identyfikacja poleceń i audyt są transakcyjne. Wiadomości przetrwają restart.

Ponowienia mogą opóźnić kolejne wiadomości. Odpowiedź Telegram może się powtórzyć; idempotencja chroni zapis finansowy.

Lokalna inferencja i transport Telegram

Inferencja i dane finansowe pozostają lokalne. Long polling eliminuje publiczny endpoint wejściowy.

Komputer musi być dostępny do przetwarzania. Telegram to granica zewnętrzna; cała interakcja nie jest w pełni lokalna.

Wersjonowane kryteria ewaluacji

Zbiory danych, deterministyczne oceny i manifesty wiążą zaakceptowaną konfigurację z wersjami modelu, promptów, schematów i narzędzi.

Zmiana modelu lub promptu wymaga ukierunkowanych regresji. Wiarygodna odpowiedź lub wynik pewności nie wystarcza jako dowód.

Przykładowa interakcja

Schematyczna prezentacja, a nie dokładne odtworzenie bieżącego interfejsu. Kwoty, kategorie i teksty są wymyślone. Model finansowy pod rozmową wyjaśnia oba uzgodnienia.

Symulacja po angielsku · fikcyjne dane · to nie zrzut ekranu
Money Tracker Demo
Example message

Today I spent €36 — €28 on groceries and €8 on household items. I paid with €12 in vouchers and €24 by card.

Illustrative response

Expense draft · €36.00

Groceries €28.00 · Household €8.00
Vouchers €12.00 · Card €24.00

Waiting for your confirmation.

Jeden zakup, dwa niezależne podziały

Kategorie opisują cel wydatku, a źródła finansowania sposób płatności. Oba podziały sumują się do kwoty operacji. Raporty agregują odpowiedni wymiar, bez podwójnego liczenia zakupu.

Dane ilustracyjne, nie rzeczywista transakcja
Kwota operacji€36.00EUR · 3600

Według kategorii

Żywność€28.00

Dom€8.00

Według źródła płatności

Bony€12.00

Karta€24.00

28 + 8 = 36 · 12 + 24 = 36

  • Kwoty EUR używają całkowitych centów: 36,00 € zapisuje się jako 3600, bez binarnych obliczeń zmiennoprzecinkowych dla pieniędzy.
  • Korekty zastępują zwalidowany agregat i zapisują zdarzenie audytu. Cofnięcie unieważnia operację bez usuwania jej historii.

Panel pokazuje działanie domeny

Wdrożony interfejs React obejmuje widok miesiąca, zarządzanie operacjami i budżety kategorii. Dwa schematyczne przykłady używają spójnych fikcyjnych danych. Poglądowe demo jest prezentowane po angielsku; obecna aplikacja używa języka włoskiego.

Symulacja panelu · fikcyjne dane · to nie zrzuty ekranu

Widok miesiąca

Money TrackerOverview · March 2026 · Demo

Where your money is going

Posted transactions only · 3 fictitious transactions

Net spending
€120.00
Personal funds
€108.00
Benefits
€12.00
Monthly budgets

Posted spending / monthly target

Groceries€82.00 / €100.00
Household€8.00 / €40.00
Transport€30.00 / €50.00
Zarejestrowane operacje zasilają wydatki netto, środki osobiste, benefity i wykorzystanie budżetów. Szkice nie wchodzą do sum.

Szczegóły operacji

TransactionsIllustrative transaction · Demo

Example purchase

Posted€36.00
Categories

Groceries€28.00

Household€8.00

Total €36.00 · reconciled

Payment sources

Vouchers€12.00

Card€24.00

Total €36.00 · reconciled

Operacja rozdziela kategorie i źródła płatności. Interfejs udostępnia korektę i anulowanie; walidacja i audyt pozostają w domenie.

Jak przebiegały eksperymenty z modelami

Wybór modelu traktowałem jako serię sprawdzalnych eksperymentów dla lokalnego obciążenia. Badano sześć modeli w profilach tekstowych i, tam gdzie skonfigurowano, wizyjnych. Dowody rozróżniają testy protokołu, częściowe próby narzędzi, pełne ewaluacje i jawną decyzję o wdrożeniu.

Od pierwszego testu do zachowanej konfiguracji

  1. 1–2 wrz. 2026

    Sprawdzić lokalne interfejsy

    Ustalono skwantowane wagi i llama.cpp, kontekst 8192 tokenów i jeden slot. Testy obejmowały wyjście strukturalne, wywołania narzędzi, kontynuację po wyniku i transport obrazów. Sukces pozwalał na dalsze próby bez dowodu poprawności finansowej.

  2. 3 wrz. 2026

    Zamienić błędy w nowe testy

    Qwen3 14B wypełniał pola niewskazane w wiadomości. Rozszerzony test oddzielał pomijanie pól opcjonalnych od wyjścia union. Pomijanie zawodziło, union działał, co uzasadniało jawniejsze kontrakty modelu.

  3. 8 wrz. 2026

    Poprawić kontrakty i dowody

    Schematy, prompty i etykiety rozwojowe poprawiano z wersjami i uzasadnieniami. Raporty uszczelniono, aby niespełnione lub niezmierzone obowiązkowe kryteria nie oznaczały sukcesu. Kolejne profile tekstowe i próby narzędzi rozszerzyły porównanie.

  4. 9 wrz. 2026

    Wdrożyć pełną konfigurację

    Po deterministycznych poprawkach wyboru odczytu i ocenie porad przez właściciela Qwen3 14B spełnił wszystkie mające zastosowanie kryteria blokujące. EVD-004 ustalił model, prompty, schematy i politykę. Progi zachowano; automatyczne rejestrowanie pozostało wyłączone.

  5. 10 wrz. 2026

    Sprawdzić większego kandydata

    Qwen3.8 27B zmierzono po sprawdzeniu, że konfiguracja mieści się na komputerze. Kategoryzacja była lepsza, lecz routing, narzędzia i porady nie spełniały wymagań. Model pozostał eksperymentalny; zachowano wdrożoną konfigurację.

Wszystkie modele i zakres ich dowodów

Wszystkie modele i zakres ich dowodów
Model / kwantyzacjaWykonane eksperymentyZaobserwowany wynikDecyzja
GPT-OSS 20BMXFP4Pierwszy test protokołu tekstowego; późniejsza próba wyboru narzędzi.Początkowo zawiodły strukturalny wynik końcowy i kontynuacja po narzędziu. Późniejszy test narzędzi też nie spełnił kryteriów.Niewdrożony
Qwen3 14BQ5_K_MTesty tekstowe, pomijanie/union, iteracje kontraktów i wszystkie zestawy tekstowe.Początkowe ograniczenia pomijania pozostają udokumentowane. Dostosowane kontrakty i polityka odczytu spełniły wszystkie mające zastosowanie kryteria produktu.Wdrożona konfiguracja tekstowa
Ministral 3 14BQ5_K_MTesty wizyjne i porównania przepływów tekstowych.Kontynuacja po wyniku narzędzia początkowo zawodziła. Później nie przeszły ekstrakcja i inne kryteria; właściciel zatrzymał końcowe porównanie po błędzie ingestii.Niewdrożony
Qwen3.5 9BUD-Q5_K_XLProtokół wizyjny; rozszerzone możliwości tekstowe i przebieg zestawów.Testy możliwości przeszły w zmierzonych wersjach. Ekstrakcja tekstowa przeszła, ale routing, kategorie, narzędzia i porady nie spełniły wszystkich kryteriów.Eksperymentalny; wizja zachowana dla przyszłych paragonów
Gemma 4 12BQAT Q4_0Protokół wizyjny; częściowy tekstowy test wyboru narzędzi.Transport i protokół wizyjny przeszły. Tekstowy test narzędzi zawiódł; brak udokumentowanego pełnego porównania tekstowego.Eksperymentalny; wizja zachowana dla przyszłych paragonów
Qwen3.8 27BUD-IQ4_XSRozszerzone możliwości tekstowe i wszystkie zestawy tekstowe.Możliwości, ekstrakcja i kategoryzacja przeszły. Kategoryzacja poprawiła wynik bazowy; routing, narzędzia i porady pozostały zablokowane.Eksperymentalny; zachowana konfiguracja bazowa

Wyniki dotyczą zapisanych kombinacji modelu, runtime i schematu. Wczesne tekstowe próby Ministral ładowały projektor wizyjny przed poprawą profili. Zmieniano również zestawy i instrukcje: to historia dowodów, a nie jednolity ranking.

Co pozwalało interpretować przebieg

Ustalić granicę porównania

Każdy przebieg zapisywał model, kwantyzację, runtime, szablon, kontekst, prompt, schemat, narzędzia i dane. Porównanie wymaga tych samych wersji danych i instrukcji. Regresje rozwojowe odróżnia się od nietkniętego holdoutu.

Sprawdzić obserwowalne zachowanie

Routing, ekstrakcję, kategorie, narzędzia i porady oparte na danych oceniano osobno, z deterministycznymi ocenami i postwarunkami PostgreSQL. Przegląd kategorii używał skryptowanego modelu do badania wznowienia przepływu, nie jakości modelu.

Zbadać błędy przed decyzją

Brakujące pola, zamianę odczytu i zapisu, zakazane narzędzia, injection, zmyślone liczby i źródła płatności badano według klas błędów. Ludzka ocena użyteczności uzupełniała kryteria, ale nie zastępowała poprawności finansowej lub interpretacyjnej.

Decyzja zmieniona przez eksperymenty

Wybrano pełną konfigurację aplikacji. Jawne kontrakty i deterministyczny wybór odczytu pozwoliły użyć Qwen3 14B w zaakceptowanym zakresie tekstowym. Żaden podzbiór nie zakwalifikował się do automatycznej rejestracji: nowe operacje są szkicami wymagającymi potwierdzenia.

Transport obrazu nie dowodzi ekstrakcji paragonów, nadal odłożonej. Czasy zależały od komputera i konfiguracji. Brak pomiaru nie oznacza sukcesu. Nie odtwarzamy tu prywatnych danych, wyników modelu ani tabel punktowych benchmarku.

Różne dowody dla różnych błędów

Deterministyczne testy oprogramowania

Testy sprawdzają sumy podziałów, autoryzację, idempotencję poleceń i przejścia audytu. Integracja PostgreSQL i testy pełnych ścieżek obejmują trwałość i odzyskiwanie; ewaluacje modelu nie zastępują tych niezmienników.

Ewaluacje zależne od modelu

Przepływy tekstowe sprawdzano za pomocą wersjonowanych zbiorów danych i jawnych progów akceptacji. Testy oprogramowania kontrolowały deterministyczne reguły i całe ścieżki; ewaluacje mierzyły routing, użycie narzędzi i porady zależne od modelu. Poprawność finansowa nie zależała od wyniku modelu.

Projekt obejmuje eksploatację: trwałe ponowienia i stany dead letter, lokalne ślady wywołań modelu oraz szyfrowane kopie Restic. Treści śladów pozostają prywatne. Dowody akceptacji istnieją w projekcie; nie odtwarzamy tutaj wyników wydajności ani prywatnych artefaktów.

Dać agentom programistycznym kontrakt

Wymagania produktu, etapowa roadmapa, widoki arc42, decyzje architektoniczne i instrukcje repozytorium określiły odpowiedzialności i granice. Każdy etap miał kryteria ukończenia i dowody; sam kod nie wystarczał, by uznać pracę za zakończoną.

Stan obecny

Zaakceptowana osobista V1 skupia się na tekście. Obejmuje trwały prywatny kanał Telegram, chroniony lokalny panel, deterministyczną domenę finansową i trwałość danych, ocenione przepływy tekstowe oraz szyfrowane kopie zapasowe. Zapisywanie i przegląd paragonów istnieją; automatyczna ekstrakcja jest odłożona. Repozytorium pozostaje prywatne.

Co pokazuje mój wkład

Mój wkład łączy zakres produktu, architekturę i weryfikację. W Money Tracker język naturalny pomaga zrozumieć prośbę, a typowane przepływy, ograniczone narzędzia i deterministyczne reguły decydują, co wolno zmienić. Dokumentacja architektury i kryteria ewaluacji pozwoliły sprawdzać tę granicę podczas pracy wspieranej przez AI.

Co udostępniam

Repozytorium jest prywatne. Opis dotyczy decyzji projektowych bez ujawniania osobistych danych finansowych, kodu i zrzutów ekranu.