Zamień ten tekst na URL Webhooka

Full-stack i Programowanie

Tempo zmian technologii i praktyczne zastosowanie AI

Wydanie nr
25
opublikowane
2023-03-17
Daniel Noworyta
Daniel Noworyta
Full stack Developer
No items found.

GPT-4 zostało opublikowane 14 dni po wersji GPT-3.5-Turbo. Już dziś możemy korzystać z nowych możliwości, dzięki ChatGPT Plus oraz bezpośrednim połączeniu z API. Dodatkowo wczoraj w ręce użytkowników została oddana piąta wersja Midjourney, którą od wcześniejszej dzieli około trzy miesiące.

Takie tempo zmian sprawia, że warto dostosować strategię "pozostawania na bieżąco". Mówię tutaj zarówno o poszerzaniu swojej wiedzy oraz umiejętności, ale także sposobie projektowania aplikacji, których podatność na modyfikacje musi być wysoka. To wszystko wymaga jeszcze fundamentu w postaci zwinnego zespołu, umiejącego zachować dużą dynamikę pracy. Zadanie wydaje się trudne i rzeczywiście takie jest. Nie oznacza to jednak, że nie nic nie możemy z tym zrobić — wręcz przeciwnie!


GPT-4 Technical Report

Na wstępie bardzo zachęcam do indywidualnego zapoznania się z publikacją opisującą GPT-4. Zawiera mnóstwo interesujących faktów dotyczących tempa rozwoju. Przedstawia określenie "Acceleration Risk", opisującego problem tempa rozwoju w zestawieniu z regulacjami prawnymi oraz ogólnym wpływem GPT-4 na ekonomię. Znajduje się tam także interesujący fragment, mówiący o 8 miesiącach testów GPT-4. Oznacza to, że rozpoczęły się na kilka miesięcy przed udostępnieniem ChatGPT pod koniec listopada zeszłego roku.

Warto podkreślić, że we wspomnianym dokumencie, znajdziemy następujący fragment:

Forecasters predicted several things would reduce acceleration, including delaying deployment of GPT-4 by a further six months and taking a quieter communications strategy around the GPT-4 deployment (as compared to the GPT-3 deployment).

"Forecasters" to osoby doradzające OpenAI. W tym przypadku sugerowali opóźnienie premiery GPT-4 o 6 miesięcy i wygląda na to, że ta sugestia nie została uwzględniona. Mamy zatem jasne sygnały mówiące o tym, że tempo rozwoju może być jeszcze wyższe, niż widzimy obecnie. Tym bardziej że bardzo wyraźna jest rywalizacja pomiędzy największymi korporacjami, w obszarze Sztucznej Inteligencji. Jej obecność zwiększa szybkość wdrażania kolejnych zmian i publicznego udostępniania coraz bardziej zaawansowanych narzędzi. Nie jest to jednak definitywne potwierdzenie tego, że tempo rozwoju zostanie utrzymane czy zwiększone. Nawet poniższy fragment mówiący o możliwości pojawieniu się AGI w perspektywie dwóch lat, nie jest wystarczający, aby jednoznacznie stwierdzić zachowanie tempa rozwoju technologii. Mówię o tym, ponieważ warto mieć to na uwadze przy planowaniu kolejnych działań.

AGI before we do, we commit to stop competing with and start assisting this project. We will work out specifics in case-by-case agreements, but a typical triggering condition might be “a better-than-even chance of success in the next two years.”

Jest jeszcze jedna, interesująca estymacja spadku kosztów trenowania modeli. Według raportu Big Trends, do 2030 roku, spadną do ~$30. Problem w tym, że 99% tego, co zostało przewidziane na kolejne 8 lat, wydarzyło się w 5 tygodni! (mowa o Stanford Alpaca). Ten przykład jasno oddaje powagę sytuacji, obrazując skalę tego, z czym się mierzymy.

Dlatego dość racjonalnym podejściem byłoby przyjrzenie się obecnej sytuacji, a także uwzględnienie ewentualnych, przyszłych scenariuszy. Na tej podstawie można zdecydować o działaniach, które mogą sprawdzić się w naszym przypadku.

Skuteczność modeli i praktyczne zastosowanie

Różnica pomiędzy GPT-3.5 a GPT-4 jest drastyczna pod wieloma względami. Dobrze oddają to testy przeprowadzone na egzaminach, które zostały przygotowane z myślą o ludziach, a model nie został w żaden sposób trenowany do ich wykonania. GPT-3.5 osiągnął wynik w dolnych 10% a GPT-4 w górnych.

