Niespodziewanym prezentem urodzinowym stało się dla mnie udostępnienie chat-bota OpenAI GPT3, albo raczej GPT3.5, gdyż jest on rozwinięciem tego już znanego wcześniej. O ile początkowo (przez kilkanaście minut) wydawał się tematem kolejnych żartów na temat ,,sztucznej głupoty'', im dłużej go używam (a może raczej z nim/nią dyskutuję?) w tym większe osłupienie wpadam. Ale po kolei.

Pierwszym odruchem każdego jest próba ,,zagięcia'' AI jakimś prostym nieoczywistym pytaniem z dziedziny w której czujemy się ekspertem. Ja zacząłem od pytania ile wynosi (-3)!! ? Chatbot z uporem maniaka twierdził, że silnia jest zdefiniowana tylko dla całkowitych liczb naturalnych, a wynik nie istnieje. W sumie dosyć sensownie odpowiedział(a), że rozszerzanie pojęcia silni na liczby ujemne i rzeczywiste to koncept trudny i nieoczywisty. Przeszedłem więc to oczywistego jak się wydaje wyrażenia (-1)^(-1). Cała dyskusja poniżej, a sprowadzała się do ustalenia czy faktycznie funkcja zespolona (-1)^(-1) jest wielowartościowa. Akurat ta przypadkowo nie jest, ale próba zrozumienia tego spowodowałaby ból głowy niejednego studenta. Cała dyskusja niżej.

Kolejnym etapem była tabliczka mnożenia. Ile jest 17^2*9 ? Wynik w przybliżeniu jest dobry, ale niepoprawny, a tłumaczenie kuriozalne.

Wtedy uświadomiłem sobie, że mam do czynienia z siecią neuronową, która nie ma dostępu nawet do tablicy czy kartki papieru, o kalkulatorze czy Mathematice nie wspominając. Nie ma dostępu do internetu, jej pamięć (krótkotrwała!) jest ograniczona to kilku tysięcy tokenów (słów). Nie ma możliwości graficznych, konsultacji z kimkolwiek, wszystko robi ,,w głowie'', a jedyny ,,output'' to text. Wyobraźmy sobie zdolnego i pilnego ucznia, którego na 20 lat zamknęliśmy w bibliotece z wydrukowanymi wszystkimi książkami, instrukcjami obsługi, stronami internetowymi, blogami itp. itd. On pilnie wszystko przestudiował i nauczył się na pamięć. I teraz ktoś taki wychodzi z piwnicy i zaczyna z Tobą dyskutować. Wiele podobnych osób spotykało się (i nadal się zdarzają) na I roku studiów, zwłaszcza na fizyce...

I teraz ktoś taki jest do mojej prywatnej dyspozycji. Na dodatek na każde pytanie odpowiada w kilka sekund, zwykle szybciej. Robi błędy, dużo nie rozumie, a każdą informację trzeba z niego wyciągać ,,za uszy'', jak ze studenta na egzaminie ustnym. Ale przygotował się do tego egzaminu najlepiej jak to możliwe wkuwając podręczniki i przerabiając tysiące standardowych zadań. Wie dużo na tematy o których nie mam pojęcia, rzeczy których musiałbym się nauczyć (a nie mam czasu) i niekończoną cierpliwość. Nauczyciel i współpracownik idealny. Słynna ,,gumowa kaczka'' programistów zyskała godnego następcę. Bo nawet jak nic nie pomoże, a udzielone odpowiedzi będą błędne, nic bardziej nie przybliża do rozwiązania problemu niż jego jasne i zrozumiałe dla innych sformułowanie!

Pierwszym szokiem było uświadomienie sobie, że ChatGPT3 co prawda nie potrafi rysować, ale np: potrafi generować kod w LaTeX-u, będącym lingua franca zapisu matematycznego i naukowego dla wzorów, równań itp. itd. O ile poprawne odpowiedzi na pytania, które zostały bez odpowiedzi po wcześniejszym Seminarium Astrofizycznym, jak:

nie robią aż takiego wrażenia, to już wygenerowanie poprawnej macierzy mieszania neutrin w LaTeX-u zdumiewa. Wystarczy gotowca wrzucić np: w Overleaf.

Dalszy ciąg ,,zabawy'' z LateX-em wprawił mnie po raz kolejny w osłupienie. Poprosiłem o schemat mostka Wheastone'a. Oto kod

\begin{circuitikz}[american voltages]
\draw (0,0) to[battery=$V_s$] (0,2)
(0,0) to[R=$R_1$] (2,0)
(2,0) to[R=$R_2$] (2,2)
(0,2) to[R=$R_3$] (2,2);
\draw (2,0) to[short,-o] (3,0);
\draw (3,0) to[R=$R_4$] (4,0);
\draw (2,2) to[short,-o] (3,2);
\draw (3,2) to[R=$R_5$] (4,2);
\draw (4,0) to[ammeter] (4,2);
\end{circuitikz}


oraz rendering


Nie wszystko poszło od razu gładko, ale dodanie dwóch brakujących nagłówków \usepackage{tikz}
\usepackage{circuitikz}
to prosta sprawa. Zwłaszcza, że ChatGPT3 zapytany (poprzez przeklejenie komunikatu z błędem) od razu podaje, które należy dołączyć aby plik się TeX-ował.
Przedwczoraj, dla odmiany, przed zajęciami z Wnętrz Gwiazd poprosiłem o równanie Lane-Emdena


Perfect!

Powyżej pokazuję rzeczy które równie dobrze mógłbym sam zrobić. Różnica jest czasowa: zamiast minut czy wręcz godzin, jak przy ręcznym rysowaniu schematu w tikz, spodziewany rezultat dostajemy w kilkanaście sekund.

A co z projektem zupełnie dla mnie ,,obcym''? Jako ,,przypadek użycia'' postanowiłem przetestować typową aplikację klient-serwer. Motywacją były negatywne opinie recenzenta mojej pracy o rozpoznawaniu stałych, gdzie jednym z zarzutów było nietypowe i niemożliwe do uruchomienia/przetestowania oprogramowanie. Nic dziwnego, skoro był to kod w C, generowany przez inny kod w Mathematice, a wynik był postaci kodu kalkulatora RPN, który to kod posiadał interpreter, ale napisany w ... Mathematice. Recenzent zasugerował napisanie strony WWW, gdzie można by podawać szukane liczby, a wynik wyświetlałby się w oknie przeglądarki. Jest to zadanie współcześnie bardzo typowe, połowa prac magisterskich na informatyce na tym polega. Jestem więc osłuchany, dzięki seminariom studenckim, z pojęciami Node.js, JSON, itp. itd. Ale sam nigdy podobnej aplikacji nie pisałem, i uznałem, że bez pomocy nie jestem tego w stanie szybko zrobić. Czy ChatbotGPT3 pomoże?

Na początek poprosiłem o kod strony WWW okienkiem do wprowadzania liczb, przyciskiem do wywołania funkcji oraz miejscem na wynik. Okazało się, że kod zawiera tag (script) w którym znajduje się jakiś kod Javascript komunikujący się poprzez "id" z elementami strony. Wszystko było jasne i przejrzyste, jak również eventListener oczekujący na kliknięcie przycisku. Kod nie dział od razu, np: najpierw brakowało przykładowej funkcji. Poprosiłem o ciąg Fibonacciego, a ponieważ przykład był rekursywny, zasugerowałem (złośliwie, bo sądziłem że to trudne w js) wersję z memoizacją. Okazało się, że Javascript łatwo używa tej techniki, a to dzięki automatycznemu przypisaniu wartości "undefined" do niezainicjalizowanych zmiennych. Po kilku sesjach typu pytanie/odpowiedź strona WWW wczytana z dysku lokalnego działała i obliczała poprawnie wartości ciągu Fibonacciego. Jedyne do musiałem ręcznie poprawić to chyba tylko przesunąć ciąg o 1 w lewo. Co było dosyć oczywiste, nawet dla osoby która widziała kod JS pierwszy raz w życiu tego dnia... Zajęło to ok. godziny, po czym trzeba było wrócić do innych zajęć.

