Cara Menguji Agen AI Non-Deterministik (Saat temperature=0 Tidak Cukup)

Atur suhu ke nol dan agen AI masih tidak akan mengembalikan teks yang identik. Uji agen nondeterministik dengan menegaskan pada struktur, skema, dan rentang, bukan string yang persis sama.

Ashley Innocent

Ashley Innocent

20 July 2026

Cara Menguji Agen AI Non-Deterministik (Saat temperature=0 Tidak Cukup)

Apidog untuk Perusahaan

Penerapan On-Premises

SSO & RBAC

Sesuai SOC 2

Jelajahi Apidog Enterprise

Pengujian Anda lulus pada hari Senin. Masukan yang sama, kode yang sama, temperature=0. Pada hari Selasa, pengujian gagal, dan Anda tidak mengubah apa pun. Pernyataan (`assertion`) memeriksa string yang persis sama, dan model mengembalikan jawaban yang sama dengan sedikit perbedaan kata. Pengujian berwarna merah, agen baik-baik saja, dan sekarang Anda men-debug rangkaian pengujian Anda alih-alih produk Anda.

Ini adalah biaya pengujian apa pun yang memanggil model bahasa. Outputnya bergerak, bahkan ketika Anda mengatakan untuk tidak. Atur suhu menjadi nol dan Anda masih tidak akan mendapatkan respons yang identik byte di seluruh jalankan. Sebagian besar pengembang mempelajarinya dengan cara yang sulit, sekali, dan kemudian menulis ulang cara mereka menguji. Panduan ini menunjukkan cara menulis pernyataan (`assertions`) yang tahan ketika teks di bawahnya terus bergeser. Ini adalah pembahasan mendalam tentang mode kegagalan ketiga dari panduan kami tentang mengapa agen AI rusak dalam produksi.

tombol

Mengapa temperature=0 tidak berarti deterministik

Suhu mengontrol bagaimana model mengambil token berikutnya. Pada nol, ia mengambil token yang paling mungkin setiap saat, yang terasa seharusnya dapat direproduksi. Tidak demikian, dan alasannya berada di bawah model.

Matematika floating-point tidak asosiatif pada GPU. Menambahkan angka yang sama dalam urutan yang berbeda akan menghasilkan sedikit perbedaan pada posisi desimal terakhir. Perbedaan kecil itu dapat menentukan token mana yang memiliki peringkat tertinggi, dan satu token yang berbeda mengubah segalanya setelahnya. Urutan penambahan tersebut tergantung pada bagaimana penyedia mengelompokkan permintaan Anda dengan lalu lintas lain, perangkat keras mana yang menjalankannya, dan versi kernel mana yang digunakan pada hari itu. Anda tidak mengontrol apa pun.

Penyedia juga mengubah banyak hal di pihak mereka. Mereka menukar GPU, memperbarui pustaka inferensi, meng-kuantisasi ulang bobot, dan mengarahkan panggilan Anda ke wilayah yang berbeda. Sebuah diskusi vLLM yang panjang menjelaskan mengapa seed tetap dan temperature=0 masih belum cukup untuk reproduktibilitas bitwise. Versi singkatnya: determinisme adalah properti dari seluruh tumpukan layanan, bukan flag yang Anda atur dalam permintaan Anda.

Jadi, berhentilah memperlakukan output yang identik sebagai dasar. Model memberi Anda jawaban yang memiliki arti yang sama, dengan kata-kata apa pun yang muncul pada saat ini. Pengujian Anda harus menerima itu.

Pernyataan string yang persis sama membuat rangkaian pengujian Anda rapuh

Inilah jebakannya. Anda menulis assert response == "Total pesanan Anda adalah $42.00." karena itulah yang kembali pertama kali. Pengujian berhasil. Kemudian model mengembalikan "Total Anda menjadi $42.00" dan pengujian gagal pada jawaban yang benar.