Kolejnym przykładem jest zaskakujące przełamanie trendu w zakresie zadań uwzględniających Hindsight Neglect, w których wcześniejsze wersje modeli, wraz ze swoim wzrostem, wykazywały coraz mniejszą skuteczność. GPT-4 rozwiązuje takie zadania bez najmniejszego problemu i w ramach wyjaśnienia — chodzi o sytuacje w których rozwiązanie jest odmienne od tego, co jest nam sugerowane i dojście do niego, wymaga logicznego działania. GPT-4 jest w stanie poprawnie udzielić odpowiedzi i wyjaśnić, z czego ona wynika. Kilka przykładów takich zadań, można znaleźć tutaj.

W praktyce wystarczy kilka interakcji, aby szybko zorientować się, że nie mówimy tutaj o różnicach wyłącznie w laboratoryjnych warunkach. Mówiąc wprost — GPT-4 jest znacznie lepszy. Przekładając to na zastosowanie produktowe, jeżeli rozwijasz aplikację wykorzystującą GPT-3, przejście na najnowszy dostępny model, jest bardzo uzasadnione. Niekiedy nawet — niezbędne.

Sam przechodziłem taką migrację z wersji text-davinci-003 na GPT-3.5-Turbo, a potem z GPT-3.5 na GPT-4. Ze względu na ChatML, konieczne było zmodyfikowanie kodu odpowiedzialnego za kontakt z API, przygotowanie kontekstu oraz przechowywanie danych. Do tego niezbędne było dostosowanie promptów, które przepisałem praktycznie od podstaw. Co ciekawe, większość z nich mogłem znacząco uprościć, ponieważ GPT-4 szybciej wyłapuje wzorce a zwracane przez niego odpowiedzi, cechuje większa precyzja.

Przykładowo GPT-3 musiałem jasno przeprowadzić przez wykrywanie intencji zapytania, od której uzależnione było dalsze działanie oraz źródła informacji dostarczane do kontekstu. Zadanie było na tyle trudne, że uzasadniony był fine-tuning na ~ 1500 zestawach danych. GPT-4 działa bezbłędnie, wykorzystując zaledwie kilka przykładów pokazujących schemat.

Warto dodać, że GPT-3.5 oraz GPT-4 nie oferują jeszcze możliwości fine-tuningu. Jednak gdy tylko będzie dostępna, może pojawić się potrzeba ponownego trenowania. Na ten moment trudno jeszcze powiedzieć, o jak dużych zmianach mówimy. Interesujące jest jednak to, że to, co jeszcze kilka tygodni temu wymagało inwestycji czasu i pieniędzy, dziś może być realizowane z pomocą kilku zdań.

Można to zestawić z aktualizacjami wersji frameworków lub oprogramowania, które zwykle zachowują wsteczną kompatybilność. Liczba nowych funkcji pomiędzy wersjami, rzadko uzasadnia konieczność natychmiastowej migracji. W przypadku GPT sytuacja wygląda inaczej. Różnica pomiędzy modelami jest znacząca a konieczność dostosowania kodu aplikacji oraz promptów nadal istnieje. Dlatego niezależnie od rozwijanego projektu, musimy zadbać o szybką adaptację do zmieniających się warunków i dostępności narzędzi.

Pomimo tego, że GPT-4 API dalej wykorzystuje ChatML, to samo pojawienie się możliwości analizowania obrazu, będzie mieć wpływ na sposób interakcji z nim (ta funkcja nie jest jeszcze dostępna). Oznacza to kolejne zmiany (aczkolwiek nie w każdej sytuacji będzie to konieczne), których wprowadzenie jest trudniejsze, proporcjonalnie do złożoności kodu z którym pracujemy.

Przekładając to wszystko na praktykę, nie mówimy tutaj o niemożliwych do wykonania zmianach. Po prostu większym wyzwaniem staje się utrzymanie odpowiedniego tempa, przy zachowaniu jakości. Odnalezienie się w tej sytuacji jest dość indywidualne i zależy od wielu czynników. Sam posiadam kilka praktyk, które całkiem dobrze mi się sprawdzają i za moment się nimi podzielę.

Zanim przejdziemy dalej, chciałbym zwrócić uwagę na zasadne pytanie, które można sobie zadać:

W jaki sposób mogę zwiększyć skuteczność swojej pracy i nauki oraz dynamikę funkcjonowania?

Odpowiedź nie musi zawsze kierować nas do sięgania po nowe rozwiązania. Czasem wystarczy zrezygnować z tych, które przestały działać. W przypadku każdego z nas możemy mówić o czymś innym, dlatego dobrze jest spojrzeć z boku na to, jak pracujemy i w jaki sposób się uczymy. Na tej podstawie możemy zestawić to, co mamy, z tym, co oferują nowo dostępne narzędzia.

