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
Lokalna stacja robocza
Wewnątrz LangGraph
Pięć osobno kompilowanych grafów. Zewnętrzny typowany dispatcher koordynuje routing, wywołania specjalistów i wznawianie oceny kategorii.
Główny router Typowany dispatcher Wydatek / zwrot / Zapytania / porady / Ocena kategorii / Korekta / anulowanie / zatwierdzenie
- Wywołanie modelu
- Węzeł deterministyczny
- Reguły + opcjonalne wywołanie modelu
- Krawędź warunkowa
Główny router
Wydatek / zwrot
Zapytania / porady
Ocena kategorii
Pętla obejmuje decyzję właściciela i trwały checkpoint. Nowa propozycja może wywołać model w settle_review; nie jest to dodatkowy węzeł grafu.
Korekta / anulowanie / zatwierdzenie
Anulowanie i zatwierdzenie używają zaufanych referencji bez modelu. Tylko korekta wykorzystuje ekstrakcję i klasyfikację.
Model proponuje; reguły aplikacji sprawdzają. Szkice wymagają potwierdzenia przed ostatecznym zaksięgowaniem. Zapytania, ocena kategorii i zmiany operacji używają osobnych grafów.
llama.cpp zapewnia lokalną inferencję przepływom.
Langfuse obserwuje wywołania modelu lokalnie; jest opcjonalny i oddzielony od autorytatywnych danych finansowych.
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.
- 1Autoryzacja i zapis
- 2Rozpoznanie intencji
- 3Uruchomienie specjalisty
- 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.
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.
EUR · 3600Wedł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
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
Szczegóły operacji
Example purchase
Posted€36.00Categories
Groceries€28.00
Household€8.00
Total €36.00 · reconciled
Payment sources
Vouchers€12.00
Card€24.00
Total €36.00 · reconciled
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–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.
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.
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.
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.
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
| Model / kwantyzacja | Wykonane eksperymenty | Zaobserwowany wynik | Decyzja |
|---|---|---|---|
| GPT-OSS 20BMXFP4 | Pierwszy 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_M | Testy 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_M | Testy 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_XL | Protokół 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_0 | Protokół 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_XS | Rozszerzone 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.