Pengujian yang gagal pada jawaban yang benar lebih buruk daripada tidak ada pengujian sama sekali. Tim belajar bahwa rangkaian ini sering "berteriak serigala". Orang-orang menjalankannya lagi sampai menjadi hijau, lalu mereka berhenti membaca kegagalan, lalu mereka melewatkan regresi nyata yang terkubur dalam kebisingan. Pengujian yang rapuh tidak hanya membuang waktu, tetapi juga mengikis kepercayaan pada seluruh rangkaian, dan kami telah menulis sebelumnya tentang apa yang menyebabkan pengujian yang rapuh dan mengapa mereka menyebar. Output non-deterministik adalah salah satu cara tercepat untuk menghasilkannya.

Naluri awalnya adalah mengunci output lebih keras: menangkap string yang persis sama, mengambil snapshot, membandingkannya. Itu membuat kerapuhan menjadi lebih buruk, karena Anda telah mengaitkan pengujian Anda dengan satu hal yang dijamin akan berubah. Anda membutuhkan gerakan yang berlawanan.

Tegaskan pada struktur dan makna, bukan teks yang persis sama

Outputnya bervariasi, tetapi kontrak di bawahnya seharusnya tidak. Agen dukungan mungkin merumuskan konfirmasi pengembalian dana dengan seratus cara, namun setiap respons yang valid membawa fakta yang sama: jumlah pengembalian dana, ID pesanan, status. Uji fakta, bukan rumusan kata-katanya.

Itulah keseluruhan pergeseran. Berhentilah bertanya "apakah model mengatakan persis ini" dan mulailah bertanya "apakah responsnya memiliki bentuk yang tepat, bidang yang tepat, dan nilai dalam rentang yang tepat." Properti-properti tersebut bertahan dari perubahan kata-kata. Sebuah regresi nyata, bidang yang hilang, angka di luar batas, payload yang salah format, masih memicu pernyataan (`assertion`). Berikut adalah strategi yang menerapkan ini.

Validasi respons terhadap skema JSON

Jika agen Anda mengembalikan data terstruktur, definisikan skema JSON untuk itu dan validasi setiap respons terhadap skema tersebut. Skema memeriksa tipe, bidang yang diperlukan, enumerasi yang diizinkan, dan format tanpa peduli tentang nilai tertentu. Bidang status harus salah satu dari refunded, pending, atau denied. Sebuah order_id harus cocok dengan pola ID Anda. Sebuah amount harus berupa angka, bukan string.

Ini adalah pernyataan tunggal terkuat yang dapat Anda tulis terhadap respons non-deterministik, karena ia menangkap kegagalan yang merugikan: model menghilangkan bidang, menyarangkan objek dengan salah, atau mengembalikan prosa di mana Anda mengharapkan JSON. Muat skema respons Anda ke Apidog dan validasi respons langsung agen terhadapnya. Ketidakcocokan akan menunjukkan bidang yang tepat yang rusak, bukan perbedaan string 400 karakter.

Tegaskan bahwa panggilan alat memiliki bentuk dan target yang tepat

Ketika agen Anda memutuskan untuk memanggil sebuah alat, uji panggilannya, bukan kalimat yang mengarah padanya. Tegaskan tiga hal: ia memilih alat yang tepat, ia mengarah ke target yang tepat, dan payload cocok dengan skema alat tersebut. Agen pemesanan yang memanggil POST /reservations harus mengirim guests sebagai bilangan bulat dan date yang valid, apa pun penalaran bahasa alami yang menghasilkan panggilan tersebut.

Ini adalah disiplin yang sama dengan memvalidasi isi respons, diterapkan pada permintaan keluar. Periksa apakah parameter yang diperlukan ada, tipe sudah benar, dan tidak ada bidang yang dibuat-buat yang menyusup. Metode end-to-end untuk menguji panggilan API agen AI mencakup penangkapan skema alat tersebut dan penegasan terhadapnya. Payload panggilan alat memiliki kontrak bahkan ketika kata-kata di sekitarnya tidak.

Gunakan rentang numerik alih-alih nilai yang tepat

