Engineering prompt

Dalam modul AI Generatif, Anda telah mempelajari bahwa ruang input model AI generatif hampir tidak terbatas. Untuk menghasilkan output yang sesuai dengan ekspektasi pengguna, Anda perlu membuat perintah. Perintah adalah kontrak terstruktur antara aplikasi Anda dan model.

Perintah yang ditulis dengan baik:

  • Menyatakan cara LLM harus membangun responsnya.
  • Terdiri dari beberapa komponen yang dapat diberi versi, diuji, dan ditingkatkan seiring waktu.
  • Dapat bertindak sebagai artefak bersama untuk kolaborasi di seluruh tim.

Dalam modul ini, Anda akan mempelajari cara menulis perintah yang efektif. Kami menjelaskan struktur perintah dan cara komponennya didistribusikan antara sistem dan pengguna akhir. Anda juga akan mempelajari teknik perintah dasar dan skenario untuk menerapkan setiap teknik tersebut.

Di sepanjang modul ini, kita akan menggunakan contoh bersama: BlogBuddy, asisten penulisan yang didukung AI, yang terinspirasi oleh penggunaan Prompt API oleh CyberAgent.

Kembali ke modul AI generatif untuk cetak biru sistem BlogBuddy.

Komponen perintah

Setiap komponen perintah memiliki peran tertentu dalam mengarahkan perilaku model.

  • Konteks: Menetapkan peran dan domain model, sehingga model memahami cara berperilaku.
  • Instruksi: Menetapkan tugas tertentu ke model.
  • Variabel input: Konteks khusus situasi, yang disediakan oleh aplikasi Anda secara real-time.
  • Format output: Menentukan struktur output yang diharapkan. Misalnya, Anda mungkin menginginkan output JSON.
  • Contoh: Menunjukkan cara tugas harus dijalankan untuk satu atau beberapa input lainnya.
  • Batasan: Tetapkan batas yang jelas untuk menjaga output tetap konsisten, aman, dan sesuai merek.

Perintah Anda dapat menyertakan beberapa atau semua komponen ini. Contoh berikut menggambarkan komponen ini untuk fitur asisten penulisan BlogBuddy.

### Context

You are a writing assistant for blog authors.
Your job is to generate helpful, concise, and engaging content.

### Instruction

Generate 3 alternative titles for the user's blog post with a given style.

### Input variables

Here is the content of the blog post:
${blogPostContent}

Here is the desired style:
${titleStyle}

### Output format

Return valid JSON ONLY, in the following exact structure:
{
  "titles": ["Title option 1", "Title option 2", "Title option 3"]
}

### Examples

Example input:
{
  "blogPostContent": "I finally visited the small neighborhood café I've been eyeing for months...",
  "titleStyle": "friendly"
}

Example output:
{
  "titles": [
    "A First Visit to the Neighborhood Café",
    "Trying the Café I've Wanted to Visit for Months",
    "My Experience at a Long-Awaited Local Spot"
  ]
}
### Constraints

- Each title must be under 128 characters.
- Titles must be original, not copied verbatim from the draft.
- Keep the tone natural and human. Avoid emojis unless explicitly requested.
- Avoid sensationalism or clickbait.
- If the draft includes multiple topics, choose the most prominent topic.

Untuk perintah pertama, mulailah dengan hal-hal penting: petunjuk dan format output. Kemudian, tambahkan lebih banyak komponen secara iteratif saat Anda menganalisis hasilnya dan menentukan kontrol yang lebih baik yang diperlukan untuk meraih kesuksesan.

Perintah sistem versus perintah pengguna

Beberapa komponen perintah dikodekan secara permanen, sementara yang lain dapat disediakan oleh pengguna akhir:

  • Perintah sistem disediakan oleh developer aplikasi dan menentukan perilaku model secara keseluruhan. Hal ini dapat menetapkan peran model, gaya bahasa yang diharapkan, format output (seperti skema JSON yang ketat), dan batasan global apa pun. Perintah sistem juga merupakan tempat Anda mengenkode persyaratan keamanan dan tanggung jawab. Nilai ini tetap konsisten di seluruh permintaan dan memberikan fondasi yang stabil untuk perilaku model.

  • Perintah pengguna berisi permintaan langsung yang menghasilkan output. Pengguna meminta tugas tertentu, yang dapat mencakup variabel tertentu. Misalnya, "Tampilkan tiga judul untuk postingan ini", "Lanjutkan paragraf ini", atau "Buat teks ini terdengar lebih formal".

Sebagian besar API AI generatif memungkinkan Anda menyusun perintah sebagai array pesan, yang masing-masing memiliki peran (sistem atau pengguna) dan konten. Hal ini mempermudah pemisahan petunjuk global yang stabil dari input per permintaan yang dinamis.

Bagaimana Anda memutuskan komponen apa yang termasuk dalam perintah sistem dan apa yang harus dibiarkan ditentukan oleh pengguna? Jawabannya bergantung pada seberapa fleksibel pengalaman pengguna Anda dan seberapa mumpuni model Anda.