Interakcja z API i personalizacja doświadczeń

Dla najpopularniejszych technologii powstały już narzędzia, ułatwiające interakcję z API OpenAI. Mówimy tutaj nie tylko o uzyskiwaniu odpowiedzi, ale także kontroli jakości, kosztów, limitów, dedykowanym kontekście i projektowaniu zachowania AI. Na potrzeby własnych projektów większość poniższych zagadnień, nie będzie nas obowiązywać, ale oddając nasze rozwiązanie w ręce użytkowników końcowych, musimy uwzględnić między innymi wątki znajdujące się na poniższej liście.

Przykłady z różnych kategorii:

  • kontrola tokenów (np. tiktoken)
  • limity związane z kontrolą kosztów
  • kontrola inputu użytkownika (moderation API)
  • rozbudowane interakcje (np. langchain)
  • systemy wyszukiwania (np. pinecone)
  • ochrona danych poufnych (np. przez odpowiednie prompty)

Do tego powstają także nowe określenia, takie jak "OP Stack" (OpenAI / Pinecone). W praktyce jednak wszystko, co mamy dostępne na rynku, jest jeszcze na bardzo wczesnym etapie rozwoju. W związku z tym bardziej złożone integracje mogą uwzględniać pisanie własnej logiki, która komunikuje się bezpośrednio z API OpenAI. Elastyczność jest na tyle duża, że sam w kursie o tworzeniu personalnego asystenta, skorzystałem wyłącznie z narzędzi no-code i kilku połączeń API. Takie podejście daje ogromną szybkość developmentu, ale zdarzają się sytuacje w których niektóre z akcji są trudne do osiągnięcia, bez napisania kodu.

Jak już wspomniałem, sposób interakcji pomiędzy modelami GPT-3 a GPT-4, znacznie się zmienił. W przypadku mojej aplikacji, zastosowanie zmian okazało się stosunkowo proste. Za kontakt z OpenAI w każdym przypadku odpowiadała jedna funkcja, która korzystała z drugiej, budującej dla niej ciało zapytania. Jednak gdyby logika budowania całego kontekstu była rozproszona w różnych miejscach, wprowadzenie zmian, byłoby trudniejsze. Dodatkowo konieczne było także usunięcie niektórych funkcji. Jedną z nich była moja implementacja mechanizmu konwersacji, który teraz dostępny jest natywnie. W tym przypadku zmiany były pozytywne, bo znacznie uprościły kod. Interesujące jest jednak to, że mam więcej przykładów funkcjonalności, które stosowałem kilka miesięcy temu a które dziś, stają się natywnie dostępne dzięki API, lub bezpośrednio w aplikacjach (np. Google Workspace czy Microsoft 365). Nadal jednak moje własne rozwiązania znacząco wyprzedzają to, co jest dostępne na rynku, głównie pod kątem personalizacji, pracy z własnymi danymi oraz niesamowitej elastyczności, która znacząco wykracza poza ekosystemy konkretnych korporacji. Dlatego warto szukać sposobów, które dają nam przewagę i dostęp do nowych możliwości na kilka/naście miesięcy przed innymi. Dziś jest to źródło przewagi, którą szczególnie warto mieć na uwadze.

Piszę o tym dlatego, że zastosowanie dobrych praktyk projektowania aplikacji i unikatowego podejścia do rozwiązywania problemów, jest kluczowe do szybkiego wprowadzania zmian. Jest to momentami dość paradoksalne, ponieważ tworzenie takiego kodu, wymaga więcej czasu! To o czym teraz piszę, ma zastosowanie także do obszarów, niezwiązanych bezpośrednio z programowaniem. Paradoksalnie, aby szybciej się poruszać, nie rzadko dobrym sposobem jest wybranie dłuższej ścieżki.


(Brachistochrone curve, źródło: Wikipedia)

Pytanie więc, jak to się stało, że w moim projekcie, rozwijanym "w wolnym czasie", byłem w stanie zadbać o odpowiednio elastyczną architekturę, refaktoryzację, a nawet code-review?

Połączenie z AI

Odpowiedź na powyższe pytanie jest prosta. Chodzi o połączenie mojego doświadczenia z narzędziami takimi jak ChatGPT, Github Copilot oraz własnych aplikacji i automatyzacji, korzystających z OpenAI. Skuteczność programowania z ich pomocą jest wyższa niż praca w pojedynkę.

