Rekayasa dengan Bijak

Panduan ini membagikan strategi dan taktik untuk mendapatkan hasil yang lebih baik dari model bahasa besar (terkadang disebut sebagai model GPT) seperti GPT-4. Metode yang dijelaskan di sini kadang-kadang dapat digunakan secara bersamaan untuk efek yang lebih besar. Kami mendorong eksperimen untuk menemukan metode-metode yang terbaik bagi Anda.

Beberapa contoh yang ditunjukkan di sini saat ini hanya berfungsi dengan model kami yang paling mampu, 'gpt-4'. Secara umum, jika Anda menemukan bahwa sebuah model gagal dalam suatu tugas dan model yang lebih mampu tersedia, seringkali layak untuk mencoba lagi dengan model yang lebih mampu.

Tips: Tutorial ini adalah terjemahan dari Panduan Rekayasa Tip Resmi OpenAI. Tutorial ini menjelaskan strategi/taktik menulis kata-kata tip, dan bagaimana memberi instruksi pada LLM untuk mengembalikan hasil yang diinginkan melalui inskripsi.

Enam strategi untuk mendapatkan hasil yang lebih baik

Menulis instruksi yang jelas

Model-model ini tidak bisa membaca pikiran Anda. Jika hasilnya terlalu panjang, minta balasan yang singkat. Jika hasilnya terlalu sederhana, minta tulisan tingkat ahli. Jika Anda tidak suka formatnya, tunjukkan format yang ingin Anda lihat. Semakin sedikit model harus menebak apa yang Anda inginkan, semakin besar kemungkinan Anda mendapatkannya.

Taktik:

  • Sertakan detail dalam pertanyaan Anda untuk mendapatkan jawaban yang lebih relevan
  • Mintalah model untuk mengadopsi suatu persona
  • Gunakan pembatas untuk jelas menunjukkan bagian-bagian berbeda dari input
  • Spesifikasikan langkah-langkah yang diperlukan untuk menyelesaikan suatu tugas
  • Berikan contoh
  • Spesifikasikan panjang keluaran yang diinginkan

Memberikan teks referensi

Model bahasa dapat dengan percaya diri membuat jawaban palsu, terutama ketika ditanyai tentang topik esoteris atau untuk kutipan dan URL. Dengan cara yang sama dengan secarik catatan dapat membantu seorang siswa mendapatkan hasil yang lebih baik dalam ujian, memberikan teks referensi kepada model-model ini dapat membantu dalam menjawab dengan lebih sedikit pembuatan.

Taktik:

  • Instruksikan model untuk menjawab menggunakan teks referensi
  • Instruksikan model untuk menjawab dengan kutipan dari teks referensi

Memisahkan tugas kompleks menjadi sub-tugas yang lebih sederhana

Sama halnya dengan praktik baik dalam rekayasa perangkat lunak untuk memecah suatu sistem kompleks menjadi serangkaian komponen modular, hal yang sama berlaku untuk tugas-tugas yang disampaikan ke model bahasa. Tugas-tugas kompleks cenderung memiliki tingkat kesalahan yang lebih tinggi daripada tugas-tugas yang lebih sederhana. Selain itu, tugas-tugas yang kompleks seringkali dapat didefinisikan ulang sebagai alur kerja dari tugas-tugas yang lebih sederhana di mana keluaran-keluaran dari tugas-tugas sebelumnya digunakan untuk membuat masukan untuk tugas-tugas berikutnya.

Taktik:

  • Gunakan klasifikasi niat untuk mengidentifikasi instruksi yang paling relevan untuk pertanyaan pengguna
  • Untuk aplikasi percakapan yang memerlukan percakapan yang sangat panjang, ringkas atau saring percakapan sebelumnya
  • Ringkas dokumen panjang secara bertahap dan bangun ringkasan penuh secara berulang-ulang

Beri waktu pada model untuk "berpikir"

Jika ditanyai untuk mengalikan 17 dengan 28, Anda mungkin tidak tahu jawabannya seketika, tetapi masih bisa menghitungnya dengan waktu. Demikian pula, model melakukan lebih banyak kesalahan penalaran saat mencoba menjawab segera, daripada dengan mengambil waktu untuk mencari jawaban. Meminta "alur pikir" sebelum sebuah jawaban dapat membantu model untuk berpikir dengan lebih zuhur menuju jawaban yang benar dengan lebih dapat diandalkan.

Taktik:

  • Instruksikan model untuk mencari solusinya sendiri sebelum terburu-buru pada kesimpulan
  • Gunakan monolog dalam batin atau sebuah urutan pertanyaan untuk menyembunyikan proses penalaran model
  • Tanyakan pada model jika ada yang terlewat dalam upaya-upaya sebelumnya

Gunakan alat eksternal

Perkuatlah kelemahan dari model dengan memberikannya keluaran dari alat-alat lain. Sebagai contoh, sistem temu kembali teks (kadang disebut juga RAG atau retrieval augmented generation) dapat memberi tahu model tentang dokumen-dokumen relevan. Sebuah mesin eksekusi kode seperti Penerjemah Kode OpenAI dapat membantu model melakukan perhitungan matematika dan menjalankan kode. Jika suatu tugas dapat dilakukan dengan lebih dapat diandalkan atau efisien oleh suatu alat daripada oleh model bahasa, serahkan pada alat tersebut untuk mendapatkan yang terbaik dari keduanya.

Taktik:

  • Gunakan penyarian berbasis embedding untuk menerapkan temu pengetahuan yang efisien
  • Gunakan eksekusi kode untuk melakukan perhitungan yang lebih akurat atau memanggil API eksternal
  • Beri model akses kepada fungsi-fungsi spesifik

Uji perubahan secara sistematis

