Menu

Prompt Chaining: Memecah Tugas Menjadi Langkah

Prompt chaining memecah sebuah pekerjaan menjadi rangkaian prompt yang lebih kecil, di mana output setiap langkah menjadi input langkah berikutnya. Setiap langkah melakukan satu hal, dan kamu bisa mengecek hasilnya sebelum langkah berikutnya berjalan.

Setiap prompt di bawah bisa diedit: ubah, lalu buka di ChatGPT, Claude, atau aplikasi AI lain.

Prompt chaining berarti memecah sebuah pekerjaan menjadi rangkaian prompt, di mana output satu prompt menjadi bagian dari input prompt berikutnya. Alih-alih meminta model membaca lima puluh ulasan, menemukan masalahnya, mengurutkannya, dan menulis laporan sekaligus, kamu memintanya satu per satu. Setiap prompt punya satu tugas, dan di antara langkah-langkahnya kamu (atau kodemu) bisa melihat hasilnya, memperbaikinya, atau berhenti.

Blok di bawah ini adalah rantai tiga langkah yang mengubah ulasan pelanggan menjadi catatan untuk tim produk. Setiap tab adalah satu langkah. Input langkah 2 adalah balasan dari langkah 1 yang ditempel, dan input langkah 3 adalah balasan dari langkah 2.

Fill in
Daftarkan setiap keluhan di ulasan-ulasan di dalam tag <reviews>. Abaikan pujian. Kembalikan array JSON berisi objek dengan key "review" (nomor ulasan) dan "complaint" (maksimal delapan kata). Kembalikan JSON-nya saja. <reviews> 1. Baterainya habis setelah 4 jam, dan kabel chargernya terlalu pendek. 2. Suaranya mantap. Tapi aplikasinya terus membuatku ter-logout. 3. Suka banget, tapi baterainya hampir tidak cukup untuk perjalanan pulangku. 4. Aplikasinya crash dua kali saat pairing, dan baterainya cepat habis. 5. Kabelnya sangat pendek sampai aku tidak bisa memakainya sambil mengecas di meja. </reviews>
Try it
Example replyReplies vary between models and runs.
[
  {"review": 1, "complaint": "Baterai habis setelah 4 jam"},
  {"review": 1, "complaint": "Kabel charger terlalu pendek"},
  {"review": 2, "complaint": "Aplikasi terus ter-logout"},
  {"review": 3, "complaint": "Baterai tidak cukup untuk perjalanan"},
  {"review": 4, "complaint": "Aplikasi crash saat pairing"},
  {"review": 4, "complaint": "Baterai cepat habis"},
  {"review": 5, "complaint": "Kabel terlalu pendek untuk dipakai sambil mengecas"}
]

Langkah 1 hanya membaca dan mengambil. Langkah 2 tidak pernah melihat ulasannya, hanya daftarnya, jadi langkah itu tidak bisa melantur kembali ke meringkas ulasan. Langkah 3 hanya menulis. Kalau nada langkah 3 ternyata salah, kamu cukup menjalankan ulang langkah 3; hasil pengambilan dan pengelompokan tetap seperti semula.

Perhatikan apa yang tidak disebutkan langkah 3: bahwa ada baterai yang habis setelah 4 jam, atau bahwa masalah aplikasinya berupa logout dan crash. Langkah 3 hanya menerima nama-nama tema, jadi detail itu tidak ada di input-nya. Menentukan apa yang diterima setiap langkah adalah pilihan desain utama dalam sebuah rantai, dan detail yang kamu inginkan ada di jawaban akhir harus diteruskan sampai ke ujung.

Kenapa memakai rantai alih-alih satu prompt besar

Setiap langkah punya satu tugas dan satu standar. Satu prompt yang meminta pengambilan data, analisis, dan tulisan yang rapi punya tiga tujuan yang harus diseimbangkan, dan tidak ada yang memberi tahu tujuan mana yang dikorbankan. Prompt dengan satu tugas bisa menyatakan dengan tepat seperti apa hasil yang bagus untuk tugas itu, dan kamu bisa menilai balasannya berdasarkan standar itu.

Kamu bisa mengecek bagian tengahnya. Dalam satu prompt, keluhan yang terlewat hilang di dalam paragraf yang ditulis dengan rapi dan kamu tidak pernah melihatnya. Dalam sebuah rantai, daftar dari langkah 1 ada di depanmu. Mengeceknya hanya butuh beberapa detik, dan memperbaikinya sebelum langkah 2 lebih murah daripada menemukan kesalahannya di laporan akhir.

