05.2026 — obecnie
Fullstack Developer / AI Engineer
Nodeic — własna działalność (kontrakt B2B) · klient: platforma rekrutacyjna AI (NDA)
Rozwój platformy rekrutacyjnej z wyszukiwarką kandydatów opartą o AI. Frontend zbudowałem od zera; backend, baza wektorowa i infrastruktura już działały, więc pracuję w istniejącym kodzie — silnik wyszukiwania, model danych, migracje i przetwarzanie całej bazy po zmianach. Dla tego samego klienta powstało też wewnętrzne narzędzie do pozyskiwania kontaktów.
- Zbudowałem od zera produkcyjną aplikację webową (Nuxt 4 / Vue 3, SSR, BFF): architektura Vertical Slice na Nuxt Layers, własny design system, i18n PL/EN, analityka z consent mode.
- Rozwijam silnik wyszukiwania semantycznego kandydatów (Google Gemini, embeddingi e5-large, Qdrant) na korpusie kilku tysięcy CV: przebudowa na wzorzec strategii, twarde filtry, wersjonowanie potoku i masowa re-ekstrakcja na produkcji. Drugą wersję silnika pisałem w TDD — silnik wyliczeń otestowany w całości, a brzegowe odpowiedzi modelu sprawdza atrapa LLM, bo prościej napisać test, niż zmusić model do konkretnej złej odpowiedzi.
- Poprawiłem jakość danych, na których stoi wyszukiwanie: kanoniczna kategoria zawodu wyznaczana przy ekstrakcji CV, sprowadzenie zapisów umiejętności do wspólnej postaci i przebudowa dopasowania z obsługą polskiej fleksji. zobacz case study ↓
- Ustanowiłem metodologię ewaluacji wyszukiwania (LLM-as-judge, korelacje rankingowe, benchmark 50 ogłoszeń zbudowany z logów realnego ruchu) i na niej oparłem decyzje: naprawa danych podniosła zgodność rankingu z niezależną oceną z 2% do 52%, R&D rerankingu cross-encoderem zakończyło się udokumentowaną decyzją o niewdrażaniu z wnioskiem, że następny skok da dopiero reranking LLM, a zbudowana w izolacji od produkcji druga wersja silnika — z lekkim rerankerem LLM zbudowanym na tym wniosku — wygrywa na benchmarku 22:2 (zgodność kolejności 70% wobec 35%) i obsługuje ruch produkcyjny — bilans po wdrożeniu, liczony na 1214 wierszach logów realnych wyszukiwań, wykazał cztery klasy defektów zdjęte z listy klienta, w tym filtr wycinający ponad połowę puli w 9% zapytań i 6% pozycji z wynikiem poniżej progu jakości. zobacz case study ↓
- RODO w warstwie AI: fail-closed anonimizacja nazwisk w tekście generowanym przez LLM (z obsługą polskiej deklinacji). Samodzielnie wykryłem i załatałem stored XSS w podglądzie CV: plik wracał z typem zapisanym przy uploadzie i otwierał się jako blob dziedziczący origin panelu — serwer wymusza dziś typ treści, dokłada nosniff i odrzuca wszystko, co nie jest PDF-em.
- Zbudowałem dla tego samego klienta drugą wersję narzędzia do pozyskiwania leadów B2B (Python, Pydantic AI / Gemini, FastAPI, PostgreSQL, Docker), napisaną od nowa: potok od ogłoszeń o pracę, przez profile pracodawców i wzbogacanie modelem z groundingiem, po trzy niezależne źródła weryfikacji telefonu — strona firmy, rejestr GUS, Google Places — w kolejności „darmowe przed płatnym”. Każdy fakt ma pochodzenie i status, model działa w jednym typowanym wywołaniu z zakazem zgadywania, a jego wynik zasila deterministyczny filtr targetu. W bazie ok. 1,3 tys. firm, 83% firm w targecie z potwierdzonym telefonem. zobacz case study ↓