Przy rozwiązywaniu problemów oraz refaktoryzacji, pomagał mi ChatGPT. Wspólnie zaadresowaliśmy sensowny podział logiki aplikacji oraz zastosowaliśmy funkcje z którymi do tej pory nie miałem doświadczenia (np. praca ze streamowaniem danych przez API). Więcej na ten temat pisałem w "overment labs", dostępnym na Ahoy: https://community.ahoy.so/c/kawka-i-herbatka/overment-labs-nowy-interfejs-m-o-n-d-a-y-formatowanie-odpowiedzi-i-pair-programming-z-chatgpt

Kluczowy fragment pokazuje skuteczność jaką można osiągnąć w pracy z ChatGPT. Nie mówimy tutaj jednak o sytuacji w której napisałem "popraw ten kod (...)", ale wspólnej pracy i przechodzeniu przez analizę, optymalizację i końcowe rozwiązania, dla każdego z fragmentów tej logiki.

Interesujące jest to, że zwiększenie skuteczności o której piszę, nie jest charakterystyczne tylko dla mnie. Publikacja "The Impact of AI on Developer Productivity: Evidence from GitHub Copilot" (link) mówi o zwiększeniu produktywności przy programowaniu o 55.8% i to tylko w przypadku wykorzystania Github Copilot, który pracuje na modelu CODEX.

Trudno jest mi określić wzrost mojej produktywności. Jednak niejednokrotnie spotkałem sytuacje, które normalnie zajmowałyby mi kilka/naście godzin a z pomocą ChatGPT zrealizowałem je w kilka/naście minut! Jest w tym jednak jedno "ale". Chodzi o aktualność danych oraz zjawisko "halucynacji", które wydają się czynić ChatGPT bezużytecznym w pracy z nowymi technologiami.

Praca z nowymi danymi

Do zbudowania mojej aplikacji wykorzystałem najnowszą wersję Tauri oraz SvelteKit (wersja 1.0 pojawiła się pod koniec roku). Połączenie z OpenAI również uwzględniało najnowsze zmiany. Stanowi to pewnego rodzaju wyzwanie, ponieważ dane ChatGPT uwzględniają zakres do połowy 2021 roku.

Co więcej, ChatGPT nie jest podłączony do Internetu (aczkolwiek czasem może wydawać się, że jest inaczej). Nie stanowi to ograniczenia w przypadku wyszukiwarki Bing, więc może to być jedna z opcji, po które możemy sięgnąć. Sam jednak nie korzystam z tego rozwiązania.

Znacznie skuteczniejsze wydaje się prowadzenie rozmowy wewnątrz ChatGPT, ale z dostarczeniem odpowiedniego kontekstu. Czasem może być to fragment dokumentacji, innym zdaniem rozbudowany opis problemu a jeszcze innym, prompt dzięki której rozmowa przeprowadza nas przez proces myślowy, pozwalający dostarczyć niezbędnych informacji (np. wykorzystywane biblioteki i ich funkcje) i na podstawie nie, dojść do rozwiązania.

Powyższe przykłady mogą być także znacznie rozbudowane i bardziej kreatywne. Np. wprowadzenie ChatGPT w tryb "krytyka", znacznie zwiększa efektywność przy wyszukiwaniu błędów. Pojawiły się także przykłady w których zastosowanie pogłębionych pytań oraz systemu nagród, także zwiększały skuteczność konwersacji. Dokładając do tego jeszcze programowanie, mamy możliwość opierania całej rozmowy na własnych danych, które dynamicznie dobierane są na podstawie aktualnej konwersacji i pojawiających się w niej słowach kluczowych.

Myślę, że widzisz już teraz, że praca z ChatGPT nie sprowadza się wyłącznie do pisania promptów czy prostego połączenia z API. Tym bardziej że do stworzenia własnych interfejsów do interakcji z GPT-4, możemy wykorzystać ... ChatGPT!

Obawy i dobre praktyki

Możliwości, które już teraz mamy do dyspozycji mogą wzbudzać ekscytację oraz przerażenie. Generowanie kodu, którego napisanie zajęłoby nam wiele godzin, staje się powoli normą. Nasza praca nie polega jednak wyłącznie na pisaniu kodu, lecz rozwiązywaniu problemów. Wykorzystanie AI znacznie w tym pomaga, dając nam mnóstwo przestrzeni na tworzenie rzeczy, które do tej pory były poza naszym zasięgiem. Pomimo ogromnego entuzjazmu oraz wbijających w fotel przykładów zastosowania, nadal należy pamiętać o kilku rzeczach. Mowa o zachowaniu prywatności, szczególnie w krytycznych obszarach (hasła, klucze, poufne informacje) oraz zjawisku określanym jako "halucynacja modelu", polegającym na generowaniu nieprawdziwych odpowiedzi, które występuje także w GPT-4 (aczkolwiek pojawia się rzadziej).