Setiap langkah bisa memakai pengaturannya sendiri. Pengambilan dan pengelompokan butuh temperature rendah dan output terstruktur yang bisa di-parse oleh kode. Langkah menulis bisa lebih bebas. Di kode, kamu bahkan bisa mengirim langkah-langkah yang berbeda ke model yang berbeda, seperti model kecil yang cepat untuk pengambilan data.

Kegagalannya bersifat lokal. Ketika sebuah rantai rusak, kamu tahu langkah mana yang rusak, dan kamu hanya perlu menjalankan ulang langkah itu.

Biayanya juga nyata. Rantai membuat lebih banyak pemanggilan, jadi waktunya lebih lama dan biayanya lebih mahal daripada satu prompt. Selain itu, kesalahan yang lolos dari langkah awal terbawa ke setiap langkah sesudahnya, dan itulah kenapa langkah-langkah di antaranya layak dicek.

Cara merancang sebuah rantai

  1. Tuliskan langkah-langkah yang akan kamu lakukan secara manual. Kalau kamu akan membuat daftar dulu, lalu mengurutkannya, lalu menuliskannya, itu berarti tiga prompt. Langkah-langkah yang butuh jenis pemikiran berbeda adalah tempat alami untuk memecahnya.
  2. Tentukan format output setiap langkah sebelum menulis prompt-nya. Apa pun yang dipakai langkah berikutnya harus mudah dibaca dan mudah dicek: array JSON, daftar bernomor, tabel. Prosa bebas hanya cocok untuk langkah terakhir.
  3. Teruskan hanya yang dibutuhkan langkah berikutnya. Langkah 2 di atas menerima daftar keluhan, bukan ulasannya. Input yang lebih sedikit berarti lebih sedikit hal yang bisa mengalihkan perhatian, dan setiap langkah jadi bisa diuji secara terpisah.
  4. Tambahkan pengecekan di antara langkah-langkah. Di kode, parse JSON-nya dan pastikan field-field-nya ada. Untuk hal yang butuh penilaian, pengecekan itu sendiri bisa berupa prompt: "Apakah daftar ini berisi setiap keluhan di ulasan-ulasan ini? Jawab ya atau tidak, lalu sebutkan yang terlewat."
  5. Tandai materi yang ditempel dengan jelas. Input setiap langkah adalah teks yang dihasilkan oleh langkah sebelumnya, dan delimiter mencegah model membacanya sebagai instruksi baru.

Berikut langkah pengecekan untuk rantai di atas, dijalankan pada versi output langkah 1 yang melewatkan satu keluhan. Pengecekan seperti ini adalah prompt terpisah dengan satu pertanyaan yang sempit, jadi lebih mudah dikerjakan dengan benar daripada pengambilan datanya sendiri.

Cek sebuah langkah sebelum diteruskan
Bandingkan ulasan-ulasan di dalam tag <reviews> dengan daftar keluhan di dalam tag <complaints>. Apakah daftar itu berisi setiap keluhan di ulasan-ulasannya? Jawab "Lengkap" atau "Tidak lengkap" di baris pertama. Kalau tidak lengkap, sebutkan setiap keluhan yang terlewat beserta nomor ulasannya. <reviews> 1. Baterainya habis setelah 4 jam, dan kabel chargernya terlalu pendek. 2. Suaranya mantap. Tapi aplikasinya terus membuatku ter-logout. 3. Suka banget, tapi baterainya hampir tidak cukup untuk perjalanan pulangku. 4. Aplikasinya crash dua kali saat pairing, dan baterainya cepat habis. 5. Kabelnya sangat pendek sampai aku tidak bisa memakainya sambil mengecas di meja. </reviews> <complaints> Ulasan 1: Baterai habis setelah 4 jam Ulasan 1: Kabel charger terlalu pendek Ulasan 2: Aplikasi terus ter-logout Ulasan 3: Baterai tidak cukup untuk perjalanan Ulasan 4: Aplikasi crash saat pairing Ulasan 5: Kabel terlalu pendek untuk dipakai sambil mengecas </complaints>
Try it
Example replyReplies vary between models and runs.

