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.
Na początku naszego kursu wspominałem o
tym, że modele takie jak GPT-4 są niedeterministyczne.
Oznacza to, że dla dokładnie takiego samego zestawu danych oraz tych samych
ustawień możemy otrzymywać różne odpowiedzi.
Dowód tego mamy tutaj.
To jest jedno wykonanie naszego promptu,
teraz przełączę się do drugiego i wygląda dokładnie tak samo
no i mamy trzecie, w przypadku którego to
samo zadanie dla tych samych ustawień zostało przypisane do priorytetu normalne.
I swoją drogą zobacz, że w tym momencie mam tutaj małą nieścisłość.
Ze względu na to, że na liście dostępnych priorytetów wybrałem nazwę domyślny
natomiast potem w przykładach pokazałem priorytet Normalne.
Oczywiście jest to mała pomyłka, która w
tym przypadku raczej nie ma większego znaczenia
natomiast i tak realnie chodzi tutaj o to,
że dla dokładnie takiego samego zestawu danych otrzymujemy różne rezultaty.
Jako pewien bonus chciałbym podkreślić jeden dodatkowy fakt.
Mianowicie jednym z głównych elementów
podawania priorytetu jest uwzględnienie aktualnej daty oraz godziny.
Ta godzina musi być programistycznie
wpisywana w nasz prompt, aby model wiedział dokładnie, kiedy jest dziś.
Dodatkowo według moich doświadczeń bardzo dobrą taktyką jest także wskazanie,
który dzień tygodnia występuje dla aktualnej daty
ponieważ modele takie jak GPT-4 nie zawsze poprawnie są w stanie to określić.
Dodatkowo istnieje ogromne ryzyko, że
gdybyśmy poprosili model GPT-4 o wskazanie jakiejś bardziej odległej daty np.
za dwa tygodnie w piątek, to nie będzie w stanie rozwiązać takiego zadania
i warto mieć to na uwadze.
Oczywiście można zbudować prompt, który
będzie obsługiwał pewien zakres dat i wiem o tym, ponieważ coś takiego budowałem,
natomiast i tak raz na jakiś czas zdarza się tak, że GPT-4 również wtedy podaje
niewłaściwą datę. Natomiast dla krótszych zakresów działa to w zasadzie bez zarzutu.
No i teraz wracając do naszego głównego
wątku, pytanie brzmi w jaki sposób możemy polegać na takich promptach, skoro nawet
dla takiego samego zestawu danych potrafią zwracać różne rezultaty?
Otóż jedną z możliwych technik jest tutaj
zastosowanie zasady konsekwencji polegającej na tym, że rzeczywiście tak
jak w moim przypadku wykonujemy prompt kilkukrotnie np.
3 razy, a następnie albo samodzielnie, albo programistycznie
lub też z pomocą kolejnego promptu wybieramy rezultat, który padał
najczęściej, bądź też wydaje się najbardziej prawdopodobny.
Oczywiście coś takiego wymaga od nas wykonania zapytania trzykrotnie
natomiast z programistycznego punktu
widzenia to wszystko może dziać się równolegle.
W związku z tym nie mówimy tutaj o
szczególnym wydłużeniu czasu realizacji takiego zadania, ale na pewno o większych
kosztach, no i oczywiście o wyższej skuteczności.
Jeżeli o mnie chodzi, to ja osobiście nie
miałem okazji wykorzystywać tej techniki w żadnym z moich projektów i zawsze raczej
dążyłem do tego, aby znaleźć inne rozwiązanie.
Przykładem może być tylko wyciągnięcie
pewnych słów kluczowych, na podstawie których programistycznie określam priorytet,
bądź też np. dopracowanie promptu w taki sposób, aby jego skuteczność rzeczywiście była wyższa.
Swoją drogą zwróć uwagę, że ten brak konsekwencji w odpowiedziach widoczny jest
także pomimo tego, że cały czas miałem ustawiony wskaźnik temperatury na 0.
Zatem nawet coś takiego okazało się nieskuteczne przy tym konkretnym zadaniu,
które swoją drogą wydaje się stosunkowo proste.
Jeżeli chodzi o technikę Self- Consistency
to polecam Ci także zajrzeć na stronę LearnPrompting.org, na której znajdziesz
praktycznie wszystkie omawiane przez nas techniki, pokazujące je także na nieco
innych przykładach, które być może pozwolą Ci je lepiej zrozumieć.
I przykładowo tutaj technika Self-Consistecy
została przedstawiona w dość podobny sposób, gdzie dla jednego promptu
generujemy wiele odpowiedzi, a następnie wybieramy tą, która padała najczęściej.
Coś takiego myślę, że najlepiej sprawdza się w sytuacji, gdy model zwraca jedną z
dostępnych odpowiedzi, którą następnie jesteśmy w stanie np.
programistycznie wybrać.
W ten sposób nie jest wymagany dodatkowy prompt, o którym mówiłem, tylko po
prostu jakaś funkcja, która pobierze najczęściej pojawiający się rezultat.
Jeżeli chodzi o technikę Self-Consistency to by było na tyle,
w związku z tym dzięki za uwagę i do usłyszenia w kolejnej lekcji.