Meningkatkan kinerja lebih mudah jika Anda dapat mengukurnya. Dalam beberapa kasus, modifikasi pada sebuah inskripsi akan mencapai kinerja yang lebih baik dalam beberapa contoh yang terisolasi namun akan mengakibatkan kinerja secara keseluruhan yang lebih buruk pada suatu set contoh yang lebih representatif. Oleh karena itu, untuk memastikan bahwa sebuah perubahan memberikan kinerja yang lebih baik secara keseluruhan, mungkin perlu untuk mendefinisikan rangkaian uji yang komprehensif (juga dikenal sebagai "eval").

Taktik:

  • Mengevaluasi keluaran model dengan merujuk pada jawaban-jawaban standar emas

Taktik

Setiap dari strategi yang tercantum di atas dapat diwujudkan dengan taktik-taktik tertentu. Taktik-taktik ini dimaksudkan untuk memberikan ide-ide untuk hal-hal yang perlu dicoba. Mereka sama sekali tidak lengkap, dan Anda seharusnya merasa bebas untuk mencoba ide-ide kreatif yang tidak terwakili di sini.

Deskripsi contoh kata kunci

Semua orang tahu bahwa API Model Obrolan yang memanggil OpenAI memiliki tiga jenis pesan, yaitu SISTEM, PENGGUNA, dan ASISTEN, dan fungsi dari ketiga pesan ini adalah sebagai berikut:

Jenis pesan (sesuai dengan parameter peran api) Deskripsi
SISTEM Pesan sistem membantu mengatur perilaku asisten. Misalnya, Anda dapat memodifikasi kepribadian asisten atau memberikan instruksi khusus tentang bagaimana seharusnya berperilaku sepanjang percakapan. Namun perlu diperhatikan bahwa pesan sistem bersifat opsional dan perilaku model tanpa pesan sistem kemungkinan akan mirip dengan menggunakan pesan generik seperti "Anda adalah asisten yang membantu."
PENGGUNA Pesan pengguna adalah masalah input pengguna.
ASISTEN Pesan bantuan mewakili apa yang GPT kembalikan.

Contoh dari kata kunci dalam tutorial ini akan dijelaskan dalam format berikut:

// Pesan SISTEM
Ini menunjukkan bagaimana mengatur kata kunci Pesan SISTEM.

// Pesan PENGGUNA
Ini menunjukkan bagaimana mengatur kata kunci Pesan PENGGUNA.

// Pesan ASISTEN
Ini menunjukkan apa yang mungkin dihasilkan oleh GPT.

Strategi: Tulis instruksi yang jelas

Taktik: Sertakan rincian dalam pertanyaan Anda untuk mendapatkan jawaban yang lebih relevan

Untuk mendapatkan tanggapan yang sangat relevan, pastikan bahwa permintaan menyediakan setiap detail atau konteks penting. Jika tidak, Anda membiarkan model menebak apa yang Anda maksudkan.

Buruk Lebih Baik
Bagaimana cara menambahkan angka di Excel? Bagaimana cara menambahkan jumlah dari sejumlah angka pada Excel? Saya ingin melakukan ini secara otomatis untuk seluruh lembar dengan semua total berakhir di sebelah kanan di kolom yang disebut "Total".
Siapa presidennya? Siapa presiden Meksiko pada tahun 2021, dan seberapa sering pemilihan diadakan?
Tulis kode untuk menghitung deret Fibonacci. Tulis fungsi TypeScript untuk menghitung deret Fibonacci dengan efisien. Berikan komentar pada kode secara detail untuk menjelaskan setiap bagian dan mengapa ditulis seperti itu.
Ringkas catatan rapat. Ringkaskan catatan rapat dalam satu paragraf. Kemudian buat daftar dalam format markdown dari para pembicara dan masing-masing poin kuncinya. Terakhir, sebutkan langkah-langkah selanjutnya atau item tindakan yang disarankan oleh para pembicara, jika ada.

Taktik: Minta model untuk mengadopsi persona

Pesan sistem dapat digunakan untuk menentukan persona yang digunakan oleh model dalam balasannya.

// Pesan SISTEM
Ketika saya meminta bantuan untuk menulis sesuatu, Anda akan membalas dengan dokumen yang berisi setidaknya satu lelucon atau komentar playful di setiap paragraf. 

// Pesan PENGGUNA
Tulis catatan terima kasih kepada pemasok baut baja saya atas pengiriman tepat waktu dan dengan pemberitahuan singkat. Ini memungkinkan kami untuk mengirim pesanan penting.

Taktik: Gunakan pemisah untuk dengan jelas menandai bagian-bagian berbeda dari input

Pemisah seperti tanda kutip tiga kali lipat, tag XML, judul bagian, dll. dapat membantu menandai bagian-bagian teks yang akan diolah secara berbeda.

// Pesan PENGGUNA
Ringkas teks yang diapit oleh tanda kutip tiga kali lipat dengan sebuah haiku. 

"""masukkan teks di sini"""
// Pesan SISTEM
Anda akan diberikan sepasang artikel (diapit tag XML) tentang topik yang sama. Pertama, ringkas argumen dari masing-masing artikel. Kemudian tunjukkan artikel mana yang memiliki argumen yang lebih baik dan jelaskan alasannya. 

// Pesan PENGGUNA
<article> masukkan artikel pertama di sini </article>
<article> masukkan artikel kedua di sini </article>
// Pesan SISTEM
Anda akan diberikan abstrak tesis dan judul yang disarankan untuk itu. Judul tesis harus memberi pembaca gambaran yang baik tentang topik tesis tetapi juga menarik perhatian. Jika judul tidak memenuhi kriteria tersebut, usulkan 5 alternatif. 

// Pesan PENGGUNA

Abstrak: masukkan abstrak di sini

Judul: masukkan judul di sini

Untuk tugas yang sederhana seperti ini, penggunaan pemisah mungkin tidak membuat perbedaan dalam kualitas output. Namun, semakin kompleks suatu tugas, semakin penting untuk menjelaskan detail tugas. Jangan biarkan model bekerja untuk memahami dengan tepat apa yang Anda minta dari mereka.