Tidak lengkap

  • Ulasan 4: baterainya cepat habis

Kalau pengecekannya menjawab "Tidak lengkap", jalankan ulang langkah 1 atau tambahkan item yang terlewat secara manual sebelum langkah 2 berjalan.

Rantai di dalam kode

Di dalam kode, rantai adalah rangkaian pemanggilan di mana setiap prompt disusun dari jawaban sebelumnya. Versi ini memakai SDK Python milik Anthropic; bentuk yang sama bisa dipakai dengan penyedia mana pun.

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)

Baris json.loads adalah pengecekan yang paling sederhana: kalau langkah 1 menjawab dengan prosa, rantainya berhenti di situ alih-alih meneruskan input yang buruk. Rantai untuk produksi juga akan mengecek field-field-nya, menjalankan ulang langkah yang gagal sekali, dan mencatat setiap hasil perantara supaya jawaban akhir yang buruk bisa dilacak kembali ke langkah penyebabnya.

Prompt chaining di aplikasi chat

Kamu tidak butuh kode untuk merangkai prompt. Jalankan langkah 1, baca jawabannya, perbaiki apa pun yang salah, lalu tempelkan ke prompt langkah 2. Mengerjakan setiap langkah di chat baru membuat percakapan sebelumnya tidak ikut masuk ke konteks, jadi instruksi yang ditulis untuk satu langkah tidak memengaruhi langkah berikutnya. Tetap di satu chat lebih cepat dan cocok ketika langkah-langkahnya berkaitan erat, tapi seluruh riwayatnya ikut terbawa di setiap pesan baru.

Prompt chaining dibandingkan dengan teknik terkait

Chain of thought adalah penalaran yang dituliskan di dalam satu balasan; prompt chain adalah beberapa balasan di mana kamu yang mengendalikan apa yang diteruskan di antaranya. Keduanya bisa digabungkan dengan baik: langkah mana pun dalam sebuah rantai bisa meminta penalaran langkah demi langkah.

Dalam sebuah rantai, langkah-langkahnya kamu tetapkan dari awal. Ketika model sendiri yang memutuskan langkah apa yang berikutnya, misalnya mencari, membaca hasilnya, lalu memilih tindakan lain, polanya menjadi agent loop, yang dijelaskan di ReAct prompting. Rantai yang tetap lebih mudah diuji dan diprediksi, jadi rantai seperti itu adalah titik awal yang lebih baik setiap kali kamu sudah tahu langkah-langkahnya.

Pertanyaan yang sering diajukan

Apa itu prompt chaining?

Prompt chaining adalah teknik di mana kamu memecah sebuah tugas menjadi beberapa prompt yang berjalan satu demi satu, dan output setiap prompt dimasukkan ke prompt berikutnya. Misalnya, satu prompt mengambil keluhan dari ulasan, prompt kedua mengelompokkannya menjadi tema, dan prompt ketiga menulis laporan dari tema-tema itu.

Apa bedanya prompt chaining dengan chain of thought?

Chain of thought terjadi di dalam satu respons: model menuliskan penalarannya sebelum jawaban. Prompt chaining memakai beberapa pemanggilan terpisah, dan kamu atau kodemu meneruskan hasil satu pemanggilan ke pemanggilan berikutnya. Kamu bisa memeriksa, memperbaiki, atau menjalankan ulang satu langkah mana pun dalam sebuah rantai, sesuatu yang tidak bisa dilakukan dengan penalaran di dalam satu balasan.

Bisakah prompt chaining dilakukan di ChatGPT atau Claude tanpa kode?

Bisa. Jalankan prompt pertama, cek jawabannya, lalu tempelkan ke prompt berikutnya, entah di chat yang sama atau di chat baru. Memulai chat baru untuk setiap langkah mencegah draf dan instruksi sebelumnya memengaruhi langkah-langkah berikutnya.

Kapan sebaiknya memakai prompt chaining alih-alih satu prompt?

Pakai rantai ketika satu prompt meminta beberapa jenis pekerjaan yang berbeda, seperti mengambil data, menganalisis, dan menulis, atau ketika kamu perlu mengecek atau memakai ulang hasil perantara. Kalau satu prompt saja sudah memberikan jawaban yang bisa diandalkan, rantai hanya menambah pemanggilan, biaya, dan waktu tunggu.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai