Prompt-Builder / README.md
ArielJoe's picture
docs: update README.md
29c3929
|
Raw
History Blame Contribute Delete
13.7 kB
---
title: Prompt Builder
emoji: 🧠
colorFrom: green
colorTo: blue
sdk: docker
app_port: 7860
pinned: false
license: mit
short_description: Indonesian prompt builder with real-time NLP detectors
---
# Prompt Builder
Prompt Builder adalah web app berbasis Bahasa Indonesia untuk membantu pengguna menyusun prompt AI yang efektif, bersih, dan bertanggung jawab. Setiap field prompt dianalisis secara real-time oleh sembilan detektor NLP sebelum prompt dikirimkan ke model AI.
## Fitur Utama
- 9 field prompt terstruktur: Task, Context, References, Role, Audience, Tone, Constraints, Output Format, dan Example.
- 9 detektor NLP: PII, Word Quality, Konten Berisiko, NER, Profanity, Filler, Special Char, Syntax, dan Field-Fit.
- Fokus Bahasa Indonesia, dengan dukungan lintas bahasa pada PII, NER, dan Profanity (identifier, entitas, dan kata kasar berlaku untuk teks Inggris juga). Teks yang terdeteksi Inggris hanya diproses ketiga detektor itu; enam detektor lain Indonesia-only.
- Lexicon dipisah di `resources/lexicons/` agar dapat diperbarui tanpa mengubah kode detektor.
- Highlight inline untuk kata atau frasa bermasalah.
- Saran perbaikan otomatis (replace) untuk PII, slang, alay, dan typo.
- Backend Python sederhana berbasis stdlib `http.server` — tanpa framework web.
- Frontend statis berbasis HTML dan Tailwind CSS — tanpa SPA framework.
- Hot-reload detektor saat file berubah; auto-restart proses jika file inti pipeline berubah.
## Arsitektur
```text
web/index.html
|
| POST /api/evaluate
v
src/core/pipeline_server.py
|
+-- pii (NIK, NPWP, email, HP, ... + SSN_US, NIN_UK, IBAN, MAC) [lintas bahasa]
+-- word_quality (slang, alay, l33tspeak, typo)
+-- risky_content (injection, harmful, academic dishonesty, sensitive topic)
+-- ner (transformer NER + rule-based booster Indonesia + entitas Inggris) [lintas bahasa]
+-- profanity (lexicon kata kasar Indonesia + Inggris) [lintas bahasa]
+-- filler (sapaan, basa-basi, referensi samar)
+-- special_char (zero-width, bidi, Unicode tag, homoglyph, full-width, repeated punct)
+-- syntax (urutan kata janggal via perplexity IndoBERT)
+-- field_fit (deteksi salah field: persona di Task + embedding lintas-field)
Routing bahasa: teks yang terdeteksi Inggris hanya melewati pii, ner, dan
profanity; enam detektor lain Indonesia-only dan dilewati.
```
Semua detektor dimuat saat server start dan digunakan ulang untuk setiap request.
## Struktur Folder
```text
prompt-builder/
src/
core/
pipeline_server.py # orchestrator utama
language.py # deteksi bahasa via wordfreq (id/en/unknown)
lexicons.py # loader lexicon terpusat
config.py # konfigurasi global (mode produksi, ambang ML)
pii/
pii_detector.py
pii_server.py
word_quality/
word_quality_detector.py
word_quality_server.py
risky_content/
risky_content_detector.py
risky_content_server.py
profanity/
profanity_detector.py
profanity_server.py
filler/
filler_detector.py
filler_server.py
special_char/
special_char_detector.py
special_char_server.py
ner/
ner_detector.py
ner_server.py
syntax/
syntax_detector.py
syntax_server.py
field_fit/
field_fit_detector.py
field_fit_server.py
thesaurus/
thesaurus.py
web/
index.html
*-test.html
resources/
lexicons/
language/
word_quality/
profanity/ # Indonesia (high/medium) + Inggris (high_en/medium_en)
ner/
special_char/ # homoglyph, smart-quote, pesan alasan
field_fit/ # prototipe & label field (untuk ML embedding)
scripts/
import_lexicons.py
audit_detectors.py
tests/
cache/ # cache lokal (gitignored): SymSpell, KBBI, tesaurus, model ML
pyproject.toml
package.json
tailwind.config.js
Dockerfile
```
## Instalasi
### Prasyarat
- Python 3.10+
- Node.js (hanya untuk build Tailwind CSS)
### Clone Repository
```bash
git clone https://github.com/ArielJoe/Prompt-Builder.git
cd Prompt-Builder
```
### Install Dependensi Python
Minimal untuk NLP ringan (tanpa model ML):
```bash
pip install -e ".[nlp]"
```
Lengkap dengan model ML (NER, Syntax, Field-Fit, plus lapis opsional Word Quality dan Profanity):
```bash
pip install -e ".[full]"
```
Development tools:
```bash
pip install -e ".[dev]"
```
Model NER, Syntax Checker, dan Field-Fit akan diunduh otomatis dari HuggingFace Hub saat pertama kali digunakan.
## Cara Menjalankan
Pipeline utama (dengan semua detektor):
```bash
python src/core/pipeline_server.py
```
Mode cepat — tanpa model ML berat (semua model berat dinonaktifkan):
```bash
python src/core/pipeline_server.py --fast
```
Tanpa lapis ML ringan (Word Quality & Profanity) saja:
```bash
python src/core/pipeline_server.py --no-resp-ml
```
Port dan host custom:
```bash
python src/core/pipeline_server.py --port 8080 --host 0.0.0.0
```
Setelah server berjalan, buka `http://127.0.0.1:8000` di browser.
Saat development, server otomatis memuat ulang perubahan detektor. Jika file inti pipeline
(`pipeline_server.py`, `language.py`, `lexicons.py`) berubah, proses akan restart sendiri
dengan argumen yang sama. Matikan dengan `--no-auto-reload` jika diperlukan.
## Deploy ke Hugging Face Spaces
Space ini dikonfigurasi sebagai Docker Space (port 7860). Dockerfile menjalankan pipeline:
```bash
python3 src/core/pipeline_server.py --host 0.0.0.0 --port ${PORT:-7860} ${PIPELINE_FLAGS}
```
`PORT` dan `PIPELINE_FLAGS` dapat diatur lewat `Settings > Variables` pada Space tanpa
mengubah Dockerfile. `PIPELINE_FLAGS` kosong secara default sehingga pipeline penuh
(semua detektor, termasuk model ML) yang berjalan. Untuk Free CPU Space yang terbatas
RAM-nya, set `PIPELINE_FLAGS=--fast` agar model transformer besar tidak dimuat.
`--fast` setara dengan `--no-resp-ml --no-ner-ml --no-syntax-ml --no-fieldfit-ml`.
Untuk deployment publik, set environment variable `PROMPT_BUILDER_ENV=production`.
Pada mode produksi: auto-reload dimatikan, sub-server halaman test tidak dijalankan,
dan header CORS tidak dikirim karena frontend disajikan satu origin dengan backend.
## Privasi Data
Prompt yang dimasukkan hanya diproses di memori selama evaluasi berlangsung dan
tidak disimpan ke penyimpanan permanen, basis data, atau log. Server tidak menulis
isi prompt ke berkas. Meski demikian, pengguna tetap disarankan tidak memasukkan
data pribadi yang sebenarnya, dan detektor PII berfungsi sebagai pengingat bila
data semacam itu terdeteksi.
Push ke Space:
```bash
git remote add space https://huggingface.co/spaces/ArielJoe/Prompt-Builder
git push space main
```
### Auto Deploy dari GitHub
Workflow `.github/workflows/deploy-hf-space.yml` akan push ke Hugging Face Space secara
otomatis setiap ada push ke `main` yang mengubah file pipeline, frontend, lexicon,
Dockerfile, atau dependency.
Setup sekali:
1. Buat token di `https://huggingface.co/settings/tokens` dengan permission write.
2. Di GitHub repo: `Settings > Secrets and variables > Actions`.
3. Tambahkan secret: `HF_TOKEN=hf_...`
## Server Detektor Individual
Setiap detektor memiliki server test mandiri:
```bash
python -m src.pii.pii_server
python -m src.word_quality.word_quality_server
python -m src.risky_content.risky_content_server
python -m src.profanity.profanity_server
python -m src.filler.filler_server
python -m src.special_char.special_char_server
python -m src.ner.ner_server
python -m src.syntax.syntax_server
python -m src.field_fit.field_fit_server
```
Halaman test tersedia di `web/*-test.html`.
## Pengujian
Unit test fungsi murni (validator PII, normalisasi teks, skeleton konsonan):
```bash
python -m pytest tests/
```
## Audit Detektor
Uji semua detektor dengan skenario positif, negatif, dan bypass:
```bash
python scripts/audit_detectors.py
```
Termasuk layer ML opsional:
```bash
python scripts/audit_detectors.py --include-ml
```
Audit menampilkan status kasus, label temuan, latency, serta proxy precision,
recall, dan F1 per detector. Untuk rencana evaluasi etika, risiko, efisiensi
komputasi, serta DOI paper rujukan, lihat `docs/detector_evaluation.md`.
Seed dataset untuk fine-tuning/evaluasi lanjutan tersedia di
`resources/evaluation/`. Validasi schema dan distribusi label:
```bash
python scripts/validate_evaluation_sets.py
```
## Tailwind CSS
```bash
npm install
npm run dev # watch mode
npm run build # CSS minified untuk produksi
```
## Lexicon Resources
| Folder | Isi |
| --- | --- |
| `language/` | Stopwords Indonesia untuk filter entitas dan konteks. |
| `word_quality/` | Slang, alay, dan data koreksi typo Bahasa Indonesia. |
| `profanity/` | Kata kasar curated Indonesia (`high`/`medium`) + Inggris (`high_en`/`medium_en`). Tanpa whitelist — kurasi di sumber lexicon. |
| `ner/` | Nama orang, organisasi, sufiks badan usaha & akronim global, nama tempat, kata pemicu (gelar, etnis) untuk rule NER. |
| `special_char/` | Peta homoglyph, smart-quote, dan pesan alasan per kategori. |
| `field_fit/` | Prototipe contoh dan label tiap field untuk centroid embedding. |
Update lexicon dari sumber online:
```bash
python scripts/import_lexicons.py --all
```
Import selektif:
```bash
python scripts/import_lexicons.py --slang-id
python scripts/import_lexicons.py --profanity-id
python scripts/import_lexicons.py --stopwords
python scripts/import_lexicons.py --geonames --ssa-names
```
## API Reference
### `GET /api/status`
```json
{
"ready": true,
"detectors": {
"pii": true,
"word_quality": true,
"risky_content": true,
"ner": true,
"profanity": true,
"filler": true,
"special_char": true,
"syntax": true,
"field_fit": true
}
}
```
### `POST /api/evaluate`
Request:
```json
{
"fields": {
"task": "Jelaskan konsep fotosintesis",
"context": "Untuk siswa kelas 7 SMP",
"references": "Buku IPA Kurikulum Merdeka",
"role": "Guru IPA",
"audience": "Siswa usia 12-13 tahun"
}
}
```
Response:
```json
{
"issues": [
{
"field_id": "task",
"field_label": "Task",
"css_class": "slang",
"severity": "MEDIUM",
"word": "nemenin",
"start": 5,
"end": 12,
"reason": "Kata informal; padanan baku: \"menemani\".",
"action": "replace",
"replacement": "menemani"
}
],
"final_prompt": "Task: ...",
"final_prompt_sections": []
}
```
Field issue yang dikirim hanya yang dipakai frontend. Atribut internal seperti
`source`, `issue_type`, dan `confidence` tidak disertakan dalam respons; status
detektor tersedia di `GET /api/status`. Temuan konten berisiko menambahkan field
`recommendation` berisi saran reformulasi.
Severity: `HIGH` | `MEDIUM` | `LOW`, dikirim pada tiap issue tetapi tidak dipakai untuk
mengelompokkan tampilan. Semua temuan bersifat saran dan ditampilkan sebagai satu daftar,
dikelompokkan per kategori (css_class) sesuai urutan kepentingan pada frontend.
Action: `replace` (ada saran penggantian; `replacement` kosong berarti hapus)
atau `select` (hanya sorot).
## Ringkasan Detektor
| Detektor | File Utama | Fungsi |
| --- | --- | --- |
| PII | `src/pii/pii_detector.py` | NIK, NPWP, BPJS, SIM, plat nomor, email, telepon, rekening, kartu kredit, IP, tanggal lahir, alamat Indonesia + identifier internasional (SSN_US, NIN_UK, IBAN, MAC, TELEPON_US). **Lintas bahasa.** |
| Word Quality | `src/word_quality/word_quality_detector.py` | Slang, alay, l33tspeak, typo — dengan saran perbaikan dan reklasifikasi kontekstual. |
| Konten Berisiko | `src/risky_content/risky_content_detector.py` | Prompt injection, self-harm, konten seksual eksplisit, diskriminasi, academic dishonesty, framing berbahaya, sensitive topic. |
| NER | `src/ner/ner_detector.py` | Named entity recognition via transformer + rule-based booster Indonesia + entitas Inggris (gelar, sufiks badan usaha, akronim global). **Lintas bahasa.** |
| Profanity | `src/profanity/profanity_detector.py` | Kata kasar berbasis leksikon Indonesia + Inggris + classifier toksisitas opsional. **Lintas bahasa.** |
| Filler | `src/filler/filler_detector.py` | Sapaan ke AI, basa-basi, ucapan terima kasih, permintaan maaf, referensi samar. |
| Special Char | `src/special_char/special_char_detector.py` | Zero-width (termasuk BOM, word joiner, soft hyphen), kontrol arah teks (bidi), Unicode tag, homoglyph, control char, non-breaking space, full-width ASCII, repeated punct, spasi berlebih. |
| Syntax | `src/syntax/syntax_detector.py` | Deteksi urutan kata janggal via pseudo-log-likelihood IndoBERT. |
| Field-Fit | `src/field_fit/field_fit_detector.py` | Deteksi salah field: aturan persona di Task + ML embedding kemiripan lintas-field (sentence-transformers). |
## Field Prompt
| Field | ID | Wajib |
| --- | --- | --- |
| Task | `task` | Ya |
| Context | `context` | Ya |
| References | `references` | Ya |
| Role | `role` | Tidak |
| Audience | `audience` | Tidak |
| Tone | `tone` | Tidak |
| Constraints | `constraints` | Tidak |
| Output Format | `outputFormat` | Tidak |
| Example | `example` | Tidak |
Field wajib yang kosong dilaporkan sebagai issue `MISSING` dengan severity `HIGH`.
## Dependensi
| Grup | Isi |
| --- | --- |
| `nlp` | `wordfreq`, `symspellpy` |
| `ml` | `transformers`, `torch`, `sentencepiece`, `accelerate`, `protobuf`, `huggingface-hub` |
| `full` | `nlp` + `ml` |
| `dev` | `pytest`, `pytest-cov`, `ruff` |
Node.js: `tailwindcss` (build CSS frontend).
## Lisensi
Lihat `LICENSE`.
---
```yaml
title: Prompt Builder
emoji: 🧩
colorFrom: green
colorTo: blue
sdk: docker
app_port: 7860
pinned: false
license: mit
```