Podstawy
2 godz. 43 min · OpenAI · Full-stack i Programowanie
Adam GospodarczykChociaż dokładne działanie dużych modeli językowych nie jest zrozumiałe nawet dla twórców tych narzędzi, to i tak istnieje szereg dobrze znanych faktów. Zapoznanie się z nimi pozwoli Ci lepiej wyobrazić sobie sposób działania LLM bez konieczności wchodzenia w głębokie detale techniczne. To z kolei w sposób bezpośredni przełoży się na skuteczność projektowanych promptów. W pierwszej części kursu skupiamy na wysokopoziomowym spojrzeniu na modele firmy OpenAI, uwzględniając ich aktualne możliwości oraz aktualne ograniczenia.
Instrukcje kierowane do modeli takich jak GPT-3.5-Turbo czy GPT-4, mogą realizować najróżniejsze zadania. Pomimo tego ich ogólna struktura uwzględnia pewne schematy z których możemy korzystać. W zależności od celu jaki chcemy osiągnąć, możemy uwzględniać lub pomijać poszczególne elementy promptu. I chociaż wspomniane modele są w stanie świetnie radzić sobie z nieustrukturyzowanymi danymi, to w przypadku projektowania instrukcji, bardzo istotne jest zachowanie precyzji oraz wyraźne oddzielenie jej fragmentów. Na praktycznych przykładach zobaczysz, jak łatwo niewłaściwe formatowanie może negatywnie wpływać na generowaną odpowiedź. Poznasz także ogólne zasady, które pomogą Ci kształtować instrukcje w sposób, który zwiększy prawdopodobieństwo wygenerowania odpowiedzi, której oczekujesz.
Zero-shot, Few-shot, Chain of Thought czy Tree of Thoughts — to techniki projektowania promptów, dzięki którym znacząco zwiększysz ich skuteczność. I choć każda z nich zwykle opiera się o bardzo proste koncepcje, tak ich praktyczne wykorzystanie nie zawsze jest oczywiste. W tym kursie nie tylko poznasz przykłady ich zastosowania, ale także będziesz w stanie połączyć je z ogólnymi zasadami tworzenia promptów, co jeszcze bardziej ulepszy tworzone przez Ciebie instrukcje. Ciekawostka: Technika Tree of Thoughts w niektórych przypadkach zwiększa skuteczność GPT-4 z 4% do nawet 74%.
Ostatnia część kursu uwzględnia kilka przykładów, których celem jest pokazanie Ci szerokiego kontekstu w którym umiejętność projektowania promptów, umożliwia wyjście daleko poza zwykłe odpowiadanie na pytania i generowanie tekstu. Zobaczysz, jak tworzone przez Ciebie instrukcje mogą zostać wykorzystane w aplikacjach webowych oraz systemach uwzględniających realizujących złożone zadania z pomocą dużych modeli językowych. Mowa tutaj o pamięci długoterminowej, embeddingu danych oraz nawet autonomicznych agentach, zdolnych do posługiwania się narzędziami. Pamiętaj jednak, że wszystkie z wymienionych tematów zostały omówione tylko z szerokiej perspektywy, ponieważ ich faktyczna implementacja, wykracza poza zakres tego kursu.
Ten kurs został zaprojektowany z myślą o osobach chcących rozpocząć naukę projektowania promptów dla dużych modeli językowych, takich jak GPT-3.5-Turbo czy GPT-4. Wcześniejsze doświadczenie oraz zaawansowane umiejętności techniczne czy programistyczne nie są wymagane. Wiedza z tego kursu da Ci podstawy do dalszej nauki projektowania promptów oraz pozwoli Ci uzyskać szerszą perspektywę na temat roli promptów przy codziennej pracy z narzędziami takimi jak ChatGPT czy integracjami dużych modeli językowych z aplikacjami.
W tej lekcji chciałbym pokazać Ci, w jaki sposób możesz podkreślać instrukcje
zawartą w swoim prompcie po to, aby otrzymać oczekiwane rezultaty.
Mamy tutaj dość prosty prompt, którego zadaniem jest sklasyfikowanie wiadomości
użytkownika i przypisanie do niej jednej z dwóch kategorii.
Pierwsza z nich to kategoria prywatne, a druga praca.
Teoretycznie więc, jeżeli mamy taki prompt, a następnie użytkownik prześle
informację o napisaniu newslettera, to spodziewamy się tutaj odpowiedzi w postaci
obiektu JSON z kategorią ustawioną jako praca.
Niestety w przypadku modelu GPT-3,5-Turbo
wiadomość systemowa w tym momencie została do pewnego stopnia zignorowana i
odpowiedź nie jest taka, jakiej byśmy oczekiwali.
Jeżeli jednak przestawimy tutaj model na GPT-4, to tym razem zadanie zostanie
zrealizowane poprawnie, czego dowód mamy tutaj.
Ten przykład nie oznacza jednak, że nawet w takiej sytuacji musimy przełączać się na
model GPT-4, aby poprawnie rozwiązać to zadanie.
Mianowicie wystarczy, że skorzystamy z tak zwanej techniki Few-Shot Learning, a w tym
przypadku praktycznie wystarczy One-Shot Learning.
Polega ona na tym, aby w ramach promptu
uwzględnić także kilka pokazowych w tym przypadku przykładów, które dodatkowo
wzmacniają nasz opis i prezentują oczekiwane zachowanie.
Okazuje się, że na potrzeby naszego promptu wystarczają tylko te dwie dodatkowe linie
aby model GPT-3,5-Turbo poprawnie zrealizował to zadanie.
Oczywiście w momencie, gdy nasze zadanie
byłoby bardziej złożone, konieczne byłoby dobranie kolejnych przykładów, na
podstawie których model byłby w stanie uczyć się pewnego rodzaju schematów, tak
aby następnie mógł stosować je w swoich wypowiedziach.
Coś takiego może okazać się szczególnie przydatne w momencie, gdy np.
kategorie są czymś, co jest znane nam, ale niekoniecznie modelowi.
Jak widać zmodyfikowałem tutaj nasz prompt
w taki sposób, aby kategoriami były nazwy moich projektów.
Oczywiście model będzie podejmował tutaj próbę, aby dalej kategoryzować podane
przeze mnie przykłady, natomiast prawdopodobnie w większości przykładów
albo nie będziemy mieć rozwiązania, albo rozwiązanie będzie niepoprawne.
W końcu nie mogę tutaj wymagać znajomości poszczególnych projektów oraz tego, jaki
rodzaj zadań realizuję w ramach każdego z nich.
Ponownie, jak widać, nie oznacza to tego, że model nie jest w stanie zrealizować
takiego zadania poprawnie, ponieważ wystarczy, że dodam mu dodatkowy kontekst
w postaci opisów dla poszczególnych kategorii.
Wówczas, jeżeli podamy tutaj kilka
dodatkowych przykładów, no to nietrudno się domyślić, że tym razem przypisanie
kategorii odbędzie się zgodnie z ustalonymi regułami.
Jak widzisz, modele nawet takie jak GPT-3,5-Turbo są w stanie niesamowicie szybko
się uczyć, również na podstawie naszego promptu.
Oznacza to, że nawet modele takie jak GPT-3,5-Turbo są w stanie skutecznie realizować zadania, które w sposób
bezpośredni nie nawiązują do ich bazowej wiedzy.
Oczywiście w przypadku mojego promptu to wykorzystanie bazowej wiedzy występuje ze
względu na to, że model będzie w stanie połączyć np.
słowa typu zapier ze słowem automatyzacja.
Dzięki temu np. słowo zapier
zostanie zaklasyfikowane do kategorii Eduweb.
Przy projektowaniu promptów takich jak ten
ogromną rolę odgrywa to, jakie przykłady zaprezentujemy modelowi oraz czasem nawet
odgrywa rolę to, w jakiej kolejności będziemy je podawać.
Tutaj szczerze mówiąc nie ma złotych
zasad, którymi należy się kierować, lecz bardziej na obecnym etapie znajomości tego
jak funkcjonują modele oraz jak można projektować prompty
najlepiej sprawdzi się eksperymentowanie i
testowanie naszego promptu na różnych zestawach danych.
W ten sposób będziemy w stanie ewentualnie
korygować jego zachowanie, bądź też w niektórych sytuacjach może się okazać
nawet, że pisanie promptu nie będzie wystarczające dla konkretnego zadania
i konieczne będzie rozważenie tak zwanego fine tuningu, czyli po prostu wytrenowania
modelu do przeprowadzenia konkretnej klasyfikacji.
Tymczasem, aby poprzeć moje słowa
dotyczące przykładów, przejdziemy sobie do publikacji na stronie OpenAI,
a konkretnie do tego dokumentu, który co prawda ma już swoje lata, ale zawiera
pewne informacje na temat tego, jak modele takie jak w tym przypadku GPT-3 są w
stanie uczyć się na kilku podanych przykładach wewnątrz promptu.
Jeżeli teraz przejdziemy sobie przez ten
dokument, a konkretnie skupimy się na aspektach dotyczących analizy zachowania
modelu w porównaniu do tego czy ma podane przykłady czy też nie, to zobaczymy, że
tutaj nawet jeden przykład odgrywa istotną rolę, a podanie kilku potrafi w znaczący
sposób zwiększyć efektywność działania modelu.
Przypominam, że mówimy tutaj o modelu GPT-3 oraz publikacji mającej ponad 3 lata.
Z moich doświadczeń wynika, że model GPT-4 stał się znacznie lepszy w rozwiązywaniu
problemów bez jakichkolwiek przykładów, ale jednocześnie te przykłady również
odgrywają jeszcze większą rolę niż miało to miejsce w przypadku modelu GPT-3.
Poza tym, przynajmniej w tym dokumencie
oraz też kilku innych, nie znalazłem też konkretnych wskazówek mówiących o tym, w
jaki sposób należy dobierać przykłady do naszego promptu.
Mówi się raczej o tym,
że dodanie przynajmniej kilku przykładów odgrywa istotną rolę, ale to,
ile ich faktycznie powinno być, jest już kwestią zależną od konkretnego zadania.
Patrząc na to z praktycznego punktu
widzenia, po prostu pisząc prompt na pewnym etapie zwyczajnie widzimy, kiedy
zaczyna działać i zachowywać się zgodnie z naszymi oczekiwaniami.
Wówczas jest to sygnał do tego, że nie potrzebujemy więcej przykładów.
Tutaj zaznaczę, że osiągając taki moment, być może warto się zastanowić także nad tym, czy
pewne przykłady nie mogą zostać usunięte, aby zaoszczędzić dodatkowe tokeny.
Tutaj co prawda tylko jedno wykonanie
naszego promptu raczej nie odgrywa roli z punktu widzenia kosztów.
Natomiast w momencie gdy podłączamy taki
prompt do aplikacji, z której korzystają użytkownicy, to nagle okazuje się, że
praktycznie każdy token odgrywa tutaj istotną rolę.
Dodatkowo kilka moich doświadczeń mówi o tym, aby starannie dobierać przykłady i
rzeczywiście pokazywać modelowi pewne schematy, którymi chcemy, aby podążał
natomiast spotkałem się także ze źródłami, które mówią, że jeżeli chodzi nam
wyłącznie o formatowanie odpowiedzi, a nie np.
o konkretną klasyfikację, to nic nie stoi
na przeszkodzie, aby nawet podane tutaj przykłady były błędne.
Szczerze mówiąc nie wiem, czy jestem w
stanie zgodzić się z taką teorią i w swoich promptach zawsze dbam o to, aby
podawać tutaj jak najbardziej prawdziwe przykłady, a także wybierać takie, które
mogą pokazywać pewnego rodzaju schemat myślenia, którym podążam.
W ten sposób zauważam, że model jest w
stanie wychwytywać te schematy i przekładać je na generowane odpowiedzi.
Mówiąc o tym jednak bardziej konkretnie, wyobraźmy sobie scenariusz, w którym np.
zauważam, że prompt nie klasyfikuje mi poprawnie
zadań, które powinny być przydzielane do Eduweba.
W związku z tym modyfikuję mój prompt albo
przez uzupełnienie opisu kategorii, albo poprzez podanie dodatkowego przykładu.
Wówczas, pomimo tego, że dodaję tylko jeden przykład z jakiejś kategorii, to w
praktyce model znacznie rozszerza tą klasyfikację i jest w stanie doskonale
odnajdywać się także w innej klasyfikacji, której wcześniej nie widział np.
w prompcie.
Jeżeli chodzi o technikę Few-Shot, sprawdza
się ona szczególnie w momencie, gdy zależy nam na bardzo konkretnym formacie
odpowiedzi modelu bądź też sytuacji, w której potrzebujemy np.
dokonywać klasyfikacji według naszych
kategorii lub ściśle określonych zasad, albo realizować jakieś inne złożone
zadanie, wymagające pewnego rodzaju logiki, którą trudno jest opisać z pomocą
instrukcji, ale znacznie łatwiej opisać ją na przykładach.
Cała reszta to kwestia eksperymentowania i odkrywania możliwości, które na ten moment
co prawda zaczynają być odkrywane, ale w rzeczywistości jest to tylko mały wycinek
tego, co wydaje się, że oferują takie modele jak GPT-4.