
Kontekst
Grzybiarz to mój własny produkt: aplikacja mobilna, która pomaga wypatrzeć owocniki w ściółce leśnej i wspiera identyfikację gatunku przez porównanie z gatunkami trującymi, z którymi da się go pomylić. Jest w budowie, z premierą celowaną na jesień 2027; kilka podsystemów jest skończonych i działa, a domykaną częścią jest potok wizyjny na urządzeniu.
Problem
Wszystko kształtują dwa ograniczenia i oba są nietypowe.
W lesie nie ma zasięgu, a trafnym słowem jest żaden, a nie słaby: w momencie, w którym produkt potrzebuje serwera, żeby odpowiedzieć, jest bezużyteczny dokładnie tam, gdzie się go używa. Więc inferencja, mapa, baza gatunków i cały zapis sesji muszą mieszkać na telefonie.
Drugie ograniczenie: poprzeczkę trafności ustawia dziedzina, a nie gust. Kilka gatunków jadalnych ma sobowtóry różniące się szczegółami, których pojedyncze zdjęcie może w ogóle nie uchwycić, a ta różnica ma znaczenie. To wyklucza zwykły kształt konsumenckiej funkcji AI, w którym model zwraca najlepsze przypuszczenie z procentem obok, a interfejs pozwala temu procentowi zastąpić wiedzę.
Jest trzecie ograniczenie, które pojawia się dopiero przy grzybiarzach. Nikt nie zdradza swoich miejsc zbioru. Funkcja społecznościowa publikująca lokalizacje to funkcja, której nikt nie włączy, a taka, która publikuje je po cichu, jest zdradą.
Podejście
Produkt jest ustawiony jako asystent, nie wyrocznia, i pilnuje tego architektura, a nie formułka o odpowiedzialności. Każda identyfikacja pokazywana jest ze skalibrowaną pewnością, obok gatunków trujących, z którymi da się ją pomylić, i cech morfologicznych, które je rozdzielają: odkop podstawę trzonu i sprawdź pochwę, zobacz kolor blaszek. Dane referencyjne są zbudowane dokładnie pod to: około stu dwudziestu pięciu gatunków i sto trzydzieści par mylących, każda z wypisanymi cechami różnicującymi i oznaczeniem wagi, żeby interfejs traktował te najpoważniejsze inaczej. Model zawęża pytanie; odpowiada człowiek, który trzyma grzyba w ręku.
Kalibracja jest traktowana jak funkcja: temperature scaling, jawna opcja odmowy i wykrywanie próbek spoza rozkładu, żeby „nie wiem" było wynikiem pierwszej kategorii, a nie niskim słupkiem na wykresie. Zdjęcie czegoś, czego model nigdy nie widział w treningu, ma polec głośno, a nie wylądować na najbliższym gatunku.
Najbardziej pouczający wynik inżynierski dał potok on-device. Kwantyzacja detektora do INT8 zmniejszyłaby model o połowę i tutaj nie działa: głowa emituje pudełka, pewności i współczynniki masek sklejone w jeden tensor, więc dzielą skalę kwantyzacji. Pudełka w pikselach narzucają krok około 2,5, po czym każda pewność z zakresu od zera do jedynki zaokrągla się do zera. Zostało to zmierzone na wyeksportowanym grafie, a nie założone, i odpowiedzią było wydanie fp32 na mniejszym backbone zamiast skwantyzowanego modelu, który nie zwraca nic.
Prywatność zaprojektowałem wokół tego, co grzybiarze naprawdę robią. Nie ma kont: tożsamość jest anonimowa, z kodem odzyskiwania haszowanym Argon2id i spalanym przy pierwszym użyciu, zrobionym jako SPI Keycloaka, żeby backend nadal miał jednego dostawcę tożsamości, a nie własnoręcznie zszytego. GPS jest usuwany z EXIF zdjęcia przed zapisem pliku. Znalezisko udostępnione publicznie jest po stronie serwera przesuwane losowo do dwustu metrów i sprowadzane do komórki H3, więc mapa społeczności pokazuje, gdzie idzie sezon, nie pokazując niczyjego miejsca.
Rezultat
Skończone i działające jest: podsystem sesji grzybobrania z śledzeniem GPS, rejestracją w tle i rekordami osobistymi; w pełni offline'owe mapy Polski na MapLibre i PMTiles; lokalna baza; backend społecznościowy na Quarkusie z anonimowym uwierzytelnieniem; oraz około trzydziestu ekranów cross-platform dzielonych przez aplikację mobilną i webową. Pokrywa to blisko tysiąc sto testów TypeScript i zestaw testów po stronie Javy.
Nieskończona, i trzeba to powiedzieć wprost, jest ta część, od której produkt bierze nazwę. Detektor i klasyfikator są zintegrowane i budują się na urządzeniu, toolchain eksportu jest rozstrzygnięty, a pomiar akceptacyjny liczby klatek na fizycznym sprzęcie wciąż przed mną. Funkcja wizyjna niezmierzona na prawdziwym telefonie w prawdziwym świetle jest planem, a nie zdolnością.
Wnioski
W dziedzinie, w której ostateczną decyzję podejmuje użytkownik, użyteczne pytanie nie brzmi, jak podnieść trafność, tylko co system robi, kiedy nie jest pewny. Zaprojektowana, skalibrowana i widoczna odmowa jest warta więcej niż kilka punktów trafności top-1, bo to decyzja użytkownika jest tą istotną, a interfejs albo ją wspiera, albo ją zastępuje.
Drugi wniosek jest węższy i kosztował mnie czas: kwantyzacja nie jest ustawieniem. Jest decyzją numeryczną dotyczącą konkretnego grafu i na tym grafie trzeba ją zmierzyć. Moja poległa z powodu, przed którym nic w dokumentacji by nie ostrzegło.