Taktik: Menentukan langkah-langkah yang diperlukan untuk menyelesaikan sebuah tugas

Beberapa tugas terbaik ditentukan sebagai urutan langkah-langkah. Menuliskan langkah-langkah dengan eksplisit bisa memudahkan model untuk mengikutinya.

// PESAN SISTEM

Gunakan instruksi langkah demi langkah berikut untuk merespons masukan pengguna.

Langkah 1 - Pengguna akan memberi Anda teks dalam tanda kutip tiga. Ringkas teks ini dalam satu kalimat dengan awalan yang mengatakan "Ringkasan: ".

Langkah 2 - Terjemahkan ringkasan dari Langkah 1 ke dalam bahasa Spanyol, dengan awalan yang mengatakan "Terjemahan: ".

// PESAN PENGGUNA
"""masukkan teks di sini"""

Taktik: Memberikan contoh

Memberikan instruksi umum yang berlaku untuk semua contoh umumnya lebih efisien daripada mendemonstrasikan semua variasi tugas melalui contoh, tetapi dalam beberapa kasus memberikan contoh mungkin lebih mudah. Misalnya, jika Anda bermaksud agar model menyalin gaya tertentu dalam merespons pertanyaan pengguna yang sulit untuk dijelaskan secara eksplisit. Ini dikenal sebagai "few-shot" prompting.

// PESAN SISTEM
Berikan jawaban dalam gaya yang konsisten.

// PESAN PENGGUNA
Ajarilah saya tentang kesabaran.

// PESAN ASISTEN
Sungai yang membentuk lembah terdalam mengalir dari mata air yang sederhana; simfoni terbesar bermula dari satu not; kain tenun paling rumit dimulai dari seutas benang yang sendirian.

// PESAN PENGGUNA
Ajarilah saya tentang samudera.

Taktik: Tentukan panjang output yang diinginkan

Anda dapat meminta model untuk menghasilkan output dengan panjang target tertentu. Panjang output yang ditargetkan dapat ditentukan dalam hal jumlah kata, kalimat, paragraf, poin-poin, dll. Namun, perlu diperhatikan bahwa memerintahkan model untuk menghasilkan jumlah kata tertentu tidak selalu akurat. Model lebih dapat menghasilkan output dengan jumlah paragraf atau poin-poin yang spesifik.

// PESAN PENGGUNA

Ringkaskan teks yang dibatasi oleh tanda kutip tiga sekitar 50 kata.

"""masukkan teks di sini"""
// PESAN PENGGUNA

Ringkaskan teks yang dibatasi oleh tanda kutip tiga dalam 2 paragraf.

"""masukkan teks di sini"""
// PESAN PENGGUNA

Ringkaskan teks yang dibatasi oleh tanda kutip tiga dalam 3 poin-poin.

"""masukkan teks di sini"""

Strategi: Beri teks referensi

Taktik: Instruksikan model untuk menjawab dengan teks referensi

Jika kita dapat memberikan model dengan informasi tepercaya yang relevan dengan pertanyaan saat ini, maka kita dapat menginstruksikan model menggunakan informasi yang diberikan untuk menyusun jawabannya.

// PESAN SISTEM
Gunakan artikel yang diberikan yang dibatasi oleh tanda kutip tiga untuk menjawab pertanyaan. Jika jawabannya tidak dapat ditemukan di artikel, tulis "Saya tidak dapat menemukan jawabannya."

// PESAN PENGGUNA
<masukkan artikel, masing-masing dibatasi oleh tanda kutip tiga>

Pertanyaan: <masukkan pertanyaan di sini>

Mengingat semua model memiliki jendela konteks yang terbatas, kita memerlukan cara untuk mencari informasi secara dinamis yang relevan dengan pertanyaan yang diajukan. Embeddings dapat digunakan untuk mengimplementasikan pencarian pengetahuan yang efisien. Lihat taktik "Gunakan pencarian berbasis embedding untuk mengimplementasikan pencarian pengetahuan yang efisien" untuk detail lebih lanjut tentang cara mengimplementasikannya.

Taktik: Instruksikan model untuk menjawab dengan kutipan dari teks referensi

Jika input telah dilengkapi dengan pengetahuan yang relevan, maka mudah untuk meminta model menambahkan kutipan ke jawabannya dengan merujuk pada bagian-bagian dari dokumen yang disediakan. Perhatikan bahwa kutipan dalam output kemudian dapat diverifikasi secara programatik dengan mencocokkan string di dalam dokumen-dokumen yang disediakan.

// PESAN SISTEM
Anda akan diberikan dokumen yang dibatasi oleh tanda kutip tiga dan sebuah pertanyaan. Tugas Anda adalah menjawab pertanyaan hanya dengan menggunakan dokumen yang disediakan dan menyertakan kutipan dari dokumen yang digunakan untuk menjawab pertanyaan. Jika dokumen tidak berisi informasi yang diperlukan untuk menjawab pertanyaan ini, tulis saja: "Informasi tidak mencukupi." Jika jawaban atas pertanyaan diberikan, harus dicatat dengan sebuah kutipan. Gunakan format berikut untuk merujuk pada bagian yang relevan ({"kutipan": …}).

// PESAN PENGGUNA

"""<masukkan dokumen di sini>"""

Pertanyaan: <masukkan pertanyaan di sini>

Taktik: Gunakan klasifikasi tujuan untuk mengidentifikasi instruksi yang paling relevan untuk pertanyaan pengguna

