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 nasza uwaga skupi się na
edytorze Playground, czyli zasadniczo narzędziu,
w którym możemy projektować i testować nasze prompty.
Jeżeli chodzi o samo narzędzie,
to tak naprawdę praktycznie
zawsze będziemy korzystać z trybu
Chat, ponieważ tylko
w nim dostępne są najnowsze wersje modeli.
Zacznijmy jednak od
początku i przejdźmy sobie przez tryb wcześniejszy, czyli tryb
Complete, w którym zadaniem modelu jest tak
naprawdę uzupełnienie tekstu, który chcemy napisać.
Jak widzisz, w momencie,
gdy wpisałem tutaj tylko część, uzupełniony tekst z jednej strony
może mieć sens, aczkolwiek trudno stwierdzić
dlaczego
akurat został uzupełniony w ten, a nie inny sposób.
Jednocześnie teraz co prawda
wydarzyło się to niesamowicie szybko, ale zwróć uwagę
na to, że w
momencie uruchomienia zapytania tekst pojawia się małymi fragmentami.
Co więcej, nie są to
pojedyncze słowa, ale
mniejsze fragmenty, które nazywamy tokenami.
Rolą modeli językowych tak jak
już wspominałem w jednej z poprzednich lekcji
jest przewidywanie wystąpienia kolejnego tokenu
i w ten sposób wygenerowanie całej odpowiedzi.
Dlatego właśnie ten tryb nazywa się
Complete, czyli uzupełnienie tekstu, który przekazujemy do modelu.
Jest to niesamowicie
ważne, aby postrzegać
interakcję z GPT właśnie przez pryzmat autouzupełnienia.
W ten sposób jesteśmy w stanie lepiej zrozumieć to, jak pisać prompty oraz
to, czego
jesteśmy w stanie spodziewać się jako odpowiedzi.
Co więcej, na sam proces autouzupełniania
może wpływać nie tylko
struktura naszego promptu, ale także ustawienia,
które mamy tutaj.
Jak być może wiesz, w przypadku ChatGPT nie
mamy możliwości wpływania na te ustawienia,
no może poza wyborem samego modelu.
To właśnie z tego powodu do projektowania promptów wykorzystujemy
narzędzia takie
jak Playground bądź też Alternative, ponieważ
dają nam one większą
kontrolę nad zachowaniem modelu, które później
może zostać przeniesione
bezpośrednio na kod oraz bezpośrednie połączenie z API.
Jeżeli chodzi o samo generowanie, to wiemy
już, że mamy tutaj do czynienia z tokenami.
Jeżeli teraz otworzymy sobie narzędzie
o nazwie Tokenizer dostępne na platformie OpenAI
to zobaczymy, że jeżeli
wpisuję tutaj tekst po polsku, to podany
fragment zostaje tutaj zamieniony na tokeny.
I teraz co ciekawe, w przypadku zdania "Cześć,
co mogę dla Ciebie zrobić?"
w języku polskim mamy aż
21 tokenów
i praktycznie każdy znak
jest nowym tokenem.
Oznacza to, że każdy z tych tokenów musiał
zostać przewidziany przez model
w taki sposób, aby ułożyć
sensowną odpowiedź.
Jeżeli jednak dokładnie to samo zdanie przeniesiemy sobie na język angielski,
to zobaczymy, że mamy tutaj już tylko 9 tokenów,
ze względu na to, że tokenami okazały się tutaj nie tylko słowa, ale nawet odstępy
pomiędzy nimi i teraz jest to niesamowicie
ważne z przynajmniej kilku powodów. Po pierwsze,
wygenerowanie kolejnego tokenu zajmuje czas oraz kosztuje pieniądze
ponieważ rozliczenia
z OpenAI odbywają się właśnie na podstawie tokenów.
To wszystko sugeruje nam, że
powinniśmy dbać o to, aby pisać prompty w taki sposób, aby
zawierały możliwie
jak najmniej tokenów, a jednocześnie skutecznie realizowały swoje zadanie.
Poza tym okazuje się
oczywistym, że jeżeli
będziemy komunikować się z GPT np. w języku polskim,
to nasze zapytania
będą droższe i będą generowane zdecydowanie wolniej.
Mając teraz na uwadze te wszystkie
fakty, o których wspomniałem,
czyli że mamy tutaj do czynienia z
autouzupełnianiem kolejnych tokenów, które stanowią podstawę
rozliczenia i też
bezpośrednio wpływają na wydajność, nasza
perspektywa na temat projektowania promptów
znacznie się tutaj zmienia.
Co więcej, chciałbym tutaj zaznaczyć jeszcze jedną rzecz.
Zwróć uwagę, że
tekst, który mamy tutaj, zapisujemy tylko w jednym polu.
Oznacza to, że w ramach przetworzonego
promptu mówimy tutaj nie tylko o wygenerowanych tokenach
ale także o tych, które zostały
tutaj przetworzone. A więc jeżeli będę
chciał kontynuować tą rozmowę, to zwróć uwagę na liczbę tokenów, którą mamy tutaj.
Jeżeli dopisze kolejne
zdanie, liczba ta zostanie odpowiednio powiększona.
I teraz ta liczba odgrywa tutaj szczególną
rolę nie tylko ze względu na wspomniane aspekty,
ale także na pewien
limit, który występuje w przypadku modeli.
Dla modelu, który wykorzystujemy w tej chwili
limit ten wynosi 4000 tokenów.
Co więcej, tutaj w tym opisie mamy tutaj jasno powiedziane,
że
limit ten uwzględnia nie tylko wygenerowany tekst,
ale także ten, który przekażemy jako wejście.
Inaczej mówiąc, wszystko, co
zostanie zapisane w tym polu, będzie brane pod uwagę w kontekście limitu.
Jeżeli więc napiszemy tutaj 4000
tokenów, to nie pozostanie nam już nic, aby wygenerować kolejne.
Oczywiście też jeżeli z jakiegoś powodu przekroczymy
ten limit, zapytanie nie zostanie zrealizowane
i otrzymamy błąd.
Wniosek jest więc tutaj
taki, że musimy projektować nasze prompty
w ten sposób, aby były nie tylko szybkie
i efektywne kosztowo, ale także
aby nie wykraczały
poza maksymalne możliwości modelu, które
też stopniowo, z czasem się zwiększają
i w przypadku nowszych modeli
limity te są zdecydowanie
wyższe. No i jeżeli
mówimy już o modelach
to tak jak wspomniałem wcześniej, wszystkie, które mamy tutaj można
potraktować do pewnego stopnia jako archiwalne.
Oczywiście czasem może zdarzyć się
sytuacja, w których ich wykorzystanie będzie uzasadnione.
Przykładem może być chociażby Fine-Tuning, czyli
dostosowanie modelu do realizowania np.
konkretnego zadania. Na dzień nagrywania tego materiału
funkcja ta dostępna jest tylko dla
tych starszych modeli, aczkolwiek pojawiły się już informacje, że
niebawem ma się to zmienić i funkcja Fine-Tuningu będzie dostępna
także dla nowszych modeli.
Dodatkowym argumentem do tego
aby korzystać z nowszych modeli
jest ich zdecydowanie
większa skuteczność
oraz także zdecydowanie
niższe koszty. W przypadku modelu GPT-3,5-Turbo,
który mamy dostępny w
trybie Chat, koszty te w
porównaniu do modelu DaVinci są nawet dziesięciokrotnie niższe.
Pomimo tego wszystkiego nasza uwaga w
tej lekcji skupi się na tych wcześniejszych modelach, ponieważ
chciałbym szybko
wyjaśnić tutaj te dodatkowe opcje, których co
prawda w większości nie mamy w przypadku
nowszych modeli, aczkolwiek w przyszłości może to
w pewnym stopniu ulec zmianie.
W związku z tym warto je rozumieć.
Na początek chciałbym tutaj jeszcze zatrzymać
się w temacie prawdopodobieństwa wybrania kolejnego tokenu.
Jeżeli tutaj na dole zaznaczymy sobie
opcje Full Spectrum to zobaczymy, że
w momencie generowania tekstu poszczególne
tokeny zostaną podświetlone w nieco inny sposób.
Gdy będziemy na nie klikać, to
zobaczymy, że dla każdego z
nich zostało przypisane prawdopodobieństwo jego wybrania.
Oznacza to, że model tak jakby
zastanawiając się nad tym, który token
będzie kolejny wybierał jeden spośród tych, które mamy dostępne tutaj na liście.
Świadomość tego, że mamy tutaj do czynienia
z takim oto wyborem jest ogromnie istotne ze względu na
to, że
parametry, które będziemy mogli tutaj ustawiać będzie miało wpływ na to, które z
tych tokenów zostaną wybrane i w ogóle będą uwzględniane w procesie generowania.
No bo dla przykładu
token, który mamy tutaj, nie miał najwyższego
prawdopodobieństwa, a pomimo tego został wybrany. Prawdopodobnie jedną z
wielu przyczyn, dlaczego
tak się stało, był wskaźnik temperatury. Zwiększającą
tak zwaną kreatywność modelu. Bądź też
ewentualnie losowość dobierania kolejnych
tokenów i w rezultacie w tym akurat przypadku nie został wybrany ten
najbardziej prawdopodobny, ale drugi w kolejności.
Uzasadnione więc wydaje się to, że
w momencie gdy zmniejszymy temperaturę czyli zmniejszymy
losowość oraz kreatywność, to jednocześnie
też płyniemy tutaj na zachowanie polegające na
wybieraniu możliwie jak
najbardziej prawdopodobnych tokenów. Muszę jednak tutaj
podkreślić fakt, z którym można spotkać się czasem
w sieci mówiący o tym, że w tej
sytuacji dla podanego zapytania zawsze otrzymamy
dokładnie taką samą odpowiedź.
Oczywiście faktem jest, że prawdopodobieństwo
tego, że tak się stanie, jest po
prostu wyższe. Nie można
jednak mówić o tym, że zawsze tak będzie.
Generowanie tokenów opiera się o prawdopodobieństwo i dokładnie nie wiemy,
co się dzieje pomiędzy wysłaniem zapytania a wygenerowaniem kolejnych tokenów.
Z tego powodu raz na jakiś czas
może zdarzyć się, że
wygenerowana odpowiedź będzie wyglądała
nieco inaczej. Oczywiście w tym
akurat przypadku, czyli w przypadku przywitania
nie odgrywa to szczególnie istotnej roli.
Jednak w momencie, gdy będzie nam zależało na
precyzyjnym działaniu naszego
promptu, to niestety nasza możliwość
zachowania precyzji jest tutaj do pewnego stopnia
ograniczona.
Naturalną więc konsekwencją
jest tutaj sytuacja, w której ustawiając wskaźnik
temperatury na 1, czyli dość wysoko, to
wygenerowana odpowiedź nieco różni się od tej, którą mieliśmy wcześniej.
Co więcej, też szansa na to, że za każdym
razem otrzymamy nieco inną, jest też odpowiednio wyższa.
Nie możemy jednak zakładać, że dla
wskaźnika temperatury ustawione na jakąś wysoką wartość
otrzymamy
zupełnie inną odpowiedź, niż jakbyśmy ustawili go na minimalną wartość.
Cały czas i jeszcze raz
podkreślę poruszamy się tutaj po
prawdopodobieństwie i wskaźnikach, które mają na to wpływ, ale nie są w stanie
zapewnić nam stuprocentowej pewności, że zachowanie modelu faktycznie się zmieni.
No i teraz kolejnym ustawieniem, które mamy na naszej liście jest Maximum length,
czyli maksymalna długość wygenerowanej odpowiedzi.
Tutaj oczywiście jeżeli
chodzi o tą wartość mowa o tokenach,
a zatem jeżeli ustawię
sobie tutaj ten wskaźnik na 1,
to oczywiście zostanie wygenerowany tylko jeden token.
Jeżeli jednak ustawię go
na nieco wyższą wartość
to oczywiście też nie mam tutaj
pewności, że zostaną wykorzystane
wszystkie dostępne tokeny.
Kontrolowanie długości wypowiedzi tokenu jest
w tym przypadku praktycznie niemożliwe.
Co prawda jesteśmy w stanie tym dość ogólnie sterować.
Przykładowo prosząc o to, aby model przywitał się z nami wykorzystując
tylko dwa słowa, ale ta reguła nie
zadziała w przypadku dłuższych wypowiedzi.
Czyli jeżeli nasze zapytanie
będzie uwzględniało wygenerowanie
odpowiedzi o długości 255 znaków, to niestety czasem
zdarzy się tak, że wygenerowana
odpowiedź będzie zdecydowanie dłuższa.
Można to w pewnym sensie porównać do tego,
jakbyśmy drugiej osobie powiedzieli, aby przedstawiła się
w 255 znakach.
Po prostu trudne będzie dla niej to, aby
jednocześnie wypowiadać kolejne słowa oraz liczyć to, ile ich jest.
W przypadku dwóch słów jest to stosunkowo
proste, ale w przypadku 250 już nie do końca.
W rezultacie nawet jeżeli ustawimy
ten wskaźnik np. na 250
tokenów czy 230, to może zdarzyć się tak, że
wygenerowana odpowiedź zostanie urwana w połowie zdania.
Wynika to głównie z faktu, że model
skupia się tylko na wygenerowaniu kolejnego tokenu i nie wie np.
co będzie za 100 tokenów.
W rezultacie efekt końcowy
może być taki, że jedna ze
zdań zostanie w połowie
siłowo przerwane
właśnie przez ten wskaźnik.
Pomimo tego zdecydowanie warto go ustawiać
np. na
podstawie długości promptu, aby upewnić się, że nie będziemy tutaj
przekraczać dopuszczalnej
wartości.
Idąc dalej mamy tutaj następne ustawienie, czyli tzw.
sekwencja Stop.
W moim przypadku ustawiłem ją na ciąg znaków w postaci trójki oraz kropki.
Oznacza to, że generowanie tokenów zatrzyma się dokładnie
wtedy, gdy pojawi się taki token do wygenerowania
aczkolwiek on sam nie zostanie tutaj uwzględniony.
Doskonały dowód tego, o czym właśnie
mówię, jest polecenie polegające na podaniu 5 nazwy rockowych zespołów.
I w tym przypadku poprawnie został podany
pierwszy, drugi i w momencie gdyby został generowany trzeci
sekwencja stop została zastosowana i generowanie tekstu zostało zakończone.
Tutaj warto dodać, że
taką sekwencję dobrze jest dobierać w odpowiedni sposób.
Przykładowo, jeżeli podana
tutaj fraza mogłaby wystąpić losowo w wygenerowanym tekście, mogłoby się
okazać, że generowanie
zatrzymało by się wcześniej
niż byśmy się tego spodziewali.
Z tego powodu dobrze jest stosować tutaj np.
jakieś znaki specjalne bądź innego rodzaju
unikatową sekwencję, która nie wystąpi przypadkowo w tekście.
Proponuję, abyśmy w tym momencie przeszli do trzech
kolejnych wskaźników, takich jak Top P, kara za częstotliwość oraz za obecność.
Są to wskaźniki, które bezpośrednio wpływają na sposób
dobierania czy też
wybierania tokenów, a konkretnie tego, jak
postrzegane jest ich prawdopodobieństwo wystąpienia.
W związku z taką rolą uzasadniona wydaje się
także powiązanie ze wskaźnikiem temperatury.
On także wpływa
na to, w jaki sposób generowane są kolejne tokeny.
W tym jednak przypadku mówimy o
zdecydowanie bardziej zaawansowanych wskaźnikach, których poprawne ustawienie
może
znacząco pozytywnie wpłynąć na sposób generowania tekstu,
ale także jednocześnie
jeżeli coś zrobimy tutaj nie tak, generowany tekst nie będzie miał sensu,
bądź w ogóle zaczniemy otrzymywać niemające sensu ciągi znaków.
I teraz przechodząc przez każdy z tych
wskaźników, pierwszy z nich daje nam możliwość
ograniczenia tego, z jakiej puli dobierane są tokeny.
Przykładowo, jeżeli przejdziemy
tutaj przez generowany tekst, no to widzimy, że do
każdego z tokenów mamy przypisane odpowiednie prawdopodobieństwo.
W tym momencie, w związku z tym, że
ten parametr został ustawiony na jego
maksymalną wartość, wszystkie tokeny były brane pod uwagę i w tym przypadku został
wybrany ten z najmniejszym prawdopodobieństwem wystąpienia.
Jednak w momencie gdybym zmniejszył ten wskaźnik np.
o połowę, to efekt działania byłby taki, że pod
uwagę byłyby brane tylko te tokeny,
w przypadku których łączne
prawdopodobieństwo nie przekracza
wskaźnika Top P.
W tym przypadku 0.5 można uznać za 50%. No i jeżeli
chodzi o wybór tego tokenu to pierwszy z
nich został by odrzucony ze względu na to, że jego prawdopodobieństwo
przekracza dopuszczalny tutaj
wskaźnik, a w zamian pod uwagę zostałyby
wzięte tylko te, których łączna suma tych wartości
nie przekracza 50%.
Zatem tutaj zostałyby wybrane wszystkie tokeny
oprócz tego pierwszego.
Oczywiście jeżeli tutaj mielibyśmy np.
20, tutaj również 20 i tutaj 10, no to pod uwagę zostałyby wzięte tylko te 3 tokeny,
a wszystkie pozostałe zostałyby z góry odrzucone.
Jak się pewnie domyślasz, naprawdę trudno jest jednoznacznie określić, jaka wartość
tego wskaźnika jest odpowiednia dla aktualnie wykonywanego zadania.
Jednocześnie istnieje kilka ogólnych zasad, o których opowiem za chwilę.
Tymczasem przejdźmy sobie do kolejnego
wskaźnika, którego rolą jest karanie tokenów za ich częstotliwość wystąpienia.
Aby go zrozumieć, weźmy pod uwagę cały wygenerowany
tekst, w przypadku
którego zadanie polegało na wymienieniu pięciu faktów na temat psów.
Zwróć uwagę, że pewne tokeny, które
powtarzają się w naszym tekście, stopniowo zaczynają
mieć coraz niższe prawdopodobieństwo
wystąpienia.
W rezultacie im dłuższy będzie generowany tekst
tym mniejsza szansa będzie na
to, że ten token
ponownie pojawi się w tym tekście. Ponownie jednak
zaznaczam, że
mamy tutaj do czynienia po pierwsze z token, a po drugie z prawdopodobieństwem.
Przykładowo słowo psy pisane wielką literą
to zupełnie inny token niż takie samo słowo pisane małymi literami.
No i teraz, aby to jeszcze bardziej
podkreślić, cofnijmy się do poprzedniego przykładu, gdzie nie mieliśmy ani kar za
obecność, a nie ich częstotliwość a
w związku z tym nic nie stało na przeszkodzie
aby praktycznie każde zdanie
rozpoczynało się od tego samego słowa.
W tym przypadku słowo rozpoczynające
pierwsze zdanie zostało ukarane za to, że wystąpiło w tekście
i już w kolejnej linii miało zdecydowanie
niższą szansę wystąpienia.
Oczywiście nadal zdarzył się przypadek,
w którym to słowo wystąpiło
natomiast znowu za ten fakt otrzymało
karę i szansa na to, że wystąpiłoby np.
w kolejnych 5 wygenerowanych faktach ponownie spada.
No i myślę, że patrząc teraz na to wszystko, dość oczywistym
wskaźnikiem okaże się kara za obecność.
Poprzednim razem mówiliśmy o
częstotliwości wystąpienia, a w tym przypadku za samo pojawienie się.
Wówczas tutaj również ponownie widać
że słowo psy za pierwszym razem
zostało wybrane, ale potem ten konkretnie token nie
pojawił się w tekście już ani razu.
Oznacza to, że rzeczywiście
został ukarany za wystąpienie i tym samym doprowadziliśmy do tego, że ogólnie
wygenerowany tekst jest bardziej różnorodny.
Warto jednak pamiętać, że
tokeny to nie tylko słowa, ale także czasem pojedyncze znaki czy spójniki.
Oznacza to, że jeżeli wartość
tego wskaźnika będzie zbyt duża,
to w przypadku dłuższych
tekstów dojdzie do sytuacji, w której w
generowanych fragmentach tekstu będzie brakowało tych podstawowych
tokenów, które mają
bezpośredni wpływ na poprawność zdania.
Zatem podsumowując te cztery wskaźniki.
Temperatura odpowiada za zwiększenie albo zmniejszenie szansy
wybrania tokenu, który ma mniejsze
prawdopodobieństwo wystąpienia.
Następnie wskaźnik Top P ogranicza pulę, z której wybieramy, a wskaźniki
kar karają tokeny za ich wystąpienie
bądź częstotliwość występowania.
Oczywiście same definicje tych parametrów
są trochę niewystarczające do tego, aby móc wykorzystywać je w praktyce.
Jednocześnie na forum OpenAI
które swoją drogą bardzo polecam
trafiłem na genialny wpis tego oto użytkownika.
Mianowicie nie tylko
tłumaczy on te poszczególne wskaźniki, ale
także pokazuje
jak np.
ustawić temperaturę oraz Top P dla generowania konkretnych rodzajów tekstu.
Przejście przez takie oto przykłady oraz
lekkie eksperymentowanie z pewnością
da Ci pewnego rodzaju
wyczucie, które pozwoli ci wykorzystywać
te parametry bardziej świadomie i tym samym osiągać
znacznie lepsze efekty
dla pisanych przez Ciebie promptów. No i teraz
możemy przejść do ostatnich ustawień.
Best of odpowiada tutaj za generowanie
różnych wariantów wypowiedzi i wybieranie tej najlepszej.
Z jednej strony możemy tutaj zyskać na
końcowej jakości, ale z drugiej wygenerowanie takiej wypowiedzi będzie
odpowiednio droższe, ponieważ
wykorzystamy kilka razy więcej tokenów.
No i teraz mamy jeszcze tutaj dwie opcje, których co prawda nie ma w trybie czat,
ale w niektórych przypadkach mogą okazać się przydatne.
Poza tym sama ich obecność
zwraca naszą uwagę
na pewien istotny fakt związany z generowaniem tekstu.
Mianowicie zwróć uwagę, że każda
kolejna linia tego tekstu rozpoczyna się
odpowiednio od Q bądź A. Q odpowiada za pytanie np pytanie
użytkownika, a A za odpowiedź wygenerowaną
w tym przypadku przez AI.
Jeżeli więc
teraz usuniemy ten fragment, a następnie wygenerujemy go ponownie, to
zobaczymy, że ta
sekwencja początkowa została automatycznie dodana i na samym końcu po zakończeniu
generowania tekstu została umieszczona sekwencja restart.
Dzięki temu jesteśmy w stanie tutaj łatwiej kontynuować tą interakcję.
Jednak ze względu na to, że tej
opcji nie ma już w trybie Chat chciałem tylko
raz jeszcze nawiązać tutaj do faktu,
że
generowany tekst jest uzupełnieniem tego, co napisaliśmy wcześniej.
Formatuje on tekst w taki sposób, aby wyglądało to jak rozmowa
po prostu zwiększamy szanse na to, że otrzymamy
tutaj odpowiedź a nie np.
dopełnienie
tego pierwszego zdania co mogłoby się
teoretycznie wydarzyć
w momencie, gdybyśmy nie mieli tutaj tych sekwencji.
Jednocześnie pamiętaj
proszę o tym, że jednym
z elementów projektowania promptów jest
nie tylko opisywanie tego, czego chcemy, ale także pewnego rodzaju prowadzenie
modelu do tego, aby generował odpowiedzi w takim, a nie innym formacie.
I teraz przykładowo jeżeli wrócimy sobie do jednego z
wcześniejszych przykładów, to zwróć uwagę, że mój
prompt zakończyłem cyfrą 1 oraz kropką. W ten sposób
jasno jeszcze podkreśliłem to, że chodzi mi o
wymienienie poszczególnych nazw z pomocą listy numerowanej.
Oczywiście nic nie stoi na przeszkodzie
aby stosować tutaj nieco bardziej zaawansowane techniki
aczkolwiek trzeba pamiętać o jednej
małej rzeczy.
Mianowicie w trybie Chat
nasza interakcja z modelem została podzielona na trzy grupy.
Mowa tutaj o wiadomości systemowej, która określa
zachowanie naszego asystenta
a także o
sekcji User, gdzie wprowadzamy nasze zapytania oraz
także sekcji Assistanta
wewnątrz której będą pojawiać się wypowiedzi
generowane przez model.
No i teraz pomimo takiego oto podziału,
pod spodem funkcjonuje taki sam mechanizm autouzupełniania.
Z tego powodu, jeżeli jako użytkownik
zakończę moje zapytanie początkiem
wypowiedzi, która ma zostać dopełniona przez model
to jak widać zostało to uwzględnione.
Warto o tym pamiętać, ale także mieć na uwadze pewnego rodzaju różnice,
które występują w
przypadku trybu Chat.
Jednak o tych różnicach powiemy
sobie już w kolejnej lekcji.
Także dziękuję za uwagę i do
usłyszenia za chwilę.