Untuk setiap angka yang dihasilkan atau diteruskan oleh model, tegaskan rentang, bukan nilai. Agen keranjang belanja menghitung total. Anda tidak tahu angka yang tepat di setiap eksekusi, keranjang, dan aturan pajak, tetapi Anda tahu itu tidak boleh negatif dan tidak boleh melebihi nilai keranjang ditambah pengiriman dan pajak maksimum. Jadi, tegaskan itu: balasan berisi total antara 0 dan batas atas itu.

Batas tunggal itu menangkap kegagalan yang penting, total negatif, total sepuluh kali terlalu besar, total nol pada keranjang penuh, sambil mengabaikan variasi yang tidak Anda pedulikan. Rentang berfungsi untuk skor kepercayaan, jumlah item, penggunaan token, anggaran latensi, dan angka turunan lainnya. Pilih batas terluas yang masih gagal pada bug asli.

Periksa keberadaan kunci yang diperlukan dan ketiadaan bidang yang dilarang

Dua pernyataan murah membawa banyak bobot. Pertama, kunci yang Anda andalkan ada dan tidak null. Kedua, kunci yang tidak boleh muncul tidak ada. Agen yang menangani tiket dukungan harus mengembalikan resolution, dan tidak boleh membocorkan bidang internal_notes atau raw_prompt kepada pelanggan.

Pemeriksaan keberadaan-dan-ketiadaan kebal terhadap perubahan kata secara desain, karena mereka menguji kerangka respons, bukan isinya. Mereka juga merupakan penjaga termurah Anda terhadap seluruh kelas kebocoran privasi, di mana model dengan "suka rela" menyertakan bidang yang seharusnya tetap bersifat pribadi.

Gunakan pemeriksaan semantik dan ambang batas untuk teks bebas

Terkadang payload berupa prosa dan Anda masih perlu mengujinya. Pencocokan yang persis tidak akan berhasil, jadi periksa propertinya saja. Apakah balasan tersebut berisi nomor pesanan yang Anda berikan? Apakah panjangnya tetap di bawah batas? Apakah ia menghindari daftar hitam frasa yang tidak ingin Anda kirimkan kepada pengguna?

Ketika Anda benar-benar perlu menguji makna, bandingkan dengan kesamaan embedding terhadap jawaban referensi dan tegaskan bahwa skornya melewati ambang batas, daripada menuntut string yang cocok. Perlakukan pemeriksaan semantik ini sebagai gerbang kasar, bukan yang presisi. Mereka menangkap respons yang menyimpang dari topik. Mereka tidak akan menangkap kesalahan faktual yang halus, jadi pasangkan dengan pernyataan struktural di atas.

Snapshot rentang, bukan snapshot yang tepat

Pengujian snapshot masih memiliki tempat, selama Anda mengambil snapshot bagian yang stabil. Bekukan bentuk respons, kumpulan kunci, tipe, nilai enum, dan biarkan bidang yang mengalir bebas bervariasi dalam batas. Dalam praktiknya, snapshot Anda mencatat "respons ini memiliki kunci a, b, c, dengan b dalam rentang ini dan c dari set ini" daripada gumpalan beku teks yang tepat. Ketika snapshot rusak, itu rusak karena perubahan struktural yang layak ditinjau, bukan karena sinonim.

Status dan memori membuat ini lebih sulit

Semua hal di atas mengasumsikan satu permintaan masuk, satu respons keluar. Agen tidak bekerja seperti itu. Mereka membawa memori di setiap giliran, dan status itu melipatgandakan sumber variasi.

Jawaban agen yang memiliki status tergantung pada apa yang diambilnya, apa yang disimpannya sebelumnya, dan urutan giliran sebelumnya dijalankan. Dua kali menjalankan percakapan yang sama dapat menyimpang karena langkah pengambilan peringkat dokumen secara berbeda, atau karena ringkasan yang ditulis pada giliran kedua membentuk penalaran pada giliran kelima. Sekarang output Anda bervariasi karena dua alasan yang saling memperparah: non-determinisme model itu sendiri, dan status awal yang berbeda. Penjelasan kami tentang bagaimana memori agen AI bekerja menjelaskan di mana status itu berada dan bagaimana ia dibangun.