Untuk tugas-tugas di mana banyak set instruksi independen diperlukan untuk menangani kasus-kasus yang berbeda, dapat bermanfaat untuk pertama-tama mengklasifikasikan jenis pertanyaan dan menggunakan klasifikasi tersebut untuk menentukan instruksi yang diperlukan. Hal ini dapat dicapai dengan mendefinisikan kategori-kategori tertentu dan mengkodekan secara kaku instruksi yang relevan untuk menangani tugas dalam kategori tertentu. Proses ini juga dapat diterapkan secara rekursif untuk memecah tugas menjadi urutan tahap-tahap. Kelebihan dari pendekatan ini adalah setiap pertanyaan hanya akan mengandung instruksi yang diperlukan untuk melakukan tahap berikutnya dari suatu tugas, yang dapat menghasilkan tingkat kesalahan yang lebih rendah dibandingkan dengan menggunakan satu pertanyaan untuk melakukan seluruh tugas. Hal ini juga dapat mengakibatkan biaya yang lebih rendah karena prompt yang lebih besar membutuhkan biaya yang lebih tinggi untuk dijalankan.

Misalkan contohnya untuk aplikasi layanan pelanggan, pertanyaan-pertanyaan dapat diklasifikasikan sebagai berikut:

// SYSTEM Message
Anda akan diberikan pertanyaan-pertanyaan layanan pelanggan. Klasifikasikan setiap pertanyaan ke dalam kategori primer dan kategori sekunder. Berikan output dalam format json dengan kunci: primer dan sekunder.

Kategori primer: Penagihan, Dukungan Teknis, Pengelolaan Akun, atau Pertanyaan Umum.

Kategori sekunder Penagihan:
- Berhenti langganan atau upgrade
- Menambahkan metode pembayaran
- Penjelasan untuk tagihan
- Mempermasalahkan tagihan

Kategori sekunder Dukungan Teknis:
- Memecahkan masalah
- Kompatibilitas perangkat
- Pembaruan perangkat lunak

Kategori sekunder Pengelolaan Akun:
- Reset password
- Memperbarui informasi pribadi
- Menutup akun
- Keamanan akun

Kategori sekunder Pertanyaan Umum:
- Informasi produk
- Harga
- Umpan balik
- Berbicara dengan manusia

// USER Message
Saya perlu mengaktifkan kembali koneksi internet saya.

Berdasarkan klasifikasi dari pertanyaan pelanggan, sejumlah instruksi yang lebih spesifik dapat diberikan kepada model untuk menangani langkah-langkah selanjutnya. Misalnya, misalkan pelanggan memerlukan bantuan dengan "memecahkan masalah".

// SYSTEM Message
Anda akan diberikan pertanyaan-pertanyaan layanan pelanggan yang memerlukan pemecahan masalah dalam konteks dukungan teknis. Bantu pengguna dengan:

- Mintalah mereka untuk memeriksa semua kabel ke/dari router yang terhubung. Perhatikan bahwa seringkali kabel-kabel tersebut menjadi longgar dari waktu ke waktu.
- Jika semua kabel terhubung dan masalah tetap ada, mintalah jenis model router yang mereka gunakan.
- Sekarang Anda akan memberikan nasihat kepada mereka cara me-restart perangkat mereka:
-- Jika nomor modelnya adalah MTD-327J, beri tahu mereka untuk menekan tombol merah dan tahan selama 5 detik, lalu tunggu 5 menit sebelum menguji koneksi.
-- Jika nomor modelnya adalah MTD-327S, beri tahu mereka untuk mencabut dan menyambungkan kembali, lalu tunggu 5 menit sebelum menguji koneksi.
- Jika masalah pelanggan tetap setelah me-restart perangkat dan menunggu 5 menit, hubungkan mereka ke dukungan TI dengan output {"Pendukungan TI diminta"}.
- Jika pengguna mulai bertanya hal-hal yang tidak terkait dengan topik ini, maka konfirmasikan apakah mereka ingin mengakhiri percakapan saat ini mengenai pemecahan masalah dan klasifikasikan permintaan mereka sesuai dengan skema berikut:

<masukkan skema klasifikasi primer/sekunder dari atas di sini>

// USER Message
Saya perlu mengaktifkan kembali koneksi internet saya.

Perhatikan bahwa model telah diinstruksikan untuk mengeluarkan string khusus untuk menunjukkan kapan status percakapan berubah. Hal ini memungkinkan kami untuk mengubah sistem kami menjadi mesin keadaan di mana keadaan menentukan instruksi yang disisipkan. Dengan melacak keadaan, instruksi apa yang relevan pada keadaan tersebut, dan juga opsionalnya transisi keadaan apa yang diperbolehkan dari keadaan tersebut, kami dapat menempatkan pengamanan di sekitar pengalaman pengguna yang sulit untuk dicapai dengan pendekatan yang kurang terstruktur.

Taktik: Untuk aplikasi percakapan yang memerlukan percakapan sangat panjang, ringkas atau saring percakapan sebelumnya

Karena model memiliki panjang konteks yang tetap, percakapan antara pengguna dan asisten di mana seluruh percakapan disertakan dalam jendela konteks tidak dapat berlanjut tanpa batas.

Ada berbagai cara untuk mengatasi masalah ini, salah satunya adalah dengan merangkum giliran sebelumnya dalam percakapan. Begitu ukuran input mencapai panjang ambang tertentu, hal ini dapat memicu pertanyaan yang merangkum bagian percakapan dan rangkuman percakapan sebelumnya dapat disertakan sebagai bagian dari pesan sistem. Sebagai alternatif, percakapan sebelumnya dapat dirangkum secara asinkron dalam latar belakang sepanjang seluruh percakapan.

Solusi alternatif adalah dengan dinamis memilih bagian percakapan sebelumnya yang paling relevan dengan pertanyaan saat ini. Lihat taktik "Gunakan pencarian berbasis embedding untuk menerapkan pencarian pengetahuan yang efisien".

Taktik: Merangkum dokumen panjang secara bertahap dan membangun ringkasan penuh secara rekursif

Karena model memiliki panjang konteks yang tetap, mereka tidak dapat digunakan untuk merangkum teks yang lebih panjang daripada panjang konteks dikurangi panjang ringkasan yang dihasilkan dalam satu permintaan.

