Lewati ke konten
15/30Bab 15 dari 30

Prompt Engineering, Diukur: Apa yang Mengubah Output

60 tiket, kata yang sama dalam 6 urutan, akurasi 26,7%–85,0%. Lalu 4 trik internet, masing-masing dengan error bar.

Di halaman ini

Ini sebuah tiket dukungan, dan empat antrean yang mungkin menjadi tujuannya.

TEXT
The label on the parcel has my old surname on it.
    -> billing / technical / shipping / account

Untuk merutekannya, kamu butuh tiga hal di dalam prompt: definisi antrean, tiket, dan instruksi untuk memilih satu. Tiga blok. Ada enam urutan yang bisa kamu gunakan, dan blok-blok itu berisi karakter yang persis sama di keenamnya.

Pada enam puluh tiket dengan jawaban yang sudah diketahui, enam urutan itu mencetak skor antara 26,7 % dan 55,0 %. Pindahkan dua blok yang sama keluar dari giliran user dan masuk ke giliran system, tanpa mengubah satu kata pun, dan model yang sama mencetak 76,7 %. Bungkus tiket dalam tag bergaya XML dan hasilnya mencapai 85,0 %.

Tidak ada yang berubah pada model. Tidak ada yang berubah pada tugas. Tidak satu kata pun ditulis ulang. Ayunan lima puluh delapan poin muncul hanya dari penyusunan teks yang sama.

Itulah alasan bab ini ada, dan itu juga alasan topik ini paling dipenuhi cargo cult di bidang ini. Efeknya nyata dan besar, sehingga setiap anekdot terasa terkonfirmasi; dan efeknya tidak stabil lintas model dan tugas, yang berarti kebanyakan saran pada akhirnya hanyalah anekdot. Jadi bab ini punya satu aturan, dan semua isinya tunduk pada aturan itu:

Prompt itu diukur, bukan diperdebatkan. Empat varian pada dua puluh kasus tidak membedakan apa pun.

Sebelum pengukuran, ada satu fakta yang diam-diam menjelaskan setengah dari hal-hal berikut.

Model tidak punya memori. Di antara dua panggilan, ia tidak menyimpan apa pun — bukan pertanyaan terakhirmu, bukan jawaban terakhirnya sendiri, bukan file yang kamu lampirkan, bukan fakta bahwa kamu sudah menanyakannya dua kali. Setiap panggilan dimulai dari mesin kosong, dan satu-satunya hal yang diketahui mesin itu adalah urutan token yang baru saja kamu berikan.

Apa yang tampak seperti memori di antarmuka chat adalah client kamu yang mengirim ulang seluruh percakapan, setiap giliran, dari awal. Model membaca semuanya lagi dari nol, setiap kali. Bab 13 mengukur biaya pembacaan ulang itu dalam sebuah forward pass; Bab 16 mengubahnya menjadi baris pada invoice. Yang penting di sini adalah konsekuensinya untuk desain: prompt bukan pesan kepada sistem yang memiliki state. Prompt adalah state.

Itu mengakhiri satu keluarga kebingungan. "Model lupa apa yang saya katakan" biasanya berarti hal itu tidak pernah dikirim. "Model mengabaikan instruksi saya sebelumnya" biasanya berarti instruksi itu keluar dari window ketika riwayat dipangkas. "Model berperilaku berbeda di production" biasanya berarti production menyusun prompt yang berbeda dari prompt yang kamu uji. Tidak satu pun dari ini masalah model, dan tidak satu pun diperbaiki dengan menulis ulang apa pun.

Klaim "prompt ini lebih baik" adalah klaim tentang sebuah distribusi, dan kamu tidak bisa melihat distribusi dengan melihat satu output. Yang kamu butuhkan membosankan: kasus dengan jawaban yang diketahui, N varian, dan sebuah interval.

Harness-nya lima puluh baris TypeScript dengan bentuk yang sama seperti client dari Bab 14 — sebuah request, sebuah deadline, sedikit concurrency, sebuah hitungan. Ia muncul lagi di Bab 19 untuk mengevaluasi retriever dan di Bab 29 sebagai golden set.

bench.tsTS
export type Case = { input: string; expected: string };
export type Variant = { name: string; build: (c: Case) => ChatMessage[] };

async function pooled<T, R>(xs: T[], n: number, f: (x: T) => Promise<R>) {
  const out: R[] = new Array(xs.length);
  let i = 0;
  await Promise.all(
    Array.from({ length: n }, async () => {
      while (i < xs.length) {
        const k = i++;
        out[k] = await f(xs[k]);
      }
    }),
  );
  return out;
}

