Prompt zincirleme (prompt chaining), bir işi bir promptun çıktısının bir sonrakinin girdisinin parçası olduğu bir prompt dizisine bölmektir. Bir modelden elli yorumu okumasını, sorunları bulmasını, sıralamasını ve raporu tek seferde yazmasını istemek yerine bunların her birini sırayla istersin. Her promptun tek bir işi vardır ve adımlar arasında sen (ya da kodun) sonuca bakabilir, onu düzeltebilir ya da durabilirsin.
Aşağıdaki blok, müşteri yorumlarını bir ürün ekibi için nota dönüştüren üç adımlı bir zincir. Her sekme bir adım. 2. adımın girdisi, 1. adımın yanıtının yapıştırılmış hâli; 3. adımın girdisi de 2. adımın yanıtı. JSON anahtarlarını İngilizce bıraktık, çünkü zincirin kodu onları bekliyor.
[
{"review": 1, "complaint": "Pil 4 saat sonra bitti"},
{"review": 1, "complaint": "Şarj kablosu çok kısa"},
{"review": 2, "complaint": "Uygulama sürekli oturumu kapatıyor"},
{"review": 3, "complaint": "Pil yol boyunca dayanmıyor"},
{"review": 4, "complaint": "Uygulama eşleştirirken çöktü"},
{"review": 4, "complaint": "Pil hızlı bitiyor"},
{"review": 5, "complaint": "Kablo şarjdayken kullanmak için çok kısa"}
]
-
adım sadece okur ve çıkarır. 2. adım yorumları hiç görmez, sadece listeyi görür, bu yüzden onları özetlemeye geri kayamaz. 3. adım sadece yazar. 3. adım yanlış bir tonla gelirse sadece 3. adımı yeniden çalıştırırsın; çıkarma ve gruplama olduğu gibi kalır.
-
adımın söylemediği şeye dikkat et: bir pilin 4 saat sonra bittiğini ya da uygulama sorunlarının oturum kapanması ve çökmeler olduğunu. 3. adım sadece tema adlarını aldı, yani bu ayrıntılar girdisinde yoktu. Her adımın ne alacağına karar vermek bir zincirdeki asıl tasarım seçimidir ve nihai cevapta görmek istediğin bir ayrıntının en sona kadar aktarılması gerekir.
Neden tek büyük prompt yerine zincir
Her adımın tek bir işi ve tek bir standardı vardır. Çıkarma, analiz ve özenli yazıyı birlikte isteyen tek bir promptun dengelemesi gereken üç hedefi vardır ve hangisini kısa kestiğini sana hiçbir şey söylemez. Tek işi olan bir prompt, o iş için iyi bir sonucun neye benzediğini tam olarak belirtebilir ve sen de yanıtı ona göre değerlendirebilirsin.
Ortayı kontrol edebilirsin. Tek bir promptta gözden kaçan bir şikâyet güzel yazılmış bir paragrafın içinde kaybolur ve onu hiç görmezsin. Bir zincirde 1. adımın listesi tam oradadır. Kontrol etmek saniyeler alır ve 2. adımdan önce düzeltmek, hatayı nihai raporda bulmaktan daha ucuzdur.
Her adım kendi ayarlarını kullanabilir. Çıkarma ve gruplama düşük bir temperature ve kodun ayrıştırabileceği yapılandırılmış çıktı ister. Yazma adımı daha serbest olabilir. Kodda farklı adımları farklı modellere bile gönderebilirsin, örneğin çıkarma için küçük ve hızlı bir model.
Hatalar yereldir. Bir zincir bozulduğunda hangi adımın bozulduğunu bilirsin ve sadece onu yeniden çalıştırırsın.
Maliyetleri de gerçek. Bir zincir daha fazla çağrı yapar, bu yüzden tek bir prompttan daha uzun sürer ve daha pahalıdır. Ve erken bir adımdan sızan bir hata sonraki her adıma taşınır; aradaki adımları kontrol etmeye değmesinin nedeni budur.
Bir zincir nasıl tasarlanır
- Elle yapacağın adımları yaz. Önce bir liste yapıp sonra onu sıralayıp sonra da yazıya dökecekseniz, bu üç prompttur. Farklı türde düşünme gerektiren adımlar bölmek için doğal yerlerdir.
- Her adımın promptunu yazmadan önce çıktı biçimine karar ver. Sonraki adımın tükettiği şey okunması ve kontrol edilmesi kolay olmalı: bir JSON dizisi, numaralı bir liste, bir tablo. Serbest düzyazı sadece son adım için uygundur.
- Sadece sonraki adımın ihtiyacını aktar. Yukarıdaki 2. adım yorumları değil, şikâyet listesini alıyor. Daha az girdi, dikkat dağıtacak daha az şey demektir ve her adımı kendi başına test edilebilir kılar.
- Adımlar arasına bir kontrol ekle. Kodda JSON'u ayrıştır ve alanların var olduğunu doğrula. Yargı gerektiren durumlarda kontrolün kendisi bir prompt olabilir: "Bu liste bu yorumlardaki her şikâyeti içeriyor mu? Evet ya da hayır diye cevap ver, sonra eksik olanları listele."
- Yapıştırılan malzemeyi net şekilde işaretle. Her adımın girdisi önceki bir adımın ürettiği metindir ve ayırıcılar modelin onu yeni talimatlar olarak okumasını önler.
İşte yukarıdaki zincir için bir kontrol adımı; 1. adım çıktısının bir şikâyeti atlamış bir sürümü üzerinde çalışıyor. Böyle bir kontrol tek ve dar bir soru soran ayrı bir prompttur, bu yüzden doğru yapmak çıkarmanın kendisinden daha kolaydır.
Eksik
- Yorum 4: pil hızlı bitiyor
Kontrol "Eksik" derse, 2. adım çalışmadan önce 1. adımı yeniden çalıştır ya da eksik maddeyi elle ekle.
Kodda bir zincir
Kodda bir zincir, her promptun bir önceki cevaptan oluşturulduğu bir çağrı dizisidir. Bu sürüm Anthropic Python SDK'sını kullanıyor; aynı yapı her sağlayıcıyla çalışır.
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)
json.loads satırı mümkün olan en basit kontroldür: 1. adım düzyazıyla cevap verdiyse zincir kötü girdiyi aktarmak yerine orada durur. Üretimdeki bir zincir ayrıca alanları kontrol eder, başarısız bir adımı bir kez yeniden dener ve her ara sonucu loglar ki kötü bir nihai cevap ona yol açan adıma kadar izlenebilsin.
Bir sohbet uygulamasında zincirleme
Promptları zincirlemek için koda ihtiyacın yok. 1. adımı çalıştır, cevabı oku, yanlış olan her şeyi düzelt ve onu 2. adım promptuna yapıştır. Her adımı yeni bir sohbette yapmak önceki konuşmayı bağlamın dışında tutar, böylece bir adım için yazılmış bir talimat sonrakini etkilemez. Tek bir sohbette kalmak daha hızlıdır ve adımlar birbirine yakın olduğunda işe yarar, ama bütün geçmiş her yeni mesajla birlikte taşınır.
Zincirlemenin benzer tekniklerle karşılaştırması
Chain of thought tek bir yanıtın içinde yazılan akıl yürütmedir; bir prompt zinciri ise aralarında neyin geçeceğini senin kontrol ettiğin birkaç yanıttır. İkisi iyi birleşir: bir zincirin herhangi bir adımı adım adım akıl yürütme isteyebilir.
Bir zincirde adımları önceden sen belirlersin. Arama yapmak, bir sonucu okumak ve sonra başka bir eylem seçmek gibi sıradaki adıma model kendisi karar verdiğinde bu kalıp bir ajan döngüsüne dönüşür; ReAct prompting sayfasında anlatılıyor. Sabit zincirlerin test edilmesi ve tahmin edilmesi daha kolaydır, bu yüzden adımları zaten bildiğin her durumda daha iyi bir başlangıç noktasıdır.
Sıkça Sorulan Sorular
Prompt zincirleme nedir?
Prompt zincirleme, bir görevi art arda çalışan birkaç prompta böldüğün ve her promptun çıktısını bir sonrakine eklediğin bir tekniktir. Örneğin bir prompt yorumlardan şikâyetleri çıkarır, ikincisi onları temalara ayırır, üçüncüsü de temalardan bir rapor yazar.
Prompt zincirleme ile chain of thought arasındaki fark nedir?
Chain of thought tek bir yanıtın içinde olur: model cevaptan önce akıl yürütmesini yazar. Prompt zincirleme birkaç ayrı çağrı kullanır ve birinin sonucunu bir sonrakine sen ya da kodun aktarır. Bir zincirin herhangi bir adımını tek başına inceleyebilir, düzeltebilir ya da yeniden çalıştırabilirsin; tek bir yanıttaki akıl yürütmede bunu yapamazsın.
ChatGPT ya da Claude'da kod yazmadan prompt zincirleme yapabilir miyim?
Evet. İlk promptu çalıştır, cevabı kontrol et, sonra onu aynı sohbette ya da yeni bir sohbette bir sonraki prompta yapıştır. Her adım için yeni bir sohbet başlatmak önceki taslakların ve talimatların sonraki adımları etkilemesini önler.
Tek bir prompt yerine ne zaman prompt zincirleme kullanmalıyım?
Bir prompt çıkarma, analiz ve yazma gibi birkaç farklı türde iş istediğinde ya da bir ara sonucu kontrol etmen veya tekrar kullanman gerektiğinde zincir kullan. Tek bir prompt zaten güvenilir bir cevap veriyorsa zincir sadece çağrı, maliyet ve bekleme süresi ekler.