O inżynierii podpowiedzi (prompt engineeringu) słów kilka
08.10.2024 | Anna Faruzel
Z artykułu dowiesz się
- z jakich części składa się prompt;
- jak lepiej pisać prompty;
- o podstawowych technikach pisania promptów, czyli zero-shot prompting, one- oraz few-shot prompting czy chain-of-thought;
- jakie są zaawansowane techniki interakcji z dużymi modelami językowymi, między innymi self-consistency, prompt chaining, generated knowledge prompting, tree of thoughts oraz RAG;
- dlaczego chatboty, wykorzystujące modele AI, posiadają ukryte prompty systemowe.
Wstęp
Inżynieria podpowiedzi jest kluczowym narzędziem w pracy z zaawansowanymi modelami językowymi takimi jak: GPT-4, Gemini czy Claude 3. Różnorodne techniki tworzenia promptów pozwalają kierować generowaniem tekstu przez model, co przekłada się na lepsze odpowiedzi oraz zwiększa wachlarz zastosowań LLM-ów w praktyce.
Czym jest prompt?
Ogólnie rzecz ujmując, prompt jest zbiorem instrukcji lub informacji niezbędnych do otrzymania oczekiwanej odpowiedzi z dużego modelu językowego. Poniższa grafika przedstawia poszczególne elementy promptu. Nie oznacza to jednak, że każdy prompt musi zawierać wszystkie 6 części, ponieważ wachlarz zastosowań LLM-ów nie kończy się na budowie systemów konwersacyjnych. Mogą one zostać użyte w bardzo wąskich zadaniach takich jak klasyfikacja, czy zapytanie użytkownika jest próbą prompt injection, czyli zmanipulowania działania czatu. W tym wypadku nie będą nam potrzebne źródła wiedzy oraz cała historia konwersacji, ponieważ interesuje nas analiza tylko jednego, konkretnego pytania. Bardzo ważne w tym zastosowaniu będą natomiast zasady (instrukcje) działania oraz przykłady.
Rysunek 1: Schemat promptu
Znając ogólną strukturę promptu, możemy zaznajomić się również z nomenklaturą dotyczącą jego poszczególnych części:
- prompt użytkownika (user prompt) jest instrukcją lub zapytaniem wprowadzanym przez użytkownika w celu uzyskania konkretnej odpowiedzi, lub wykonania określonego zadania przez LLM. User promptami są więc wszystkie pytania, które wysyłamy do Chatu GPT, np. „Jaka jest stolica Hondurasu?”. W kontekście schematu z Rusunku 1 jest to ostatnia część: pytanie.
- prompt systemowy (system prompt) definiuje kontekst i zasady działania modelu oraz jest niewidoczny z poziomu użytkownika końcowego (tak, ChatGPT ma swój własny prompt systemowy, którego nie możemy modyfikować, a który zawiera m.in. historię konwersacji).
Przykładem prostego promptu systemowego może być: „Jesteś pomocnym asystentem AI, który ma udzielać wyczerpujących i uprzejmych odpowiedzi na pytania użytkowników”. W kontekście schematu z Rysunku 1, jest to pierwsze 5 części: rola, instrukcja działania, źródła wiedzy, przykłady, historia konwersacji.
W przypadku korzystania z gotowych narzędzi takich jak ChatGPT czy Google Gemini należy połączyć swój prompt systemowy z pytaniem wysłanym w okienku czatu. Pamiętajcie jednak, że oryginalny, wbudowany prompt systemowy może wprowadzać pewne ograniczenia oraz blokować niektóre operacje, np. nie pozwoli nam poznać swojej treści lub złamać zdefiniowanych w nim zasad. Nie oznacza to niestety, że reguł z promptu systemowego nie da się złamać, dlatego nie powinien on zawierać żadnych informacji poufnych, których ujawnienie mogłoby spowodować szkody.
Podstawowe techniki pisania promptów
Na początek przyjrzymy się trzem podstawowym technikom pisania promptów, których z powodzeniem możecie użyć w interakcjach z Chatem GPT czy Google Gemini. Są one również podstawą bardziej zaawansowanych metod, które zostaną omówione w dalszej części artykułu.
Przykłady obrazujące działanie poszczególnych technik zostały wykonane w OpenAI Playground, który składa się z następujących pól:
- SYSTEM – odpowiednik promptu systemowego,
- USER – odpowiednik promptu użytkownika,
- ASSISTANT – odpowiedź z modelu.
Jeżeli korzystacie z czatu, który udostępnia tylko okienko użytkownika, wystarczy, że połączycie teksty z pól SYSTEM oraz USER.
Zero-shot prompting
Zero-shot prompting jest podstawową metodą, polegającą na zadaniu LLM-owi pytania lub polecenia bez podawania żadnych przykładów. Model musi wykorzystać swoją wiedzę ogólną oraz umiejętność rozumienia języka, aby odpowiedzieć na pytanie. Przykład:
Jak widać, nasz prompt systemowy jest bardzo prosty – składa się z jednozadaniowej, krótkiej instrukcji.
One-shot prompting oraz few-shot prompting
One-shot prompting oraz few-shot prompting różnią się od zero-shot promptingu tym, że użytkownik dostarcza modelowi jeden lub kilka przykładów ilustrujących, jak powinna wyglądać odpowiedź. Dzięki nim model lepiej rozumie kontekst i oczekiwania użytkownika.
Aby przedstawić ideę tej techniki, posłużmy się promptem z punktu powyżej. Choć model dokonał poprawnej oceny, forma, w której przedstawił swoją odpowiedź, nie nadaje się do dalszego przetworzenia przez komputer, np. w celu automatycznego zbadania wydźwięku komentarzy pod postami w mediach społecznościowych. W tym wypadku potrzebowalibyśmy, aby model zwracał po prostu jedną z kategorii: „pozytywny”, „neutralny”, „negatywny”. Poniżej propozycja rozwiązania tego problemu z pomocą few-shot promptingu:
Dodanie kilku przykładów pożądanego działania nie tylko pomaga w uzyskaniu odpowiedniego formatowania odpowiedzi, ale również dodatkowo sugeruje modelowi, że ma się nie domyślać uczuć towarzyszących wypowiedzi. Obrazują to przykłady zdań: „Od rana pada deszcz”, które powinno zostać sklasyfikowane jako neutralne oraz „Mam zły humor, bo cały dzień pada deszcz”, którego z kolei wydźwięk jest negatywny.
Chain-of-thought prompting
Chain-of-thought prompting to technika, w której model jest prowadzony przez serię kroków, mających na celu pomoc we wnioskowaniu oraz rozwiązywaniu złożonych problemów [Wei et al. 2022]. Jest to możliwe dzięki podzieleniu skomplikowanego zadania na mniejsze, bardziej zrozumiałe części, np. poprzez dodanie zwrotu: „Let’s work this out step by step” lub „wyjaśnij krok po kroku”.
Technika ta jest szczególnie przydatna w rozwiązywaniu zadań wymagających logicznego myślenia i wieloetapowego wnioskowania. Poniżej znajduje się prosty przykład wykorzystujący tę technikę:
W tym miejscu warto zaznaczyć, że duże modele językowe nie zostały stworzone do wykonywania działań matematycznych i nie powinno się ich używać w tym celu w rozwiązaniach komercyjnych. Na potrzeby prywatne można zwiększyć szanse na uzyskanie poprawnej odpowiedzi, stosując właśnie chain-of-thought prompting.
Najlepiej jednak obliczenia matematyczne zostawić dedykowanemu im modelowi Wolfram Alpha, który świetnie radzi sobie z operacjami takimi jak całkowanie, różniczkowanie, czy wyznaczanie granic funkcji.
Zaawansowane techniki interakcji z dużymi modelami językowymi
Uzbrojeni w znajomość podstawowych metod inżynierii podpowiedzi, możemy przejść do tych bardziej zaawansowanych, które często wymagają użycia serii promptów, co komplikuje ich zastosowanie w interakcji z czatem. Szczególną uwagę należy zwrócić na techniki, które wymagają, aby wyniki kolejnych odpytań modelu były od siebie niezależne. Taki warunek wyklucza możliwość zastosowania danej metody podczas jednej sesji czatu, ponieważ historia konwersacji przechowywana w prompcie systemowym może wpływać na wyniki kolejnych zapytań.
Self-consistency
Self-consistency to technika często łączona z chain-of-thought, w której model generuje wiele niezależnych od siebie odpowiedzi na to samo pytanie, a następnie wybierana jest ta najbardziej spójna z innymi [Wang et al. 2022]. Taka strategia pomaga uzyskać bardziej wiarygodne i dokładne wyniki, minimalizując ryzyko błędów. Jej wadą jest natomiast wyższy koszt obliczeniowy.
Poniższy przykład obrazuje schemat działania tej techniki w połączeniu z chain-of-thought oraz few-shot promptingiem na postawie zadania o magicznych kurkach z poprzedniego rozdziału.
Rysunek 2: Przykład promptu systemowego obrazujący działanie metody self-consistency
Odpytujemy kilkukrotnie LLM tym samym promptem (Rysunek 2). Bardzo ważne, aby każde odpytanie było od siebie niezależne, dlatego nie powinno się w tej metodzie używać czatu. Historia konwersacji będzie zaburzać wyniki poszczególnych odpytań, co w najgorszym przypadku może prowadzić do powielenia błędnej odpowiedzi. Kontynuując przykład, schemat z Rysunku 3 przedstawia sposób wyboru najczęściej występującej odpowiedzi spośród różnych toków myślowych.
Rysunek 3: Schemat wyboru finalnej odpowiedzi w metodzie self-consistency
Wybranie najczęściej występującej odpowiedzi uchroniło nas przed scenariuszem, w którym LLM błędnie zakłada, że właścicielka kurek ma dwie córki, co prowadzi do udzielenia nieprawidłowej odpowiedzi.
Prompt chaining
Prompt chaining jest ogólną techniką, w której wyniki jednego promptu są używane jako dane wejściowe do kolejnych promptów. Pozwala to na budowanie złożonych, wieloetapowych procesów, prowadzących do bardziej dopracowanych wyników. Zaletą tej techniki jest rozbicie złożonego zadania na kilka mniejszych, co ułatwia rozwój projektu, identyfikowanie oraz poprawę ewentualnych błędnych wyników.
Szczególnymi przypadkami prompt chainingu są metody opisane w dalszej części artykułu.
Generated knowledge prompting
Generated knowledge prompting ma na celu zwiększenie zdolności zdroworozsądkowego rozumowania dużych modeli językowych, co prowadzi do lepszych odpowiedzi. Zgodnie z oryginalnym podejściem [Liu et al. 2022] składa się z dwóch etapów. Są to kolejno: generowanie informacji oraz integracja wygenerowanych informacji (Rysunek 4). O ile wygenerowanie próby składającej się z n niezależnych zestawów informacji nie jest zbyt skomplikowaną operacją, o tyle wytypowanie finalnej odpowiedzi może być problematyczne ze względu na konieczność wyboru tej najbardziej prawdopodobnej.
Rysunek 4: Schemat działania techniki generate knowlegde prompting zaproponowanej w artykule „Generated Knowledge Prompting for Commonsense Reasoning”, Liu et al. 2022.
Alternatywnie można skorzystać z uproszczonej wersji przedstawionej na Rysunku 5. Granatowym fontem wyróżniono przykładowe prompty dla każdego z etapów:
Rysunek 5: Schemat uproszonej metody polegającej na generowaniu wiedzy, na podstawie której LLM ma wykonać zadanie na przykładzie eseju nt. zmian klimatycznych
Tree of thoughts
Tree of thoughts (drzewo myśli) jest jedną z bardziej skomplikowanych oraz zaawansowanych technik. Polega na tworzeniu struktury drzewiastej z różnych możliwych odpowiedzi lub ścieżek myślenia. Model eksploruje różne gałęzie drzewa, aby znaleźć najbardziej logiczne i spójne rozwiązanie. Jest to szczególnie przydatne w skomplikowanych zadaniach wymagających eksploracji wielu możliwości.
Aby lepiej zrozumieć założenia drzewa myśli, prześledźmy, jak z jego pomocą można rozwiązać grę w 24 [Yao et al. 2023]. Zasady tej gry są bardzo proste – mając dany zbiór 4 liczb, należy go przekształcić podstawowymi działaniami arytmetycznymi (dodawaniem, odejmowaniem, mnożeniem oraz dzieleniem) tak, aby wynik był równy 24. W tym wypadku będziemy przeszukiwać drzewo myśli wszerz (Rysunek 6). Przeszukiwanie to odbywa się iteracyjnie, powtarzając te same działania w każdym z kroków (żółte przerywane linie) aż do uzyskania rozwiązania. Szare strzałki symbolizują generowanie przez LLM możliwych działań arytmetycznych. W niebieskich polach znajdują się wygenerowane działania arytmetyczne razem z liczbami, które pozostają w zbiorze po wykonaniu działania. Zbiory te są danymi wsadowymi do kolejnych kroków. Czerwonymi krzyżykami zaznaczone są kombinacje, z których nie ma możliwości uzyskania wyniku 24. Ich gałęzie nie będą się rozrastać w kolejnych krokach. Natomiast zielonym ptaszkiem zaznaczono kombinacje liczb, z których możliwe jest uzyskanie wyniku 24. Te gałęzie będą się rozwijać w następnych krokach.
Rysunek 6: Schemat działania metody drzewa myśli na przykładzie gry w 24 [Yao et al. 2023].
Zgodnie ze schematem przedstawionym powyżej, w kroku 1 są generowane możliwe działania arytmetyczne na zbiorze liczb z danych wejściowych (szare strzałki) oraz sprawdzane jest, czy z pozostałych liczb możliwe jest osiągnięcie wyniku 24. Aby ograniczyć liczbę prezentowanych informacji, schemat przedstawia tylko dwie możliwe kombinacje dla każdego kroku. Zbiór liczb 10, 13, 13, pozostały po wykonaniu działania 4+9, zostaje odrzucony z dalszej analizy w przeciwieństwie do zbioru 6, 9, 13, dla którego są generowane oraz walidowane kombinacje działań arytmetycznych w kroku 2. W kroku 3 powtarzamy algorytm dla zbioru 4, 6, co prowadzi nas do rozwiązania: (13-9)(10-4).
RAG (Retrieval-Augmented Generation)
RAG (Retrieval-Augmented Generation) to technika łącząca generowanie tekstu przy pomocy LLM-ów z wyszukiwaniem odpowiednich informacji w bazie wiedzy [Gao et al. 2023]. Jest szczególnie przydatna w zadaniach wymagających aktualnych lub specjalistycznych danych.
W technice tej odpowiednie informacje z bazy wiedzy dołączane są do promptu. Zadaniem modelu jest sformułowanie odpowiedzi na ich podstawie. Architektura RAG może być z powodzeniem stosowana w botach konwersacyjnych opartych o GenAI. Należy mieć tutaj na uwadze, że w przypadku wystawienia takiego rozwiązania użytkownikom zewnętrznym, konieczne jest użycie dodatkowych mechanizmów zabezpieczających, tzw. guardrails. Mają one na celu m.in. zabezpieczenie bota przed złośliwymi zapytaniami takimi jak prompt injection czy jailbreak.
Rysunek 7: Schemat działania architektury RAG
Rysunek 7 przedstawia schemat działania architektury RAG. Warto zwrócić uwagę na to, że wyszukiwanie informacji z bazy wiedzy odbywa się zarówno na podstawie oryginalnego pytania, jak i jego przeredagowanej wersji. Taki zabieg pozwala na:
- odfiltrowanie zbędnych informacji, co ma pozytywny wpływ na dopasowanie informacji z bazy wiedzy, np. zapytanie: „Zgubiłam kartę kredytową podczas porannej podróży pociągiem. Co powinnam zrobić w tej sytuacji?” można zamienić na: „Co powinnam zrobić, jeśli zgubiłam kartę kredytową?”;
- utrzymanie wątku konwersacji poprzez utworzenie przeredagowanego pytania na podstawie oryginalnego zapytania użytkownika oraz historii konwersacji. Dla zobrazowania sytuacji posłużymy się krótką konwersacją, w której pierwsze pytanie brzmi: „Czy mogę czasowo zablokować kartę kredytową?”. Po udzieleniu odpowiedzi przez system użytkownik kontynuuje konwersację, pytając: „A jak mogę zdjąć taką blokadę?”. Wyszukanie informacji w bazie wiedzy na podstawie tak skonstruowanego zapytania nie przyniesie oczekiwanego efektu, ponieważ jest ono wyrwane z kontekstu. W tym przypadku niezbędne jest przeredagowane pytania z uwzględnieniem historii konwersacji, np.: „Jak zdjąć blokadę karty kredytowej?”. Tak skonstruowane zapytanie pozwala na wyszukanie adekwatnych informacji w bazie wiedzy.
Podsumowanie
Przedstawione techniki inżynierii podpowiedzi stanowią fundament skutecznej pracy z nowoczesnymi modelami językowymi, umożliwiając bardziej precyzyjne i efektywne generowanie tekstów w różnorodnych zastosowaniach – od wykorzystania gotowych rozwiązań jak Chat GPT, po tworzenie własnych aplikacji wykorzystujących GenAI. To właśnie dzięki różnorodnym metodom pisania promptów LLM-y są w stanie lepiej zrozumieć intencje użytkowników, przeprowadzać złożone wnioskowania oraz dostarczać odpowiedzi wyższej jakości bez konieczności dotrenowania ich do realizacji konkretnych zadań.