Rola & zakres
W całości zaprojektowana i zbudowana, a od tego czasu stale rozwijana: wielodostępowa platforma PIM z izolacją najemców (super admin, admin najemcy, użytkownik), przepływem szkic/publikacja, dzięki któremu każda zmiana jest przeglądana przed publikacją, oraz pełnym logowaniem audytowym ze zrzutami przed i po.
- Synchronizacja Shopify-first, obok integracji z ERP NetSuite i eksportu na Amazon oraz inne marketplace'y przez ChannelEngine.
- Wzbogacanie AI tytułów, opisów, tekstów SEO i tłumaczeń — z krokiem przeglądu, zanim wygenerowana treść zostanie opublikowana.
- Wbudowany asystent RAG, który pozwala zespołowi produktowemu szukać i pracować w katalogu przez czat: wyszukiwanie wektorowe po danych produktowych, z wywołaniami narzędzi dla akcji, które użytkownik musi najpierw zatwierdzić.
- Osobne rozszerzenie do Chrome, którym zespół wrzuca produkty ze stron marketplace'ów wprost do kolejki wzbogacania.
- Moduł zgodności z unijnym GPSR, moduł SEO z walidacją wolumenu słów kluczowych oraz zadania w tle (sync wektorowy, wzbogacanie, scheduler) przez kolejkę z ponowieniami.
Efekty
- Ponad 3400 aktywnych produktów na rynku podstawowym, ze strumieniami eksportu do setek dodatkowych ofert na marketplace'ach takich jak Amazon.
- Pipeline tłumaczeń AI, który po cichu nadpisywał adresy URL kategorii, został wycofany i zastąpiony wersją tworzącą przekierowania i zapisującą wszystko w ścieżce audytu.
- Błąd synchronizacji, przez który każde powiązanie z NetSuite nadpisywało treści AI i zmiany z Shopify, rozwiązano strukturalnie, zamiast naprawiać ręcznie za każdym razem.
- Ponad 350 commitów w ciągu ośmiu miesięcy ciągłego rozwoju — nie jednorazowe wdrożenie, lecz system rosnący razem z asortymentem.
Architektura
Monorepo Turborepo z backendem NestJS i frontendem Next.js 14 (App Router), współdzielonym pakietem bazodanowym Prisma i wspólnymi typami. PostgreSQL z rozszerzeniem pgvector przechowuje zarówno dane produktowe, jak i embeddingi, więc wyszukiwanie wektorowe i zwykłe zapytania działają na tej samej bazie. Praca w tle (sync wektorowy, wzbogacanie AI, sync marketplace'ów) idzie przez kolejki oparte na Redis z automatycznymi ponowieniami i wykładniczym backoffem, odseparowane od interfejsu, żeby wolna synchronizacja marketplace'u nie blokowała reszty platformy.
Wybór modelu
Wbudowany asystent RAG jest celowo wielodostawcowy: różne zadania idą przez różne modele (od taniego modelu do rutynowego czatu po cięższe warianty Claude i GPT do bardziej złożonego wzbogacania), z cenami tokenów śledzonymi per model, żeby koszt rozmowy był widoczny, a nie był czarną skrzynką. Wygenerowana treść (tytuły, opisy, tłumaczenia) zawsze trafia najpierw do kroku przeglądu — model proponuje, człowiek zatwierdza; z tego samego powodu w innych projektach logika cenowa również nigdy nie przechodzi bezpośrednio przez model językowy.
Koszty & opóźnienia
- Koszt tokenów per rozmowa jest śledzony per model, więc droższe modele są używane świadomie i widocznie, a nie domyślnie.
- Zadania w tle (sync wektorowy, wzbogacanie) działają asynchronicznie z maksymalnie 3 ponowieniami i wykładniczym backoffem, żeby chwilowa awaria marketplace'u nie oznaczała od razu utraty danych.
- Wyszukiwanie wektorowe i zwykłe zapytania produktowe działają na tej samej instancji PostgreSQL (pgvector), co czyni zbędną osobną bazę wektorową i jej warstwę synchronizacji.
Wnioski
Pipeline tłumaczeń AI nadpisywał adresy URL kategorii bez ostrzeżenia, gdy tylko tłumaczenie było generowane ponownie — z pozoru dobrze dla SEO, ale psuło istniejące linki zewnętrzne. Rozwiązane przez przywrócenie historycznych adresów, dodanie przekierowań i zbudowanie ścieżki audytu, która odtąd pokazuje takie zmiany, zanim trafią na produkcję. Drugi błąd: każda synchronizacja z NetSuite nadpisywała treści wygenerowane przez AI i zmiany z Shopify, gdy tylko produkt został powiązany z NetSuite — nie incydent, lecz wzorzec strukturalny, rozwiązany przez rewizję kierunku synchronizacji zamiast ręcznych napraw za każdym razem. I trzeci, drobniejszy, ale wymowny: pipeline źle tłumaczył skróty materiałów, jak „RVS” (stal nierdzewna) — naprawione jawną regułą w glosariuszu zamiast liczenia na to, że model zgadnie wiedzę dziedzinową.