export async function runVariant(v: Variant, cases: Case[], concurrency = 6) {
  const hits = await pooled(cases, concurrency, async (c) => {
    const answer = await complete(v.build(c));      
    return answer.trim().toLowerCase() === c.expected;
  });
  return { name: v.name, hits, k: hits.filter(Boolean).length, n: cases.length };
}

Angka yang kembali bukanlah hasilnya. Ini hasilnya:

stats.tsTS
/** 95 % Wilson score interval for a proportion. Chapter 4 derives it. */
export function wilson(k: number, n: number, z = 1.96) {
  const p = k / n;
  const d = 1 + (z * z) / n;
  const centre = (p + (z * z) / (2 * n)) / d;
  const half = (z * Math.sqrt((p * (1 - p)) / n + (z * z) / (4 * n * n))) / d;
  return [Math.max(0, centre - half), Math.min(1, centre + half)] as const;
}

Bab 4 membuat argumennya dan bab ini mencairkannya. Tujuh belas benar dari dua puluh adalah 85 %, dan interval 95 %-nya berjalan dari 64 % hingga 95 %. Varian yang mencetak 13 dari 20 — 65 %, yang terasa jelas lebih buruk — memiliki interval dari 43 % hingga 82 %. Kedua interval itu tumpang tindih hampir di seluruh panjangnya. Dua puluh kasus tidak bisa membedakan prompt yang baik dari yang biasa-biasa saja, dan kebanyakan saran prompt yang dipublikasikan divalidasi pada jumlah yang lebih sedikit.

Enam puluh kasus, yang digunakan bab ini, tetap tidak banyak. Itu cukup untuk melihat efek besar dan cukup jujur untuk mengakui ketika tidak bisa melihat efek kecil — dan bab ini akan mengakuinya beberapa kali di bawah.

Tiga blok — aturan R, tiket T, instruksi I — digabungkan menjadi satu pesan user. Keenam permutasi, konten identik byte demi byte, masing-masing enam puluh kasus.

urutan tiga blokbenarakurasi, Wilson 95 %
aturan, instruksi, tiket33/6055,0 % [42,5, 66,9]
aturan, tiket, instruksi30/6050,0 % [37,7, 62,3]
tiket, aturan, instruksi22/6036,7 % [25,6, 49,3]
instruksi, tiket, aturan21/6035,0 % [24,2, 47,6]
instruksi, aturan, tiket17/6028,3 % [18,5, 40,8]
tiket, instruksi, aturan16/6026,7 % [17,1, 39,0]

Terbaik ke terburuk adalah 28,3 poin, dan intervalnya tidak tumpang tindih, jadi ini bukan cerita tentang noise. Karena setiap arm dinilai pada enam puluh item yang sama, pertanyaan yang lebih tajam adalah pertanyaan berpasangan: dari kasus-kasus ketika dua arm tidak sepakat, seberapa miring pembagiannya? Berpindah dari urutan terburuk ke terbaik membalik 21 kasus menjadi benar dan 4 menjadi salah — probabilitas berpasangan eksak 0,0009.3

Baca tabel dari bentuknya, bukan pemenangnya. Dua baris terbaik sama-sama berakhir dengan tiket; dua yang terburuk sama-sama mengubur instruksi di tengah atau menempatkannya setelah data. Itu fenomena yang sama yang dinamai Liu et al. Lost in the Middle: materi di tepi prompt digunakan lebih andal daripada materi di tengah.4 Bab 16 memberi harga pada window dan Bab 24 mengukur efeknya dengan benar pada panjang besar, ketika bagian tengah runtuh seperti yang dijelaskan dan pemulihan di ujung paling akhir tidak muncul kembali. Di sini aturan praktisnya muncul sendiri: tugas di atas, data di bawah, tidak ada yang penting di tengah.

Sekarang pindahkan kata-kata yang sama di antara giliran. Bab 11 menetapkan bahwa chat template bukan dekorasi di sekitar model, melainkan bagian darinya — <|im_start|>system dan <|im_start|>user adalah token nyata yang dilihat model jutaan kali selama fine-tuning, tepat di posisi itu. Jadi seharusnya penting di sisi mana dari marker tersebut instruksimu mendarat, dan memang penting:

tempat kata yang sama beradabenarakurasi, Wilson 95 %
aturan dan instruksi di giliran system, tiket saja di giliran user46/6076,7 % [64,6, 85,6]
aturan di giliran system, instruksi dan tiket di giliran user44/6073,3 % [61,0, 82,9]
aturan dan instruksi di giliran system, instruksi diulang setelah tiket42/6070,0 % [57,5, 80,1]
ketiga blok dalam satu giliran user33/6055,0 % [42,5, 66,9]