Następnego dnia rano postanowiłem przerzucić obliczanie funkcji Fibonacciego na serwer. Na początek zapytałem czy mogę taki serwer napisać w C lub postawić jakiś gotowy? ChatGPT odradzał, argumentując, że to bardzo skomplikowane, techniczne i trudne do skonfigurowania. Przekonał mnie, że szybciej będzie opanować Node.js, a potem w nim napisać server. Na początek dowiedziałem się jak zainstalować Node.js w Ubuntu, ChatGTP od razy podaje gotowe polecenia typu sudo apt install nodejs . Okazało się, że "node" to po prostu interpreter Javascriptu, w którym można bądź wpisywać polecenia z klawiatury bądź uruchomić skrypt z pliku. Dla osoby która sporo takich skryptów, ale w bash-u, DOS-ie czy Pythonie napisała, schemat działania był jasny. Napisałem prompt (tak określa się często zdania wysyłane do Chatbota), który zawierał pytanie jak wygląda przykładowy serwer HTTP do uruchomienia w Node. Kod uruchamiał serwer nasłuchujący na porcie 8000 i wyświetlający "Hello, world!". Niestety, połączenie z nim możliwe było tylko i wyłącznie z tej samej maszyny (wirtualnej) gdzie go uruchomiono. Nie przedłużając, ChatGPT zasugerował kilka technik debugowania bądź poprzez użycie console.log, bądź z poziomu Chrome/Firefoxa. Okazało się, że trzeba użyć modułów Access-Control-Allow-Origin, t.j. express i cors. Dostałem instrukcję instalacji modułów z użyciem npm. Serwer HTTP zaczął być dostępny także z innych komputerów w sieci. Wszystko poszło gładko i zajęło ok. 30 minut.

Następnie próbowałem uruchomić na serwerze funkcję Fibonacci i wysłać wynik na stronę WWW. Zmitrężyłem cały wieczór bez efektu, ChatBOT sugerował różne działania, użycie JSON, metody HTTP GET, POST itp. itd. debugowanie - wszystko na nic. Postanowiłem odłożyć sprawę do rana.

Rano zacząłem zastanawiać się, jakim cudem serwer HTTP wie, dla jakiego argumentu obliczyć funkcję, skoro strona WWW nic do niego nie wysyła. Poprosiłem o wyjaśnienie Chatbota, było na tle jasne, że zrozumiałem, iż problemem jest to, że nie wiem jak wygląda prawidłowe HTTP query. ChatGPT natychmiast podał przykład typu
http://localhost/fib?n=11
Od tego momentu stało się jasne, że zarówno serwer jak i strona WWW cały czas działały poprawnie, tylko query było złe. Mogę bez żadnej aplikacji pobrać wynik z serwera np. tak:
"http://20.123.10.86/fib?n=11"

Od tego momentu wydawało się, że pójdzie z górki. Jako przykład nietrywialnego zastosowania postanowiłem udostępnić mój stary ,,mad solver'', czyli funkcję rozwiązującą równania poprzez wstawienie do niego wszystkich 2^32 = 4294967296 możliwych liczb typu float. Program jest bardzo stary, napisałem go ze 20 lat temu jako odpowiedź na zarzuty recenzenta grantu, że wstawienie nieskończenie wielu liczb rzeczywistych do równania jest niemożliwe, a nawet gdyby było to zajmie to nieskończenie wiele czasu. Otóż fakty są takie, że liczb zmiennoprzecinkowych jest skończona liczba, a wstawienie tych typu float zajmowało wtedy ok. 4 minut na procesorze z zegarem ok. 1 GHZ. Od tego czasu co jakiś czas uruchamiam program aby zobaczyć, jak wzrasta wydajność CPU na 1 core. Obecny rekord, należący do studenta inf. I roku, to 11 sekund .

