Od ciekawości do działania

Pracując nad swoją stroną profilową i obserwując, jak dobrze AI radzi sobie z tworzeniem stron WWW, zacząłem zadawać sobie pytanie: czy AI poradzi sobie z czymś bardziej skomplikowanym?

Postanowiłem to sprawdzić, więc musiałem wymyślić, jak to zrobić. Zamiast wykorzystać istniejące narzędzia do tworzenia bloga, zdecydowałem się stworzyć własny system blogowy, pracując wspólnie z AI.

Ja wcielam się w rolę osoby nadzorującej, a AI – w tym przypadku Codex – w rolę programisty. Pierwsze kroki to fundament, czyli wybór technologii – najlepiej takiej, którą znam, aby w razie problemów móc wesprzeć agenta.

Wybrane technologie to: PHP z frameworkiem Symfony, baza danych SQLite, JavaScript oraz CSS. Zdecydowałem się na czysty JavaScript i CSS, aby nie komplikować całego projektu.

Dodatkowym założeniem było jak najmniejsze ingerowanie z mojej strony – kod przygotowany przez AI akceptuję w takiej formie, w jakiej został wygenerowany, z ewentualnymi uwagami dotyczącymi bezpieczeństwa, wydajności itp., które przekazuję w formie komentarzy do Code Review, a AI wprowadza poprawki bez mojego bezpośredniego udziału.

Prace z agentem polegały na iteracjach. Najpierw były to proste operacje, takie jak dodawanie i usuwanie, a następnie przechodziłem do coraz bardziej zaawansowanych funkcjonalności, co pozwalało stopniowo dopracowywać poszczególne elementy systemu.

W trakcie prac zauważyłem, że GitHub oferuje darmowy okres próbny GitHub Copilot. Od tego momentu każdy nowy branch, Pull Request oraz Code Review były obsługiwane przez Copilota, a jego uwagi przenosiłem do agenta Codexa, który iteracyjnie poprawiał nieścisłości.

Wraz z postępem prac dodawałem coraz bardziej skomplikowane funkcjonalności – zarówno wizualne, jak i te działające po stronie backendu. Proces ten trwał do momentu, aż efekt stał się zadowalający i możliwy do zaprezentowania.

Błędy i ograniczenia pracy z AI

W trakcie pracy z AI pojawiło się kilka uwag dotyczących współpracy. Pierwsze spostrzeżenie: powielane błędy. Mimo poprawnie sformułowanego promptu AI potrafi powtarzać ten sam błąd, co wcześniej, co pokazuje, że nie należy zakładać, iż jeśli coś raz zadziałało, to będzie działać zawsze.

Na przykład przy dodawaniu zmian do listy, mimo wyraźnego polecenia umieszczenia najnowszych elementów na końcu, AI potrafi się pogubić i wstrzyknąć tekst w środek pliku, całkowicie ignorując część polecenia.

Drugie spostrzeżenie: jeśli nie wskażesz, że należy skorzystać z zewnętrznego narzędzia, zamiast „wynajdywać koło na nowo”, agent spróbuje zaimplementować tę logikę samodzielnie.

Z pomocą przychodzi AGENTS.md – otwarty przewodnik dla agentów. Można w nim opisać dodatkowe reguły, dzięki czemu da się sterować ich zachowaniem, bez konieczności każdorazowego przypominania o tych samych zasadach.

Trzecie spostrzeżenie: czasem agent się „fiksuje” i wpada w pętlę. Polega to na tym, że naprawia jedną rzecz, ale jednocześnie psuje inną. Po zwróceniu uwagi wprowadza poprawkę, jednak powoduje powrót poprzedniego błędu.

W takiej sytuacji warto cofnąć zmiany i zacząć od nowa. Dlatego dobrze jest dzielić pracę na małe partie i nie wprowadzać wszystkiego naraz – dzięki temu zmiany wprowadzone przez AI można łatwo wycofać bez „gruzowania” całej pracy.

Inną metodą jest ręczna ingerencja i poprawienie fragmentu kodu, aby agent „wrócił na właściwe tory”.

Kolejnym krokiem powinno być sprawdzenie, jak agent rozumie prompt, ponieważ może interpretować go inaczej, niż zakładamy. Na przykład, gdy chciałem „zwęzić blok”, agent zamiast tego zmniejszał liczbę linii.

Postęp prac i koszty projektu

Repozytorium oraz prace nad projektem rozpocząłem niecały miesiąc temu, w momencie pisania artykułu. W tym czasie udało się wdrożyć takie funkcjonalności jak: dodawanie i edytowanie artykułów, zarządzanie kategoriami i słowami kluczowymi, zarządzanie użytkownikami, obsługa hierarchii górnego menu, zarządzanie plikami graficznymi oraz import i eksport danych.

Całość została zrealizowana w ramach płatnej subskrypcji ChatGPT Plus oraz bezpłatnego okresu próbnego GitHub Copilot w GitHub. Koszt całego projektu wyniósł jedynie 99 PLN.

Jeśli będę – a zamierzam jeszcze przez jakiś czas kontynuować prace – koszt ten wzrośnie o około 10 USD miesięcznie (około 37 PLN).

Gdybym miał wykonać ten projekt samodzielnie, na pewno nie zająłoby mi to tylko miesiąca. Nie byłbym też w stanie tak efektywnie pracować równolegle nad frontendem, backendem oraz konfiguracją serwera.