Memindahkan aturan dan instruksi melintasi batas template menghasilkan 21,7 poin — 19 kasus naik, 6 turun, probabilitas berpasangan 0,0146 — tanpa mengubah satu karakter pun. Ini jawaban konkret untuk system prompt versus user prompt: keduanya bukan dua cara mengatakan hal yang sama. Keduanya adalah dua posisi token berbeda dalam struktur yang digunakan untuk melatih model, dan posisi system adalah tempat instruksi yang berlaku untuk seluruh percakapan berada.

Perhatikan juga baris ketiga. Mengulang instruksi setelah tiket — trik yang sering direkomendasikan — mencetak skor di bawah menyatakannya sekali. Pada model ini, pada tugas ini, mengatakannya dua kali lebih buruk daripada mengatakannya sekali.

Delimiter, dan pelajaran statistik yang tersembunyi di dalamnya

Tautan ke bagian: Delimiter, dan pelajaran statistik yang tersembunyi di dalamnya

Prompt yang sama, penempatan terbaik, enam puluh kasus. Satu-satunya hal yang berubah adalah apa yang mengelilingi teks tiket.

cara tiket diberi delimiterbenarakurasi, Wilson 95 %
tag bergaya XML51/6085,0 % [73,9, 91,9]
tidak ada sama sekali48/6080,0 % [68,2, 88,2]
heading Markdown47/6078,3 % [66,4, 86,9]
label, Ticket:46/6076,7 % [64,6, 85,6]
hash fences45/6075,0 % [62,8, 84,2]
triple backticks44/6073,3 % [61,0, 82,9]
tanda kutip ganda40/6066,7 % [54,1, 77,3]

Rentang delapan belas poin dari tanda baca. Tapi lihat dua interval ekstremnya: [73,9, 91,9] dan [54,1, 77,3]. Keduanya tumpang tindih. Dengan pembacaan kasar — bandingkan error bar, dan jika bersentuhan, jangan katakan apa-apa — tabel ini tidak membuktikan apa pun.

Pembacaan kasar itu salah di sini, dan memahami alasannya lebih bernilai daripada tabelnya. Setiap varian dinilai pada enam puluh tiket yang sama, jadi dua pengukuran itu bukan sampel independen; keduanya berpasangan. Sebagian besar lebar setiap interval berasal dari sumber ketidakpastian yang dibagi kedua arm — apakah enam puluh tiket ini representatif — dan sumber itu hilang ketika kamu membandingkannya satu sama lain. Ajukan pertanyaan berpasangan sebagai gantinya dan jawabannya tajam: berpindah dari tanda kutip ganda ke tag XML membalik 12 kasus menjadi benar dan 1 menjadi salah, probabilitas berpasangan 0,0034. Itu perbedaan nyata.

Lalu pengujian yang sama mengempiskan judul besarnya. Tag XML mengalahkan label polos Ticket: sebesar 8,3 poin, angka yang akan dipasang blog post di judulnya. Berpasangan: 6 naik, 1 turun, probabilitas 0,1250. Belum terbukti. Tujuh kasus adalah fondasi peningkatan terkenal itu.

Jadi ada dua pertanyaan dengan dua instrumen berbeda, dan mencampuradukkannya adalah cara saran prompt salah ke dua arah sekaligus:

Seberapa bagus prompt ini? Interval Wilson pada akurasinya sendiri. Lebar kecuali kamu punya ratusan kasus. Ini angka yang kamu laporkan kepada orang yang memutuskan apakah akan ship.

Apakah B lebih baik daripada A? Uji berpasangan atas kasus ketika keduanya tidak sepakat. Jauh lebih sensitif, karena kesulitan bersama dari set itu hilang. Ini angka yang kamu gunakan untuk memilih antara dua kandidat.

Temuan umumnya — bahwa model sangat dan tidak terduga sensitif terhadap pilihan formatting yang tidak membawa konten semantik — bukan hal baru. Sclar et al. hanya memvariasikan separator, spacing, dan casing di puluhan tugas dan menemukan rentang akurasi yang cukup lebar untuk membalik peringkat model yang sudah dipublikasikan.5 Konsekuensi praktisnya bukan "gunakan tag XML". Konsekuensinya adalah formatting adalah hyperparameter, biayanya nol untuk di-sweep, dan perbandingan dua model mana pun yang mengunci satu format sedang membandingkan format sama banyaknya dengan model.

Berapa banyak contoh yang sebenarnya cukup

Tautan ke bagian: Berapa banyak contoh yang sebenarnya cukup

In-context learning — menunjukkan contoh kerja kepada model di dalam prompt dan membuatnya melakukan generalisasi dari contoh itu tanpa update weight apa pun — adalah kemampuan yang membuat GPT-3 terkenal.6 Pertanyaan praktisnya tidak pernah apakah itu berhasil. Pertanyaannya adalah berapa banyak contoh yang layak dibayar.

