Skip to main content
Di balik layar
Di balik layarEngineeringDecisions

Saat Penyedia AI Kami Mematikan Modelnya

Pergantian model, jawaban kosong tanpa error, dan tagihan yang tiba-tiba berlipat-lipat lebih tinggi. Apa yang rusak, dan kenapa penyebabnya begitu sulit terlihat.

Diterbitkan pada oleh AlphaCloud4 menit baca

Pada Juli 2026, beberapa fitur berhenti bekerja sekaligus: chat AI, jawaban AI di tiket, ringkasan tiket, pembuat server, ditambah moderasi dan terjemahan ide serta laporan bug.

Penyebabnya bukan kode kami. Penyedia AI kami telah mematikan model yang kami pakai.

Bagian pertama: modelnya hilang

Itu bagian yang jelas, dan cepat diperbaiki. Penyedia menghentikan sebuah model, kamu memasukkan penerusnya, selesai.

Insiden yang sebenarnya dimulai sesudahnya.

Bagian kedua: jawaban kosong, tanpa error

Setelah pergantian, jawaban kembali datang. Hanya saja kadang-kadang kosong. Bukan terpotong, bukan rusak formatnya, melainkan jawaban yang benar-benar kosong tanpa error apa pun.

Penyebabnya ada pada perbedaan yang tidak terungkap dari nama model: penerusnya adalah model penalaran. Sebelum jawaban sebenarnya, model ini lebih dulu menulis alur pikir internal ke kolom terpisah. Keduanya mengambil dari jatah token yang sama.

Kalau jatahnya habis dipakai untuk berpikir, jawaban yang kembali secara formal baik-baik saja: penyedia melaporkan "batas panjang tercapai" dan kolom isinya kosong. Tidak ada error, tidak ada petunjuk, tidak ada yang akan terlihat oleh try/catch.

Kami mereproduksinya dengan tes sungguhan: jatah lima token saja sudah cukup untuk menghasilkan jawaban kosong di setiap request.

Bagian ketiga: tagihannya

Di titik panggilan yang paling mahal, pembuat server AI, kami mengatur jatah yang longgar karena di sana dihasilkan jawaban yang panjang. Jadi proses berpikirnya tidak menabrak batas, melainkan terus saja berjalan.

Akibatnya datang dari dua arah sekaligus. Request memakan waktu begitu lama sampai terkena timeout. Dan biayanya berlipat-lipat, karena setiap kali seluruh alur pikir yang tak terlihat itu ikut dibayar. Di akhir muncul pesan error yang tidak kami rencanakan: saldo tidak mencukupi.

Perbaikannya satu baris. Proses berpikir bisa dinonaktifkan di body request, dan model lalu berperilaku seperti model lama lagi. Sejak itu baris tersebut wajib ada di setiap titik panggilan, dan jumlahnya di repositori lebih dari segelintir.

Bagian keempat: apa yang kami temukan saat bersih-bersih

Kalau toh kamu sedang menyentuh setiap titik panggilan AI, kamu pasti melihat-lihat. Dari situ muncul topik kedua, tidak berhubungan dengan insiden ini tapi sama mahalnya.

Penyedia mengenakan biaya jauh lebih rendah untuk prompt yang bagian awalnya tetap sama dan bisa dilayani dari cache. Selisih antara hit dan miss kira-kira tiga puluh kali lipat.

Diskon itu tidak kamu dapatkan lewat sebuah flag. Kami mengujinya secara khusus: kolom di body request yang dimaksudkan untuk itu punya efek nol, cache tetap berlaku secara otomatis. Satu-satunya pengungkit adalah urutan di dalam prompt, dari yang stabil ke yang berubah-ubah.

Empat tempat di mana kami melakukan kebalikannya:

Nilai yang berubah-ubah di dalam blok instruksi tetap. Pemeriksaan duplikat untuk laporan bug mencantumkan nama modul di teks instruksi. Akibatnya blok yang sebenarnya identik mendapat jalur cache sendiri per modul. Nilai itu tempatnya di bagian variabel, yang memang berubah.

Yang baru sebelum yang stabil. Pemeriksaan yang sama mengirim laporan bug baru sebelum hingga lima puluh kandidat pembanding. Itu membuat prompt terbesar di API menjadi miss total secara permanen.

Data per pengguna di bagian tetap. Chat AI publik menaruh catatan tentang masing-masing pengguna di blok instruksi, jadi sebelum riwayat saluran yang dipakai bersama. Akibatnya setiap pengguna di saluran yang sama punya awal sendiri, dan riwayat bersama dibayar terpisah per pengguna.

Sliding window atas riwayat. Mengirim N pesan terakhir di setiap pesan menggeser bagian awal di setiap pesan. Seluruh riwayat lalu menjadi miss permanen. Pendekatan yang benar adalah memangkas per blok, jadi jarang tapi sekaligus banyak.

Ditambah satu detail yang terlihat seperti cari-cari kesalahan padahal bukan: daftar di dalam prompt yang diurutkan hanya dengan satu kriteria bisa berubah urutannya kalau ada nilai yang sama. Satu baris yang tertukar di tengah blok instruksi mengorbankan hit untuk semua yang ada di belakangnya. Pengurutan di dalam prompt butuh penentu yang tidak ambigu untuk nilai yang sama.

Apa yang kami ambil darinya

Pergantian model bukan perubahan konfigurasi. Namanya terlihat seperti nilai dalam sebuah variabel. Di baliknya ada perilaku yang berbeda, dan perilaku itulah yang merusak kode kami, bukan antarmukanya.

Kegagalan yang berbahaya adalah yang diam. Hilangnya model lama langsung terlihat dan diperbaiki dalam hitungan menit. Jawaban kosong datang sebagai respons yang secara formal sah dan bisa saja tetap begitu tanpa batas waktu.

Kemampuan diukur harus ada di titik panggilan. Sekarang kami mencatat tingkat cache hit di setiap titik panggilan. Titik yang dibangun dengan benar akan stabil di tingkat tinggi setelah request pertama, yang dibangun dengan buruk tetap di nol. Kamu melihatnya di satu baris log dan tidak di tempat lain, karena keduanya sama-sama berfungsi.

Dan kesimpulan yang tidak nyaman: memakai model milik orang lain berarti sebagian produkmu bergantung pada keputusan yang dibuat di tempat lain. Karena itu, sejak Agustus, server mana pun bisa mengarahkan fitur AI ke endpoint miliknya sendiri alih-alih bergantung pada milik kami.

Artikel lainnya