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, abyśmy zaczęli
rozszerzać nasze umiejętności dotyczące projektowania promptów poprzez
zwiększanie świadomości na temat tego, co w zasadzie robimy.
Jest to istotne ze względu na to, że bardzo duża część problemów dotyczących
projektowania promptów i działania modelu jest powszechna i często spotykana.
W związku z tym powstają różne techniki,
po które możemy sięgać, aby zwiększać efektywność naszych promptów.
Zanim jednak zaczniemy, chciałbym zwrócić
jeszcze uwagę na kilka wniosków z następującej publikacji.
Mianowicie jeden z obecnych tutaj wniosków mówi o tym, że aktualnie nie mamy do
dyspozycji jakichkolwiek technik, które w sposób stabilny oraz bardzo przewidywalny
będą w stanie sterować zachowaniem modeli takich jak GPT-4.
Oznacza to, że praktycznie wszystko to,
czego się uczymy jest raczej pewnego rodzaju kierunkowskazem, a nie bardzo
sztywnymi zasadami, które są w stanie zawsze dostarczyć nam rezultatów.
Coś takiego niewykluczone, że już udało Ci się zauważyć, ale też będziesz spotykać
się z tym na co dzień w swojej pracy przy projektowaniu promptów.
Dodatkowym potwierdzeniem tego, o czym
mówię, jest fakt, że nawet eksperci nie są w stanie dokładnie przeanalizować tego, w
jaki sposób działają modele takie jak GPT-4
i aktualnie tylko dość ogólnie wiemy co
się dzieje pomiędzy wysłaniem zapytania do modelu a otrzymaniem odpowiedzi.
Prześledzenie tego procesu krok po kroku
jest na dzień dzisiejszy niemożliwe, a przynajmniej nie w zrozumiały sposób.
No i tutaj ostatni element, który jest
istotny w kontekście projektowania promptów,
mówiące o tym, że krótkie, ogólne instrukcje kierowane do dużych modeli
językowych generują zwykle nieprawidłowe odpowiedzi.
Jest to oczywiście prawda, co doskonale
obrazuje ten przykład, który często jest podawany w prezentacjach jako wręcz
jednoznaczne określenie tego, że modele takie jak GPT-4 po prostu nie działają.
Mianowicie mamy tutaj bardzo proste zadanie mówiące o tym, że mając dwa
pojemniki 12 litrowe oraz 6 litrowe potrzebujemy odmierzyć tylko 6 litrów.
Naturalne więc wydaje się, że odpowiedzią
na to pytanie jest po prostu napełnienie 6 litrowego pojemnika.
Coś takiego nie jest jednak oczywiste
nawet dla modelu GPT-4, który jak widać w tej sytuacji totalnie gubi się w tym
zadaniu, podając całkowicie bezsensowne i rozbudowane rozwiązanie.
Szczerze mówiąc, widząc coś takiego po raz pierwszy, prawdopodobnie byłbym
zniechęcony do wchodzenia w jakąkolwiek interakcję z narzędziami takimi jak GPT-4.
Jednak okazuje się, że jeżeli nieco
zmodyfikujemy to zapytanie oraz doprecyzujemy np.
to skąd może pochodzić woda i że chodzi nam o najprostsze możliwe rozwiązanie, to
nagle otrzymujemy w pełni poprawną odpowiedź.
Coś takiego prowadzi nas do jednego wniosku.
Mianowicie sposób w jaki wchodzimy w
interakcję z GPT-4 odgrywa tutaj ogromne znaczenie.
W tym przypadku wystarczyło dodać w
zasadzie jeden istotny fakt do tego, aby uzyskać poprawną odpowiedź.
Nie musieliśmy tutaj stosować ani
rozbudowanych technik, ani też sugerować możliwego rozwiązania.
Po prostu w tym przypadku zapytaliśmy o najprostsze z możliwych.
Naturalnie wyzwanie pojawia się w
momencie, gdy oddajemy taki system w ręce użytkowników, ponieważ wówczas tracimy
kontrolę nad tym, co wprowadza użytkownik oraz nad tym, co generuje model.
W takim scenariuszu łatwo może się okazać,
że nasza aplikacja nie działa zgodnie z oczekiwaniami.
Moim zdaniem dość dobrym sposobem na to, aby uniknąć takich sytuacji jest na ten
moment albo ograniczanie działania modelu do bardzo ściśle określonego kontekstu,
bądź też w ogóle projektowanie aplikacji wykorzystujących np.
modele GPT-4 w taki sposób, aby użytkownik
mógł tylko wykonywać predefiniowane akcje na swoim kontekście.
Inaczej mówiąc, wyobraźmy sobie, że
zamiast wpisywania własnych poleceń użytkownik ma wyłącznie możliwość
kliknięcia jakiegoś przycisku, który pozwala mu skorzystać ze sztucznej
inteligencji, ale z góry ustalony przez nas sposób.
Wracając jednak do samego projektowania
promptów, to jak widzisz, byłem w stanie rozwiązać pozornie nierozwiązywalny
problem z pomocą GPT-4 poprzez zmodyfikowanie mojego promptu.
W związku z tym, że ograniczyłem się tutaj
w zasadzie wyłącznie do zadania pytania, taką interakcję nazywamy Zero-Shot Learning.
Oznacza to, że nie musiałem tutaj posługiwać się np.
przykładami, dodatkowym kontekstem czy jakimiś innymi zewnętrznymi informacjami
po to, aby uzyskać bezpośrednio poprawną odpowiedź.
I teraz według moich obserwacji projektowanie takich promptów wymaga tak
naprawdę doświadczenia i pewnego rodzaju wyczucia.
Niestety nie ma tutaj bardzo ścisłych reguł, którymi jesteśmy w stanie podążać,
aby praktycznie zawsze otrzymywać poprawną odpowiedź.
Wszystko na tym etapie rozwoju AI, na
którym jesteśmy, sprowadza się do przeprowadzania eksperymentów oraz
nieustannej modyfikacji i ulepszaniu promptów.
No i teraz pomimo tego, że technikę Zero-Shot Learning można tak naprawdę sprowadzić
do zadania jednego pytania, to w rzeczywistości, jak widać na tych dwóch
przykładach, nie jest to tak oczywiste, jak mogłoby się wydawać.
Ogromne znaczenie odgrywa w tej sytuacji
dobór słów, zachowanie szyku, ułożenie poszczególnych zdań, a także narzucanie
ograniczeń oraz doprecyzowanie realizowanego zadania.
To wszystko sprowadza się do tego, aby
przy projektowaniu w pierwszej kolejności przynajmniej podjąć
próbę polegającą na tym, aby opisać nasze zadanie możliwie jak najbardziej zwięźle i
spróbować w ten sposób osiągnąć pożądany rezultat.
Jeżeli nam się uda, to uzyskamy bardzo efektywne prompt, które może składać się z
bardzo małej liczby tokenów, a jednocześnie być niesamowicie użyteczny.
Z drugiej jednak strony, gdy okaże się, że
jest to niewystarczające, nic nie stoi na przeszkodzie, abyśmy mogli go rozbudować i
wykorzystać kolejne techniki, o których będziemy sobie mówić w kolejnych lekcjach.
Zanim jednak do tego przejdziemy,
chciałbym jeszcze raz podkreślić, że modele takie jak GPT-4 z natury
są raczej kiepskie w rozwiązywaniu złożonych zadań w sposób bezpośredni.
Znacznie lepiej jest im dać przestrzeń do myślenia czy np. poprowadzić ich procesy
myślowe przez konkretne kroki czy zewnętrzne kontekst.
Samo wykorzystanie Zero-Shot może być jednak świetnym punktem startowym oraz w
niektórych sytuacjach być w zupełności wystarczająca do poprawnego działania.
Teraz, zanim zakończymy tę lekcję,
chciałbym jeszcze pokazać jedną małą rzecz.
Mianowicie podczas bezpośredniej interakcji z modelami GPT-4 np.
w przypadku ChatGPT możemy nie tylko pisać
nasz prompt ponownie, ale także po prostu doprecyzowywać nasze wymagania.
Przykładowo tutaj napisałem po prostu, że
nie ma potrzeby wykorzystywania obu pojemników i model samodzielnie poprawił
swoją wypowiedź mówiąc, że wystarczy napełnić tylko 6l litrowy pojemnik.
Dzięki temu zrealizujemy nasze zadanie.
Wszystko jak najbardziej się tutaj zgadza,
a dodatkowo przykład, który tutaj mamy jest dowodem na to, że modele takie jak
GPT-4 są w stanie samodzielnie poprawiać swoje rezultaty.
Jest to dość nieoczekiwane zachowanie modelu, które nawet jest kojarzona z
pewnego rodzaju inteligencją ze względu na to, że są nawet przykłady takich sytuacji,
w których bez podawania jakichkolwiek wskazówek na temat możliwego rozwiązania
nadal model jest w stanie samodzielnie dojść do pozytywnego rezultatu.
Podsumowując więc tą lekcję, pamiętaj
proszę o tym, że technika Zero-Shot Learning polega na tym, aby tak napisać
instrukcję, by model był w stanie zrealizować zadanie bezpośrednio.
Technika ta, jeżeli w ogóle możemy tak
powiedzieć, niestety nie sprawdzi się jednak w przypadku nieco bardziej
złożonych zadań i wówczas będziemy musieli sięgnąć po kolejne.
Nie zmienia to jednak faktu, że rozwijanie
swoich umiejętności w pisaniu promptów, które są w stanie zwięźle prowadzić model,
jest zdecydowanie wartościowe i warto ją rozwijać.