Kod w C wymagał wpisania rozwiązywanej funkcji bezpośrednio w pliku źródłowym. Normalnie obszedłbym to generując plik *.c jakimś bash-owym skryptem sklejającym go z kawałków tekstu. Ale przecież mam ChatGPT, który wie wszystko! Zapytałem jak sugeruje rozwiązanie takiego problemu. Jak można się domyśleć, wielu ludzi nad tym myślało i opcji jest sporo:

Ostatecznie wróciłem do skryptu w basu. Nie wiedziałem tylko, jak go uruchomić na serwerze Node.js. ChatGPT od razu podał prawie gotowe rozwiązanie, użycie const { spawnSync } = require('child_process'); .

Wszystko działało niemal idealnie, za wyjątkiem wzorów zawierających niedozwolone znaki HTTP. W szczególności znak +, bez którego ciężko zapisać jakiekolwiek nietrywialne równanie. ChatGPT szybko został nakierowany przeze mnie na funkcję (musiała takowa istnieć!) encodeURIComponent. Schody zaczęły się w momencie przeniesienia serwera Node na komputery w sieci UJ. Wszystkie są za firewallami, nie da się połączyć nawet przez SSH. Aby umożliwić połączenie, kod serwera bądź co gorsza strony WWW musiałby zawierać moje prywatne klucze i hasła. Tak wynikało z przykładowych kodów pokazanych przez Chatbota OpenAI. Poskanowałem porty, wg. jego instrukcji, ale znając paranoidalne podejście naszych adminów wiedziałem, że wszystkie są zamknięte.

Zapytałem, czy mógłbym uruchomić swój serwer gdzieś w chmurze. Na liście proponowanych serwisów było Azure, które jak mi się wydawało jest opłacone w ramach licencji UJ. Nie do końca, dostałem kredyt na $200, na razie musi wystarczyć. Skonfigurowanie maszyny wirtualnej bez pomocy Chatbota byłoby zapewne znacznie bardziej bolesne. Dla przykładu dostałem listę kilkudziesięciu do wyboru, w różnych konfiguracjach CPU, RAM i dysków. Dla mnie idealny byłby komputer wielordzeniowy, z minimalną ilością RAM i miejsca na dysku. Ale takich nie ma, znana zasada mówi o 4 GB/core. Długo można by pisać o walce z Azure, aby serwer mógł się połączyć z moją stroną WWW. Ostatecznie, dzięki pomocy ChatGPT, uruchomiłem serwer na dostępnym porcie, czego nie dało się zrobić bez root-a w potrzebnym zakresie. Efekt całej procedury, która zajęła w sumie kilka godzin rozłożone na 3 dni można znaleźć TU .

Czy zaszła w tym tygodniu jakaś rewolucja? Moim zdaniem TAK! Przyspieszenie pracy, zwłaszcza w zakresie programowania czy prac humanistycznych, jest rzędu 10-100x. Dotyczy to głównie zagadnień, na których znamy się pobieżnie. ChatGPT3 nie jest światowej klasy ekspertem w żadnej dziedzinie. Ale jest solidnym współpracownikiem w prawie każdej. Dzień w którym darmowy dostęp do niego się skończy, a nastąpi to zapewne szybko (1 mln użytkowników w tydzień), będzie dla mnie dniem czarnej rozpaczy. Kosmita wylądował na Ziemi i miałem okazję z nim rozmawiać.

Internet zalewają mniej lub bardziej zdumiewające możliwości Chatbota GPT. Emulacja Linuksowego terminala ,,w głowie'', rysowanie SVG , znajomość ezoterycznych języków programowania (tagi OSM, Amigowski startup-sequence, skrypty Broutera *.brf), a nawet renderowanie plików PNG/BMP w postaci hexadecymalnej Pythona binary(). To ostatnie skłoniło mnie do zrobienia sobie od niego przerwy...

I nie śmiejcie się z tego, że jego IQ=87 , bo poległ na tabliczce mnożenia. Dajcie mu kalkulator...