Mój pierwszy RAG napisałem w 2019 roku. Dostałem do wykonania produkt, który działał w taki sposób: wysyłamy zdjęcie jakiegoś ubrania, aplikacja sugeruje 10 najbardziej podobnych produktów i prowadzi do różnych sklepów.
Trzeba było zebrać bazę sklepów, bazę ich produktów, zdjęcia, a następnie przekształcić te zdjęcia na wektory i osadzić w przestrzeni wielowymiarowej.
Architektura Systemu
Ingestia Danych (Facade & Strategy Pattern)
Projekt na początku zakładał użycie Kafki jako systemu kolejkowego, jednak przy użyciu dobrych wzorców projektowych — takich jak fasada i strategia — udało się ujednolicić klasy workerów:
- Worker odpytujący sklepy o zaktualizowane produkty
- Worker przetwarzający zdjęcia na wektory
- Worker aktualizujący przestrzeń wielowymiarową
Aplikacja obsługuje wielu dostawców danych. Każdy sklep posiada własną strategię mapowania pól XML na ustandaryzowany model produktu.
Pipeline Wektoryzacji Zdjęć
Kluczowym elementem systemu RAG było visual embedding. Aplikacja pobierała zdjęcia, skalowała je do formatu 224x224px (RGB) — standardowego rozmiaru wejściowego dla modeli computer vision — a następnie wyciągała zestawy danych do obliczania wektorów podobieństwa (KNN).
Indeksowanie i Baza Danych
Sercem systemu była baza PostgreSQL zarządzana przez SQLAlchemy. Produkty były indeksowane nie tylko po ID, ale również w relacji z kategoriami i płcią, co pozwoliło na hybrydowe wyszukiwanie.
Główne Cechy
- Skalowalność: Dzięki wielowątkowości proces pobierania zdjęć i aktualizacji danych zachodzi równolegle dla wielu sklepów
- Ujednolicony Model Danych: Bez względu na źródło, każdy produkt trafia do bazy w tej samej strukturze
- Automatyzacja: Skrypty monitorujące zmiany i automatyzujące codzienne aktualizacje
- Gotowość na AI: Struktura bazy zaprojektowana pod integrację z Keras czy TensorFlow
Największy Sukces
Udane wyprowadzenie produktu na produkcję. Wszystkie kawałki — od ingestii danych, przez przetwarzanie obrazów, aż po wyszukiwanie wektorowe — działały razem seamlessly.