← Wszystkie artykuły

Automatyczne porównanie ofert z hurtowni cz. 1

Dział logistyki dostaje pięć ofert na jedno zapytanie i w żadnej z nich materiał nie nazywa się tak samo.

Dział logistyki zbiera materiał na jedną budowę w jedno zapytanie ofertowe: każda pozycja z nazwą, ilością i jednostką. To samo zapytanie wysyła do kilku hurtowni, zwykle od dwóch do pięciu, i od każdej dostaje ofertę w PDF, ułożoną po swojemu.

Żeby je porównać, trzeba jednej tabeli - wiersz na pozycję zapytania, kolumna na dostawcę, kilkanaście albo kilkadziesiąt wierszy. Nikt takiej tabeli nie składa. Dział ogląda więc dokumenty obok siebie, sprawdza kilka pozycji, na których najbardziej mu zależy, i patrzy na sumę netto. Na tej podstawie kierownik zakupów wybiera dostawcę. Po zamówieniu oferty zostają w skrzynce pocztowej jako załączniki i pół roku później nikt już nie powie, ile ten sam kabel kosztował w marcu.

Tak wyglądało to w SG Technologies, generalnym wykonawcy instalacji elektrycznych, teletechnicznych, sanitarnych i energetycznych. Firma zatrudnia około stu osób i prowadzi wiele budów naraz. Utrzymujemy dla niej system zamówień, w którym dział logistyki prowadzi zapytania i zamówienia materiału. Porównanie ofert dołożyliśmy do tego systemu wiosną 2026 roku.

Dlaczego ofert nie da się zestawić

Każda hurtownia ma własny szablon oferty i zmienia go bez uprzedzenia, więc dział logistyki czyta każdy dokument od nowa. Kolumnę z kodem jedna oferta nazywa „Indeks”, druga „Symbol”, trzecia „Kod dostawcy”. Nazwa produktu raz mieści się w jednej komórce, raz zajmuje dwie kolumny, a czasem dzieli się na dwa wiersze. Separator dziesiętny raz jest kropką, raz przecinkiem. Dodatkowo często tabela ma kilkanaście stron, nagłówek powtórzony na każdej i pozycje pogrupowane w sekcje z podsumowaniami.

Problem samego układu strony da się rozwiązać uważnym wczytaniem się w treść oferty. Gorsze jest to, co zostaje potem, po przepisaniu wszystkiego do jednej tabeli. Żeby oferty dało się realnie porównać, trzeba jeszcze ustalić, która pozycja oferty odpowiada której pozycji zapytania.

Ten sam kabel u jednego dostawcy nazywa się „przewód YDYp 3x1,5”, u drugiego „YDYp 3x1,5 750V”. Oba dokumenty opisują ten sam produkt. Nazwę nadaje sprzedawca pod swój katalog, więc jako klucz dopasowania jest najgorsza z możliwych.

Kody sprawdzają się lepiej. Indeks katalogowy hurtowni jest stały, więc ten sam kod dostawcy w ofercie z marca i z lipca oznacza prawdopodobnie ten sam produkt. Kod producenta pochodzi z katalogu wytwórcy i po nim można by zestawić oferty różnych dostawców. Problemem bywa jednak to, że hurtownia go nie podaje albo dokleja do nazwy produktu.

Do tego dochodzą różne jednostki i wielkości opakowań. Przykładowo na zapytanie o 450 metrów kabla hurtownia przesyła ofertę na pięć krążków po sto metrów. Gdy hurtownia zaokrągla do pełnego opakowania, rośnie ilość, a razem z nią wartość pozycji. Ceny z takich ofert zestawione obok siebie dotyczą różnych ilości, więc porównanie nic nie mówi.

Nawet gdy już wiadomo, która pozycja jest którą, oferta nie odpowiada zapytaniu wiersz w wiersz. Hurtownia nie wycenia materiału, którego nie sprzedaje, więc część wierszy w ofercie zostaje pusta. Dodatkowo część pozycji hurtownia wycenia zamiennikiem, a taki zamiennik ktoś musi ocenić technicznie, zanim dojdzie do porównywania cen.

Najczęściej w tej samej tabeli co materiał hurtownia wycenia też koszt dostawy i usługi dodatkowe, takie jak cięcie kabla. Materiałem nie jest ani jedno, ani drugie, a suma netto obejmuje je tak samo.

Suma netto na dole oferty jest przez to najmniej wiarygodną liczbą w całym dokumencie. Oferta, w której hurtownia pominęła trzy najdroższe pozycje, ma sumę niższą od kompletnej i wygląda przez to na tańszą.

Odczyt oferty

Pierwszym pomysłem na odczyt był program z osobnymi regułami pod każdą hurtownię. Numer oferty w prawym górnym rogu, tabela od ósmego wiersza, cena w piątej kolumnie. Taki program działa do pierwszej zmiany szablonu, a hurtownia nie uprzedza, że przesunęła kolumnę, więc o zmianie wiadomo w dniu, w którym import przestaje działać. Każdy nowy dostawca to kolejna reguła do napisania.

Model językowy współrzędnych nie potrzebuje. Dostaje cały dokument i opis tego, czego w nim szukamy, więc przesunięta kolumna przestaje być problemem, a ofertę nowego dostawcy da się odczytać od pierwszego dokumentu, bez pisania czegokolwiek.

