Inżynieria promptów
Ten przewodnik udostępnia strategie i taktyki, które pozwalają uzyskać lepsze rezultaty z dużych modeli językowych (czasami nazywanych modelami GPT) takich jak GPT-4. Opisane tutaj metody można czasem wykorzystać równocześnie, by osiągnąć większy efekt. Zachęcamy do eksperymentowania, aby znaleźć metody, które najlepiej działają dla Ciebie.
Niektóre z przykładów tutaj demonstrujących działanie, obecnie działa tylko z naszym najbardziej zdolnym modelem, gpt-4
. Ogólnie rzecz biorąc, jeśli zauważysz, że model zawodzi w zadaniu i dostępny jest bardziej zdolny model, warto spróbować ponownie z wykorzystaniem bardziej zdolnego modelu.
Wskazówki: Ten samouczek to tłumaczenie oficjalnego przewodnika Inżynierii Promptów firmy OpenAI. Samouczek wyjaśnia strategię/taktykę pisania słów kluczowych i jak instruować model języka do zwracania pożądanego wyniku za pomocą wytycznych.
Szesć strategii uzyskiwania lepszych wyników
Spisywanie klarownych instrukcji
Te modele nie potrafią czytać Twoich myśli. Jeśli wyniki są zbyt długie, poproś o zwięzłe odpowiedzi. Jeśli wyniki są zbyt proste, poproś o pisanie poziomu eksperta. Jeśli nie podoba Ci się format, pokaż, jaki format chcesz zobaczyć. Im mniej model musi domyślać się, czego chcesz, tym bardziej prawdopodobne, że to dostaniesz.
Taktyki:
- Dołącz szczegóły w swoim zapytaniu, aby otrzymać bardziej trafne odpowiedzi
- Poproś model o przyjęcie pewnej persony
- Użyj separatorów, aby jasno wskazać odrębne części wejścia
- Określ kroki wymagane do wykonania zadania
- Przedstaw przykłady
- Określ pożądaną długość wyniku
Udostępnianie tekstu odniesienia
Modele językowe potrafią pewnie wymyślać fikcyjne odpowiedzi, zwłaszcza gdy pytamy o ezoteryczne tematy, cytaty i adresy URL. W taki sam sposób, w jaki kartka z notatkami może pomóc uczniowi wypaść lepiej na teście, udostępnienie modelom tekstu odniesienia może pomóc w udzielaniu odpowiedzi z mniejszą liczbą fabrykacji.
Taktyki:
- Nakazuj modelowi udzielenie odpowiedzi, korzystając z tekstu odniesienia
- Nakazuj modelowi udzielenie odpowiedzi, zawierając cytaty z tekstu odniesienia
Rozłóż złożone zadania na prostsze podzadania
Tak jak w przypadku praktyki w inżynierii oprogramowania rozkładania złożonego systemu na zbiór modularnych komponentów, to samo dotyczy zadań składanych do modeli językowych. Złożone zadania mają tendencję do wyższych wskaźników błędów niż zadania prostsze. Ponadto złożone zadania często można ponownie zdefiniować jako zestaw prostszych zadań, w których wyniki z wcześniejszych zadań są używane do konstruowania wejść do późniejszych zadań.
Taktyki:
- Wykorzystaj klasyfikację intencji, aby zidentyfikować najbardziej istotne instrukcje dla zapytania użytkownika
- Dla aplikacji dialogowych, które wymagają bardzo długich rozmów, podsumowuj lub filtrowuj poprzedni dialog
- Podsumuj długie dokumenty kawałkami i konstruuj pełne podsumowanie rekurencyjnie
Daj modelowi czas na "zastanowienie się"
Jeśli zostanie zapytany o pomnożenie 17 przez 28, być może nie będzie w stanie natychmiast podać odpowiedzi, ale może wciąż opracować ją z czasem. Podobnie modele popełniają więcej błędów rozumowania, gdy próbują odpowiedzieć natychmiast, a nie biorą sobie czasu na znalezienie odpowiedzi. Poproszenie o "łańcuch myśli" przed udzieleniem odpowiedzi może pomóc modelowi w bardziej niezawodnym rozumowaniu ku poprawnym odpowiedziom.
Taktyki:
- Nakazuj modelowi opracowanie własnego rozwiązania przed pośpiechem do wniosków
- Użyj monologu wewnętrznego lub sekwencji zapytań, aby ukryć proces rozumowania modelu
- Zapytaj model, czy coś przeoczył na poprzednich próbach
Wykorzystaj zewnętrzne narzędzia
Zrekompensuj słabe strony modelu, podając mu wyniki innych narzędzi. Na przykład, system wyszukiwania oparty na osadzeniach (czasami zwany RAG lub ulepszonym generowaniem) może poinformować model o istotnych dokumentach. Silnik wykonania kodu, taki jak Interpreter Kodu OpenAI, może pomóc modelowi w wykonywaniu obliczeń i uruchamianiu kodu. Jeśli zadanie można wykonać bardziej niezawodnie lub efektywnie za pomocą narzędzia niż modelu językowego, przenieś je, aby uzyskać jak najlepsze efekty.
Taktyki:
- Użyj wyszukiwania opartego na osadzeniach, aby zaimplementować wydajne pozyskiwanie wiedzy
- Korzystaj z wykonania kodu, aby wykonywać bardziej dokładne obliczenia lub wywoływać zewnętrzne interfejsy API
- Udostępnij modelowi dostęp do konkretnych funkcji
Systematycznie testuj zmiany
Poprawa wydajności jest łatwiejsza, jeśli można ją zmierzyć. W niektórych przypadkach modyfikacja promptu może osiągnąć lepsze wyniki na kilku izolowanych przykładach, ale prowadzić do gorszej ogólnej wydajności na bardziej reprezentatywnym zbiorze przykładów. Dlatego, aby mieć pewność, że zmiana przynosi netto lepsze wyniki wydajności, konieczne może być zdefiniowanie kompleksowego zestawu testowego (znany również jako "ewaluacja").
Taktyka:
- Oceń wyniki modelu odnosząc się do wzorcowych odpowiedzi
Taktyki
Każda z wyżej wymienionych strategii może zostać zrealizowana za pomocą konkretnych taktyk. Taktyki te mają na celu dostarczenie pomysłów na rzeczy do wypróbowania. Nie są one w pełni wyczerpujące, a więc możesz śmiało wypróbować kreatywne pomysły, które tutaj nie są reprezentowane.
Opis przykładowego słowa kluczowego
Wszyscy wiemy, że interfejs API modelu czatu, który wywołuje OpenAI, posiada trzy rodzaje wiadomości: SYSTEM, USER i ASSISTANT, a funkcje tych trzech wiadomości są następujące:
Rodzaj wiadomości (odpowiadający parametrowi roli w api) | Opis |
---|---|
SYSTEM | Wiadomość systemowa pomaga ustawić zachowanie asystenta. Na przykład, można zmodyfikować osobowość asystenta lub dostarczyć konkretne instrukcje dotyczące tego, w jaki sposób powinien się zachowywać podczas całej rozmowy. Należy jednak zauważyć, że wiadomość systemowa jest opcjonalna, a zachowanie modelu bez wiadomości systemowej jest prawdopodobnie podobne do użycia ogólnej wiadomości typu "Jesteś pomocnym asystentem". |
USER | Wiadomość użytkownika to kwestia wprowadzenia przez użytkownika. |
ASSISTANT | Wiadomości pomocnika reprezentują to, co zwraca GPT. |
Przykłady słów kluczowych w tym samouczku zostaną wyjaśnione w następującym formacie:
// WIADOMOŚĆ SYSTEM
Pokaże, jak ustawić słowo kluczowe wiadomości SYSTEM.
// WIADOMOŚĆ UŻYTKOWNIKA
Pokaże, jak ustawić słowo kluczowe wiadomości UŻYTKOWNIKA.
// WIADOMOŚĆ POMOCNIKA
Pokaże, co model GPT mógłby zwrócić.
Strategia: Napisz jasne instrukcje
Taktyka: Dołącz szczegóły do zapytania, aby uzyskać bardziej trafne odpowiedzi
Aby uzyskać bardzo trafną odpowiedź, upewnij się, że żądania zawierają ważne szczegóły lub kontekst. W przeciwnym razie pozostawiasz to modelowi zgadywania, o co chodzi.
Gorsze | Lepsze |
Jak dodać liczby w Excelu? | Jak zsumować wiersz kwot dolarów w Excelu? Chcę zrobić to automatycznie dla całego arkusza z danymi, gdzie wszystkie sumy znajdą się po prawej stronie w kolumnie o nazwie "Razem". |
Kto jest prezydentem? | Kto był prezydentem Meksyku w 2021 roku i jak często odbywają się wybory? |
Napisz kod do obliczenia ciągu Fibonacciego. | Napisz funkcję TypeScript do wydajnego obliczania ciągu Fibonacciego. Skomentuj kod swobodnie, aby wyjaśnić, co robi każdy kawałek i dlaczego jest napisany w taki sposób. |
Podsumuj notatki z spotkania. | Podsumuj notatki z spotkania w jednym akapicie. Następnie napisz listę mówców i każdy z ich kluczowych punktów w formacie markdown. Na koniec wymień sugerowane przez mówców kolejne kroki lub zadania do wykonania, jeśli takie istnieją. |
Taktyka: Poproś model o przyjęcie pewnej roli
Wiadomość systemowa może być używana do określenia osobowości, jaką model ma przyjąć w swoich odpowiedziach.
// WIADOMOŚĆ SYSTEM
Kiedy poproszę o pomoc w napisaniu czegoś, odpowiesz dokumentem zawierającym co najmniej jeden żart lub żartobliwy komentarz w każdym akapicie.
// WIADOMOŚĆ UŻYTKOWNIKA
Napisz notatkę podziękowania dla mojego dostawcy stalowych śrub za dostarczenie towaru na czas i krótki termin. To umożliwiło nam zrealizowanie ważnego zamówienia.
Taktyka: Użyj ograniczników, aby wyraźnie wskazać różne części wejścia
Ograniczniki, takie jak potrójne cudzysłowy, znaczniki XML, tytuły sekcji, itp., mogą pomóc oznaczyć sekcje tekstu do traktowania w różny sposób.
// WIADOMOŚĆ UŻYTKOWNIKA
Podsumuj tekst ograniczony potrójnymi cudzysłowami za pomocą haiku.
"""wstaw tutaj tekst"""
// WIADOMOŚĆ SYSTEM
Zostaniesz dostarczony parami artykułów (ograniczonych znacznikami XML) na ten sam temat. Najpierw podsumuj argumenty każdego artykułu. Następnie wskaż, który z nich stanowi lepszy argument i wyjaśnij dlaczego.
// WIADOMOŚĆ UŻYTKOWNIKA
<article> wstaw tutaj pierwszy artykuł </article>
<article> wstaw tutaj drugi artykuł </article>
// WIADOMOŚĆ SYSTEM
Otrzymasz streszczenie pracy magisterskiej i sugerowany tytuł. Tytuł pracy magisterskiej powinien dać czytelnikowi dobry pomysł na temat pracy, ale powinien również przyciągać uwagę. Jeśli tytuł nie spełnia tych kryteriów, zaproponuj 5 innych.
// WIADOMOŚĆ UŻYTKOWNIKA
Streszczenie: wstaw streszczenie tutaj
Tytuł pracy: wstaw tytuł tutaj
W przypadku prostych zadań, takich jak te, użycie ograniczników może nie mieć znaczenia dla jakości wyniku. Jednak im bardziej skomplikowane jest zadanie, tym ważniejsze jest sprostanie szczegółom zadania. Nie pozostawiaj modelowi pracy w rozumieniu dokładnie, o co masz go poprosić.
Taktyka: Określenie kroków wymaganych do wykonania zadania
Niektóre zadania najlepiej jest określić jako sekwencję kroków. Spisanie kroków w sposób wyraźny może ułatwić modelowi ich śledzenie.
// SYSTEM Message
Skorzystaj z poniższych instrukcji krok po kroku, aby odpowiedzieć na wejścia użytkownika.
Krok 1 - Użytkownik dostarczy ci tekst w potrójnych cudzysłowach. Podsumuj ten tekst w jednym zdaniu z przedrostkiem "Podsumowanie: ".
Krok 2 - Przetłumacz podsumowanie z kroku 1 na język hiszpański, z prefiksem "Tłumaczenie: ".
// USER Message
"""wstaw tutaj tekst"""
Taktyka: Podanie przykładów
Podanie ogólnych instrukcji, które dotyczą wszystkich przykładów, jest zazwyczaj bardziej efektywne niż demonstracja wszystkich możliwych wariantów zadania poprzez przykład, ale w niektórych przypadkach podanie przykładów może być łatwiejsze. Na przykład, jeśli zamierzasz, żeby model skopiował określony styl reagowania na zapytania użytkowników, co jest trudne do opisania w sposób jednoznaczny. Jest to znane jako "few-shot" wyzwanie.
// SYSTEM Message
Odpowiadaj w spójnym stylu.
// USER Message
Naucz mnie cierpliwości.
// ASSISTANT Message
Rzeka, która wyżłobiła najgłębszą dolinę, wypływa z skromnego źródła; największa symfonia wywodzi się z pojedynczej nuty; najbardziej wymyślna tkanina zaczyna się od pojedynczego wątku.
// USER Message
Naucz mnie o oceanie.
Taktyka: Określenie pożądanej długości odpowiedzi
Możesz poprosić model o wygenerowanie odpowiedzi o określonej docelowej długości. Docelowa długość odpowiedzi może być określona jako liczba słów, zdań, akapitów, punktów lub innych elementów. Należy jednak zauważyć, że instruowanie modelu do wygenerowania określonej liczby słów nie działa z dużą precyzją. Model może bardziej niezawodnie generować odpowiedzi o określonej liczbie akapitów czy punktów.
// USER Message
Podsumuj tekst ograniczony potrójnymi cudzysłowami do około 50 słów.
"""wstaw tutaj tekst"""
// USER Message
Podsumuj tekst ograniczony potrójnymi cudzysłowami w 2 akapitach.
"""wstaw tutaj tekst"""
// USER Message
Podsumuj tekst ograniczony potrójnymi cudzysłowami w formie 3 punktów.
"""wstaw tutaj tekst"""
Strategia: Udostępnianie tekstów odniesienia
Taktyka: Nakazanie modelowi odpowiedzi za pomocą tekstów odniesienia
Jeśli możemy dostarczyć modelowi zaufane informacje istotne dla bieżącego zapytania, możemy nakazać modelowi skorzystanie z dostarczonych informacji do skomponowania odpowiedzi.
// SYSTEM Message
Do odpowiedzi na pytania użyj dostarczonych artykułów zawartych w potrójnych cudzysłowach. Jeśli odpowiedź nie może być znaleziona w artykułach, napisz "Nie udało mi się znaleźć odpowiedzi."
// USER Message
<wstaw artykuły, każdy zawarty w potrójnych cudzysłowach>
Pytanie: <wstaw pytanie tutaj>
Biorąc pod uwagę ograniczoną zdolność modeli do uwzględniania kontekstu, konieczne jest znalezienie sposobu na dynamiczne wyszukiwanie informacji istotnych dla zadawanego pytania. Osadzenia mogą być używane do realizacji efektywnego wyszukiwania wiedzy. Zobacz taktykę "Wykorzystaj wyszukiwanie oparte na osadzeniach do efektywnego wyszukiwania wiedzy" w celu uzyskania bardziej szczegółowych informacji na temat sposobu realizacji tego.
Taktyka: Nakazanie modelowi odpowiedzi zawierających cytaty z tekstów odniesienia
Jeśli wejście zostało uzupełnione istotną wiedzą, to prośba o dodanie cytowań do odpowiedzi przez odwoływanie się do fragmentów dostarczonych dokumentów jest oczywiste. Należy zauważyć, iż cytaty w odpowiedzi mogą być następnie weryfikowane programistycznie poprzez dopasowanie ciągów znaków w dostarczonych dokumentach.
// SYSTEM Message
Otrzymasz dokument zawarty w potrójnych cudzysłowach oraz pytanie. Twoim zadaniem jest udzielenie odpowiedzi na pytanie, korzystając wyłącznie z dostarczonego dokumentu oraz cytowania wykorzystanych fragmentów dokumentu. Jeśli dokument nie zawiera informacji niezbędnych do odpowiedzi na pytanie, napisz po prostu "Niewystarczające informacje." Jeśli udzielisz odpowiedzi na pytanie, musi ona zawierać adnotację z cytatem. Użyj następującego formatu, aby cytować istotne fragmenty ({„cytowanie”: …}).
// USER Message
"""<wstaw tutaj dokument>"""
Pytanie: <wstaw pytanie tutaj>
Taktyka: Wykorzystanie klasyfikacji intencji do identyfikacji najbardziej istotnych instrukcji dla zapytania użytkownika
W przypadku zadań, w których potrzebne są niezależne zbiory instrukcji do obsługi różnych przypadków, może być korzystne najpierw sklasyfikowanie rodzaju zapytania i użycie tej klasyfikacji do określenia potrzebnych instrukcji. Można to osiągnąć poprzez zdefiniowanie stałych kategorii i wprowadzenie instrukcji, które są istotne do obsługi zadań w danej kategorii. Proces ten może być stosowany rekurencyjnie do dekompozycji zadania na sekwencję etapów. Zaletą tego podejścia jest to, że każde zapytanie zawierać będzie tylko te instrukcje, które są wymagane do wykonania kolejnego etapu zadania, co może skutkować niższymi wskaźnikami błędów w porównaniu z użyciem pojedynczego zapytania do wykonania całego zadania. Może to również prowadzić do obniżonych kosztów, ponieważ większe wskazówki kosztują więcej do uruchomienia.
Przykładowo, dla aplikacji obsługi klienta z obszaru usług, zapytania można klasyfikować w następujący sposób:
// Wiadomość SYSTEMU
Będziesz otrzymywał zapytania dotyczące obsługi klienta. Sklasyfikuj każde zapytanie do kategorii podstawowej i drugorzędnej. Podaj swoje wyniki w formacie json z kluczami: primary i secondary.
Kategorie podstawowe: Rozliczenia, Wsparcie techniczne, Zarządzanie kontem, lub Ogólne zapytanie.
Drugorzędowe kategorie dla Rozliczeń:
- Wypisanie się lub aktualizacja
- Dodanie metody płatności
- Wyjaśnienie opłaty
- Reklamacja dotycząca opłaty
Drugorzędowe kategorie dla Wsparcia technicznego:
- Rozwiązywanie problemów
- Kompatybilność urządzenia
- Aktualizacje oprogramowania
Drugorzędowe kategorie dla Zarządzania kontem:
- Resetowanie hasła
- Aktualizacja danych osobowych
- Zamknięcie konta
- Bezpieczeństwo konta
Drugorzędowe kategorie dla Ogólnych zapytań:
- Informacje o produkcie
- Cenowo
- Opinie
- Rozmowa z człowiekiem
// Wiadomość UŻYTKOWNIKA
Potrzebuję ponownie uruchomić moje połączenie internetowe.
Na podstawie klasyfikacji zapytania klienta, można dostarczyć modelowi zestaw bardziej konkretnych instrukcji do obsłużenia kolejnych kroków. Na przykład, załóżmy, że klient potrzebuje pomocy z "rozwiązywaniem problemów".
// Wiadomość SYSTEMU
Będziesz otrzymywał zapytania obsługi klienta, które wymagają rozwiązywania problemów w kontekście wsparcia technicznego. Pomóż użytkownikowi poprzez:
- Poproś ich, aby sprawdzili, czy wszystkie kable do/z routera są podłączone. Należy zauważyć, że kable mogą z czasem poluzować.
- Jeśli wszystkie kable są podłączone i problem nadal występuje, zapytaj ich, jaki model routera używają.
- Teraz doradź im, jak zrestartować urządzenie:
-- Jeśli numer modelu to MTD-327J, doradź im, aby nacisnęli czerwony przycisk i przytrzymali go przez 5 sekund, a następnie odczekali 5 minut przed przetestowaniem połączenia.
-- Jeśli numer modelu to MTD-327S, doradź im, aby odłączyli i podłączyli ponownie kabel, a następnie odczekali 5 minut przed przetestowaniem połączenia.
- Jeśli problem klienta nadal występuje po restarcie urządzenia i oczekiwaniu 5 minut, połącz ich z pomocą techniczną, generując {"Zgłoszono prośbę o wsparcie techniczne"}.
- Jeśli użytkownik zaczyna zadawać pytania niezwiązane z tym tematem, potwierdź, czy chcą zakończyć bieżącą rozmowę na temat rozwiązywania problemów i sklasyfikować ich prośbę zgodnie z poniższym schematem:
<wstaw tu schemat klasyfikacji podstawowych/drugorzędowych z powyższego>
// Wiadomość UŻYTKOWNIKA
Potrzebuję ponownie uruchomić moje połączenie internetowe.
Zauważ, że model otrzymał instrukcje emitowania specjalnych ciągów znaków, aby wskazać, kiedy stan rozmowy się zmienia. Dzięki temu możemy przekształcić nasz system w automat stanowy, w którym stan określa, które instrukcje są wstrzykiwane. Śledząc stan, które instrukcje są istotne w danym stanie, a także opcjonalnie jakie przejścia stanowe są dozwolone z tego stanu, możemy wprowadzić barierki wokół doświadczenia użytkownika, które byłoby trudne do osiągnięcia przy mniej strukturalnym podejściu.
Taktyka: Dla aplikacji dialogowych, które wymagają bardzo długich rozmów, podsumuj lub przefiltruj poprzednią rozmowę
Ponieważ modele mają ustaloną długość kontekstu, dialog między użytkownikiem a asystentem, w którym cała rozmowa jest zawarta w oknie kontekstu, nie może trwać w nieskończoność.
Istnieje wiele obejść tego problemu, z których jednym jest podsumowanie poprzednich obrotów w rozmowie. Gdy rozmiar wejścia osiągnie uprzednio określoną długość, może to skłonić do zapytania, które podsumuje część rozmowy, a podsumowanie poprzedniej rozmowy może być dołączone jako część wiadomości systemowej. Alternatywnie, poprzednia rozmowa mogłaby być podsumowana asynchronicznie w tle podczas całej rozmowy.
Alternatywnym rozwiązaniem jest dynamiczne wybieranie wcześniejszych części rozmowy, które są najbardziej istotne dla bieżącego zapytania. Zobacz taktykę "Wykorzystanie wyszukiwania opartego na osadzeniach do efektywnego pozyskiwania wiedzy".
Taktyka: Podsumuj długie dokumenty krok po kroku i konstruuj pełne podsumowanie rekurencyjnie
Ponieważ modele mają ustaloną długość kontekstu, nie mogą być używane do podsumowania tekstu dłuższego niż długość kontekstu minus długość wygenerowanego podsumowania w pojedynczym zapytaniu.
Aby podsumować bardzo długi dokument, takiego jak książka, możemy użyć sekwencji zapytań, aby podsumować każdą sekcję dokumentu. Podsumowania sekcji mogą być łączone i podsumowane w celu uzyskania podsumowań podsumowań. Ten proces może przebiegać rekurencyjnie aż do podsumowania całego dokumentu. Jeśli konieczne jest wykorzystanie informacji o wcześniejszych sekcjach, aby zrozumieć późniejsze sekcje, przydatnym trikiem może być uwzględnienie bieżącego podsumowania tekstu poprzedzającego punkt, w którym dokonuje się podsumowanie treści. Skuteczność tego postępowania w podsumowywaniu książek została zbadana w poprzednich badaniach przeprowadzonych przez OpenAI przy użyciu wariantów GPT-3.
Strategia: Daj modelowi czas na "zastanowienie się"
Taktyka: Daj modelowi instrukcję, aby sam znalazł rozwiązanie zanim podejmie ostateczny wniosek
Czasami uzyskujemy lepsze wyniki, gdy jasno instruujemy model, aby rozważył podstawowe zasady, zanim dojdzie do wniosku. Załóżmy na przykład, że chcemy, aby model ocenił rozwiązanie ucznia w problemie matematycznym. Najbardziej oczywistym podejściem jest po prostu zapytanie modelu, czy rozwiązanie ucznia jest poprawne czy nie.
// WIADOMOŚĆ SYSTEMU
Określ, czy rozwiązanie ucznia jest poprawne czy nie.
// WIADOMOŚĆ UŻYTKOWNIKA
Założenia problemu: Buduję instalację zasilania słonecznego i potrzebuję pomocy w obliczeniu finansów.
- Koszt ziemi: 100 USD / stopa kwadratowa
- Mogę kupić panele słoneczne za 250 USD / stopę kwadratową
- Negocjowałem umowę na konserwację, która będzie mnie kosztować stałe 100 000 USD rocznie i dodatkowo 10 USD / stopę kwadratową
Jaki jest całkowity koszt pierwszego roku działalności jako funkcja liczby stóp kwadratowych.
Rozwiązanie ucznia: Niech x będzie rozmiarem instalacji w stopach kwadratowych.
1. Koszt ziemi: 100x
2. Koszt paneli słonecznych: 250x
3. Koszt konserwacji: 100 000 + 100x
Całkowity koszt: 100x + 250x + 100 000 + 100x = 450x + 100 000
// WIADOMOŚĆ ASYSTENTA
Rozwiązanie ucznia jest poprawne.
Ale rozwiązanie ucznia jest faktycznie nieprawidłowe! Możemy sprawić, aby model zauważył to, kierując model do wygenerowania własnego rozwiązania najpierw.
// WIADOMOŚĆ SYSTEMU
Najpierw oblicz swoje własne rozwiązanie problemu. Następnie porównaj swoje rozwiązanie z rozwiązaniem ucznia i oceniaj, czy rozwiązanie ucznia jest poprawne czy nie. Nie decyduj, czy rozwiązanie ucznia jest poprawne, dopóki sam nie rozwiążesz problemu.
// WIADOMOŚĆ UŻYTKOWNIKA
Założenia problemu: Buduję instalację zasilania słonecznego i potrzebuję pomocy w obliczeniu finansów.
- Koszt ziemi: 100 USD / stopa kwadratowa
- Mogę kupić panele słoneczne za 250 USD / stopę kwadratową
- Negocjowałem umowę na konserwację, która będzie mnie kosztować stałe 100 000 USD rocznie i dodatkowo 10 USD / stopę kwadratową
Jaki jest całkowity koszt pierwszego roku działalności jako funkcja liczby stóp kwadratowych.
Rozwiązanie ucznia: Niech x będzie rozmiarem instalacji w stopach kwadratowych.
1. Koszt ziemi: 100x
2. Koszt paneli słonecznych: 250x
3. Koszt konserwacji: 100 000 + 100x
Całkowity koszt: 100x + 250x + 100 000 + 100x = 450x + 100 000
// WIADOMOŚĆ ASYSTENTA
Niech x będzie rozmiarem instalacji w stopach kwadratowych.
1. Koszt ziemi: 100x
2. Koszt paneli słonecznych: 250x
3. Koszt konserwacji: 100 000 + 10x
Całkowity koszt: 100x + 250x + 100 000 + 10x = 360x + 100 000
Rozwiązanie ucznia jest nieprawidłowe. Popełnili błąd w obliczeniu kosztu konserwacji, używając 100x zamiast 10x. Prawidłowy całkowity koszt pierwszego roku działalności to 360x + 100 000.
Taktyka: Użyj wewnętrznej monologu lub sekwencji zapytań, aby ukryć proces myślowy modelu
Poprzednia taktyka pokazuje, że czasami ważne jest, aby model szczegółowo rozważał problem przed udzieleniem konkretnego odpowiedzi. Dla niektórych zastosowań proces myślowy, który model wykorzystuje do uzyskania ostatecznej odpowiedzi, może być nieodpowiedni do udostępnienia użytkownikowi. Na przykład w aplikacjach edukacyjnych możemy chcieć zachęcić studentów do samodzielnego rozwiązywania problemów, ale proces myślowy modelu dotyczący rozwiązania studenta mógłby ujawnić odpowiedź studentowi.
Wewnętrzny monolog to taktyka, która może być stosowana w celu złagodzenia tego zagadnienia. Pomysłem wewnętrznego monologu jest nakazanie modelowi umieszczenia części wyniku, które mają być ukryte przed użytkownikiem, w strukturalnym formacie ułatwiającym ich analizę. Następnie, przed przedstawieniem wyniku użytkownikowi, wynik jest analizowany i tylko część wyniku staje się widoczna.
// WIADOMOŚĆ SYSTEMU
Postępuj zgodnie z poniższymi krokami, aby odpowiedzieć na zapytania użytkownika.
Krok 1 - Najpierw wypracuj własne rozwiązanie problemu. Nie polegaj na rozwiązaniu studenta, ponieważ może być błędne. Umieść całą swoją pracę na ten krok wewnątrz potrójnych cudzysłowów (""").
Krok 2 - Porównaj swoje rozwiązanie z rozwiązaniem studenta i oceniaj, czy rozwiązanie studenta jest poprawne czy nie. Umieść całą swoją pracę na ten krok wewnątrz potrójnych cudzysłowów (""").
Krok 3 - Jeśli student popełnił błąd, określ, jaką wskazówkę mógłbyś dać studentowi, nie ujawniając odpowiedzi. Umieść całą swoją pracę na ten krok wewnątrz potrójnych cudzysłowów (""").
Krok 4 - Jeśli student popełnił błąd, udziel wskazówki z poprzedniego kroku studentowi (poza potrójnymi cudzysłowami). Zamiast pisać "Krok 4 - ..." napisz "Wskazówka: ".
// WIADOMOŚĆ UŻYTKOWNIKA
Treść zadania: <wprowadź treść zadania>
Rozwiązanie studenta: <wprowadź rozwiązanie studenta>
Alternatywnie, można to osiągnąć za pomocą sekwencji zapytań, w których wszystkie z wyjątkiem ostatniego mają swoje wyniki ukryte przed końcowym użytkownikiem.
Najpierw możemy poprosić model o samodzielne rozwiązanie problemu. Ponieważ to początkowe zapytanie nie wymaga rozwiązania studenta, może zostać pominięte. To dodatkowo daje zaletę, że nie ma szansy na to, że rozwiązanie modelu zostanie uwarunkowane przez próbę rozwiązania studenta.
// WIADOMOŚĆ UŻYTKOWNIKA
<wprowadź treść zadania>
Następnie, możemy poprosić model o wykorzystanie wszystkich dostępnych informacji do oceny poprawności rozwiązania studenta.
// WIADOMOŚĆ SYSTEMU
Porównaj swoje rozwiązanie z rozwiązaniem studenta i oceniaj, czy rozwiązanie studenta jest poprawne czy nie.
// WIADOMOŚĆ UŻYTKOWNIKA
Treść zadania: """<wprowadź treść zadania>"""
Twoje rozwiązanie: """<wprowadź rozwiązanie wygenerowane przez model>"""
Rozwiązanie studenta: """<wprowadź rozwiązanie studenta>"""
W końcu, możemy pozwolić modelowi wykorzystać własną analizę do skonstruowania odpowiedzi w roli pomocnego korepetytora.
// WIADOMOŚĆ SYSTEMU
Jesteś korepetytorem matematyki. Jeśli student popełnił błąd, zaoferuj wskazówkę w taki sposób, aby nie ujawnić odpowiedzi. Jeśli student nie popełnił błędu, po prostu zaoferuj mu zachęcający komentarz.
// WIADOMOŚĆ UŻYTKOWNIKA
Treść zadania: """<wprowadź treść zadania>"""
Twoje rozwiązanie: """<wprowadź rozwiązanie wygenerowane przez model>"""
Rozwiązanie studenta: """<wprowadź rozwiązanie studenta>"""
Analiza: """<wprowadź analizę wygenerowaną przez model z poprzedniego kroku>"""
Taktyka: Zapytaj model, czy coś przegapił podczas poprzednich iteracji
Załóżmy, że używamy modelu do wylistowania fragmentów zródła, które są istotne dla konkretengo pytania. Po wylistowaniu każdego fragmentu model musi określić, czy powinien zacząć pisać kolejny czy zakończyć. Jeśli dokument źródłowy jest duży, często zdarza się, że model zatrzymuje się zbyt wcześnie i nie wylicza wszystkich istotnych fragmentów. W takim przypadku lepsze wyniki można uzyskać często poprzez wielokrotne zapytywanie modelu o ewentualne przegapione fragmenty podczas poprzednich iteracji.
// WIADOMOŚĆ SYSTEMU
Otrzymasz dokument oznaczony potrójnymi cudzysłowami. Twoim zadaniem jest wybrać fragmenty odnoszące się do następującego pytania: "Jakie istotne przesunięcia paradygmatyczne miały miejsce w historii sztucznej inteligencji".
Upewnij się, że fragmenty zawierają cały istotny kontekst niezbędny do ich interpretacji - innymi słowy, nie wybieraj małych fragmentów pozbawionych istotnego kontekstu. Poddaj wynik w formacie JSON w następujący sposób:
[{"fragment": "..."},
...
{"fragment": "..."}]
// WIADOMOŚĆ UŻYTKOWNIKA
"""<wprowadź tutaj dokument>"""
// WIADOMOŚĆ ASYSTENTA
[{"fragment": "model wpisuje tutaj fragment"},
...
{"fragment": "model wpisuje tutaj kolejny fragment"}]
// WIADOMOŚĆ UŻYTKOWNIKA
Czy są jeszcze istotne fragmenty? Upewnij się, żeby się nie powtarzały. Upewnij się również, że fragmenty zawierają wszystkie istotne informacje niezbędne do ich interpretacji - innymi słowy, nie wybieraj małych fragmentów pozbawionych istotnego kontekstu.
Strategia: Korzystanie z zewnętrznych narzędzi
Taktyka: Wykorzystaj wyszukiwanie oparte na osadzeniach do efektywnego pozyskiwania wiedzy
Model może wykorzystać zewnętrzne źródła informacji, jeśli są one dostarczane jako część jego wejścia. Może to pomóc modelowi w generowaniu bardziej ugruntowanych i aktualnych odpowiedzi. Na przykład, jeśli użytkownik zada pytanie dotyczące konkretnego filmu, warto dodać wysokiej jakości informacje o filmie (np. aktorzy, reżyser itp.) do wejścia modelu. Osadzenia mogą być wykorzystane do efektywnego pozyskiwania wiedzy, dzięki czemu istotne informacje mogą być dynamicznie dodawane do wejścia modelu podczas jego działania.
Osadzenie tekstu to wektor, który może mierzyć związki pomiędzy ciągami tekstowymi. Podobne lub powiązane ciągi będą bliżej siebie niż niepowiązane ciągi. Fakt ten, w połączeniu ze stosowaniem szybkich algorytmów wyszukiwania wektorowego, oznacza, że osadzenia mogą być wykorzystane do efektywnego pozyskiwania wiedzy. W szczególności, korpus tekstu może być podzielony na fragmenty, a każdy fragment może być osadzony i przechowywany. Następnie można osadzić daną zapytanie i przeprowadzić wyszukiwanie wektorowe, aby znaleźć osadzone fragmenty tekstu z korpusu, które są najbardziej powiązane z zapytaniem (tj. najbliższe sobie w przestrzeni osadzeń).
Taktyka: Wykorzystaj wykonanie kodu do dokładniejszych obliczeń lub wywoływania zewnętrznych interfejsów API
Modele językowe nie mogą być polegać na dokładnym wykonywaniu działań arytmetycznych ani długich obliczeń. W przypadkach, gdy jest to potrzebne, model może być nakazany do napisania i uruchomienia kodu zamiast wykonywania własnych obliczeń. W szczególności, model może być nakazany umieścić kod, który ma być uruchomiony w wyznaczonym formacie, np. potrójnym cudzysłowie. Po wygenerowaniu wyniku kod może być wydobyty i uruchomiony. W końcu, jeśli to konieczne, wynik z silnika wykonującego kod (tj. interpreter Pythona) może być przekazany jako wejście do modelu dla następnego zapytania.
// Wiadomość SYSTEMOWA
Możesz pisać i wykonywać kod Pythona, zamieniając go w potrójne cudzysłowia, np. ```tutaj wpisz kod```. Wykorzystaj to aby wykonać obliczenia.
// Wiadomość UŻYTKOWNIKA
Znajdź wszystkie rzeczywiste pierwiastki następującego wielomianu: 3*x**5 - 5*x**4 - 3*x**3 - 7*x - 10.
Innym dobrym zastosowaniem wykonania kodu jest wywoływanie zewnętrznych interfejsów API. Jeśli model będzie nauczony właściwego korzystania z danego interfejsu API, może napisać kod, który z niego skorzysta. Model może zostać pouczony, jak korzystać z interfejsu API, poprzez udostępnienie mu dokumentacji i/lub przykładów kodu pokazujących, jak korzystać z danego interfejsu.
// Wiadomość SYSTEMOWA
Możesz pisać i wykonywać kod Pythona, zamieniając go w potrójne cudzysłowia. Zauważ również, że masz dostęp do następującego modułu, który pomoże użytkownikom wysyłać wiadomości do swoich znajomych:
\`\`\`python
import message
message.write(to="John", message="Cześć, chcesz się spotkać po pracy?")\`\`\`
OSTRZEŻENIE: Wykonywanie kodu wygenerowanego przez model nie jest samo w sobie bezpieczne i należy podjąć środki ostrożności w każdej aplikacji, która chce to zrobić. W szczególności konieczne jest utworzenie środowiska wykonującego kod w piaskownicy, aby ograniczyć szkody, jakie niezaufany kod mógłby spowodować.
Taktyka: Daj modelowi dostęp do konkretnych funkcji
Interfejs API dla uzupełnień rozmowy pozwala przekazywać listę opisów funkcji w żądaniach. Dzięki temu modele mogą generować argumenty funkcji zgodnie z dostarczonymi schematami. Wygenerowane argumenty funkcji są zwracane przez interfejs API w formacie JSON i mogą być wykorzystane do wywoływania funkcji. Wyniki wywołań funkcji mogą następnie być ponownie przekazane do modelu w kolejnym żądaniu, aby kontynuować pętlę. Jest to zalecany sposób wykorzystywania modeli OpenAI do wywoływania zewnętrznych funkcji.
Strategia: Systematyczne testowanie zmian
Czasami może być trudno stwierdzić, czy zmiana – na przykład nowa instrukcja lub nowy projekt – sprawia, że Twój system staje się lepszy czy gorszy. Przejrzenie kilku przykładów może dać wskazówki, które jest lepsze, ale przy małych próbkach może być trudno odróżnić prawdziwą poprawę od przypadkowego szczęścia. Być może zmiana poprawia wydajność w niektórych przypadkach, ale pogarsza ją w innych.
Procedury ewaluacyjne (zwane "ewaluacjami") są przydatne do optymalizacji projektów systemów. Dobre ewaluacje są:
- Reprezentatywne dla rzeczywistego użytku (lub przynajmniej zróżnicowane)
- Zawierają wiele przypadków testowych w celu uzyskania większej mocy statystycznej (patrz poniższa tabela z wytycznymi)
- Łatwe do zautomatyzowania lub powtarzania
Różnica do wykrycia | Wielkość próbki wymagana dla 95% pewności |
---|---|
30% | ~10 |
10% | ~100 |
3% | ~1,000 |
1% | ~10,000 |
Ewaluacja wyników może być przeprowadzona przez komputery, ludzi lub mieszankę obu. Komputery mogą automatyzować ewaluacje z obiektywnymi kryteriami (np. pytania z jedną poprawną odpowiedzią), a także niektóre kryteria subiektywne lub niejasne, w których wyniki modelowe są oceniane przez inne kwerendy modelu. OpenAI Evals to otwarte oprogramowanie, które dostarcza narzędzia do tworzenia zautomatyzowanych ewaluacji.
Ewaluacje oparte na modelach mogą być przydatne, gdy istnieje zakres możliwych wyników, które zostałyby uznane za równie wysokiej jakości (np. dla pytań z długimi odpowiedziami). Granica między tym, co można realistycznie ocenić za pomocą ewaluacji opartych na modelu, a tym, co wymaga oceny przez człowieka, jest niejasna i ciągle się przesuwa w miarę jak modele stają się bardziej zdolne. Zachęcamy do eksperymentowania, aby dowiedzieć się, jak skutecznie mogą działać ewaluacje oparte na modelach w Twoim przypadku użycia.
Taktyka: Ocenianie wyników modelu w odniesieniu do wzorców poprawnych odpowiedzi
Załóżmy, że wiadomo, że poprawna odpowiedź na pytanie powinna odnosić się do określonego zestawu znanych faktów. Wówczas możemy użyć zapytania modelu, aby policzyć, ile z wymaganych faktów zawiera odpowiedź.
Na przykład, korzystając z poniższej wiadomości systemowej:
// Wiadomość SYSTEM
Otrzymasz tekst ograniczony potrójnymi cudzysłowami, który rzekomo stanowi odpowiedź na pytanie. Sprawdź, czy następujące informacje bezpośrednio zawarte są w odpowiedzi:
- Neil Armstrong był pierwszą osobą, która postawiła stopę na Księżycu.
- Data, kiedy Neil Armstrong po raz pierwszy stanął na Księżycu, to 21 lipca 1969 roku.
Dla każdego z tych punktów wykonaj następujące kroki:
1 - Przedstaw punkt w inny sposób.
2 - Podaj odnośnik z odpowiedzi, który najbardziej odpowiada temu punktowi.
3 - Rozważ, czy osoba czytająca odnośnik, która nie zna tematu, mogłaby bezpośrednio wywnioskować punkt. Wyjaśnij, dlaczego tak się dzieje albo dlaczego nie, zanim podejmiesz decyzję.
4 - Napisz "tak", jeśli odpowiedź na pytanie 3 była tak, w przeciwnym razie napisz "nie".
Na koniec podaj liczbę "tak" odpowiedzi. Podaj tę liczbę jako {"liczba": <wprowadź liczbę tutaj>}.
Oto przykładowe wejście, w którym oba punkty są spełnione:
// Wiadomość SYSTEM
<wstaw powyższą wiadomość systemową>
// Wiadomość UŻYTKOWNIKA
"""Neil Armstrong jest znany z tego, że był pierwszym człowiekiem, który postawił stopę na Księżycu. To historyczne wydarzenie miało miejsce 21 lipca 1969 roku podczas misji Apollo 11."""
Oto przykładowe wejście, w którym spełniony jest tylko jeden punkt:
// Wiadomość SYSTEM
<wstaw powyższą wiadomość systemową>
// Wiadomość UŻYTKOWNIKA
"""Neil Armstrong zapisał się na kartach historii, kiedy wszedł z modułu księżycowego, stając się pierwszą osobą, która postawiła stopę na Księżycu."""
Oto przykład wejścia, w którym żaden z nich nie jest spełniony:
// Wiadomość SYSTEM
<wstaw powyższą wiadomość systemową>
// Wiadomość UŻYTKOWNIKA
"""Latem '69, wielka podróż,
Apollo 11, odważna jak ręka legendy.
Armstrong postawił krok, historia się rozwijała,
"Mały krok," powiedział, dla nowego świata."""
Istnieje wiele możliwych wariantów tego rodzaju oceny opartej na modelu. Rozważmy poniższą zmianę, która śledzi rodzaj nakładania się między kandydowaną odpowiedzią a wzorcem poprawnej odpowiedzi, a także śledzi, czy kandydowana odpowiedź przeczy któremukolwiek z elementów wzorca poprawnej odpowiedzi.
// Wiadomość SYSTEM
Użyj poniższych kroków, aby odpowiedzieć na wejścia użytkownika. W pełni ponów każdy krok, zanim przejdziesz dalej. czyli "Krok 1: Przyczyna...".
Krok 1: Przemyśl krok po kroku, czy informacje w przesłanej odpowiedzi względem odpowiedzi eksperta są: rozłączne, równe, podzbiorem, nadzbiorem lub nakładają się (tj. pewne przecięcie, ale nie podzbiór/nadzbiór).
Krok 2: Przemyśl krok po kroku, czy przesłana odpowiedź przeczy jakimkolwiek aspektom odpowiedzi eksperta.
Krok 3: Wygeneruj obiekt JSON zbudowany następująco: {"typ_nakładania": "rozłączne" lub "równe" lub "podzbiór" lub "nadzbiór" lub "nakładające się", "przeciwstawienie": true lub false}
Oto przykład wejścia z niedostateczną odpowiedzią, która jednakowoż nie przeczy odpowiedzi eksperta:
// Wiadomość SYSTEM
<wstaw powyższą wiadomość systemową>
// Wiadomość UŻYTKOWNIKA
Pytanie: """Za jakie wydarzenie Neil Armstrong jest najbardziej znany i w jakiej dacie to miało miejsce? Zakładaj czas UTC."""
Przesłana Odpowiedź: """Czy on nie chodził na Księżycu albo coś?"""
Odpowiedź Eksperta: """Neil Armstrong jest najbardziej znany z tego, że był pierwszą osobą, która postawiła stopę na Księżycu. To historyczne wydarzenie miało miejsce 21 lipca 1969 roku."""
Oto przykład wejścia z odpowiedzią, która bezpośrednio przeczy odpowiedzi eksperta:
// Wiadomość SYSTEM
<wstaw powyższą wiadomość systemową>
// Wiadomość UŻYTKOWNIKA
Pytanie: """Za jakie wydarzenie Neil Armstrong jest najbardziej znany i w jakiej dacie to miało miejsce? Zakładaj czas UTC."""
Przesłana Odpowiedź: """21 lipca 1969 roku Neil Armstrong został drugą osobą, która postawiła stopę na Księżycu, tuż po Buzzie Aldrinie."""
Odpowiedź Eksperta: """Neil Armstrong jest najbardziej znany z tego, że był pierwszą osobą, która postawiła stopę na Księżycu. To historyczne wydarzenie miało miejsce 21 lipca 1969 roku."""
Oto przykład wejścia z poprawną odpowiedzią, która dodatkowo zawiera trochę więcej szczegółów niż jest to konieczne:
// WIADOMOŚĆ SYSTEMOWA
<wstaw powyżej wiadomość systemową>
// WIADOMOŚĆ UŻYTKOWNIKA
Pytanie: """Za co Neil Armstrong jest najbardziej znany i w jakiej dacie to wystąpiło? Przyjmij czas UTC."""
Wprowadzona odpowiedź: """Około godziny 02:56 czasu UTC 21 lipca 1969 r. Neil Armstrong stał się pierwszym człowiekiem, który postawił stopę na powierzchni księżyca, stanowiąc monumentalne osiągnięcie w historii ludzkości."""
Odpowiedź eksperta: """Neil Armstrong jest najbardziej znany z tego, że był pierwszą osobą, która chodziła po księżycu. To historyczne wydarzenie miało miejsce 21 lipca 1969 r."""