Contoh masuk sebagai giliran sebelumnya yang nyata, bergantian antara user dan assistant, karena itulah struktur yang digunakan saat template dilatih. Setiap k dijalankan dengan lima pengambilan acak berbeda dari pool terpisah berisi enam belas tiket berlabel:

contohakurasi rata-ratadraw terburuk dan terbaikrentang antar-draw
076,7 %
178,7 %78,3 – 80,0 %1,7 poin
283,7 %80,0 – 86,7 %6,7 poin
481,7 %78,3 – 86,7 %8,3 poin
883,7 %78,3 – 88,3 %10,0 poin
1689,3 %85,0 – 93,3 %8,3 poin

Dua contoh memberi tujuh poin. Enam contoh berikutnya tidak memberi apa pun yang terukur — 83,7, lalu 81,7, lalu 83,7, urutan yang mengembara di dalam noise-nya sendiri. Enam belas memberi lima setengah poin lagi. Kurvanya bukan pendakian mulus; ia adalah satu langkah, satu plateau, dan satu langkah.

Kolom yang paling penting adalah yang terakhir. Pada k = 8, delapan contoh mana yang kebetulan kamu pilih menggeser akurasi sebesar 10 poin — lebih besar daripada seluruh keuntungan dari berpindah dari dua contoh ke delapan. Dan baris paling bawah adalah versi paling tajamnya: pada k = 16 pool habis, jadi kelima run berisi enam belas contoh yang persis sama, hanya berbeda dalam urutan kemunculannya. Urutan saja menggeser akurasi 8,3 poin.

Itulah hasil yang dilaporkan Lu et al. dan hasil itu bertahan di mana pun ia dicari: pengurutan contoh adalah hyperparameter sungguhan dengan efek yang sebanding dengan jumlah contoh.7 Jadi saran jujur tentang few-shot prompting bukan sebuah angka. Saran jujurnya adalah:

Mulai dari nol dan tambahkan contoh hanya berdasarkan pengukuran

Tautan ke bagian: Mulai dari nol dan tambahkan contoh hanya berdasarkan pengukuran

Dua yang pertama biasanya sepadan. Setelah itu kamu menebak, dan tebakan itu menghabiskan token pada setiap panggilan selama sisa umur produk.

Perlakukan pemilihan sebagai bagian dari prompt

Tautan ke bagian: Perlakukan pemilihan sebagai bagian dari prompt

Dua contoh yang dipilih dengan baik mengalahkan delapan yang dipilih sembarangan. Jika contohmu berasal dari bagian atas spreadsheet, variabel itulah yang perlu di-sweep sebelum menambahkan lebih banyak.

Gratis, efeknya nyata, dan berbeda dari kebanyakan hal dalam bab ini, tidak perlu penulisan ulang untuk dicoba.

Empat contoh yang semuanya punya label sama mengajari model label, bukan tugasnya. Keruntuhan model ini ke antrean mana pun yang dicantumkan terakhir adalah kegagalan yang sama dengan kostum berbeda.

Sekarang folklornya. Masing-masing ini adalah satu kalimat yang ditambahkan di depan system prompt yang selain itu identik, pada enam puluh kasus yang sama.

kalimat yang ditambahkan ke system promptbenarakurasi, Wilson 95 %berpasangan melawan baseline
tidak ada tambahan46/6076,7 % [64,6, 85,6]
"Tarik napas dalam-dalam dan kerjakan masalah ini dengan cermat."47/6078,3 % [66,4, 86,9]+4 / −3, p = 1,000
"Ini sangat penting untuk karier saya."46/6076,7 % [64,6, 85,6]+5 / −5, p = 1,000
"Kamu adalah pakar operasi dukungan pelanggan kelas dunia dengan pengalaman dua puluh tahun."42/6070,0 % [57,5, 80,1]+3 / −7, p = 0,344
"Saya akan memberimu tip $200 jika kamu menjawab dengan benar."41/6068,3 % [55,8, 78,7]+1 / −6, p = 0,125
"Kamu akan dikenai penalti untuk setiap tiket yang kamu kirim ke antrean yang salah."25/6041,7 % [30,1, 54,3]+3 / −24, p < 0,001

Empat dari lima tidak melakukan apa pun. Bukan "melakukan sedikit"; tidak ada yang bisa dilihat oleh enam puluh kasus berpasangan. Persona ahli dan suap sama-sama mencetak skor di bawah baseline yang tidak disentuh, dan bahkan penurunan itu gagal dalam uji berpasangan — itu noise yang menunjuk ke bawah.