Dział logistyki wgrywa więc do systemu ofertę taką, jaka przyszła, i po chwili ma ją w tabeli: numer oferty, data wystawienia i pozycje rozbite na pola - nazwa, ilość, jednostka, cena jednostkowa netto, wartość netto, producent, kod producenta, kod dostawcy. Zawsze te same pola, niezależnie od tego, która hurtownia wystawiła ofertę i jak układa swój szablon.

Zanim dział logistyki ruszy dalej, sprawdza sumę netto i liczbę pozycji - dziesięć sekund na dokument. Pojedyncze pozycje ogląda przy nowym dostawcy, którego szablonu jeszcze nie znamy.

Dopasowanie pozycji

Po odczycie każda oferta ma tę samą postać, ale nazwy produktów zostają w niej takie, jakie wpisała hurtownia. Wciąż nie wiadomo, co z czym zestawić. W naszym rozwiązaniu dopasowanie pozycji proponuje model, a zatwierdza je człowiek.

Tabela ma wiersz na każdą pozycję zapytania, więc tam, gdzie hurtownia nie wyceniła materiału, kolumna dostawcy jest pusta. Braki widać od razu i suma netto przestaje być jedyną liczbą, na której opiera się wybór.

Model dopasowuje zamiennik tak samo jak oryginał, bo z samej oferty nie widać, że hurtownia podstawiła inny produkt. Dział logistyki wypatruje go przy przeglądaniu tabeli.

Zostają jeszcze jednostki i ilości. Zapytanie jest na 500 sztuk wkrętów, a hurtownia wycenia 10 paczek po 50. Dział logistyki widzi taką pozycję podświetloną, z wyliczonym przelicznikiem, i zatwierdza go sam.

Zapytanie nie ma pozycji na koszt dostawy ani na cięcie kabla, więc model nie ma ich do czego przypisać. Pokazujemy je osobno, pod pozycjami materiału.

Dział logistyki przegląda całą tabelę, a nie tylko najdroższe pozycje.

Historia cen ofertowych

Ceny opisane datą, dostawcą i produktem zostają w systemie po każdym porównaniu. Nikt ich osobno nie wpisuje, bo pochodzą z ofert, które dział logistyki i tak dostaje.

Firma ma z tego własną bazę cen ofertowych, choć żadnego cennika w tym celu nie prowadzi. Kierownik projektu w każdej chwili może sprawdzić, czy zamówione na jego budowę materiały faktycznie były najtańsze. Dział logistyki może porównywać ceny pomiędzy kolejnymi ofertami, jeśli wydają mu się zbyt wysokie albo niskie. Kosztorysant ma szybki wgląd w realne ceny ofertowe na dane produkty.

Koszt wywołań modelu

Za odczyt i dopasowanie odpowiada model Sonnet 5 firmy Anthropic. Rachunek za jego wywołania u tego klienta wygląda tak:

MiesiącRachunekWywołania modelu
kwiecień 20267,51 USD122
maj 20269,15 USD385
czerwiec 20265,25 USD365
lipiec 20266,57 USD413

Jako wywołanie liczymy każdy odczyt wgranego PDF-u i każde dopasowanie pozycji do zapytania. Tyle płaci przez miesiąc cała firma, ze wszystkimi budowami naraz. Licznik kosztów wywołania ruszył w trakcie kwietnia, więc pierwszy wiersz tabeli zawiera tylko część miesiąca. Pojedyncze wywołanie kosztuje tym więcej, im dłuższa jest oferta, więc miesiąc z kilkoma obszernymi dokumentami bywa droższy od miesiąca z większą liczbą krótkich. Liczby w tabeli pochodzą z wcześniejszej wersji 4.6.

Kto pyta nas o koszty, spodziewa się zwykle znacznie większej kwoty. Z kolejnymi modelami rachunek lekko rośnie i najpewniej będzie rósł dalej, ale skala zostaje ta sama. Tyle kosztuje porównanie, którego wcześniej nikt nie robił.

Dlaczego dopiero teraz

Zestawienie ofert pozycja po pozycji dało się zrobić zawsze. Wystarczyło przepisać każdą ofertę do wspólnej tabeli i uzgodnić nazwy produktów, czyli kilka godzin pracy na jedno zapytanie. Nikt tego nie robił, bo tyle pracy nie zwracało się przy jednej decyzji. Dział logistyki sprawdzał kilka najdroższych pozycji i na nich opierał wybór dostawcy.

Model nie zrobił z tej pracy rzeczy łatwej. Zrobił z niej rzecz tanią. Przy kilku dolarach miesięcznie nikt nie liczy, czy porównanie się opłaca, więc robi się je przy każdym zapytaniu.

Tak samo jest z historią cen ofertowych. Żadna firma nie prowadziłaby jej ręcznie, bo przepisywanie ofert do cennika kosztowałoby więcej, niż warta jest wiedza o cenach sprzed roku. Teraz powstaje przy okazji każdego porównania, bez osobnej pracy.

Warto rozejrzeć się po firmie za pracą, której nikt nie wykonuje, choć wszyscy wiedzą, że by się przydała. Sporą część takiej pracy da się dziś oddać modelowi i wtedy zaczyna się opłacać.

Druga część jest o samej instrukcji dla modelu: skąd wziął się jej podział na część wspólną i część dostawcy, i jak sprawdzamy każdą zmianę.