O projekcie
Aplikacja na pulpicie kupca w firmie modowej. Zdjęcie zrobione telefonem — na targach, w showroomie, u dostawcy albo w sklepie konkurencji — trafia na komputer i staje się zapytaniem. Po kilkunastu sekundach na ekranie stoi lista ofert tego samego towaru: na jakich platformach jest wystawiony, po ile, kto go sprzedaje i ile ten ktoś prowadzi sklepów.
Zdjęcie jest tu jedynym sensownym zapytaniem, a nie efektownym dodatkiem. Rzecz na wieszaku nie ma użytecznego identyfikatora: nazwa jest marketingiem („Sukienka MAJA”), kod kreskowy należy do konkretnego sprzedawcy, a ten sam model chodzi po rynku pod czterdziestoma nazwami naraz. Jedyną stabilną cechą jest to, jak towar wygląda.
I tu zaczyna się właściwa trudność, bo TO SAMO NA ZDJĘCIU NIE ZNACZY TEN SAM PRODUKT. Spora część asortymentu to ten sam towar od tego samego producenta, odsprzedawany pod wieloma markami; inna część to podobny fason w innym materiale i innej jakości. Zestawienie, które wrzuca jedno i drugie do wspólnego worka, daje rozpiętość cen, z której nie wynika nic. Dlatego system trzyma to jako DWIE OSOBNE ODPOWIEDZI — „ten sam produkt” i „ten sam fason” — i nigdy ich nie scala, nawet gdy wyglądają identycznie.
Rozstrzygnięcie nie należy do modelu. Odcisk wizualny wyszukuje kandydatów — to jest wyszukiwanie po podobieństwie i tyle potrafi. O tożsamości produktu decydują reguły na atrybutach: kolor, wzór, długość, dekolt, zapięcie, deklarowany skład, rozpiętość rozmiarów, zdjęcia dodatkowe. Model odczytuje te atrybuty z kadru i z opisu oferty, ale werdykt zapada poza nim, w kodzie, który da się przetestować i któremu można zajrzeć w uzasadnienie.
Cena też nie jest jedną liczbą i udawanie, że jest, byłoby najłatwiejszym sposobem na zbudowanie narzędzia, które myli. Na jednej karcie stoi cena regularna, na drugiej po rabacie, na trzeciej za sztukę w wielopaku, na czwartej bez wysyłki, a na piątej w promocji platformy, która skończy się jutro. Raport pokazuje cenę porównywalną i wypisuje, co ona w sobie zawiera — bo liczba bez tej rozpiski wygląda na precyzyjną i nie jest.
„Ile ma sklepów” to pytanie o sprzedawcę, nie o produkt. Ten sam podmiot bywa na kilku platformach pod różnymi szyldami, więc powiązanie idzie po danych firmowych tam, gdzie są publiczne, i po powtarzalnych cechach witryny tam, gdzie ich nie ma. Liczba jest podana razem z tym, jak powstała — z powiązania pewnego czy z przesłanki — bo agregat bez tej informacji jest tylko ładnie wyglądającą cyfrą.
Pozyskiwanie danych jest celowo zachowawcze i to też była decyzja projektowa, a nie ograniczenie. Najpierw oficjalne API i feedy produktowe, potem publicznie dostępne strony ofert — z limitami zapytań, z uczciwą identyfikacją klienta i z poszanowaniem regulaminów. Nic zza logowania, żadnych danych osobowych sprzedawców poza tym, co firma sama publikuje. Narzędzie, które wciąga klienta w spór albo daje mu się zablokować, jest warte mniej niż brak narzędzia.
Pulpit zamiast aplikacji webowej wynika z tego samego rachunku. Zdjęcia zostają na maszynie kupca, wyniki i historia zapytań leżą w lokalnej bazie, a całość pracuje w rytmie oglądania towaru, a nie jako kolejny system, do którego trzeba się zalogować. Ubocznym efektem jest to, że ten sam fason sprawdzony miesiąc później pokazuje ruch cen bez odpytywania rynku od nowa.
Problem
Kupiec w modzie ma przed sobą wieszak, a nie numer katalogowy. Sprawdzenie, kto jeszcze to sprzedaje i po ile, to pół godziny w kilkunastu kartach przeglądarki — a decyzja o cenie zapada w minutę po obejrzeniu towaru. Do tego połowa trafień to ten sam fason, nie ten sam produkt, więc uśredniona cena z wyszukiwarki prowadzi w złą stronę.
Rozwiązanie
Zdjęcie z telefonu staje się zapytaniem: odcisk wizualny znajduje kandydatów, a reguły na atrybutach rozstrzygają, czy to ten sam produkt, czy tylko ten sam fason — i te dwie odpowiedzi nigdy się nie mieszają. Raport podaje cenę porównywalną z rozpisaniem składników, platformy, sprzedawców i liczbę ich sklepów, każdą liczbę z etykietą źródła.
Funkcje
- zdjęcie z telefonu trafia na pulpit lokalnie — kadr nie wychodzi poza sieć klienta
- wynik w kilkanaście sekund, w rytmie oglądania towaru, a nie wieczornego researchu
- „ten sam produkt” i „ten sam fason” jako dwie osobne odpowiedzi, nigdy zlane w jedną
- cena porównywalna z rozpisaniem, co w sobie zawiera i czego nie zawiera
- platformy, na których towar faktycznie stoi, z datą sprawdzenia przy każdej
- sprzedawca powiązany między platformami i liczba prowadzonych przez niego sklepów
- historia zapytań: ten sam fason sprawdzony miesiąc temu pokazuje ruch cen
- każda liczba w raporcie z etykietą źródła i momentu pobrania
Moduły
moda-most-telefonu
kanał lokalnyPrzenosi zdjęcie z telefonu na pulpit bez chmury i bez wysyłania go dalej.
- parowanie telefonu z pulpitem w sieci lokalnej, bez konta i bez usługi pośredniczącej
- kadrowanie i prostowanie zdjęcia przed zapytaniem — tło sklepu psuje dopasowanie
- kilka ujęć jako jedno zapytanie: metka i detal zapięcia mówią więcej niż sama sylwetka
- zdjęcie zostaje na maszynie kupca; do źródeł zewnętrznych idą cechy, nie kadr
moda-odcisk
warstwa dopasowaniaWektor obrazu szuka kandydatów, reguły na atrybutach rozstrzygają tożsamość produktu.
- odcisk wizualny w lokalnym indeksie — podobieństwo PROPONUJE, nie orzeka
- atrybuty odczytane z kadru i z opisu oferty: kolor, wzór, długość, dekolt, zapięcie, skład
- werdykt „ten sam produkt” wydają reguły w kodzie, nie ocena modelu
- wynik zawsze w dwóch kubełkach: identyczny produkt oraz ten sam fason
- przy niskiej pewności zapytanie kończy się listą do obejrzenia, a nie fałszywym dopasowaniem
moda-zrodla
warstwa pozyskaniaOficjalne API i feedy w pierwszej kolejności, publiczne oferty w drugiej — z higieną.
- kolejność źródeł: API platformy, feed produktowy, dopiero potem publiczna strona oferty
- limity zapytań, uczciwa identyfikacja klienta, poszanowanie regulaminów i pliku robots
- nic zza logowania i żadnych danych osobowych poza tym, co firma sama publikuje
- lokalny cache wyników — ten sam fason nie odpytuje rynku od nowa przy każdym zapytaniu
- źródło niedostępne odnotowane w raporcie jako luka, a nie pominięte po cichu
moda-raport
warstwa wynikuZamienia trafienia w decyzję cenową: składniki ceny, platformy, sprzedawcy, sklepy.
- cena porównywalna liczona na jednej definicji, z wypisanymi składnikami
- sprzedawca powiązany między platformami po danych firmowych albo cechach witryny
- liczba sklepów podana razem ze sposobem, w jaki powstała
- historia zapytań jako ruch cen w czasie, bez ponownego odpytywania rynku
- eksport do arkusza pod rozmowę z dostawcą — z datami pobrania przy każdej pozycji
Architektura
- Podstawa
- aplikacja desktopowa w TypeScripcie; dane, indeks i historia zostają na maszynie kupca
- Kanał z telefonu
- parowanie w sieci lokalnej; zdjęcie nie opuszcza infrastruktury klienta, na zewnątrz idą cechy
- Odcisk wizualny
- wektor obrazu w lokalnym indeksie; podobieństwo wyznacza kandydatów i nie przesądza tożsamości
- Rozstrzyganie tożsamości
- reguły na atrybutach w kodzie — „ten sam produkt” i „ten sam fason” jako osobne wyniki
- Rola modelu
- opis kadru i normalizacja atrybutów oferty; werdykt o tożsamości produktu zapada poza modelem
- Źródła danych
- oficjalne API i feedy produktowe przed publicznymi stronami ofert; nic zza logowania
- Higiena pobierania
- limity zapytań, uczciwa identyfikacja klienta, poszanowanie regulaminów i pliku robots
- Definicja ceny
- rozbicie na regularną, po rabacie, za sztukę w wielopaku i z wysyłką — porównanie na jednej definicji
- Dane osobowe
- żadnych; sprzedawca opisany wyłącznie danymi firmowymi, które sam publikuje
- Pamięć
- lokalny cache trafień i historia zapytań — ruch cen bez ponownego odpytywania rynku
Technologie
- TypeScript
- React
- Electron
- SQLite
- Claude
Autor
Mariusz PerzyńskiClient Relations & Operations