Baris ketiga adalah yang perlu direnungkan. "Ini sangat penting untuk karier saya" menghasilkan akurasi yang persis sama, 46 dari 60 — dan sepuluh dari enam puluh jawaban berubah, lima ke masing-masing arah. Statistik ringkasnya identik dan perilakunya tidak. Jika evaluasimu adalah satu angka pada set kecil, perubahan yang menulis ulang seperenam output-mu bisa terlihat seperti perubahan yang tidak melakukan apa pun, dan kamu akan ship sambil percaya perubahan itu gratis.

Lalu ancamannya, satu-satunya kalimat yang menggerakkan jarum dan menggerakkannya 35 poin turun, membalik 24 kasus dari benar ke salah. Itu bukan artefak pembulatan; itu perilaku model yang berbeda. Pelajarannya bukan "jangan pernah mengancam model". Pelajarannya adalah framing emosional tidak inert. Ia menggeser distribusi, kadang keras, ke arah yang tidak bisa diprediksi siapa pun dari membaca kalimatnya — itulah persisnya alasan ia harus diukur, bukan diperdebatkan lewat penalaran.

Satu caveat yang menjadi utang bab ini kepadamu: lima kalimat ini diuji pada satu model kecil dan satu tugas. Sebagian punya dukungan terbitan di tempat lain — "tarik napas dalam-dalam" muncul dari paper yang mencari instruksi berskor tinggi, bukan mengarangnya, yang merupakan klaim berbeda dan lebih baik daripada klaim yang beredar sesudahnya.8 Yang menggeneralisasi bukan kalimat-kalimatnya. Yang menggeneralisasi adalah bahwa daftar yang bertahan di blog post dan daftar yang bertahan dalam pengukuran adalah dua daftar berbeda, dan satu-satunya cara mengetahui daftar mana yang kamu pegang adalah menjalankan bench.

Aturan yang diulang semua orang — katakan apa yang kamu inginkan, bukan apa yang tidak kamu inginkan — dengan ketiadaan angka seperti biasa. Ini angkanya. Persyaratan format yang sama, ditulis tiga cara, dengan model menghasilkan secara bebas agar kepatuhan bisa diamati:

cara aturan format ditulisoutput persis satu kata yang diizinkanmean output token
"Jawab dengan satu kata."10/60 (16,7 %)2,6
"Jangan jelaskan dirimu. Jangan tulis kalimat. Jangan tambahkan tanda baca."1/60 (1,7 %)14,0
keduanya sekaligus41/60 (68,3 %)2,3

Tiga larangan berkinerja lebih buruk daripada satu instruksi, dan membuat model menulis lima kali lebih banyak teks — kebalikan persis dari ketiganya sekaligus. Menambahkan kembali kalimat positif menyelamatkannya ke 68 %.

Mekanismenya tidak misterius setelah kamu mengingat Bab 8. Model memilih next token dari distribusi yang dikondisikan pada semua hal sebelumnya, dan sebuah larangan menaruh hal yang dilarang ke dalam conditioning itu. Tidak ada operator untuk negasi; yang ada adalah konteks tempat sebuah kata kini muncul.

Itu bisa diukur secara langsung. Ambil prompt baseline dan tambahkan satu baris: Do not use the shipping queue for software problems. Lalu lihat hanya empat puluh lima tiket yang bukan tiket shipping:

shipping dipilihprobabilitas rata-rata pada shippingakurasi keseluruhan
baseline11,1 % dari 45 kasus0,13176,7 % [64,6, 85,6]
setelah melarangnya dengan nama37,8 %0,37451,7 % [39,3, 63,8]

Menyebut sebuah antrean untuk menyingkirkannya membuat model memilihnya tiga kali lebih sering, hampir melipatgandakan tiga kali probability mass yang diberikannya, dan mengorbankan 25 poin akurasi keseluruhan — 16 kasus hilang melawan 1 yang naik, probabilitas berpasangan 0,0003.

Jangan pikirkan gajah, terukur. Penulisan ulangnya selalu sama: ganti larangan dengan aturan positif yang membuatnya tidak diperlukan. Bukan "jangan gunakan shipping untuk masalah software" melainkan "gunakan shipping hanya ketika ada paket fisik yang terlibat".

Counterexample yang jujur: chain of thought yang mahal dan tidak membayar balik

Tautan ke bagian: Counterexample yang jujur: chain of thought yang mahal dan tidak membayar balik

