Prompt chaining to podzielenie pracy na sekwencję promptów, w której wynik jednego promptu staje się częścią wejścia następnego. Zamiast prosić model, żeby za jednym zamachem przeczytał pięćdziesiąt recenzji, znalazł problemy, uszeregował je i napisał raport, prosisz o każdą z tych rzeczy po kolei. Każdy prompt ma jedno zadanie, a między krokami ty (albo twój kod) możesz obejrzeć wynik, poprawić go albo przerwać.
Poniższy blok to trzyetapowy łańcuch, który zamienia recenzje klientów w notatkę dla zespołu produktowego. Każda zakładka to jeden krok. Wejście kroku 2 to wklejona odpowiedź z kroku 1, a wejście kroku 3 to odpowiedź z kroku 2.
[
{"review": 1, "complaint": "Bateria padła po 4 godzinach"},
{"review": 1, "complaint": "Za krótki kabel do ładowania"},
{"review": 2, "complaint": "Aplikacja ciągle wylogowuje"},
{"review": 3, "complaint": "Bateria nie wystarcza na dojazd"},
{"review": 4, "complaint": "Aplikacja wysypała się przy parowaniu"},
{"review": 4, "complaint": "Bateria szybko się rozładowuje"},
{"review": 5, "complaint": "Kabel za krótki, by używać przy ładowaniu"}
]
Krok 1 tylko czyta i wyciąga. Krok 2 nigdy nie widzi recenzji, tylko listę, więc nie może zboczyć z powrotem w ich streszczanie. Krok 3 tylko pisze. Jeśli krok 3 wróci w złym tonie, uruchamiasz ponownie tylko krok 3; wyciąganie i grupowanie zostają takie, jakie były.
Zwróć uwagę, czego krok 3 nie mówi: że jedna bateria padła po 4 godzinach albo że problemy z aplikacją to wylogowania i awarie. Krok 3 dostał tylko nazwy tematów, więc tych szczegółów nie było w jego wejściu. Decyzja, co dostaje każdy krok, to główny wybór projektowy w łańcuchu, a szczegół, który ma się znaleźć w odpowiedzi końcowej, trzeba przekazać przez wszystkie kroki.
Dlaczego łańcuch zamiast jednego dużego promptu
Każdy krok ma jedno zadanie i jedno kryterium. Pojedynczy prompt, który prosi o wyciąganie danych, analizę i dopracowany tekst, ma do wyważenia trzy cele i nic nie mówi ci, który z nich potraktował po macoszemu. Prompt z jednym zadaniem może dokładnie określić, jak wygląda dobry wynik tego zadania, a ty możesz ocenić odpowiedź według tego kryterium.
Możesz sprawdzić środek. W pojedynczym prompcie pominięta skarga znika w ładnie napisanym akapicie i nigdy jej nie zobaczysz. W łańcuchu lista z kroku 1 jest na widoku. Sprawdzenie jej zajmuje sekundy, a poprawienie przed krokiem 2 jest tańsze niż szukanie błędu w raporcie końcowym.
Każdy krok może mieć własne ustawienia. Wyciąganie i grupowanie potrzebują niskiej temperatury i structured output, który kod może sparsować. Krok pisania może być swobodniejszy. W kodzie możesz nawet wysyłać różne kroki do różnych modeli, na przykład do małego i szybkiego przy wyciąganiu danych.
Awarie są lokalne. Gdy łańcuch się psuje, wiesz, który krok zawiódł, i uruchamiasz ponownie tylko ten jeden.
Koszty też są prawdziwe. Łańcuch wykonuje więcej wywołań, więc trwa dłużej i kosztuje więcej niż jeden prompt. A błąd, który prześlizgnie się przez wczesny krok, przechodzi do każdego kolejnego, i dlatego warto sprawdzać etapy pośrednie.
Jak zaprojektować łańcuch
- Zapisz kroki, które wykonuje się ręcznie. Jeśli najpierw robisz listę, potem ją sortujesz, a potem opisujesz, to są trzy prompty. Kroki wymagające różnych rodzajów myślenia to naturalne miejsca podziału.
- Ustal format wyjścia każdego kroku, zanim napiszesz jego prompt. To, co konsumuje następny krok, powinno być łatwe do odczytania i sprawdzenia: tablica JSON, numerowana lista, tabela. Swobodna proza pasuje tylko do ostatniego kroku.
- Przekazuj tylko to, czego potrzebuje następny krok. Krok 2 powyżej dostaje listę skarg, a nie recenzje. Mniej wejścia to mniej rozpraszaczy, a przy tym każdy krok da się przetestować osobno.
- Dodaj sprawdzenie między krokami. W kodzie sparsuj JSON i upewnij się, że pola istnieją. Przy ocenach wymagających osądu samo sprawdzenie może być promptem: "Czy ta lista zawiera każdą skargę z tych recenzji? Odpowiedz tak albo nie, a potem wypisz brakujące."
- Wyraźnie oznaczaj wklejony materiał. Wejście każdego kroku to tekst wytworzony przez wcześniejszy krok, a delimitery chronią przed odczytaniem go przez model jako nowych instrukcji.
Oto krok sprawdzający dla powyższego łańcucha, uruchomiony na wersji wyniku kroku 1, która pominęła jedną skargę. Takie sprawdzenie to osobny prompt z jednym wąskim pytaniem, więc łatwiej je wykonać poprawnie niż samo wyciąganie.
Niekompletna
- Recenzja 4: bateria szybko się rozładowuje
Jeśli sprawdzenie zwraca "Niekompletna", uruchom ponownie krok 1 albo dopisz brakującą pozycję ręcznie, zanim ruszy krok 2.
Łańcuch w kodzie
W kodzie łańcuch to sekwencja wywołań, w której każdy prompt jest budowany z poprzedniej odpowiedzi. Ta wersja korzysta z Anthropic Python SDK; ten sam układ działa z każdym dostawcą.
import json
import anthropic
client = anthropic.Anthropic()
MODEL = "your-model-id" # e.g. from your provider's model list
def ask(prompt):
response = client.messages.create(
model=MODEL,
max_tokens=1024,
messages=[{"role": "user", "content": prompt}],
)
return response.content[0].text
reviews = open("reviews.txt", encoding="utf-8").read()
complaints = ask(
"List every complaint in the reviews inside the <reviews> tags. Ignore praise. "
'Return a JSON array of objects with the keys "review" and "complaint". '
"Return only the JSON, with no code fence.\n\n"
f"<reviews>\n{reviews}\n</reviews>"
)
json.loads(complaints) # raises an error here if step 1 did not return valid JSON
themes = ask(
"Group these complaints into themes. Return only a JSON array with the keys "
'"theme", "count" and "reviews", sorted by count, highest first.\n\n'
f"<complaints>\n{complaints}\n</complaints>"
)
note = ask(
"Write a note of at most four sentences to the product team based on these "
f"themes. Lead with the most common one.\n\n<themes>\n{themes}\n</themes>"
)
print(note)
Linia z json.loads to najprostsze możliwe sprawdzenie: jeśli krok 1 odpowiedział prozą, łańcuch zatrzymuje się w tym miejscu, zamiast przekazywać dalej złe wejście. Łańcuch produkcyjny sprawdzałby też pola, ponawiał nieudany krok raz i zapisywał w logach każdy wynik pośredni, żeby złą odpowiedź końcową dało się wyśledzić aż do kroku, który ją spowodował.
Łańcuch w aplikacji czatowej
Do łączenia promptów w łańcuch nie potrzebujesz kodu. Uruchom krok 1, przeczytaj odpowiedź, popraw to, co jest błędne, i wklej ją do promptu z kroku 2. Wykonywanie każdego kroku w nowym czacie trzyma wcześniejszą rozmowę poza kontekstem, więc instrukcja napisana dla jednego kroku nie wpływa na następny. Pozostanie w jednym czacie jest szybsze i sprawdza się, gdy kroki są ze sobą ściśle powiązane, ale cała historia jedzie razem z każdą nową wiadomością.
Prompt chaining a pokrewne techniki
Chain of thought to rozumowanie rozpisane w jednej odpowiedzi; łańcuch promptów to kilka odpowiedzi, przy czym ty kontrolujesz, co między nimi przechodzi. Obie techniki dobrze się łączą: każdy krok łańcucha może prosić o rozumowanie krok po kroku.
W łańcuchu kroki ustalasz z góry. Gdy to model decyduje, jaki krok jest następny, na przykład wyszukuje, czyta wynik, a potem wybiera kolejne działanie, mamy do czynienia z pętlą agenta, opisaną w ReAct prompting. Stałe łańcuchy łatwiej testować i przewidywać, więc są lepszym punktem wyjścia zawsze, gdy już znasz kroki.
Najczęściej zadawane pytania
Czym jest prompt chaining?
Prompt chaining to technika, w której dzielisz zadanie na kilka promptów uruchamianych jeden po drugim, a wynik każdego promptu jest wstawiany do następnego. Na przykład jeden prompt wyciąga skargi z recenzji, drugi grupuje je w tematy, a trzeci pisze na ich podstawie raport.
Czym różni się prompt chaining od chain of thought?
Chain of thought dzieje się w jednej odpowiedzi: model rozpisuje rozumowanie przed odpowiedzią. Prompt chaining używa kilku osobnych wywołań, a ty albo twój kod przekazujecie wynik jednego do następnego. Każdy pojedynczy krok łańcucha możesz obejrzeć, poprawić albo uruchomić ponownie, czego nie da się zrobić z rozumowaniem w jednej odpowiedzi.
Czy prompt chaining da się robić w ChatGPT albo Claude bez kodu?
Tak. Uruchom pierwszy prompt, sprawdź odpowiedź, a potem wklej ją do następnego promptu, w tym samym czacie albo w nowym. Nowy czat dla każdego kroku sprawia, że wcześniejsze wersje i instrukcje nie wpływają na późniejsze kroki.
Kiedy użyć prompt chaining zamiast jednego promptu?
Użyj łańcucha, gdy jeden prompt prosi o kilka różnych rodzajów pracy, na przykład wyciąganie danych, analizę i pisanie, albo gdy musisz sprawdzić lub ponownie wykorzystać wynik pośredni. Jeśli pojedynczy prompt już daje pewną odpowiedź, łańcuch tylko dokłada wywołania, koszty i czas oczekiwania.