Untuk merangkum dokumen yang sangat panjang seperti buku, kita dapat menggunakan rangkaian permintaan untuk merangkum setiap bagian dokumen. Ringkasan bagian dapat digabungkan dan disusun untuk menghasilkan ringkasan dari ringkasan. Proses ini dapat dilakukan secara rekursif hingga seluruh dokumen diringkas. Jika diperlukan informasi tentang bagian-bagian sebelumnya untuk memberikan makna pada bagian-bagian selanjutnya, maka trik lain yang dapat berguna adalah dengan menyertakan ringkasan berjalan dari teks yang mendahului titik tertentu dalam buku ketika merangkum konten pada titik tersebut. Efektivitas prosedur ini untuk merangkum buku telah dikaji dalam penelitian sebelumnya oleh OpenAI menggunakan varian GPT-3.

Strategi: Beri waktu pada model untuk "berpikir"

Taktik: Instruksikan model untuk mencari solusinya sendiri sebelum terburu-buru membuat kesimpulan

Terkadang hasil yang lebih baik dapat kita dapatkan ketika secara eksplisit menginstruksikan model untuk berpikir dari prinsip dasar sebelum sampai pada suatu kesimpulan. Misalkan kita ingin model mengevaluasi solusi seorang siswa terhadap suatu masalah matematika. Cara paling jelas untuk menghadapi ini adalah dengan hanya bertanya pada model apakah solusi siswa itu benar atau tidak.

// Pesan SISTEM
Tentukan apakah solusi siswa itu benar atau tidak.

// Pesan PENGGUNA
Pernyataan Masalah: Saya sedang membangun instalasi tenaga surya dan memerlukan bantuan dalam menghitung keuangan.
- Biaya tanah adalah $100 per kaki persegi
- Saya bisa membeli panel surya seharga $250 per kaki persegi
- Saya bernegosiasi kontrak pemeliharaan yang akan biayai saya sebanyak $100 ribu pertahun, dan tambahan $10 per kaki persegi.
Berapakah total biaya untuk tahun pertama operasi sebagai fungsi dari jumlah kaki persegi.

Solusi Siswa: Biarkan x menjadi ukuran instalasi dalam kaki persegi.
1. Biaya tanah: 100x
2. Biaya panel surya: 250x
3. Biaya pemeliharaan: 100,000 + 100x
Total biaya: 100x + 250x + 100,000 + 100x = 450x + 100,000

// Pesan ASISTEN
Solusi siswa itu benar.

Namun, solusi siswa sebenarnya tidak benar! Kita dapat membuat model dengan sukses menyadari hal ini dengan meminta model untuk menghasilkan solusinya sendiri terlebih dahulu.

// Pesan SISTEM
Pertama-tama kerjakanlah solusi masalah tersebut sendiri. Kemudian bandingkan solusi Anda dengan solusi siswa dan evaluasi apakah solusi siswa itu benar atau tidak. Jangan memutuskan apakah solusi siswa itu benar sampai Anda menyelesaikan masalah tersebut sendiri.

// Pesan PENGGUNA
Pernyataan Masalah: Saya sedang membangun instalasi tenaga surya dan memerlukan bantuan dalam menghitung keuangan.
- Biaya tanah adalah $100 per kaki persegi
- Saya bisa membeli panel surya seharga $250 per kaki persegi
- Saya bernegosiasi kontrak pemeliharaan yang akan biayai saya sebanyak $100 ribu pertahun, dan tambahan $10 per kaki persegi.
Berapakah total biaya untuk tahun pertama operasi sebagai fungsi dari jumlah kaki persegi.

Solusi Siswa: Biarkan x menjadi ukuran instalasi dalam kaki persegi.
1. Biaya tanah: 100x
2. Biaya panel surya: 250x
3. Biaya pemeliharaan: 100,000 + 100x
Total biaya: 100x + 250x + 100,000 + 100x = 450x + 100,000

// Pesan ASISTEN
Biarkan x menjadi ukuran instalasi dalam kaki persegi.
1. Biaya tanah: 100x
2. Biaya panel surya: 250x
3. Biaya pemeliharaan: 100,000 + 10x
Total biaya: 100x + 250x + 100,000 + 10x = 360x + 100,000

Solusi siswa itu salah. Mereka membuat kesalahan dalam perhitungan biaya pemeliharaan, menggunakan 100x daripada 10x. Total biaya yang benar untuk tahun pertama operasi adalah 360x + 100,000.

Taktik: Gunakan monolog dalam batin atau serangkaian pertanyaan untuk menyembunyikan proses penalaran model

Taktik sebelumnya menunjukkan bahwa terkadang penting bagi model untuk menalar secara rinci tentang suatu masalah sebelum menjawab pertanyaan tertentu. Untuk beberapa aplikasi, proses penalaran yang digunakan oleh model untuk sampai pada jawaban akhir akan tidak pantas untuk dibagikan dengan pengguna. Misalnya, dalam aplikasi bimbingan belajar, kita mungkin ingin mendorong siswa untuk mencari jawaban mereka sendiri, tetapi proses penalaran model tentang solusi siswa dapat mengungkapkan jawaban kepada siswa.

Monolog dalam batin adalah taktik yang dapat digunakan untuk mengurangi hal ini. Ide dari monolog dalam batin adalah menyuruh model untuk menempatkan bagian-bagian output yang seharusnya disembunyikan dari pengguna ke dalam format terstruktur yang memudahkan untuk menguraikannya. Kemudian sebelum mempersembahkan output kepada pengguna, output tersebut diuraikan dan hanya bagian dari output tersebut yang dibuat terlihat.

// PESAN SISTEM
Ikuti langkah-langkah ini untuk menjawab pertanyaan pengguna.

Langkah 1 - Pertama, kerjakan solusi Anda sendiri untuk masalah tersebut. Jangan hanya mengandalkan solusi siswa karena mungkin solusinya salah. Masukkan semua pekerjaan Anda untuk langkah ini di dalam tiga tanda kutip (""").

Langkah 2 - Bandingkan solusi Anda dengan solusi siswa dan evaluasi apakah solusi siswa itu benar atau tidak. Masukkan semua pekerjaan Anda untuk langkah ini di dalam tiga tanda kutip (""").