Bab 12 membangun chain of thought dengan benar — pertama sebagai teknik prompting,910 lalu sebagai sesuatu yang dilatih dengan reward yang dapat diverifikasi — dan berakhir dengan peringatan yang ditundanya ke bab ini: menyuruh model berpikir langkah demi langkah berhenti membantu setelah model bernalar sendiri, dan bisa merugikan. Ini peringatan itu dengan tabel di bawahnya, pada tugas yang mudah membuat kita berasumsi bahwa lebih banyak berpikir pasti lebih baik.

Kedua arm dibaca dengan instrumen yang sama pada posisi yang sama. Satu-satunya perbedaan adalah apakah chain of thought yang ditulis model sendiri duduk di konteks lebih dulu.

armbenarakurasi, Wilson 95 %output token ekstra per kasus
tanpa chain of thought37/6061,7 % [49,0, 72,9]0
chain of thought, hingga 60 token34/6056,7 % [44,1, 68,4]53,1
chain of thought, hingga 200 token34/6056,7 % [44,1, 68,4]97,7

Akurasi turun dan biaya naik, dan aturan bab ini sendiri berlaku pada hasil bab ini sendiri: penurunannya adalah 7 kasus naik melawan 10 hilang, probabilitas berpasangan 0,629, yang belum terbukti. Yang terbukti adalah bahwa ia menghasilkan sembilan puluh delapan output token ekstra per panggilan dan tidak membeli apa pun yang terukur dengannya. Ketidakpastian seluruhnya berada di sisi manfaat. Tagihannya pasti.

Chain yang gagal lebih instruktif daripada yang berhasil. Ketika diminta bernalar tentang "Integrasi Slack kamu berhenti mem-posting pesan setelah Selasa", model menulis:

TEXT
1. Check if the issue persists on Monday.
2. Verify if there are any updates or changes in your Slack setup that
   might affect message posting.
3. If no update has been made since Tuesday, check for any recent system
   restarts or downtime affecting Slack functionality.
4. If you have recently installed new software or updated your
   environment, ensure it's compatible with Slack version.
5. Contact Slack support for further assistance or troubleshooting steps.

Itu saran troubleshooting yang kompeten dan itu bukan tugasnya. Ketika diminta berpikir, model bergeser ke genre yang paling mirip dengan "berpikir langkah demi langkah tentang tiket dukungan ini" dalam data latihnya — lalu menjawab pertanyaan klasifikasi dengan lima ratus karakter penalaran yang tidak terkait di dalam konteksnya sendiri. Chain of thought membantu pada masalah dengan intermediate state yang layak dihitung: aritmetika, lookup multi-hop, constraint satisfaction. Merutekan sebuah kalimat ke salah satu dari empat bucket tidak punya intermediate state. Tidak ada yang bisa dipegang oleh chain, jadi yang dilakukannya hanya menambahkan teks yang terdengar masuk akal yang kemudian harus dilalui keputusan akhir.

Dua konsekuensi praktis. Pertama, untuk model yang dilatih bernalar — model RLVR dari Bab 12 — instruksi ini lebih buruk daripada redundant: ia bisa mengganti chain panjang yang akan diproduksi model dengan chain pendek berbentuk prompt. Dan sampling beberapa chain lalu voting, yang dilakukan self-consistency,11 tidak bisa menyelamatkan tugas yang tidak punya apa pun untuk diperdebatkan: ia melipatgandakan biaya dengan jumlah sampel untuk memecah tie yang tidak ada. Bab 12 mengukur trade tersebut di tempat ia memang berlaku. Kedua, perhatikan biaya scaffold perbandingan itu sendiri. Memaksa jawaban ke baris Final queue: menurunkan arm tanpa reasoning dari 76,7 % ke 61,7 %. Lima belas poin, dibayar untuk membuat dua arm dapat dibandingkan. Struktur yang ada demi kenyamananmu juga tidak gratis.

Satu pengukuran terakhir, karena ini pertanyaan yang ditanyakan semua orang setelah hasil mengejutkan pertama. Enam puluh prompt, greedy decoding, dijalankan berulang:

  • Panggilan yang sama diulang dengan semua hal dibuat tetap mengembalikan probabilitas bit-identical. Deterministik.
  • Panggilan yang sama di-batch dengan tetangga berbeda — batch size 1, 4, 12, 30, dan 60 — mengembalikan probabilitas yang berbeda hingga 0,0128. Label yang dipilih tidak pernah berubah, dalam 0 dari 60 kasus.

Label bertahan karena punya ruang untuk itu: di enam puluh kasus, gap tersempit antara dua antrean teratas adalah 0,0459, tiga setengah kali drift. Stabilitas itu bukan properti algoritma. Itu margin, dan margin bisa habis. Bab 17 adalah tempat alasan aritmetisnya berada dan tempat sampling knob yang memperlebar dan mempersempit gap tersebut dibongkar. Alasan menanamkannya di sini adalah bahwa ini membatasi makna pengukuran prompt apa pun: bench mengukur sistem yang hanya dapat direproduksi hingga suatu toleransi, dan perbedaan dua poin antar-varian berada di dalam toleransi itu pada hari yang buruk.