Dua kebiasaan menjaga ini tetap dapat diuji. Pertama, kendalikan status yang bisa Anda kendalikan. Atur memori agen ke titik awal yang diketahui sebelum setiap pengujian, sehingga Anda hanya memvariasikan satu hal, bukan dua. Kedua, tegaskan pada invarian yang berlaku terlepas dari jalurnya. Saldo berjalan tidak boleh menjadi negatif. Percakapan yang memesan satu penerbangan harus diakhiri dengan tepat satu reservasi, berapa pun giliran yang dibutuhkan. Pernyataan yang tidak bergantung pada jalur adalah yang bertahan dari agen yang memiliki status dan non-deterministik.

Mock dependensi agar pengujian berulang

Anda tidak bisa melatih semua ini terhadap API pihak ketiga yang langsung. Mereka membatasi laju Anda, mereka mengubah data mereka, dan mereka menambahkan sumber keacakan kedua di atas model. Untuk mendapatkan pengujian yang dapat diulang, kunci semua yang bukan perilaku yang Anda uji.

Mock API yang dipanggil agen dan program respons tetap. Sekarang API pembayaran selalu mengembalikan tanda terima yang sama, API pencarian selalu mengembalikan tiga hasil yang sama, dan satu-satunya hal yang tersisa bergerak adalah penalaran agen itu sendiri, yang ingin Anda amati. Dependensi yang di-mock juga memungkinkan Anda memaksa kasus-kasus ekstrem yang tidak akan dihasilkan API yang sehat sesuai permintaan, kemudian menegaskan bahwa agen menanganinya. Arahkan Apidog ke dependensi agen untuk mengatur mock tersebut dengan body yang stabil dan dapat dikontrol, dan pasangkan dengan pernyataan skema di atas. Ini berada dalam praktik yang lebih luas dari pengujian AI agentic, di mana mocking dan pernyataan bekerja sama.

Di mana Apidog cocok (dan di mana tidak)

Bersikaplah tepat tentang tugas alat ini. Apidog adalah platform desain, pengujian, dan mocking API. Ini bukan kerangka kerja agen, host model, runtime agen, atau platform evaluasi dan observabilitas. Ini tidak membangun agen Anda, menjalankannya, mengoordinasikan langkah-langkahnya, atau menilai penalaran.

Apa yang dimilikinya adalah lapisan API tempat agen Anda berkomunikasi, dan di sanalah pengujian ini berada. Dua kecocokan yang jujur. Anda menulis pernyataan pada respons API agen (validasi skema, bentuk respons, rentang numerik, kunci yang diperlukan dan dilarang, bentuk payload panggilan alat) yang bertahan dari output non-deterministik. Dan Anda memalsukan dependensi agen sehingga pengujian berjalan dengan cara yang sama dua kali. Itulah celah yang diisi Apidog: kontrak pada permintaan dan respons, bukan model yang menghasilkannya.

Uji kontraknya, bukan kata-katanya

Non-determinisme bukanlah bug yang bisa Anda hilangkan dengan konfigurasi. Ini adalah properti dari menjalankan model bahasa, dan temperature=0 tidak mematikannya. Tim yang berhasil merilis agen yang andal berhenti melawannya. Mereka menguji hal-hal yang tetap konstan, skema, bentuk, rentang, bidang yang diperlukan, dan mereka membiarkan kata-kata bergerak. Lakukan itu dan rangkaian pengujian Anda akan tenang dengan cara yang baik: ia tetap hijau saat teks bergeser, dan menjadi merah hanya ketika ada sesuatu yang rusak.

Pilih satu pernyataan (`assertion`) yang rapuh dalam rangkaian pengujian Anda minggu ini dan tulis ulang sebagai pemeriksaan skema-dan-rentang. Unduh Apidog untuk memvalidasi respons agen Anda terhadap kontrak dan memalsukan (`mock`) dependensi yang membuat pengujian dapat diulang.

tombol

Mengembangkan API dengan Apidog

Apidog adalah alat pengembangan API yang membantu Anda mengembangkan API dengan lebih mudah dan efisien.