Kasus penggunaan yang dibatasi

Untuk kasus penggunaan yang sangat spesifik, sebagian besar perintah dapat ditentukan sebelumnya dalam perintah sistem. Misalnya, di BlogBuddy, pengguna dapat mengklik Tampilkan Judul untuk mencantumkan saran judul yang dihasilkan untuk draf mereka.

Tugas sudah diperbaiki, format output sudah diketahui, dan pengguna tidak perlu memberikan konteks tambahan untuk mendapatkan hasil yang diharapkan. Dalam hal ini, Anda menempatkan semua aturan stabil, panduan nada bahasa, skema output, dan contoh dalam perintah sistem.

Untuk membangunnya dengan Prompt API, kita akan menggunakan initialPrompts untuk menentukan perilaku tingkat sistem untuk seluruh sesi:

// Defines stable behavior for the entire session
const session = await LanguageModel.create({
  initialPrompts: [
    {
      role: "system",
      content: `You are a blog-writing assistant.
      Your task is to generate high-quality titles for blog posts.
      Always respond in concise, friendly language.
      Return exactly 3 alternative titles.
      Produce valid JSON with a "titles" array of strings.`
    }
  ]
});

Saat pengguna mengklik Tampilkan Judul, perintah akan dipanggil untuk konten saat ini:

// The only variable input is the blog content
const result = await session.prompt(blogContent);

Seiring waktu, pengguna mungkin meminta lebih banyak fleksibilitas dan kontrol. Dalam hal ini, Anda dapat memindahkan komponen tertentu ke perintah pengguna, dengan kontrol antarmuka. Misalnya, menu drop-down spesifikasi gaya atau nuansa.

Namun, terlalu banyak tindakan terstruktur dapat mengganggu pengalaman pengguna. Jika hal ini terjadi, Anda mungkin ingin beralih ke desain yang lebih terbuka yang memungkinkan pengguna menentukan sebagian besar perintah mereka sendiri. Anda akan mempelajari lebih lanjut cara mengoptimalkan desain ini di modul pola UX.

Tugas fleksibel mengandalkan perintah pengguna yang mendetail

Pengalaman interaktif yang terbuka dan membantu pengguna menulis postingan blog dari awal, memberikan fleksibilitas yang lebih besar bagi pengguna Anda. Mereka dapat meminta ide, kerangka, penulisan ulang, perubahan gaya bahasa, atau diskusi, atau menentukan secara persis bagaimana tugas harus dilakukan. Dengan jenis aplikasi ini, Anda mungkin memerlukan model sisi server yang lebih canggih.

Dengan tugas fleksibel, pengguna perlu menentukan lebih banyak informasi, karena kemungkinan rentang opsi jauh lebih luas. Perintah sistem masih mengatur keseluruhan perilaku.

Praktik terbaiknya adalah:

  • Masukkan aturan, struktur, dan contoh yang stabil dalam perintah sistem. Masukkan konten dinamis dan permintaan khusus tugas dalam perintah pengguna.
  • Semakin terbuka UX Anda, semakin banyak fleksibilitas yang dibutuhkan perintah pengguna untuk mengakomodasi input yang tidak dapat diprediksi.
  • Makin banyak pekerjaan yang harus dilakukan perintah pengguna, makin mumpuni model yang diperlukan, karena model harus menangani variasi yang lebih besar dengan struktur bawaan yang lebih sedikit.

Anda dapat menggunakan aturan ini untuk mengoptimalkan secara bertahap kompromi antara kontrol dan fleksibilitas pengguna dalam konteks produk Anda. Amati preferensi dan perilaku pengguna dengan cermat. Fleksibilitas yang lebih besar tidak selalu menghasilkan nilai yang sebenarnya. Pengguna Anda juga harus memiliki waktu, keterampilan, dan bandwidth kognitif untuk membuat perintah yang lebih panjang.

Teknik penulisan perintah umum

Developer biasanya mencoba beberapa teknik perintah untuk menemukan apa yang paling cocok untuk kasus penggunaan dan model mereka.

Zero-shot prompting

Anda mendeskripsikan tugas untuk model dan berharap yang terbaik. Contoh:

"What is the capital of France?"

Perintah zero-shot adalah dasar yang efisien untuk banyak tugas AI. Untuk permintaan yang tidak rumit, seperti mengkueri pengetahuan ensiklopedis, sebaiknya Anda tetap menggunakan teknik ini. Namun, dalam sebagian besar aplikasi dunia nyata, Anda perlu memperluas perintah dengan logika dan kondisi tambahan.

Few-shot prompting

Dengan perintah beberapa cuplikan, Anda memberikan contoh untuk menunjukkan perilaku, gaya, struktur, dan variabel penting lainnya yang tepat. Berikut contoh perintah untuk klasifikasi sentimen:

You classify user messages into one of the following categories:
- "positive"
- "negative"
- "neutral"
Here are examples to guide your classifications:
Input: "I love this product! It works perfectly."
Output: { "label": "positive" }