Semua di atas adalah manusia memilih varian dan mesin menilainya. Langkah berikutnya jelas: biarkan mesin memilih variannya juga.

APE melakukan persis itu: sebuah model mengusulkan instruksi kandidat, instruksi itu dinilai pada contoh held-out, dan yang terbaik bertahan.8 Instruksi yang ditemukannya sering kali bukan instruksi yang akan ditulis manusia mana pun, dan itulah intinya — pencarian dilakukan atas apa yang mencetak skor, bukan atas apa yang terdengar profesional.

DSPy melangkah lebih jauh dan merupakan ide yang lebih berguna untuk produk.12 Kamu mendeklarasikan apa yang diterima dan dikembalikan setiap langkah pipeline, dan framework mengompilasinya menjadi prompt, memilih demonstrasi, dan mengoptimalkan instruksi terhadap metric-mu. Ganti model dan kamu recompile, bukan menulis ulang. Prompt berhenti menjadi source code yang di-tune manual oleh seseorang dan menjadi artefak yang dihasilkan terhadap sebuah metric, sebagaimana seharusnya sejak awal.

Keduanya tidak menghapus kebutuhan akan bench. Keduanya menjadikannya satu-satunya hal yang kamu butuhkan, karena optimiser tanpa metric tidak mengoptimalkan apa pun.

Yang tersisa adalah disiplin. Prompt harus berada di version control, dalam file, di sebelah kode yang mengirimnya — bukan di baris database yang diedit seseorang pada hari Selasa. Prompt butuh version identifier yang disimpan bersama setiap output yang dihasilkannya, atau ketika suatu hari terjadi regresi, kamu tidak bisa mencari tahu apa yang berubah. Prompt butuh bench dalam continuous integration, karena prompt adalah satu bagian dari sistemmu yang bisa diam-diam dibuat tidak valid oleh vendor dengan men-deploy model baru. Dan prompt butuh kasus: bukan seratus kasus cerdas, cukup dua puluh kasus membosankan yang rusak kuartal lalu, disimpan selamanya. Bench adalah deliverable. Prompt adalah produk sampingannya.

Semua dalam bab ini diukur dalam akurasi. Setiap varian itu juga punya harga.

System prompt yang membeli 21,7 poin dikirim pada setiap panggilan, selamanya. Dua contoh yang membeli tujuh poin dikirim pada setiap panggilan, selamanya. Enam belas yang membeli dua belas poin dikirim pada setiap panggilan, selamanya, dan panjangnya kira-kira sepuluh kali pertanyaan yang benar-benar ditanyakan user. Chain of thought yang tidak membeli apa pun menghasilkan sembilan puluh delapan token ekstra per request, dan output token adalah jenis yang mahal.

Tidak satu pun dari itu terlihat dalam tabel akurasi, dan semuanya terlihat di invoice.

Bab 16 membahas unit yang sebenarnya menjadi denominasi keputusan-keputusan itu. Token sebagai unit billing, context window sebagai budget dan bukan memori, mengapa percakapan empat puluh giliran berbiaya jauh lebih dari empat puluh kali giliran pertama, apa yang dibayar dan tidak dibayar oleh prompt caching, dan mengapa urutan prompt-mu menentukan apakah cache hit sama sekali — yang ternyata menjadi alasan kedua, sepenuhnya ekonomis, untuk menaruh materi stabil terlebih dahulu dan materi variabel terakhir.


