17.3.2023
Jak OpenAI Daktela API programowało (część I)

Krótkie opowiadanie o pierwszym kontakcie programisty z OpenAI:
Podekscytowany nowym narzędziem OpenAI, które ma przynieść zwielokrotnienie wydajności zespołu IT, doświadczony programista zaczął pisać w nim pierwszy program. Był to mały program/serwis HTTP, dla prawdziwego klienta Daktela, doskonale nadający się na taki eksperyment.
“Na pewno coś da się zaprogramować” – pomyślał, zwabiony bardzo dobrymi odpowiedziami, jakie uzyskiwał od OpenAI, na tematy niezwiązane z pisaniem kodu. Zresztą, widział już fantastyczne przykłady w Internecie i sam jakieś małe, i udane fragmenty kodu napisał.
“Przecież nie ja mam tu się wykazać, tylko OpenAI” – mruknął pod nosem i bez zbytniego myślenia o projekcie zaczął pisać w OpenAI Chat.

“Jeśli to jest tak inteligentne narzędzie, to przecież zrozumie strukturę danych z przykładu, i ja niczego nie będę musiał specyfikować za bardzo” – pomyślał. Miał rację. Jego oczom ukazał się piękny kod, który od razy wydawał się być poprawny, a szybka kompilacja to potwierdziła.

Ten sukces natchnął go do dalszej pracy. Do tej pory nigdy nie prosił OpenAI o wyciąganie samodzielnych wniosków z JSON i pisanie pod nie kodu. Ku jego zdziwieniu, zrobiła to poprawnie, a do tego napisała jeszcze kod testowy z objaśnieniem:

“Jest dobra” – pomyślał. Ale sprawdził kompilację i wykonanie. Tak na wszelki wypadek. Przecież nie będzie wierzył maszynie, która udaje, że może zastąpić go w pracy.
Test z kodem oczywiście zadziałał poprawnie. Może maszyna podając test, chciała powiedzieć między wierszami “Sprawdź mnie”, a może po prostu naoglądała się kodu w Internecie i głupio powtarza schematy. Przez chwilę chciał napisać “Czy domyślasz się, że testuję, co mi napisałaś”, ale nie chciał rozpraszać maszyny sprawami nieistotnymi, żeby nie zaburzyć eksperymentu.
“Pierwsze koty za płoty. Taka jesteś mądra, to będę do Ciebie mówił bardzo ogólnikowo, różnymi przykładami z życia, a Ty pokaż na co Cię stać.” – pomyślał, i napisał:

“Ten ton »Sure,…« mi się się podoba” – pomyślał, po uzyskaniu nadzwyczaj dobrej odpowiedzi:

Z niedowierzaniem zapytał szybko, sprawdzając:
“Will it work properly if URL has GET parameters?” (Czy to będzie działać poprawnie, jeśli URL będzie miał parametry GET?) – jakby zapominając już, że jeśliby chwilkę pomyślał, to by sam się tego domyślił. Zapomniał na chwilę, że to programista jest sprawdzającym, że może to skompilować i uruchomić test w każdej chwili.
Odpowiedź była do przewidzenia. OpenAI bardzo rzadko mówi, że czegoś nie wie (przynajmniej w ustawieniach OpenAI Chat). Test po uruchomieniu oczywiście działał prawidłowo.

“No to teraz spróbujmy przetestować zdolności syntezy na wysokim poziomie abstrakcji” – pomyślał, wydając najtrudniejszy rozkaz napisania kodu, jaki kiedykolwiek wydał OpenAI:

Ku jego zdziwieniu, OpenAI podało prawidłową odpowiedź. Jedynie nie dogadali się, że adres do pobierania JSON będzie zaszyty w kodzie, a nie przekazywany w parametrach HTTP. Zdziwiło go, ile dodatkowej funkcjonalności zostało dodane tylko z kilku słów, jak za dotknięciem czarodziejskiej różdżki. OpenAI przewidziała nawet przypadki skrajne i program wysyłał teraz kod błędu, nie wspominając już o kodzie HTTP 200, w przypadku sukcesu. A wisienką na torcie było napisanie przez OpenAI przypadku testowego dla zmyślonego serwera.

“Czy to potrafiłoby też zmyślać i upierać sie przy swoim?” – pomyślał, zabierając się za poprawianie nieporozumienia, nakazując: “Can you rewrite the program so the URL is hard-coded and moved to the getJsonFromUrl function?” (Czy możesz tak przepisać ten program, żeby URL był zaszyty w funkcji getJsonFromUrl?).
Jak można było się spodziewać, OpenAI posłusznie wykonała zadanie:

“Mam prawie gotowy program” – pomyślał, i nakazał następujące refaktoryzacje, już nawet nie testując poszczególnych kroków:
“Please replace echo with JSON with „result” key false/true in the program. “ (Proszę, zastąp echo w programie JSONem z kluczem result, o wartościach false/true) – poszło bezbłędnie. OpenAI domyśliła się wszystkiego.
“Please change getJsonFromUrl function name to better reflect what the function does.” (Proszę, zmień nazwę funkcji getJsonFromUrl na taką, która lepiej oddaje rolę tej funkcji) – fantastycznie, OpenAI sama wymyśliła dobrze pasującą nazwę “fetchHolidayData”.
“Make fetchHolidayData return array form of JSON and adjust the rest of the program to this change.” (Spraw, aby funkcja fetchHolidayData zwracała JSON w formie tablicy, i dostosuj resztę programu do tej zmiany) – genialnie, zadziałało dokładnie tak, jak chciał.
Wynik pracy był imponujący, a ostatnia odpowiedź brzmiała:

Teraz mógł sprawdzić czy wszystko działa poprawnie, wykonując test.
“Nie działa” – zdziwił się, ale szybko znalazł własny błąd. Dane JSON, które na początku podała OpenAI jako wynik odpowiedzi JSON HTTP, są tak naprawdę zagnieżdzone w ścieżce “.result.data” JSONa, czego ona nie mogła wiedzieć.
“Błąd ludzki” – pomyślał. I to był jedyny błąd jaki znalazł w testach…
własny błąd.
Ale to nie koniec tej historii. W następnym artykule nastąpi w niej dramatyczny zwrot akcji. Zatem zapraszam do czytania (jeśli udało się komuś dotrwać do końca naturalnie).

Łukasz Paszke
Delivery & Support Engineer
Daktela