W związku z tym poza technikami prowadzącymi nas do pożądanych rezultatów musimy zadbać jeszcze o ich interpretację i sposoby wykorzystania. ChatGPT i GPT-4 są narzędziami z którymi możemy nauczyć się pracować. Im lepiej będziemy to robić, tym lepsze rezultaty będziemy osiągać. W publikowanych przeze mnie materiałach zawsze staram się przekazywać moje podejście oraz techniki, które sam wykorzystuję i postrzegam jako wartościowe. Mam nadzieję, że również tym razem przynajmniej częściowo podsunąłem Ci jakieś pomysły, które możesz zastosować u siebie.

Tym razem jednak tylko wspomnę o dobrych praktykach, ponieważ temat jest na tyle obszerny, że warto dedykować mu oddzielny wpis. W międzyczasie polecam zapoznać się z zasadami opisanymi bezpośrednio przez OpenAI tutaj: https://platform.openai.com/docs/guides/safety-best-practices. Na tej stronie znajdziesz zestaw ogólnych zagadnień, które trzeba mieć na uwadze przy projektowaniu rozwiązań wykorzystujących GPT-4. W praktyce, szybko się przekonasz, że lista jest nieco dłuższa.

Zatem jak żyć?

Zbierzmy w całość to, o czym właśnie napisałem.

Przede wszystkim tempo zmian już teraz jest wysokie. Istnieje zarówno prawdopodobieństwo, że znacznie przyspieszy, jak i spowolni. Trudno jednoznacznie stwierdzić, który scenariusz zostanie zrealizowany. Aktualnie więcej sygnałów mówi o tym, że najbliższy czas będzie bardzo intensywny. Warto więc wypracować techniki, które pozwolą nam zwinnie poruszać się w zmieniającym otoczeniu. W moim przypadku mowa o:

  • aktualizacji obserwowanych przeze mnie źródeł i ukierunkowanie ich na obszary mniej lub bardziej związane z AI
  • rezerwacji czasu na eksperymenty z nowymi narzędziami i dostępnymi wersjami modeli
  • poszerzanie swojej wiedzy na temat pracy z AI, nie tylko uwzględniającej modele, udostępniane przez OpenAI
  • rozwijanie technik pracy wspólnie z AI i szukanie sposobów zwiększających efektywność oraz ogólne możliwości intelektualne
  • otwarte dzielenie się swoją wiedzą, nawet w ramach firmy. To naraża nas na krytykę, która momentami bywa konstruktywna i pozwala na szybsze zidentyfikowanie potencjalnych problemów oraz ewentualnych braków
  • sięganie nie tylko po "wysoko poziomową wiedzę" ale także po materiały, dzięki którym możliwe jest głębokie zrozumienie AI
  • przeznaczanie dostępnej przestrzeni, którą daje praca z AI na podnoszenie jakości tworzonego oprogramowania

Do powyższej listy, warto dodać mnóstwo praktyki. Samo poznanie narzędzi i technik pracy z nimi jest wartościowe. Jednak sam przekonałem się, że prawdziwa wartość w pracy z ChatGPT, wymaga personalizacji i własnego kontekstu. Połączenie tego z programowaniem daje także dostęp do różnych dodatkowych akcji, takich jak, chociażby czytanie zawartości stron, w wyniku połączenia z prostymi scraperami lub makrami.

Już teraz trudno jest konkurować z osobami, które posługują się AI w swojej pracy. Co ciekawe mówimy już nie tylko o programowaniu, ale praktycznie większości specjalizacji.

Podobnie też zastosowanie dotychczasowych strategii i technik pracy, rzadko kiedy może okazać się wystarczające, w obliczu obecnych zmian. Naturalnie przez jakiś czas, nadal będzie jeszcze przestrzeń do funkcjonowania bez AI lub z jego ograniczonym zastosowaniem. Ostatecznie przyszłość jest trudniejsza do przewidzenia niż kiedykolwiek wcześniej. Tym bardziej że nadal czekamy na realną odpowiedź Google (PaLM API nadchodzi)

Na koniec dodam, że wspomniany wyżej projekt Stanford Alpaca, powiązany jest z udostępnionym przez Meta modelem LLaMA. Jedna z jego wersji została uruchomiona na MacBooku Pro oraz ... RaspberryPi. Aktualnie licencja nie pozwala na zastosowanie komercyjne. Jednak takie eksperymenty, potrafią pobudzać wyobraźnię i są prawdopodobnie najważniejszym wydarzeniem ostatnich dni.