𝗜𝗻𝗽𝘂𝘁 𝗡𝘂𝗹𝗹 𝘆𝗮𝗻𝗴 𝗠𝗲𝗿𝗼𝘀𝗮𝗸𝗮𝗻 𝗘𝗷𝗲𝗻 𝗣𝗿𝗼𝗱𝘂𝗸𝘀𝗶 𝗦𝗮𝘆𝗮
Demo tersebut berjalan dengan sempurna selama tiga minggu. Setiap input ujian berfungsi. Setiap output dihantar ke tempat yang betul. Saya fikir sistem itu boleh dipercayai.
Kemudian, seorang pembekal menghantar e-mel dengan baris subjek yang kosong.
Ejen tersebut menjangkakan satu string untuk mengekstrak rujukan pesanan. Sebaliknya, ia menerima nilai null. Ia tidak terhenti (crash). Itu sebenarnya lebih baik. Ia menjana rujukan pesanan palsu yang kelihatan benar. Sistem hiliran (downstream system) memprosesnya. Tiada sesiapa menyedarinya selama empat jam.
Demo menggunakan input yang anda jangkakan. Produksi menggunakan input yang tidak anda jangkakan.
Saya mengendalikan operasi ejen di aienterprise.dk. Saya melihat jejak (trace) penuhnya. Prompt tersebut memberitahu ejen untuk mengekstrak rujukan pesanan daripada baris subjek. Ini berfungsi jika baris subjek wujud.
Jika baris subjek hilang, model bahasa besar (large language model) akan mengisi kekosongan tersebut. Ia mencipta sesuatu yang kelihatan betul. Ini bukan hingar (noise) rawak. Ia adalah hingar berstruktur. Ia berbahaya kerana ia kelihatan betul. Anda boleh mengesan kegagalan. Anda tidak boleh dengan mudah mengesan jawapan yang salah tetapi kelihatan yakin.
Saya tidak melatih semula model tersebut. Saya tidak mengubah prompt tersebut. Saya menambah satu guard sebelum panggilan model.
Kini, satu semakan ringkas dijalankan terlebih dahulu. Ia bertanya: adakah medan subjek ada dan tidak kosong? Jika jawapannya tidak, mesej tersebut akan dihantar ke barisan menunggu (hold queue) untuk disemak oleh manusia. Ejen tersebut tidak akan melihat input yang salah itu.
Guard ini hanya dua belas baris kod. Ia adalah perkara paling penting yang saya bina tahun ini.
Polanya mudah. Jika ejen mengandaikan adanya struktur, produksi akhirnya akan menghantar data tidak berstruktur. Penyelesaiannya bukanlah model yang lebih pintar. Penyelesaiannya adalah sempadan (boundary). Anda memerlukan semakan yang menghalakan input yang salah kepada manusia, bukannya membiarkan model membuat tekaan.
Kebolehpercayaan adalah satu-satunya ciri (feature). Demo menunjukkan ejen boleh melakukan tugasan. Produksi menunjukkan ejen melakukan tugasan pada
Sumber: https://dev.to/kimlike/the-null-input-that-broke-my-production-agent-and-what-fixed-it-1e77
Komuniti pembelajaran pilihan: https://t.me/GyaanSetuAi
Input Null yang Merosakkan Ejen Produksi Saya dan Cara Menyelesaikannya
Kita semua pernah melaluinya. Segalanya berfungsi dengan sempurna dalam persekitaran pembangunan (development). Anda telah menguji prompt anda, anda telah menguji kes hujung (edge cases), dan ejen anda berfungsi dengan sangat baik. Kemudian, anda melancarkannya ke produksi, dan segalanya menjadi kacau.
Insiden Tersebut
Ejen saya mula mengeluarkan ralat secara tiba-tiba. Ralatnya kelihatan seperti ini:
{
"error": "Internal Server Error",
"message": "Cannot read property 'tool_calls' of null"
}
Pada mulanya, saya menyangka ia adalah masalah pada API LLM atau masalah rangkaian. Namun, selepas menyemak log, saya mendapati satu corak yang pelik. Ralat ini hanya berlaku apabila input pengguna adalah kosong atau hanya mengandungi ruang kosong (whitespace).
Punca Masalah
Puncanya adalah ringkas tetapi membawa kesan buruk: input null.
Dalam aliran kerja saya, input pengguna dihantar terus ke dalam prompt sistem. Apabila pengguna menghantar mesej kosong, ejen saya tidak mempunyai lapisan pengesahan (validation layer) untuk menyekatnya.
Berikut adalah apa yang berlaku:
- Pengguna menghantar input kosong.
- Input tersebut dihantar ke LLM.
- LLM menerima prompt yang tidak lengkap dan cuba "meneka" apa yang dimaksudkan, atau menghasilkan output yang tidak mengikut skema JSON yang ditetapkan.
- Kod saya cuba memproses output tersebut, tetapi kerana ia tidak mengikut format yang dijangka (atau
null), ia menyebabkan ralatTypeError.
Ini adalah contoh kod yang bermasalah:
async function runAgent(userInput) {
const response = await llm.generate(userInput);
// Jika response adalah null atau tidak mengikut skema, baris bawah ini akan pecah
return response.choices[0].message.content;
}
Cara Menyelesaikannya
Untuk membaiki perkara ini, saya melaksanakan dua langkah utama:
1. Pengesahan Input (Input Validation)
Langkah pertama adalah memastikan ejen tidak memproses input yang tidak sah. Saya menambah lapisan pengesahan di peringkat awal.
function validateInput(input) {
if (!input || input.trim().length === 0) {
throw new Error("Input tidak boleh kosong.");
}
return true;
}
2. Pengukuhan Prompt (Prompt Hardening)
Selain itu, saya mengemas kini