Input: "This is terrible. I want a refund."
Output: { "label": "negative" }

Few-shot prompting berguna untuk tugas pseudo-prediktif semacam ini. Hal ini juga dapat diterapkan pada tugas yang mengikuti struktur yang dapat dikenali, seperti pembuatan judul pada Gambar 1.

Jika ruang output sangat luas, seperti konten open-ended atau panjang, perintah few-shot kemungkinan bukan teknik terbaik. Sulit atau bahkan tidak mungkin memberikan contoh yang secara bermakna mencakup ruang tersebut.

Prompting chain-of-thought

Anda mendorong model untuk melakukan penalaran langkah demi langkah sebelum menghasilkan jawaban. Langkah-langkah dapat dijelaskan secara eksplisit, atau dapat diserahkan kepada model untuk menentukannya. Contoh:

"Think step-by-step to identify the main idea of this paragraph. Then produce a
short heading under 60 characters."

Teknik berpikir terstruktur sangat cocok untuk tugas yang memerlukan penalaran dan eksekusi multi-langkah, seperti membuat kerangka postingan blog atau mendukung keputusan yang kompleks. Teknik ini adalah teknik utama di balik model penalaran.

Hal ini bisa mahal. Membuat jejak penalaran langkah demi langkah akan meningkatkan komputasi, biaya, dan latensi. Gunakan hanya jika kasus penggunaan Anda memerlukan perencanaan dan penalaran yang kompleks.

Perintah refleksi diri

Setelah pembuatan awal, Anda meminta model untuk mengkritik dan merevisi outputnya sendiri. Contoh:

"Review your previous output.
Identify unclear phrasing and rewrite it more concisely."

Refleksi diri sangat berguna untuk tugas yang mendapatkan manfaat dari penyempurnaan iteratif, seperti alat pengeditan atau penulisan ulang. Fitur ini cepat diimplementasikan dan dapat menghasilkan peningkatan kualitas yang signifikan. Loop refleksi diri bermanfaat, setelah perintah Anda berperforma baik. Pertama, sempurnakan output agar lebih jelas atau menambah kesenangan pengguna.

Kesimpulan Anda

Dalam modul ini, Anda telah mempelajari cara membuat perintah dari komponen terstruktur. Dalam praktiknya, rekayasa perintah sangat bersifat eksperimental. Kejelasan dan keandalan baru muncul setelah beberapa kali penyempurnaan.

Di modul berikutnya, kita akan membahas Pengembangan perintah berbasis evaluasi. Praktik ini membantu Anda meningkatkan kualitas perintah secara sistematis dan menyatukan apa yang paling cocok untuk produk dan pengguna Anda.

Resource

Setiap teknik ini memiliki varian dan praktik terbaiknya sendiri. Ada berbagai referensi eksternal mendetail, misalnya:

Periksa dokumentasi model yang Anda pilih, karena mungkin ada saran khusus untuk Anda guna mendapatkan hasil terbaik.

Uji pemahaman Anda

Jenis aturan apa yang dapat Anda tentukan dalam perintah sistem?

Variabel input tertentu (seperti input pengguna), struktur output yang diharapkan, peran model, dan batas jumlah karakter.
Bagus, jawaban Anda benar.
Hanya input pengguna yang masuk ke sini.
Kurang tepat, coba lagi.
Untuk menetapkan peran dan domain model, sehingga model memahami cara berperilaku.
Kurang tepat, coba lagi.
Jenis model dan ukuran model yang Anda gunakan.
Bukan, coba lagi.

Teknik apa yang sebaiknya Anda gunakan jika ingin model melakukan penalaran langkah demi langkah sebelum menghasilkan jawaban?

Zero-shot prompting
Jawaban Anda salah.
Few-shot prompting
Jawaban Anda salah.
Prompting chain-of-thought
Bagus, jawaban Anda benar.
Perintah refleksi diri
Jawaban Anda salah.

Kapan few-shot prompting paling berguna?

Saat meminta model untuk melakukan tugas tanpa konteks apa pun.
Jawaban Anda salah.
Saat tugas mengikuti struktur yang dapat dikenali, seperti pembuatan judul) atau memerlukan pemformatan tertentu.
Bagus, jawaban Anda benar.
Saat ruang output sangat besar, seperti penulisan kreatif terbuka.
Jawaban Anda salah.
Saat Anda ingin model mengkritik karyanya sendiri.
Jawaban Anda salah.

Apa itu teknik penulisan perintah refleksi diri?

Meminta model untuk mengkritik dan merevisi outputnya sendiri untuk meningkatkan kejelasan atau kualitas.
Bagus, jawaban Anda benar.
Menjalankan perintah beberapa kali dan menghitung rata-rata hasilnya.
Jawaban Anda salah.
Meminta pengguna untuk menulis ulang perintah jika hasilnya buruk.
Jawaban Anda salah.
Mengizinkan model mengubah perintah sistem secara dinamis.
Jawaban Anda salah.