Melatih AI Koding Medis dengan Data Riil

Setelah medcoder jalan stabil di server, saya masuk ke fase yang menurut saya justru paling menantang: melatih dan mengevaluasi AI-nya pakai data riwayat kunjungan rawat jalan yang sungguhan, dari beberapa klinik dan rumah sakit mitra. Bukan data sintetis, bukan contoh dari dokumentasi — data asli dengan segala kompleksitasnya.

Supaya eksperimen ini tidak mungkin merusak apa pun, saya sengaja mengakses data itu lewat akun database read-only yang cuma bisa SELECT, tidak pernah bisa menulis balik ke sistem sumber. Jadi seliar apa pun saya bereksperimen, rekam medis asli tetap aman.

Baseline dulu, baru model

Godaan pertama waktu punya AI baru adalah langsung sibuk mengoprek prompt, parameter, atau arsitekturnya. Saya menahan diri dan bikin baseline paling naif dulu: "tebak saja kode yang sama seperti kunjungan pasien itu sebelumnya." Masuk akal, karena banyak pasien di data ini adalah pasien kontrol rutin yang datang berulang dengan diagnosis serupa.

Hasilnya mengejutkan. Baseline se-sederhana itu mencetak skor F1 84.8% — jauh di atas model AI awal saya yang cuma dapat 16.8%. Ini bukan kabar buruk soal modelnya, ini petunjuk penting soal akar masalahnya.

Root cause: model tanpa konteks

Kalau baseline "tebak sama seperti terakhir kali" saja sudah jauh mengalahkan model AI, artinya masalah utamanya bukan model kurang pintar. Masalahnya model tidak pernah diberi tahu bahwa pasien ini punya riwayat coding sebelumnya. Model dipaksa menebak dari nol setiap kali, padahal manusia (koder rekam medis) tidak pernah bekerja seperti itu — mereka selalu melirik riwayat pasien dulu.

Solusi: few-shot berbasis riwayat pasien

Saya ubah alurnya: sebelum AI menebak kode untuk kunjungan baru, sistem mengambil beberapa contoh riwayat coding pasien yang sama sebagai referensi, lalu menyertakannya sebagai few-shot example ke model. Intinya, saya berhenti memperlakukan setiap kunjungan sebagai kasus yang berdiri sendiri.

Dampaknya besar:

  • Akurasi diagnosis utama naik dari sekitar 9% menjadi 88%.
  • Tingkat kode tindakan yang salah-tebak (false positive) turun dari sekitar 17% menjadi di bawah 1%.

Menjaga evaluasi tetap jujur

Angka bagus gampang menipu kalau metodologi evaluasinya longgar, jadi saya pegang beberapa aturan ketat:

  • Split data uji berdasarkan waktu — data lama jadi "riwayat" yang boleh dilihat model, data terbaru jadi "ujian" yang tidak pernah bocor ke sisi riwayat.
  • Setiap deploy versi baru ke server utama selalu dibarengi backup dan penyimpanan image versi lama, supaya bisa rollback instan kalau ada masalah.
  • Ada sinkronisasi mingguan otomatis yang menarik data kunjungan baru dari sumbernya secara idempotent — aman dijalankan berulang tanpa membuat duplikat.

Kira-kira begini pola pikirnya kalau saya tuliskan sebagai catatan kerja:

baseline_naif = "kode sama seperti kunjungan terakhir pasien ini"
baseline_naif.F1  = 84.8%
model_awal.F1     = 16.8%

# baseline naif menang jauh -> masalahnya bukan model,
# tapi model tidak diberi konteks riwayat pasien

model_dengan_riwayat.akurasi_diagnosis = 88%   # dari ~9%
model_dengan_riwayat.false_positive    = <1%   # dari ~17%

Pelajaran yang saya bawa pulang

Hal paling berharga dari eksperimen ini bukan angka akurasinya, tapi urutan kerjanya. Sebelum buru-buru bikin model "jadi lebih pintar", selalu cek dulu baseline paling naif yang mungkin dibuat. Kalau baseline naif itu ternyata sudah kuat, itu sinyal keras bahwa masalah sebenarnya ada di data dan konteks yang diberikan ke model — bukan di kemampuan model itu sendiri. Dalam kasus medcoder, jawabannya sesederhana: beri tahu AI-nya siapa pasien ini pernah dikode sebelumnya.

Model yang "lebih pintar" sering kali cuma butuh diberi tahu apa yang sudah diketahui manusia sejak awal.