pebaryan Claude Opus 4.7 commited on
Commit
ea8eaf7
Β·
1 Parent(s): 850ff59

Inject DPR Komisi 2024-2029 portfolio reference into agent prompts

Browse files

Closes 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 CHANGED
@@ -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},
src/legawa/agents/surat.py CHANGED
@@ -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
 
tests/test_penyusun.py CHANGED
@@ -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(),