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.
Zanim przejdziemy do nieco bardziej zaawansowanych technik projektowania
promptów, pomyślałem, że dobrze będzie zobaczyć, jak wiedza, którą zdobyliśmy do
tej pory, może zostać wykorzystana w praktyce.
W tej chwili na moim ekranie wyświetla się
prompt, z którego korzystaliśmy w jednej z poprzednich lekcji.
Jeżeli się w niego wczytamy, to zobaczymy tutaj różnego rodzaju frazy oraz
wyrażenia, które w sposób niebezpośredni nadają ton tej dyskusji.
Konkretnie mamy tutaj wykorzystanie języka
potocznego, które jednocześnie sprawia, że w momencie, gdy model będzie dopełniał
naszą dyskusję, czy też generował po prostu odpowiedzi, będzie brał także pod
uwagę słowa, które znajdują się w instrukcji.
Dzięki temu sprawiłem, że wypowiedzi naszego asystenta są nieco bardziej
naturalne i przypominają codzienną konwersację.
Coś takiego można także wykorzystać nie
tylko do tego, aby sprawiać, żeby asystent mówił bardziej naturalnie, ale także w
sytuacjach, gdy zależy nam na nieco bardziej oficjalnym tonie, bądź też np.
naśladowaniu sposobu wypowiedzi konkretnej osoby.
Oczywiście tutaj, poza samym
wykorzystywaniem takich charakterystycznych zwrotów, możemy także
dopisać zdanie mówiące o tym, że odpowiedzi, które będą generowane, mają
naśladować ogólny ton, który został zawarty w instrukcji.
Możemy także tutaj podać kilka dodatkowych
przykładów, które jeszcze bardziej wzmocnią ten przekaz.
Co ciekawe, tą technikę można wykorzystać także na potrzeby sytuacji, w której
potrzebujemy, aby nasz model skupił się na jakimś obszarze.
Przykładowo, jeżeli w takiej instrukcji
zawarli byśmy bardzo złożone techniczne słownictwo, to również nie tylko
zwiększamy szanse na to, że model będzie wykorzystywał podobne słowa w swoich
wypowiedziach, ale także według jednej z teorii, która jest tylko teorią i nie mam
na jej poparcie praktycznie żadnych dowodów, model będzie w stanie sięgać po
określone obszary wiedzy, które mogą zwiększyć jakość jego wypowiedzi.
W tym wszystkim jednak pojawia się pewna
wątpliwość skąd we mnie taka kreatywność, aby odnajdywać takie oto określenia i
następnie sprawnie wykorzystywać je przy projektowaniu promptu?
Okazuje się, że tak naprawdę nie są to
moje słowa, ale słowa wygenerowane przez GPT-4 na podstawie moich instrukcji.
Konkretnie tutaj
wspólnie z ChatGPT przechodziłem przez kolejne iteracje mojego promptu,
na początku analizując go, a następnie
wskazując możliwe poprawki, które można zastosować.
Wówczas otrzymywałem kolejne wersje
promptu, do którego wspólnie dodawaliśmy i odejmowaliśmy różnego rodzaju elementy.
Jak widzisz taka rozmowa nie jest
jednostronna i nie polega tylko na tym, aby oczekiwać konkretnych rezultatów, ale
także poświęcałem czas na to, aby dość starannie opisywać moje wymagania oraz
następnie testować wygenerowane odpowiedzi.
W ten sposób byłem w stanie prowadzić
dyskusję i dochodzić do kolejnych lepszych wersji promptu.
Na pewnym etapie dążyłem do tego, aby zmienić ton dyskusji i ChatGPT
zwracał coraz lepsze wersje tego promptu, które następnie także samodzielnie
modyfikowałem i następnie prosiłem o ich ewentualny przegląd oraz modyfikację.
To wszystko doprowadziło nas do pewnej wersji promptu, z której zacząłem
korzystać, wprowadzając jeszcze kilka dodatkowych modyfikacji.
Zwracam jednak uwagę na kilka istotnych elementów tej dyskusji.
Pierwszym z nich jest nadawanie roli,
którą kojarzymy z pierwszych lekcji naszego kursu.
Następnie, w związku z tym, że poruszamy
się w dość ograniczonym kontekście, zachęcałem model na samym początku, aby
potwierdzał moje instrukcje z pomocą trzech kropek.
W ten sposób oszczędziłem sporo miejsca w
naszej konwersacji na wymianę kolejnych wiadomości.
Po prostu w momencie, gdybym tego nie
zrobił, model najprawdopodobniej generował by dość rozbudowane opisy, które w
zasadzie nic nie wnoszą do naszej dyskusji, a jedynie zużywają tokeny.
Określenie, które znajduje się tutaj mam w ogóle przypisane do skrótu klawiszowego,
dzięki czemu jestem w stanie bardzo łatwo je przywoływać.
Następnie w związku z tym, że pracowaliśmy tutaj na początkowej wersji mojego
promptu, napisałem tutaj wiadomość mówiącą o tym, że będziemy pracować
wspólnie nad pewnego rodzaju promptem, który podam w kolejnej wiadomości.
Dodatkowo zaznaczyłem, że nie chcę, aby
model robił z nim cokolwiek, tylko po prostu go przeczytał.
Następnie ponownie wykorzystałem frazę,
proszącą o potwierdzenie zrozumienia tego polecenia z pomocą trzech kropek.
Zaraz później podałem prompt, no i
otrzymałem trzy kropki, czyli potwierdzenie przeczytania.
W następnym kroku poprosiłem o przeanalizowanie tego promptu oraz
zarysowałem szerszy kontekst dotyczący moich wymagań.
Oczywiście nie będę ich teraz czytał, ale
jeżeli masz taką potrzebę, to po prostu zatrzymaj to wideo.
Tak czy inaczej, po umieszczeniu tutaj tych wymagań poprosiłem, aby model
przeanalizował te wszystkie wymagania oraz prompt krok po kroku, a następnie skupił się
wyłącznie na wygenerowaniu listy i poczekał na moją dalszą reakcję.
W ten sposób uniknąłem sytuacji, w której model porwał się na wykonanie tego
polecenia, ale w zamian zrobił coś szczególnie istotnego.
Mianowicie mamy tutaj bardzo rozbudowaną odpowiedź, którą następnie oczywiście
przeczytałem i na tej podstawie określiłem, które z tych
elementów są istotne dla mojego promptu.
No i teraz tekst, który został w ten sposób wygenerowany przez model i jest
niczym innym jak kontekstem naszej dyskusji.
W końcu wiemy już, że cała konwersacja jest przesyłana jako zapytanie,
ale oczywiście też musimy brać pod uwagę
to, że niektóre z tych informacji mogą być podsumowane i tym samym tracone.
Jednak na tym początkowym etapie naszej
dyskusji jest duże prawdopodobieństwo, że model ma dostęp do całości tej wiedzę.
W rezultacie, tak jak już wspomniałem,
wszystko to, co tutaj mamy nadaje kontekst dyskusji.
Coś takiego przy projektowaniu promptu czy w ogóle prowadzeniu dyskusji np.z ChatGPT
określamy mianem generated knowledge, czyli wygenerowana wiedza.
Jest ona o tyle istotna, że elementy, które tutaj mamy mogą zostać wykorzystane
w dalszej konwersacji w następujący sposób.
Zwróć uwagę, że akurat w tym przypadku zaakceptowałem wszystkie te punkty i
poprosiłem o to, aby zaimplementować je w naszym prompcie.
Jednak w tym przypadku znowu nie zależało mi na tym, aby od razu przejść do
napisania nowego promptu, ale o to, aby model wygenerował potencjalne zmiany,
które można wprowadzić w prompcie, aby uczynić go lepszym.
Następnie znowu zachęciłem go do myślenia
krok po kroku, czyli wymienienia kolejnych punktów oraz poczekanie na moją reakcję.
Zaraz potem otrzymałem znowu dość rozbudowany opis potencjalnych zmian,
które można wprowadzić i poprosiłem o ich wprowadzenie.
Jednak na tym etapie miałem już wątpliwość, czy cały kontekst naszej
konwersacji został zapamiętany przez model.
W związku z tym postanowiłem nie tylko poprosić go o wprowadzenie zmian, ale
także w pewnym sensie przypomniałem mu całe oryginalne prompt.
Gdyby tego było mało, to tutaj dodałem
jeszcze sugestię mówiącą o tym, aby całą swoją kolejną wypowiedź model napisał w
potrójnych backtickach i zwrócił prompt oraz nic więcej.
W ten sposób otrzymałem tutaj zmodyfikowaną wersję promptu, którą
następnie sobie przeanalizowałem, przetestowałem i następnie zapisałem listę sugestii,
które można wprowadzić, aby według mnie usprawnić ten prompt.
Zaznaczyłem jednak, że nie wszystkie z tych sugestii muszą być wprowadzone i
chciałbym, aby model określił ich znaczenie samodzielnie. No i dokładnie w ten
sposób przebiegała reszta naszej dyskusji, podczas której po prostu odbijaliśmy piłeczkę,
stopniowo sprawiając, że ten prompt realizował kolejne zadania.
Dokładnie w ten sposób wygląda to jak ja projektuję prompty. Niemal zawsze, gdy mam
przed sobą jakieś konkretne zadanie, które wymaga rozbudowanego promptu
zaczynam od tego, aby napisać jego
podstawową wersję i od razu testuję ją z różnego rodzaju przypadkami.
Wówczas zdobywam wiedzę na temat ewentualnych braków w tym prompcie
i dzięki temu jestem w stanie poprowadzić dyskusję z ChatGPT, która poprowadzi nas do
finalnej, zoptymalizowanej wersji promptu.
W tym wszystkim zwracam szczególną uwagę na fakt, że mam cały czas z tyłu głowy
moją wiedzę na temat tego, jak działają modele takie jak GPT-4.
Coś takiego sprawia, że np.
jestem świadomy tego, że niektóre
informacje mogą być gubione w trakcie dyskusji, albo że do uzyskania lepszych
rezultatów potrzebuję dodatkowej wiedzy i kontekstu oraz tego, aby dać modelowi
więcej przestrzeni do tego, aby mógł się zastanowić nad potencjalną odpowiedzią.
Oczywiście taka wiedza może pochodzić albo z wygenerowanej przez niego odpowiedzi,
albo z informacji dostarczonych przeze mnie.
Mam nadzieję, że to, co właśnie pokazałem będzie dla Ciebie przydatne, ponieważ
dokładnie w ten sam sposób możesz podchodzić także do rozwiązywania różnego
rodzaju problemów wspólnie z ChatGPT, a nie tylko projektowania samych promptów.
Jednocześnie z mojego punktu widzenia taki
sposób projektowania promptu jest niezwykle efektywny.
I tutaj tylko zaznaczę, że akurat ta
rozmowa przebiegała w ramach jednej konwersacji.
Natomiast bardzo często zdarza mi się
restartować całą konwersację, aby zacząć od samego początku.
Dzięki temu jestem w stanie eliminować np.
konsekwentne trwanie przy jakiegoś rodzaju zachowaniu, którego nie chcę dalej
uwzględniać, a model z jakiegoś powodu dalej przy nim trwa.
Zatem w tym momencie dziękuję Ci za uwagę i zapraszam Cię do kolejnej lekcji.
W międzyczasie również zachęcam do tego, aby przetestować sobie frazy takie jak np. ta
lub w ogóle aby rozwiązać jakiś większy problem z pomocą ChatGPT
i rozmowy prowadzonej w sposób, który omówiłem przed chwilą.
Pamiętaj proszę o tym, że niesamowicie
istotną rolę w kontekście ulepszania odpowiedzi daje danie modelowi przestrzeni
do tego, aby się zastanowił oraz dostarczenie jakościowego kontekstu.
Coś takiego praktycznie jak wszystko
naturalnie wymaga odpowiedniej praktyki i im więcej problemów rozwiążesz w ten
sposób będziesz w stanie robić to skuteczniej.
Tym bardziej, że oprócz Twoich
umiejętności rozwijają się także możliwości modeli takich jak GPT-4.