Spaces:
Sleeping
Inject DPR Komisi 2024-2029 portfolio reference into agent prompts
Browse filesCloses the persistent Komisi-number mismatch surfaced in Test 5: the BIG
model addressed transport memos to Komisi IV (pertanian/kelautan) instead
of Komisi V (infrastruktur/perhubungan). Generic Indonesian govt knowledge
the model has weak/outdated training-time priors on, especially since the
2024-2029 period restructured into 13 commissions (was 11 in earlier
periods).
Adds KOMISI_DPR_2024_2029 constant in agents/penyusun.py β a 13-line
authoritative table covering all current commissions with their primary
bidang. Injected into:
- penyusun SYSTEM_TEMPLATE (memo / pidato / naskah_akademik / siaran_pers)
- surat REPLY_PROMPT (constituent reply drafts)
Both system prompts now end with the Komisi reference and an explicit
instruction: "Bila konstituen sudah menyebut Komisi tertentu, hormati
pilihan tersebut" β so when the constituent letter explicitly addresses
e.g. Komisi V, the reply respects that.
Live re-run on the Test 5 Bekasi memo now correctly addresses
'Komisi V dan Komisi VI DPR RI', with structured 'Komisi Utama: Komisi V
(Infrastruktur & Perhubungan)' and 'Tembusan: Komisi VI ... Komisi VII'
metadata. Pre-fix runs misclassified to Komisi IV.
Test added: assert KOMISI_DPR_2024_2029 reference is present in rendered
penyusun system prompt.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- src/legawa/agents/penyusun.py +29 -0
- src/legawa/agents/surat.py +6 -1
- tests/test_penyusun.py +28 -0
|
@@ -45,6 +45,32 @@ STYLE_GUIDES: dict[str, str] = {
|
|
| 45 |
}
|
| 46 |
|
| 47 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 48 |
SYSTEM_TEMPLATE = """\
|
| 49 |
Anda adalah Penyusun Naskah profesional yang membantu anggota legislatif Indonesia.
|
| 50 |
|
|
@@ -54,6 +80,8 @@ Tanggal penyusunan: {run_date}
|
|
| 54 |
Status korpus pasal.id: {corpus_watermark}
|
| 55 |
Konteks domain: {domain_constraints}
|
| 56 |
|
|
|
|
|
|
|
| 57 |
Aturan umum:
|
| 58 |
- Bahasa Indonesia formal, presisi, dan menghormati kaidah hukum.
|
| 59 |
- Bila diberikan basis riset (bagian "BASIS RISET"), pakai sebagai sumber fakta. Sertakan
|
|
@@ -341,6 +369,7 @@ def draft(
|
|
| 341 |
run_date=pool.settings.run_date,
|
| 342 |
corpus_watermark=pool.settings.corpus_watermark or "tidak ditentukan",
|
| 343 |
domain_constraints=domain_constraints,
|
|
|
|
| 344 |
),
|
| 345 |
},
|
| 346 |
{"role": "user", "content": user_msg},
|
|
|
|
| 45 |
}
|
| 46 |
|
| 47 |
|
| 48 |
+
# Authoritative reference for DPR RI commission portfolios. Models often
|
| 49 |
+
# misclassify which Komisi a topic belongs to (e.g. citing Komisi IV for a
|
| 50 |
+
# transport issue when transport is actually Komisi V). Injected into agent
|
| 51 |
+
# prompts so the model has a canonical mapping to consult instead of relying
|
| 52 |
+
# on training-time priors that may be from older legislative periods.
|
| 53 |
+
KOMISI_DPR_2024_2029 = """\
|
| 54 |
+
KOMISI DPR RI (Periode 2024β2029) β gunakan untuk menentukan Komisi yang relevan:
|
| 55 |
+
- Komisi I: Pertahanan, Luar Negeri, Komunikasi & Informatika, Intelijen
|
| 56 |
+
- Komisi II: Pemerintahan Dalam Negeri, Otonomi Daerah, ASN, Pemilu, Agraria
|
| 57 |
+
- Komisi III: Hukum, Penegakan Hukum, Yudikatif, Pemberantasan Korupsi (KPK)
|
| 58 |
+
- Komisi IV: Pertanian, Kehutanan, Kelautan, Perikanan, Ketahanan Pangan
|
| 59 |
+
- Komisi V: Infrastruktur, PUPR, Perhubungan, Desa & Daerah Tertinggal, BMKG, Basarnas
|
| 60 |
+
- Komisi VI: Perdagangan, BUMN, Perlindungan Konsumen, Standardisasi
|
| 61 |
+
- Komisi VII: Perindustrian, Pariwisata, Ekonomi Kreatif, UMKM
|
| 62 |
+
- Komisi VIII: Agama, Sosial, Pemberdayaan Perempuan & Anak, Kebencanaan
|
| 63 |
+
- Komisi IX: Kesehatan, Ketenagakerjaan, Kependudukan, Perlindungan Pekerja Migran, BPJS, BPOM
|
| 64 |
+
- Komisi X: Pendidikan, Kebudayaan, Riset & Teknologi (Pendidikan Tinggi), Pemuda, Olahraga
|
| 65 |
+
- Komisi XI: Keuangan, Perbankan, Investasi, Fiskal
|
| 66 |
+
- Komisi XII: Energi, SDM, Pertambangan, Lingkungan Hidup
|
| 67 |
+
- Komisi XIII: HAM, Imigrasi, Ideologi Nasional
|
| 68 |
+
|
| 69 |
+
Bila topik menyentuh beberapa bidang, sebutkan Komisi utama dan tembusan ke
|
| 70 |
+
Komisi terkait. Jangan menebak nomor Komisi β pakai daftar di atas.
|
| 71 |
+
"""
|
| 72 |
+
|
| 73 |
+
|
| 74 |
SYSTEM_TEMPLATE = """\
|
| 75 |
Anda adalah Penyusun Naskah profesional yang membantu anggota legislatif Indonesia.
|
| 76 |
|
|
|
|
| 80 |
Status korpus pasal.id: {corpus_watermark}
|
| 81 |
Konteks domain: {domain_constraints}
|
| 82 |
|
| 83 |
+
{komisi_reference}
|
| 84 |
+
|
| 85 |
Aturan umum:
|
| 86 |
- Bahasa Indonesia formal, presisi, dan menghormati kaidah hukum.
|
| 87 |
- Bila diberikan basis riset (bagian "BASIS RISET"), pakai sebagai sumber fakta. Sertakan
|
|
|
|
| 369 |
run_date=pool.settings.run_date,
|
| 370 |
corpus_watermark=pool.settings.corpus_watermark or "tidak ditentukan",
|
| 371 |
domain_constraints=domain_constraints,
|
| 372 |
+
komisi_reference=KOMISI_DPR_2024_2029,
|
| 373 |
),
|
| 374 |
},
|
| 375 |
{"role": "user", "content": user_msg},
|
|
@@ -21,6 +21,7 @@ from rich.console import Console
|
|
| 21 |
from ..llm import LLMPool
|
| 22 |
from ..tools.citations import extract_citations_with_context, format_basis_block, verify_citations
|
| 23 |
from ..tools.pasal import PasalClient
|
|
|
|
| 24 |
|
| 25 |
|
| 26 |
KATEGORI = [
|
|
@@ -85,7 +86,7 @@ Aturan urgensi:
|
|
| 85 |
"""
|
| 86 |
|
| 87 |
|
| 88 |
-
REPLY_PROMPT = """\
|
| 89 |
Anda adalah staf komunikasi legislator Indonesia. Susun balasan formal Bahasa Indonesia
|
| 90 |
untuk surat konstituen berikut.
|
| 91 |
|
|
@@ -98,8 +99,12 @@ Pedoman:
|
|
| 98 |
- Jika ada peraturan yang relevan dan terverifikasi (lihat bagian "BASIS HUKUM"), sitasi.
|
| 99 |
- Tutup dengan komitmen tindak lanjut konkret (mis. teruskan ke komisi terkait, agendakan
|
| 100 |
rapat dengar pendapat, dll) β jangan janji yang tidak bisa ditepati.
|
|
|
|
|
|
|
| 101 |
- Tanda tangan: "Hormat kami,\\n[NAMA ANGGOTA LEGISLATIF]\\n[FRAKSI/DAERAH PEMILIHAN]"
|
| 102 |
- Panjang 250β450 kata. Output Markdown.
|
|
|
|
|
|
|
| 103 |
"""
|
| 104 |
|
| 105 |
|
|
|
|
| 21 |
from ..llm import LLMPool
|
| 22 |
from ..tools.citations import extract_citations_with_context, format_basis_block, verify_citations
|
| 23 |
from ..tools.pasal import PasalClient
|
| 24 |
+
from .penyusun import KOMISI_DPR_2024_2029
|
| 25 |
|
| 26 |
|
| 27 |
KATEGORI = [
|
|
|
|
| 86 |
"""
|
| 87 |
|
| 88 |
|
| 89 |
+
REPLY_PROMPT = f"""\
|
| 90 |
Anda adalah staf komunikasi legislator Indonesia. Susun balasan formal Bahasa Indonesia
|
| 91 |
untuk surat konstituen berikut.
|
| 92 |
|
|
|
|
| 99 |
- Jika ada peraturan yang relevan dan terverifikasi (lihat bagian "BASIS HUKUM"), sitasi.
|
| 100 |
- Tutup dengan komitmen tindak lanjut konkret (mis. teruskan ke komisi terkait, agendakan
|
| 101 |
rapat dengar pendapat, dll) β jangan janji yang tidak bisa ditepati.
|
| 102 |
+
- Bila menyebut Komisi DPR, gunakan nomor Komisi yang benar sesuai daftar di bawah.
|
| 103 |
+
Bila konstituen sudah menyebut Komisi tertentu, hormati pilihan tersebut.
|
| 104 |
- Tanda tangan: "Hormat kami,\\n[NAMA ANGGOTA LEGISLATIF]\\n[FRAKSI/DAERAH PEMILIHAN]"
|
| 105 |
- Panjang 250β450 kata. Output Markdown.
|
| 106 |
+
|
| 107 |
+
{KOMISI_DPR_2024_2029}
|
| 108 |
"""
|
| 109 |
|
| 110 |
|
|
@@ -76,6 +76,34 @@ class PenyusunTests(unittest.TestCase):
|
|
| 76 |
self.assertIn("Status korpus pasal.id: 2026-04-30", system_prompt)
|
| 77 |
self.assertIn("pendidikan dasar/menengah", system_prompt)
|
| 78 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 79 |
def test_draft_blocks_unverified_citation(self) -> None:
|
| 80 |
pool = FakePool(
|
| 81 |
make_settings(),
|
|
|
|
| 76 |
self.assertIn("Status korpus pasal.id: 2026-04-30", system_prompt)
|
| 77 |
self.assertIn("pendidikan dasar/menengah", system_prompt)
|
| 78 |
|
| 79 |
+
def test_draft_includes_komisi_dpr_reference(self) -> None:
|
| 80 |
+
# Models persistently misclassify which Komisi a topic belongs to
|
| 81 |
+
# (e.g. addressing transport memos to Komisi IV when transport is V).
|
| 82 |
+
# The 2024-2029 Komisi reference table must be present in the
|
| 83 |
+
# rendered system prompt so the model has authoritative ground truth.
|
| 84 |
+
pool = FakePool(
|
| 85 |
+
make_settings(),
|
| 86 |
+
small_response='["pengadaan sekolah dasar"]',
|
| 87 |
+
big_response="Memo singkat.",
|
| 88 |
+
)
|
| 89 |
+
pasal = FakePasalClient()
|
| 90 |
+
|
| 91 |
+
draft(
|
| 92 |
+
pool, pasal,
|
| 93 |
+
kind="memo_kebijakan",
|
| 94 |
+
topic="transportasi perlintasan sebidang",
|
| 95 |
+
with_research=False,
|
| 96 |
+
)
|
| 97 |
+
|
| 98 |
+
system_prompt = pool.big.calls[0][0][0]["content"]
|
| 99 |
+
self.assertIn("KOMISI DPR RI", system_prompt)
|
| 100 |
+
self.assertIn("Komisi V", system_prompt)
|
| 101 |
+
self.assertIn("Perhubungan", system_prompt)
|
| 102 |
+
self.assertIn("Komisi IX", system_prompt)
|
| 103 |
+
self.assertIn("Kesehatan", system_prompt)
|
| 104 |
+
self.assertIn("Komisi X", system_prompt)
|
| 105 |
+
self.assertIn("Pendidikan", system_prompt)
|
| 106 |
+
|
| 107 |
def test_draft_blocks_unverified_citation(self) -> None:
|
| 108 |
pool = FakePool(
|
| 109 |
make_settings(),
|