Współpraca z AI znacząco przyspieszyła realizację projektu i pozwoliła „dowieźć” dużą jego część w ciągu jednego miesiąca. Co prawda część widoku miałem już wcześniej przygotowaną podczas pracy nad swoją stroną portfolio, więc uwzględniając ten czas, całość zajęła nieco ponad miesiąc – jeśli liczyć również etap projektowania wyglądu strony.

Dlaczego AI bez wytycznych robi bałagan w kodzie

Kod, który AI „produkuje”, nie jest kiepski, ale też nie jest idealny. Agent ma tendencję do robienia wszystkiego według jednego schematu. Na szczęście z niektórymi aspektami można sobie poradzić, aby poprawić jakość generowanego kodu.

Jeśli zauważymy, że AI próbuje powielać istniejące rozwiązania, wystarczy wskazać, że dany fragment kodu już istnieje i powinien zostać ponownie wykorzystany. Jeszcze lepszym podejściem jest zawarcie takiej informacji już w pierwszym prompcie — na przykład, aby unikał tworzenia duplikatów.

Najbardziej efektywnym rozwiązaniem jest dodanie takiej instrukcji do pliku AGENTS.md, dzięki czemu nie trzeba za każdym razem powtarzać tych samych wytycznych. Przykładowa treść przewodnika dla agentów:


- You MUST avoid code duplication. Before adding new code, search for existing implementations and extend or refactor them instead of creating duplicates.

Zauważyłem również, że agent ma tendencję do umieszczania jak największej ilości kodu w jednym pliku, co często prowadzi do mieszania się różnych rodzajów logiki.

Jeśli jednak pracuje w oparciu o określoną strukturę — na przykład taką, jaką narzuca framework Symfony (Repositories, Entity, Service itd.) — zazwyczaj się jej trzyma. Zdarza się jednak, że nie tworzy odrębnych serwisów i nie przestrzega zasady, aby jeden serwis odpowiadał za jedną odpowiedzialność.

Na szczęście to zachowanie również można uregulować poprzez odpowiednie wytyczne w pliku AGENTS.md.

## Service Design Rules

- Each Service should be responsible for ONE specific task or domain.
- Avoid "God classes" (classes doing too many things).
- If a Service starts handling multiple concerns, split it into smaller Services.
- Prefer dependency injection over static calls or tight coupling.
- Services should be reusable and testable.

Dlaczego AI zaczyna „kosztować” coraz więcej

Na początku pracy liczba tokenów bez problemu mieściła się w limicie 5-godzinnym. Jednak wraz z postępem prac oraz rosnącą liczbą plików, których dotykała każda nowa funkcjonalność, zużycie tokenów zaczęło znacząco rosnąć.

Dodatkowo pojawiające się nieporozumienia również wpływały na ich zużycie. Czasem wynikało to z mojej winy – zbyt mało precyzyjnych poleceń – a czasem AI z nieznanych powodów wykonywało tylko część komendy, jednocześnie psując kod. W takich przypadkach konieczne było ponowne wysłanie poprawionego polecenia.

Na ten moment nie analizowałem jeszcze dokładnie, jak optymalizować zapytania, aby ograniczyć zużycie tokenów. Można jednak rozważyć zawężanie kontekstu, na przykład poprzez wskazanie konkretnego pliku lub funkcji. Dzięki temu agent nie musi analizować dużej ilości kodu, co pozwala ograniczyć niepotrzebne zużycie zasobów.

Dodatkowe instrukcje również mają wpływ na koszt – niektóre mogą być neutralne, inne natomiast mogą zwiększać zakres analizowanego kodu. Przykładem jest sprawdzanie duplikacji kodu. W takim przypadku agent musi przeanalizować większą część projektu lub dostarczonego kontekstu, aby ocenić, czy istnieją już podobne fragmenty, które można ponownie wykorzystać lub przekształcić w rozwiązania reużywalne.

Wybrane funkcjonalności systemu blogowego

W ciągu tego miesiąca stworzyłem zadowalającą, a przede wszystkim działającą wersję systemu blogowego. Poniżej prezentuję zrzuty ekranu wybranych funkcji oraz wyglądu panelu administracyjnego:

editor-blog-system

Główna funkcjonalność bloga, czyli dodawanie artykułu z edytorem tekstu formatowanego jak plik Markdown.



dashboard-blog-system

Główny panel administracyjny bloga.



top-menu-management-blog-system

Zarządzanie hierarchią górnego menu.



dock-panel-blog-system

Menu administracyjne bloga z możliwością ukrywania.

Przegląd kodu

Odpowiadając na pytanie, czy programowanie w parze z AI działa — moim zdaniem tak, choć nie jest to rozwiązanie idealne. Stworzenie aplikacji bez odpowiedniej wiedzy nadal jest trudne, szczególnie w sytuacjach, gdy AI „utknie” i konieczna jest interwencja. W takich momentach kluczowa okazuje się wiedza i doświadczenie.

Aby każdy mógł samodzielnie to ocenić, do artykułu dołączam link do publicznego repozytorium na GitHubie, gdzie można sprawdzić, jak wygląda kod generowany przez AI. Starałem się ingerować w niego w jak najmniejszym stopniu — wszystkie uwagi i poprawki pochodziły od innego agenta AI, który pełnił rolę code review.

Ja natomiast występowałem głównie w roli nadzorcy projektu, zlecającego realizację poszczególnych funkcjonalności.

Link do publicznego repozytorium na GitHubie: https://github.com/salamonrafal/blog-system-ai