Bench dan setiap tabel dihasilkan dengan Qwen/Qwen2.5-0.5B-Instruct di bawah greedy decoding, jadi semuanya bereproduksi persis. Dokumentasi Hugging Face tentang chat templates adalah referensi untuk apa sebenarnya perluasan marker template dari Bab 11, dan untuk fakta bahwa model yang dikirim dengan template yang salah adalah kegagalan nyata dan berulang. Untuk efek posisi dan format pada skala production, bukan skala laboratorium, kutipan di atas adalah sumber primer; panduan prompting vendor berguna untuk contohnya dan sebaiknya dibaca dengan mengetahui bahwa tidak satu pun menerbitkan interval.

  1. Anthropic, Effective context engineering for AI agents (29 September 2025), untuk pembedaan prompt-versus-konteks yang digunakan dalam bab ini dan dikembangkan di Bab 24.

  2. Zhao, Z., Wallace, E., Feng, S., Klein, D. and Singh, S. Calibrate Before Use: Improving Few-Shot Performance of Language Models. arXiv:2102.09690 (2021). Majority-label, recency, dan common-token bias, serta mengapa rotasi dalam bench bab ini bukan opsional.

  3. McNemar, Q. Note on the sampling error of the difference between correlated proportions or percentages. Psychometrika 12(2), hlm. 153–157 (1947). Perbandingan berpasangan dalam bab ini menggunakan bentuk binomial eksak, bukan aproksimasi chi-squared, karena jumlah discordant kecil.

  4. Liu, N. F. et al. Lost in the Middle: How Language Models Use Long Contexts. arXiv:2307.03172 (2023). Dikutip di sini untuk efek posisi; diukur pada panjang besar di Bab 24.

  5. Sclar, M., Choi, Y., Tsvetkov, Y. and Suhr, A. Quantifying Language Models' Sensitivity to Spurious Features in Prompt Design. arXiv:2310.11324 (2023). Separator dan spacing saja cukup menggerakkan akurasi untuk mengurutkan ulang leaderboard model.

  6. Brown, T. B. et al. Language Models are Few-Shot Learners. arXiv:2005.14165 (2020). Paper yang memperkenalkan in-context learning sebagai kemampuan, bukan keanehan; bagian 3 adalah sumber kosakata zero-shot / one-shot / few-shot yang sekarang digunakan semua orang.

  7. Lu, Y., Bartolo, M., Moore, A., Riedel, S. and Stenetorp, P. Fantastically Ordered Prompts and Where to Find Them: Overcoming Few-Shot Prompt Order Sensitivity. arXiv:2104.08786 (2021). Hasil yang direproduksi dalam tabel few-shot di atas.

  8. Zhou, Y. et al. Large Language Models Are Human-Level Prompt Engineers. arXiv:2211.01910 (2022). Prompt engineering otomatis melalui proposal dan scoring. Instruksi "take a deep breath" yang sering dikutip berasal dari Yang, C. et al., Large Language Models as Optimizers, arXiv:2309.03409 (2023), yang menemukannya lewat pencarian pada satu tugas dengan satu model — klaim yang tidak bertahan utuh dalam perjalanannya ke blog post. 2

  9. Wei, J. et al. Chain-of-Thought Prompting Elicits Reasoning in Large Language Models. arXiv:2201.11903 (2022).

  10. Kojima, T., Gu, S. S., Reid, M., Matsuo, Y. and Iwasawa, Y. Large Language Models are Zero-Shot Reasoners. arXiv:2205.11916 (2022). Hasil "let's think step by step", dan layak dibaca untuk melihat betapa sempit kondisinya.

  11. Wang, X. et al. Self-Consistency Improves Chain of Thought Reasoning in Language Models. arXiv:2203.11171 (2022). Diukur bersama biayanya di Bab 12.

  12. Khattab, O. et al. DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines. arXiv:2310.03714 (2023).


Dibuat oleh

David Vicente Campos

Pendiri NeuraLIA Labs & salah satu pendiri MyRealFood

Saya seorang insinyur komputer lulusan Universitas León. Saya ikut mendirikan MyRealFood, tempat saya sebagai CTO membangun aplikasi yang telah digunakan jutaan orang untuk makan lebih sehat, dan saya mendirikan NeuraLIA Labs, tempat saya membangun produk AI. Di sini saya menulis tentang hal-hal yang harus saya pahami sepanjang perjalanan, sebagaimana dulu saya berharap ada yang menjelaskannya kepada saya.

Selengkapnya tentang penulis

Diterbitkan oleh NeuraLIA Labs.

Dapatkan postingan baru di inbox kamu

Berita AI, panduan, dan update produk — email singkat saat kami menerbitkan sesuatu yang layak kamu baca.

Indeks kursus

Abstract software decision engine with branching paths, probability nodes, and glowing gates.
jev11 menit baca

Model AI Jev dibuat untuk keputusan, bukan prosa

Jev dari TypeSafe AI menarik perhatian karena memperlakukan kecerdasan software sebagai persoalan probabilitas: pilih cabang yang tepat, sertakan keyakinan, dan hindari membayar LLM untuk menulis teks saat kode membutuhkan keputusan.

Abstract agent runtime sorting documents, memory blocks and pointer nodes inside a bounded context frame.
context-engineering11 menit baca

Rekayasa konteks untuk agen AI jangka panjang

Agen yang berjalan lama tidak gagal hanya karena window-nya kecil. Mereka gagal ketika file, output tool, dan riwayat lama menggeser tugas yang seharusnya diselesaikan agen.

Siap membiarkan LIA yang memilih?

Berkarya dengan semua model AI dalam satu tempat — mulai gratis hari ini.