Pierwsza wersja promptu to szkic. Często daje coś bliskiego temu, czego chcesz, a lukę między "blisko" a "dobrze" zamyka iteracja: celowa zmiana promptu, ponowne uruchomienie na tym samym wejściu i sprawdzenie, czy zmiana pomogła. Robiona niedbale, iteracja zamienia się w losowe przeformułowywanie, aż jeden szczęśliwy wynik wygląda dobrze. Robiona jako mały eksperyment daje prompt, który działa na następnych stu wejściach, a nie tylko na tym jednym przetestowanym.
Metoda ma pięć kroków: ustal, jak wygląda dobry wynik, trzymaj stałe wejścia testowe, zmieniaj jedną rzecz naraz, porównuj wyniki i wiedz, kiedy przestać.
Ustal, jak wygląda dobra odpowiedź
Zanim cokolwiek zmienisz, zapisz, co wynik musi robić, w postaci sprawdzeń z odpowiedzią tak albo nie. "Dobrej wiadomości commita" nie da się sprawdzić. Tego już tak:
- Linia tematu ma mniej niż 50 znaków.
- Stosuje format Conventional Commits (
fix:,feat:i tak dalej). - Treść mówi, dlaczego zmiana była potrzebna, a nie to, co już pokazuje diff.
- Wspomina numer zgłoszenia, jeśli taki jest.
Kryteria pełnią dwie funkcje. Mówią ci, co dodać do promptu, bo każde z nich to często brakujące polecenie. I powstrzymują cię przed ocenianiem wyników po tym, jak przyjemnie brzmią, a to najprostszy sposób, żeby zaakceptować pewną siebie, ale błędną odpowiedź.
Trzymaj mały zestaw wejść testowych
Wybierz od trzech do dziesięciu wejść i nie zmieniaj ich w trakcie pracy. Uwzględnij typowe przypadki, kilka niewygodnych (puste pole, bardzo długie wejście, język, którego prompt się nie spodziewa) i każde wejście, które wcześniej zawiodło. Prompt dostrojony do jednego przykładu zwykle pasuje do tego przykładu i zawodzi na następnym.
Zapisz prompt jako szablon z miejscem na wejście, żeby każda wersja działała na dokładnie tym samym materiale.
Zmieniaj jedną rzecz naraz
Gdy zmieniasz jednocześnie rolę, format i przykłady, a wynik się poprawia, nie wiesz, która zmiana to sprawiła, i możesz zachować dwie bezużyteczne poprawki. Zmień jedną rzecz, uruchom, porównaj. Poniższe zakładki to trzy wersje jednego promptu, każda różni się od poprzedniej jedną zmianą.
- if len(password) > 8:
+ if len(password) >= 8:
return TrueAktualizacja walidacji długości hasła
Ten commit aktualizuje logikę walidacji hasła, zmieniając operator porównania z > na >=. W efekcie hasła mające dokładnie 8 znaków będą teraz uznawane za poprawne. Ta zmiana poprawia dokładność walidacji i zapewnia lepsze doświadczenie użytkownikom zakładającym konta.
Wersja 1 nie spełnia kryteriów 2 i 3: temat nie ma prefiksu typu, a treść opowiada diff większą liczbą słów. Wersja 2 dodaje wymagania dotyczące formatu i spełnia kryteria 1 i 2, ale jej treść nadal opisuje diff. Oczywistą kolejną poprawką byłoby następne polecenie ("wyjaśnij dlaczego"), ale model nie wyjaśni powodu, którego nigdy nie dostał. Wersja 3 dodaje zamiast tego brakujący kontekst i treść oraz odwołanie do zgłoszenia pojawiają się bez proszenia. To najczęstsza lekcja z iteracji: gdy polecenie nie naprawia wyniku, promptowi zwykle brakuje informacji, a nie nacisku.
Porównuj wyniki obok siebie
Uruchom każdą wersję na każdym wejściu testowym, i to więcej niż raz, bo modele czatowe losują słowa i dwa uruchomienia tego samego promptu się różnią. Postaw wyniki obok siebie i sprawdzaj je według kryteriów, a nie według tego, jak pamiętasz poprzednie uruchomienie.
Przy precyzyjnych kryteriach pierwszą ocenę może wykonać drugie wywołanie modelu. Wklej wyniki do promptu oceniającego z wypisanymi kryteriami:
| Kryterium | Wynik A | Wynik B |
|---|---|---|
| 1. Temat poniżej 50 znaków | Zaliczone: temat ma 45 znaków | Zaliczone: ten sam temat, 45 znaków |
| 2. Conventional Commits | Zaliczone: zaczyna się od "fix:" | Zaliczone: zaczyna się od "fix:" |
| 3. Treść wyjaśnia dlaczego | Niezaliczone: "Zmień sprawdzenie długości z > na >=" powtarza diff | Zaliczone: "użytkownicy postępujący zgodnie z instrukcją nie mogli się zarejestrować" |
| 4. Wspomina zgłoszenie | Niezaliczone: brak numeru zgłoszenia | Zaliczone: "Fixes #412" |
Traktuj model oceniający jak asystenta, a nie sędziego. Zheng i współautorzy w pracy z 2023 roku "Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena" udokumentowali skłonności modeli oceniających, w tym preferowanie dłuższych odpowiedzi i odpowiedzi na określonej pozycji. Dbaj o to, żeby kryteria dało się sprawdzić, proś o cytowane dowody, zamieniaj kolejność A i B przy porównywaniu dwóch wyników i część wyników przeczytaj sam. Sprawdzenia takie jak liczenie znaków są pewniejsze jako linia kodu niż jako osąd modelu.
Poprawiaj prompt, a nie rozmowę
W czacie kusi, żeby poprawiać odpowiedź kolejnymi wiadomościami: "krócej", "nie, wspomnij zgłoszenie", "użyj innego formatu". To daje jeden dobry wynik i zostawia prompt tak słaby, jaki był. Gdy poprawka działa, przenieś ją do promptu i uruchom prompt od nowa. Następnym razem, gdy będziesz potrzebować wyniku, wkleisz jedną wiadomość, zamiast powtarzać pięć.
Zachowuj stare wersje z jednolinijkową notką o tym, co się zmieniło i co to naprawiło. Wystarczy zwykły plik tekstowy. Gdy późniejsza poprawka coś pogorszy, możesz wrócić, zamiast próbować sobie przypomnieć, co było wcześniej w prompcie.
Porównanie w kodzie
Gdy prompt działa przez API, krótki skrypt może przygotować widok porównawczy dla każdej wersji i każdego wejścia testowego. Ten korzysta z OpenAI Python SDK i zapisuje plik markdown, który można przeczytać od góry do dołu.
from openai import OpenAI
client = OpenAI()
MODEL = "your-model-id" # e.g. from your provider's model list
# each prompt file contains {input} where the test diff goes
PROMPTS = {
"v2": open("prompts/commit_v2.txt").read(),
"v3": open("prompts/commit_v3.txt").read(),
}
TESTS = [open(f"tests/diff_{i}.txt").read() for i in range(1, 6)]
with open("results.md", "w") as out:
for i, test in enumerate(TESTS, 1):
out.write(f"## Test {i}\n\n")
for name, template in PROMPTS.items():
for run in (1, 2):
response = client.chat.completions.create(
model=MODEL,
messages=[{"role": "user", "content": template.replace("{input}", test)}],
)
out.write(f"### {name}, run {run}\n\n{response.choices[0].message.content}\n\n")
Kiedy przestać
Przestań, gdy każde kryterium jest spełnione na każdym wejściu testowym w kilku uruchomieniach. Dodawanie czegoś więcej po tym momencie głównie wydłuża prompt, a każde dodatkowe polecenie to kolejna rzecz, która może kłócić się z pozostałymi.
Przestań też, gdy zmiany zaczynają wymieniać jedne błędy na inne: jedna poprawka naprawia test 2 i psuje test 4, następna to odwraca. Taki wzorzec oznacza, że od promptu oczekuje się czegoś, czego jedno polecenie nie jest w stanie ustalić. Zwykłe wyjścia to pokazanie formatu na kilku przykładach (few-shot prompting), podzielenie pracy na kroki za pomocą prompt chaining albo przeniesienie deterministycznych części, takich jak liczenie znaków czy sprawdzanie formatu, do kodu, który sprawdza wynik. Jeśli brakuje ci pomysłów, może pomóc meta prompting: daj modelowi prompt, wejście i zły wynik i zapytaj, która część promptu najpewniej go spowodowała.
Najczęściej zadawane pytania
Jak poprawić prompt, który daje złe odpowiedzi?
Przyjrzyj się złej odpowiedzi i nazwij, co jest z nią nie tak: zły format, brakujący fakt, zły odbiorca, za długa. Potem znajdź to, czego prompt nie powiedział, a co by temu zapobiegło, dodaj tę jedną rzecz i uruchom nową wersję na tym samym wejściu. Złe odpowiedzi częściej biorą się z brakującego kontekstu albo brakującego polecenia dotyczącego formatu niż ze sformułowań.
Ilu wejść testowych potrzebuję, żeby przetestować prompt?
Przy prompcie wielokrotnego użytku zwykle wystarcza od trzech do dziesięciu: kilka typowych przypadków, jeden albo dwa przypadki brzegowe (bardzo krótki, bardzo długi, nietypowy) i jedno wejście, które wcześniej wyszło źle. Nie zmieniaj ich podczas iteracji, żeby zmiana w wyniku wynikała z promptu, a nie z innego wejścia.
Dlaczego ten sam prompt uruchomiony ponownie daje inną odpowiedź?
Modele czatowe losują każde słowo z rozkładu prawdopodobieństwa, więc wyniki różnią się między uruchomieniami. Gdy porównujesz dwie wersje promptu, uruchom każdą więcej niż raz na tych samych wejściach. Różnica, która pojawia się w każdym uruchomieniu, jest prawdopodobnie prawdziwa; taka, która pojawia się tylko raz, może być przypadkiem. Przez API możesz też obniżyć temperature, żeby zmniejszyć zmienność.
Czy mogę użyć AI do oceny wyników mojego promptu?
Tak, przy kryteriach, które da się precyzyjnie określić, na przykład "treść mówi, dlaczego zmiana była potrzebna" albo "wspomina numer zgłoszenia". Daj oceniającemu modelowi swoje dokładne kryteria i poproś o wynik zaliczone albo niezaliczone dla każdego kryterium z cytatem jako dowodem. Modele oceniające mają znane skłonności, w tym faworyzowanie dłuższych odpowiedzi i jednej pozycji nad drugą, więc część wyników przeczytaj sam i zamieniaj kolejność przy porównywaniu dwóch.
Kiedy przestać ulepszać prompt?
Przestań, gdy każde kryterium jest spełnione na każdym wejściu testowym w kilku uruchomieniach albo gdy każda nowa zmiana naprawia jeden przypadek i psuje inny. Wtedy problemem zwykle nie jest już prompt: zadanie może potrzebować przykładów, podziału na kroki albo sprawdzenia w kodzie.