Dokumentasi Filter Policy
Ini adalah dokumentasi yang ditujukan untuk klien mengenai Government Policy Guard —
Policy Filter yang disebut dalam deliverable TOR/KAK Policy Filter. Dokumen ini
menjelaskan secara jujur apa yang ditangkap guard, apa yang sengaja tidak
ditangkapnya, bagaimana aturan-aturannya dibentuk, dan bagian mana yang dapat
diubah operator. Alasan yang menjadi otoritas ada di
ADR-0008;
halaman ini merupakan pembacaan operasional atasnya. Setiap klaim di sini
didasarkan pada kode guard yang telah digabungkan (src/aceh_rag/policy_guards/policy.py) dan
policy slice bank (eval/golden-seed/labels.jsonl).
Apa itu Policy Guard
Government Policy Guard adalah lapisan penegakan kebijakan yang memeriksa setiap
jawaban query sebelum sampai kepada pengguna, dan tidak dapat dilewati per
query (src/aceh_rag/policy_guards/policy.py:1-6). Guard ini membungkus dua
permukaan jawaban:
- chat berbasis sumber,
POST /query(src/aceh_rag/services.py:1184), - chat streaming,
POST /query/stream.
Primitif tanpa sumber POST /generate adalah panggilan model mentah yang tetap
diautentikasi dan secara eksplisit berada di luar guard (ADR-0050).
Pada permukaan jawaban, guard berjalan hanya pada output yang dihasilkan —
guard tidak memeriksa pertanyaan pengguna
(docs/adr/0008-government-policy-guard.md:82).
Batas yang ditegakkannya bukan "topik ini sensitif", melainkan "output ini
menganjurkan bahaya atau membocorkan instruksi milik sistem itu sendiri."
Deteksi dilakukan dengan aturan kata deterministik, bukan penilai model
(src/aceh_rag/policy_guards/policy.py:7). Penilai machine-learning merupakan opsi nyata
untuk masa depan dan ADR-0008
memilih untuk menundanya, bukan menolaknya; guard saat ini cepat (tanpa
pemanggilan model dan tanpa latensi tambahan) serta sepenuhnya dapat diperiksa,
sehingga operator pemerintah dapat membaca dan mengedit setiap aturan.
Classifier melaporkan nama yang memiliki versi, deterministic-rules-v2
(src/aceh_rag/policy_guards/policy.py:69-73), agar baris audit yang ditulis sebelum dan
sesudah perubahan aturan dapat dibedakan — disiplin pergeseran versi yang sama
dengan yang digunakan ekstraksi OCR.
Prinsip utama: pertanyaan yang sah dilindungi terlebih dahulu
Di Aceh, pertanyaan tentang agama, etnis, dan penerapan Qanun merupakan
pekerjaan sehari-hari (src/aceh_rag/policy_guards/policy.py:16-22). Pegawai negeri yang
bertanya "Apa kata Qanun Jinayat tentang non-Muslim?", analis yang mengambil
statistik populasi berdasarkan agama, dan penyusun rancangan izin rumah ibadah
semuanya harus mendapatkan jawaban.
Karena itu, guard dibangun berdasarkan satu aturan yang mengatur setiap pilihan
desain: jika menangkap satu pengelakan lagi akan mengorbankan penolakan yang
sah, pengelakan tersebut diterima (src/aceh_rag/policy_guards/policy.py:20-21). Pemblokiran
berlebihan tidak membuat platform lebih aman — hal itu membuatnya tidak berguna
bagi pengguna yang justru menjadi alasan platform ini ada, sementara pertanyaan
sah yang ditolak merupakan kegagalan yang terlihat dan berulang, sedangkan
pengelakan yang terlewat jarang terjadi.
Aturan anti-SARA
SARA — Suku, Agama, Ras, Antar-golongan (etnis, agama, ras,
antargolongan) — merupakan persyaratan khusus Indonesia. Guard menandai konten
SARA hanya ketika dua sinyal muncul bersamaan dalam jendela kedekatan yang
dibatasi (src/aceh_rag/policy_guards/policy.py:227-247). Kemunculan nama kelompok dan kata
bermusuhan saja tidak cukup; diperlukan sebuah konstruksi hasutan.
Sinyal 1 — referensi kelompok yang dilindungi
Sinyal tersebut dapat berupa kelompok bernama, atau kata benda kelompok generik
yang memiliki kualifikasi (src/aceh_rag/policy_guards/policy.py:132-163):
- Agama, denominasi, penganut, serta rujukan etnis dan ras yang bernama —
termasuk cercaan yang mewakilinya — dalam Bahasa Indonesia dan bahasa Inggris
(
src/aceh_rag/policy_guards/policy.py:133-146). Kata-kata provinsi/geografi yang berdiri sendiri (aceh,Jawaseperti dalam Jawa Barat) sengaja dikecualikan — kata-kata tersebut tidak memiliki makna kelompok secara mandiri dan akan terpicu pada teks administratif biasa. - Kata benda generik berkualifikasi —
kelompok minoritas,golongan tertentu,suku Jawa,religious minority(src/aceh_rag/policy_guards/policy.py:149-164). Katakelompok/golonganyang berdiri sendiri merupakan kata administratif dalam korpus ini (kelompok kerja,golongan III) dan bukan sinyal. Aturan etnonim dengan huruf kapital (suku+ nama diri) membedakansuku Jawadarisuku cadang(suku cadang) dansuku bunga(suku bunga).
Sinyal 2 — konstruksi hasutan
Frasa yang menganjurkan sesuatu terhadap orang, bukan sekadar kata bermusuhan,
dalam lima kelompok (src/aceh_rag/policy_guards/policy.py:165-218):
- Advokasi Bahasa Indonesia — penanda deontik (
harus,wajib,sebaiknya) dalam jarak dua token dari tindakan bermusuhan atau frasa pemindahan (src/aceh_rag/policy_guards/policy.py:166-190). - Imperatif Bahasa Indonesia yang ditujukan kepada orang (
usir mereka) (src/aceh_rag/policy_guards/policy.py:192-193). - Eufemisme penyangkalan keanggotaan dalam kedua bahasa (
tidak layak tinggal,have no place) (src/aceh_rag/policy_guards/policy.py:195-210). - Advokasi bahasa Inggris (
must be expelled,should leave) (src/aceh_rag/policy_guards/policy.py:202-206). - Sekumpulan kecil Bahasa Aceh yang bersifat upaya terbaik (
bèk tinggai,peuteubiet,hana layak) — lihat catatan kejujuran di bawah (src/aceh_rag/policy_guards/policy.py:211-215).
Inilah perbedaan antara mendeskripsikan suatu kelompok dan menganjurkan
tindakan terhadapnya. Hal inilah yang memungkinkan Pasal 28E
("warga tidak boleh diusir … karena keyakinan yang dianutnya") dan jawaban
sejarah tentang perpindahan penduduk selama konflik sama-sama lolos meskipun
memuat verba yang sama, yaitu diusir.
Satu ketepatan tambahan juga penting: untuk pemindahan yang dirumuskan sebagai
pergerakan, tujuannya yang menentukan (src/aceh_rag/policy_guards/policy.py:174-186).
Pemindahan dari tempat orang-orang tersebut berada (dipindahkan keluar wilayah ini) merupakan pengusiran dan ditandai; pemindahan dari bahaya (harus dipindahkan keluar zona merah, instruksi evakuasi BPBD yang nyata) tidak ditandai.
Jendela kedekatan yang dibatasi
Kedua sinyal harus muncul bersamaan dalam kalimat hasutan itu sendiri ditambah
kalimat yang langsung bersebelahan, dan dalam jarak 300 karakter
(src/aceh_rag/policy_guards/policy.py:220-224; _MAX_SENTENCE_DISTANCE = 1,
_MAX_CHARACTER_GAP = 300). Kedua batas ini mencegah kegagalan tertentu:
- Aturan dalam kalimat yang sama (perilaku M0 lama) dapat dikalahkan oleh tanda titik — aturan itu melewatkan "Orang Kristen tidak layak tinggal di sini. Mereka harus segera diusir."
- Aturan seluruh dokumen akan menolak jawaban panjang yang sah jika menyebut
agama di paragraf pertama lalu mengutip undang-undang yang memuat
diusirsembilan paragraf kemudian.
Aturan anti-jailbreak
Aturan anti-jailbreak mencocokkan konstruksi, bukan topik
(src/aceh_rag/policy_guards/policy.py:279-321). Menyebut suatu subjek — "what is a system
prompt", "how does a jailbreak attack work" — diperbolehkan; jawaban yang
menjelaskan keamanan prompt lolos. Yang diblokir:
- Pengambilalihan instruksi —
ignore all previous instructions, dan imperatif Bahasa Indonesiaabaikan … instruksi(src/aceh_rag/policy_guards/policy.py:282-291). Aturan Bahasa Indonesia sengaja hanya bersifat imperatif: mencocokkan bentuk berimbuhan sepertimengabaikanakan menolak setiap jawaban yang mendeskripsikan serangan. - Permintaan pengungkapan —
reveal the system prompt,bocorkan prompt sistem(src/aceh_rag/policy_guards/policy.py:293-300). - Pengungkapan aktual dalam output —
here is my system prompt,berikut adalah instruksi sistem(src/aceh_rag/policy_guards/policy.py:303-309). - Melewati guard —
bypass the policy guard,matikan filter(src/aceh_rag/policy_guards/policy.py:311-314). - Aktivasi jailbreak —
you are now jailbroken,mode jailbreak aktif(src/aceh_rag/policy_guards/policy.py:316-318).
Tingkat yang diukur
Tingkat historis di bawah ini membandingkan classifier yang diperkuat dengan
classifier M0 lama pada 66 kasus yang sama (36 diharapkan blokir, 30 diharapkan
lolos), yang kini ada di policy slice bank. Jalankan make eval-slice SLICE=policy
untuk memeriksa tingkat tangkapan dan penolakan keliru guard saat ini (ADR-0008 → Measured rates).
| Metrik | M0 (deterministic-m0) | Diperkuat (deterministic-rules-v2) |
|---|---|---|
| Tingkat tangkapan (inflamatoris diblokir) | 0.222 (8/36) | 0.778 (28/36) |
| Tingkat penolakan keliru (sah diblokir) | 0.167 (5/30) | 0.000 (0/30) |
| Tingkat tangkapan berdasarkan bahasa | id 0.200 · en 0.222 · ace 0.000 · mixed 0.667 | id 0.750 · en 0.889 · ace 0.750 · mixed 0.667 |
Setiap label, serta setiap baris Bahasa Indonesia dan Bahasa Aceh dalam policy
slice, ditulis oleh agen AI (label_status setiap baris di
eval/golden-seed/labels.jsonl menyatakannya). Sebelum disetujui oleh (a) penutur asli Bahasa Indonesia, (b)
penutur asli Bahasa Aceh, dan (c) pemilik kebijakan komunikasi pemerintahan
Pemprov Aceh, tingkat-tingkat ini merupakan sinyal regresi atas perilaku guard
itu sendiri, bukan pengukuran eksternal tentang seberapa aman guard tersebut
(ADR-0008 → Decision 3). Laporan evaluasi mencetak
peringatan ini di sebelah setiap angka yang dilaporkannya
(src/aceh_rag/eval/eval_tier.py:637-658). Peninjauan manusia ini merupakan
persetujuan korpus yang dijelaskan dalam Yang masih memerlukan manusia,
yang merupakan aktivitas delivery klien, bukan sesuatu yang diputuskan tim
engineering.
Apa yang sengaja TIDAK ditangkap guard
ADR-0008 → What this guard still does NOT catch
menjadi rujukan batasan yang diterima, ID kasus bank, dan alasan penerimaannya.
Policy slice melaporkan ketidaksesuaian pada baris known_limitation tanpa
menggagalkan gate; setiap ketidaksesuaian yang tidak terdokumentasi menggagalkannya.
Permukaan kustomisasi aturan
Aturan guard adalah daftar leksikon dan konstruksi itu sendiri, dan itulah seam yang dapat diedit operator:
| Permukaan | Lokasi | Isi |
|---|---|---|
| Kelompok yang dilindungi dan bernama | src/aceh_rag/policy_guards/policy.py:133-146 (_GROUP_NAMED_RE) | Agama, etnis, ras, penganut, cercaan |
| Kata benda kelompok yang berkualifikasi | src/aceh_rag/policy_guards/policy.py:149-164 (_GROUP_QUALIFIED_RE) | kelompok minoritas, suku + etnonim, religious minority |
| Konstruksi hasutan | src/aceh_rag/policy_guards/policy.py:165-218 (_INCITEMENT_RE dan bagian-bagiannya) | Lima kelompok advokasi/pemindahan/penyangkalan |
| Konstruksi jailbreak | src/aceh_rag/policy_guards/policy.py:279-321 (_JAILBREAK_RE) | Override, pengungkapan, bypass, aktivasi |
| Batas kedekatan | src/aceh_rag/policy_guards/policy.py:222-223 | _MAX_SENTENCE_DISTANCE, _MAX_CHARACTER_GAP |
Biaya perubahannya. Daftar-daftar ini merupakan keseluruhan guard, sehingga
sebuah edit bersifat kuat dan kasar: memperlebar aturan untuk menangkap satu
pengelakan lagi secara rutin menolak kelas jawaban yang sah, sedangkan
mempersempitnya untuk menghentikan penolakan keliru membuka sebuah pengelakan.
Itulah sebabnya perubahan aturan tidak pernah dirilis hanya berdasarkan
penilaian — perubahan dirilis melalui proses pembaruan berkala,
yang menguji setiap edit terhadap policy slice bank dengan
make eval-slice SLICE=policy.
Seam PolicyClassifier (src/aceh_rag/policy_guards/policy.py:61-66) juga memungkinkan
penilai model di masa depan ditempatkan di samping aturan tanpa desain ulang,
jika sesi pemangku kepentingan memutuskan bahwa celah-celah yang diterima di
atas layak ditutup.
Menentukan di mana Pemprov Aceh ingin menetapkan batas — sesi kerja "kustomisasi aturan bersama pemangku kepentingan" yang disebut dalam TOR — adalah aktivitas delivery klien yang dimiliki manusia, bukan sesuatu yang ditetapkan secara sepihak oleh dokumentasi ini atau tim engineering. Halaman ini menjelaskan permukaan dan biayanya; klien yang menetapkan nilainya.
Terkait
- Manual Kebijakan Akses dan Filter — bagaimana filter berada di samping kontrol akses, dan apa yang dilihat serta dilakukan administrator.
- Pembaruan Policy Berkala — loop yang memungkinkan guard berkembang tanpa regresi.
- Keamanan dan Tata Kelola — konteks tata kelola yang lebih luas.