Langkah 3 - Jika siswa melakukan kesalahan, tentukan petunjuk apa yang bisa Anda berikan kepada siswa tanpa memberikan jawabannya. Masukkan semua pekerjaan Anda untuk langkah ini di dalam tiga tanda kutip (""").

Langkah 4 - Jika siswa melakukan kesalahan, berikan petunjuk dari langkah sebelumnya kepada siswa (di luar tiga tanda kutip). Daripada menulis "Langkah 4 - ..." tulis "Petunjuk:".

// PESAN PENGGUNA
Pernyataan Masalah: <masukkan pernyataan masalah>

Solusi Siswa: <masukkan solusi siswa>

Sebagai alternatif, ini bisa dicapai dengan serangkaian pertanyaan di mana semua kecuali yang terakhir memiliki outputnya disembunyikan dari pengguna.

Pertama, kita bisa meminta model untuk menyelesaikan masalahnya sendiri. Karena pertanyaan awal ini tidak memerlukan solusi siswa, itu bisa dihilangkan. Ini memberikan keuntungan tambahan bahwa tidak ada peluang bahwa solusi model akan dipengaruhi oleh solusi siswa yang telah dicoba.

// PESAN PENGGUNA
<masukkan pernyataan masalah>

Selanjutnya, kita bisa meminta model untuk menggunakan semua informasi yang tersedia untuk menilai kebenaran solusi siswa.

// PESAN SISTEM
Bandingkan solusi Anda dengan solusi siswa dan evaluasi apakah solusi siswa itu benar atau tidak.

// PESAN PENGGUNA
Pernyataan masalah: """<masukkan pernyataan masalah>"""

Solusi Anda: """<masukkan solusi yang dihasilkan oleh model>"""

Solusi Siswa: """<masukkan solusi siswa>"""

Terakhir, kita bisa membiarkan model menggunakan analisisnya sendiri untuk menyusun balasan dalam persona seorang tutor yang membantu.

// PESAN SISTEM
Anda adalah seorang tutor matematika. Jika siswa membuat kesalahan, berikan petunjuk kepada siswa tanpa mengungkapkan jawabannya. Jika siswa tidak membuat kesalahan, berikan komentar yang memberikan semangat kepada mereka.

// PESAN PENGGUNA
Pernyataan masalah: """<masukkan pernyataan masalah>"""

Solusi Anda: """<masukkan solusi yang dihasilkan oleh model>"""

Solusi Siswa: """<masukkan solusi siswa>"""

Analisis: """<masukkan analisis yang dihasilkan oleh model dari langkah sebelumnya>"""

Taktik: Tanyakan kepada model apakah ada yang terlewat pada percobaan sebelumnya

Misalkan kita menggunakan model untuk menyebutkan cuplikan dari sebuah sumber yang relevan dengan pertanyaan tertentu. Setelah menyebutkan setiap cuplikan, model perlu menentukan apakah ia harus mulai menulis cuplikan lain atau apakah ia harus berhenti. Jika dokumen sumbernya besar, seringkali model akan berhenti terlalu dini dan gagal untuk mencantumkan semua cuplikan yang relevan. Dalam kasus tersebut, kinerja yang lebih baik seringkali dapat diperoleh dengan meminta model dengan pertanyaan lanjutan untuk menemukan cuplikan apa pun yang terlewat pada percobaan sebelumnya.

// PESAN SISTEM
Anda akan diberikan sebuah dokumen yang dibatasi oleh tanda kutip tiga. Tugas Anda adalah memilih cuplikan yang berkaitan dengan pertanyaan berikut: "Perubahan paradigma signifikan apa yang terjadi dalam sejarah kecerdasan buatan."

Pastikan cuplikan mencakup semua konteks relevan yang diperlukan untuk menginterpretasikannya - dengan kata lain, jangan mencantumkan potongan kecil yang tidak memiliki konteks penting. Sajikan output dalam format JSON sebagai berikut:

[{"cuplikan": "..."},
...
{"cuplikan": "..."}]

// PESAN PENGGUNA
"""<masukkan dokumen di sini>"""

// PESAN ASISTEN
[{"cuplikan": "model menulis cuplikan di sini"},
...
{"cuplikan": "model menulis cuplikan lain di sini"}]

// PESAN PENGGUNA
Apakah ada cuplikan yang lebih relevan? Pastikan tidak mengulangi cuplikan. Pastikan juga bahwa cuplikan mencakup semua konteks relevan yang diperlukan untuk menginterpretasikannya - dengan kata lain, jangan mencantumkan potongan kecil yang tidak memiliki konteks penting.

Strategi: Menggunakan alat eksternal

Taktik: Gunakan pencarian berbasis embedding untuk menerapkan pengambilan pengetahuan yang efisien

Sebuah model dapat memanfaatkan sumber informasi eksternal jika disediakan sebagai bagian dari masukan. Hal ini dapat membantu model untuk menghasilkan jawaban yang lebih terinformasi dan terkini. Sebagai contoh, jika pengguna bertanya tentang film tertentu, mungkin berguna untuk menambahkan informasi berkualitas tinggi tentang film tersebut (misalnya, aktor, sutradara, dll.) ke dalam masukan model. Embedding dapat digunakan untuk menerapkan pengambilan pengetahuan yang efisien, sehingga informasi yang relevan dapat ditambahkan ke dalam masukan model secara dinamis saat berjalan.

Sebuah embedding teks adalah vektor yang dapat mengukur keterkaitan antara string teks. String yang mirip atau relevan akan lebih dekat daripada string yang tidak terkait. Fakta ini, bersama dengan adanya algoritma pencarian vektor yang cepat, berarti bahwa embedding dapat digunakan untuk menerapkan pengambilan pengetahuan yang efisien. Secara khusus, korpus teks dapat dibagi menjadi bagian-bagian, dan setiap bagian dapat di-embedding dan disimpan. Kemudian sebuah kueri yang diberikan dapat di-embedding dan pencarian vektor dapat dilakukan untuk menemukan bagian teks yang di-embedded dari korpus yang paling terkait dengan kueri (yaitu, paling dekat secara bersamaan dalam ruang embedding).

Taktik: Gunakan eksekusi kode untuk melakukan perhitungan yang lebih akurat atau memanggil API eksternal

Model bahasa tidak dapat diandalkan untuk melakukan perhitungan aritmatika atau perhitungan panjang secara akurat sendiri. Dalam kasus di mana ini diperlukan, sebuah model dapat diinstruksikan untuk menulis dan menjalankan kode alih-alih melakukan perhitungan sendiri. Secara khusus, sebuah model dapat diinstruksikan untuk meletakkan kode yang dimaksudkan untuk dijalankan ke dalam format yang ditentukan seperti tiga backtick. Setelah keluaran dihasilkan, kode dapat diekstrak dan dijalankan. Terakhir, jika perlu, keluaran dari mesin eksekusi kode (yaitu, interpreter Python) dapat diberikan sebagai masukan ke model untuk kueri berikutnya.

// Pesan SISTEM

Anda dapat menulis dan menjalankan kode Python dengan memasukkannya di antara tiga backtick, contohnya ```kode di sini```. Gunakan fitur ini untuk melakukan perhitungan.

// Pesan PENGGUNA

Temukan semua akar bernilai riil dari persamaan polinomial berikut: 3*x**5 - 5*x**4 - 3*x**3 - 7*x - 10.

Penggunaan lain yang baik untuk eksekusi kode adalah memanggil API eksternal. Jika sebuah model diinstruksikan dalam penggunaan yang tepat dari suatu API, ia dapat menulis kode yang memanfaatkannya. Sebuah model dapat diinstruksikan dalam cara menggunakan API dengan menyediakan dokumentasi dan/atau contoh kode yang menunjukkan cara menggunakan API tersebut.

// Pesan SISTEM

Anda dapat menulis dan menjalankan kode Python dengan memasukkannya di antara tiga backtick. Selain itu, perhatikan bahwa Anda memiliki akses ke modul berikut untuk membantu pengguna mengirim pesan kepada teman-teman mereka:

\`\`\`python
import message
message.write(to="John", message="Hai, mau ketemu setelah kerja?")\`\`\`

PERINGATAN: Menjalankan kode yang dihasilkan oleh sebuah model tidak secara inheren aman dan tindakan pencegahan harus diambil dalam setiap aplikasi yang bermaksud melakukan hal ini. Secara khusus, lingkungan eksekusi kode yang terisolasi diperlukan untuk membatasi kerusakan yang dapat disebabkan oleh kode yang tidak dipercayai.

Taktik: Berikan model akses ke fungsi-fungsi spesifik

API Lengkap Percakapan memungkinkan menyampaikan daftar deskripsi fungsi dalam permintaan. Ini memungkinkan model untuk menghasilkan argumen fungsi sesuai dengan skema yang diberikan. Argumen fungsi yang dihasilkan dikembalikan oleh API dalam format JSON dan dapat digunakan untuk menjalankan panggilan fungsi. Keluaran yang diberikan oleh panggilan fungsi kemudian dapat dimasukkan kembali ke model dalam permintaan berikutnya untuk menutup lingkaran. Inilah cara yang disarankan untuk menggunakan model OpenAI untuk memanggil fungsi eksternal.

Strategi: Uji perubahan secara sistematis

Terkadang sulit untuk menentukan apakah suatu perubahan — misalnya, instruksi baru atau desain baru — membuat sistem Anda menjadi lebih baik atau lebih buruk. Melihat beberapa contoh mungkin memberi petunjuk tentang mana yang lebih baik, tetapi dengan ukuran sampel kecil, sulit untuk membedakan antara peningkatan nyata atau keberuntungan semata. Mungkin perubahan tersebut meningkatkan kinerja pada beberapa input, tetapi merugikan kinerja pada yang lain.

Prosedur evaluasi (atau "evaluasi") berguna untuk mengoptimalkan desain sistem. Evaluasi yang baik adalah:

  • Mewakili penggunaan dunia nyata (atau setidaknya beragam)
  • Berisi banyak kasus uji untuk kekuatan statistik yang lebih besar (lihat tabel di bawah untuk panduan)
  • Mudah diotomatisasi atau diulang
Perbedaan yang ingin dideteksi Ukuran sampel yang diperlukan untuk kepercayaan 95%
30% ~10
10% ~100
3% ~1,000
1% ~10,000

Evaluasi hasil dapat dilakukan oleh komputer, manusia, atau kombinasi keduanya. Komputer dapat mengotomatisasi evaluasi dengan kriteria objektif (misalnya, pertanyaan dengan jawaban benar tunggal) dan juga beberapa kriteria subjektif atau kabur, di mana output model dievaluasi oleh kueri model lain. OpenAI Evals adalah kerangka perangkat lunak sumber terbuka yang menyediakan alat untuk membuat evaluasi otomatis.

Evaluasi berbasis model dapat bermanfaat ketika ada berbagai output yang akan dianggap sama berkualitas tinggi (misalnya, untuk pertanyaan dengan jawaban panjang). Batas antara apa yang dapat dievaluasi secara realistis dengan evaluasi berbasis model dan apa yang memerlukan evaluasi manusia adalah kabur dan terus berubah seiring dengan kemampuan model. Kami mendorong eksperimen untuk mencari tahu seberapa baik evaluasi berbasis model bisa bekerja untuk kasus penggunaan Anda.

Taktik: Mengevaluasi keluaran model dengan merujuk ke jawaban standar emas

Misalkan diketahui bahwa jawaban yang benar untuk suatu pertanyaan harus merujuk pada kumpulan fakta yang spesifik. Maka kita dapat menggunakan kueri model untuk menghitung berapa banyak fakta yang diperlukan telah disertakan dalam jawaban.

Sebagai contoh, menggunakan pesan sistem berikut:

// Pesan Sistem
Anda akan diberikan teks yang dibatasi oleh tanda kutip tiga kali yang seharusnya menjadi jawaban dari suatu pertanyaan. Periksa apakah informasi berikut langsung terdapat dalam jawaban:

- Neil Armstrong adalah orang pertama yang berjalan di bulan.
- Tanggal Neil Armstrong pertama kali berjalan di bulan adalah 21 Juli 1969.

Untuk setiap poin ini, lakukan langkah-langkah berikut:

1 - Ulangi poin tersebut.
2 - Berikan kutipan dari jawaban yang paling mendekati poin ini.
3 - Pertimbangkan apakah seseorang yang membaca kutipan tersebut yang tidak tahu tentang topik ini dapat langsung menyimpulkan poin tersebut. Jelaskan mengapa atau mengapa tidak sebelum membuat keputusan.
4 - Tulis "ya" jika jawabannya pada langkah 3 adalah ya, jika tidak tulis "tidak".

Terakhir, berikan hitungan berapa banyak jawaban "ya" yang ada. Sajikan hitungan ini sebagai {"count": <masukkan hitungan di sini>}.

Berikut contoh masukan di mana kedua poin terpenuhi:

// Pesan Sistem
<masukkan pesan sistem di atas>

// Pesan PENGGUNA
"""Neil Armstrong terkenal karena menjadi manusia pertama yang menginjakkan kaki di Bulan. Peristiwa bersejarah ini terjadi pada 21 Juli 1969, selama misi Apollo 11."""

Berikut contoh masukan di mana hanya satu poin terpenuhi:

// Pesan Sistem

<masukkan pesan sistem di atas>

// Pesan PENGGUNA

"""Neil Armstrong membuat sejarah ketika ia melangkah keluar dari modul bulan, menjadi orang pertama yang berjalan di bulan."""

Berikut contoh masukan di mana tidak ada yang terpenuhi:

// Pesan Sistem

<masukkan pesan sistem di atas>

// Pesan PENGGUNA

"""Pada musim panas '69, sebuah perjalanan besar,
Apollo 11, berani seperti tangan legenda.
Armstrong melangkah, sejarah terbentang,
"Langkah kecil," katanya, untuk dunia baru."""

Terdapat banyak variasi mungkin dalam evaluasi berbasis model ini. Pertimbangkan variasi berikut yang melacak jenis tumpang tindih antara jawaban kandidat dan jawaban standar emas, serta melacak apakah jawaban kandidat bertentangan dengan bagian apa pun dari jawaban standar emas.

// Pesan Sistem
Gunakan langkah-langkah berikut untuk merespons masukan pengguna. Ulangi sepenuhnya setiap langkah sebelum melanjutkan. Misalnya "Langkah 1: Alasan...".

Langkah 1: Pikirkan secara detail apakah informasi dalam jawaban yang diajukan dibandingkan dengan jawaban pakar adalah: terpisah, sama, subset, superset, atau tumpang tindih (misalnya ada beberapa tumpang tindih namun bukan subset/superset).

Langkah 2: Pikirkan secara detail apakah jawaban yang diajukan menyatakan keberatan terhadap aspek mana pun dari jawaban pakar.

Langkah 3: Outputkan objek JSON yang strukturnya seperti: {"jenis_tumpang_tindih": "terpisah" atau "sama" atau "subset" atau "superset" atau "tumpang tindih", "keberatan": true atau false}

Berikut contoh masukan dengan jawaban di bawah standar namun tetap tidak bertentangan dengan jawaban pakar:

// Pesan Sistem

<masukkan pesan sistem di atas>

// Pesan PENGGUNA

Pertanyaan: """Peristiwa apa yang paling terkenal dari Neil Armstrong dan pada tanggal berapa itu terjadi? Anggap waktu UTC."""

Jawaban yang Diajukan: """Bukankah dia berjalan di bulan atau sesuatu?"""

Jawaban Pakar: """Neil Armstrong paling terkenal karena menjadi orang pertama yang berjalan di bulan. Peristiwa bersejarah ini terjadi pada 21 Juli 1969."""

Berikut contoh masukan dengan jawaban yang langsung bertentangan dengan jawaban pakar:

// Pesan Sistem

<masukkan pesan sistem di atas>

// Pesan PENGGUNA
Pertanyaan: """Peristiwa apa yang paling terkenal dari Neil Armstrong dan pada tanggal berapa itu terjadi? Anggap waktu UTC."""

Jawaban yang Diajukan: """Pada 21 Juli 1969, Neil Armstrong menjadi orang kedua yang berjalan di bulan, setelah Buzz Aldrin."""

Jawaban Pakar: """Neil Armstrong paling terkenal karena menjadi orang pertama yang berjalan di bulan. Peristiwa bersejarah ini terjadi pada 21 Juli 1969."""

Berikut contoh masukan dengan jawaban yang benar namun memberikan sedikit detail lebih dari yang diperlukan:

// Pesan SISTEM
<masukkan pesan sistem di atas>

// Pesan PENGGUNA

Pertanyaan: """Acara apa yang paling terkenal dari Neil Armstrong dan pada tanggal berapa itu terjadi? Anggap waktu UTC."""

Jawaban yang Dikirim: """Sekitar pukul 02:56 UTC pada tanggal 21 Juli 1969, Neil Armstrong menjadi manusia pertama yang menginjak permukaan bulan, menandai pencapaian monumental dalam sejarah manusia."""

Jawaban Pakar: """Neil Armstrong paling terkenal karena menjadi orang pertama yang berjalan di bulan. Peristiwa bersejarah ini terjadi pada 21 Juli 1969."""